diff --git a/Dockerfile b/Dockerfile index 169ac6b9f1..bc6297e062 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,7 +14,7 @@ ## BUILD ARGS ## ################################################################################ # This build arg allows the specification of a custom Golang image. -ARG GOLANG_IMAGE=golang:1.22.2 +ARG GOLANG_IMAGE=golang:1.23.11 # The distroless image on which the CPI manager image is built. # @@ -22,14 +22,14 @@ ARG GOLANG_IMAGE=golang:1.22.2 # deterministic builds. Follow what kubernetes uses to build # kube-controller-manager, for example for 1.27.x: # https://github.com/kubernetes/kubernetes/blob/release-1.27/build/common.sh#L99 -ARG DISTROLESS_IMAGE=registry.k8s.io/build-image/go-runner:v2.3.1-go1.22.2-bookworm.0 +ARG DISTROLESS_IMAGE=registry.k8s.io/build-image/go-runner:v2.4.0-go1.23.11-bookworm.0 # We use Alpine as the source for default CA certificates and some output # images -ARG ALPINE_IMAGE=alpine:3.17.5 +ARG ALPINE_IMAGE=alpine:3.17.10 # cinder-csi-plugin uses Debian as a base image -ARG DEBIAN_IMAGE=registry.k8s.io/build-image/debian-base:bullseye-v1.4.3 +ARG DEBIAN_IMAGE=registry.k8s.io/build-image/debian-base:bookworm-v1.0.4 ################################################################################ ## BUILD STAGE ## diff --git a/charts/cinder-csi-plugin/Chart.yaml b/charts/cinder-csi-plugin/Chart.yaml index 5074bc9df8..cb0f5060b3 100644 --- a/charts/cinder-csi-plugin/Chart.yaml +++ b/charts/cinder-csi-plugin/Chart.yaml @@ -1,8 +1,8 @@ apiVersion: v1 -appVersion: v1.31.3 +appVersion: v1.31.4 description: Cinder CSI Chart for OpenStack name: openstack-cinder-csi -version: 2.31.7 +version: 2.31.8 home: https://github.com/kubernetes/cloud-provider-openstack icon: https://github.com/kubernetes/kubernetes/blob/master/logo/logo.png maintainers: diff --git a/charts/manila-csi-plugin/Chart.yaml b/charts/manila-csi-plugin/Chart.yaml index 6bf6eb6111..0faed17e6a 100644 --- a/charts/manila-csi-plugin/Chart.yaml +++ b/charts/manila-csi-plugin/Chart.yaml @@ -1,8 +1,8 @@ apiVersion: v1 -appVersion: v1.31.3 +appVersion: v1.31.4 description: Manila CSI Chart for OpenStack name: openstack-manila-csi -version: 2.31.3 +version: 2.31.5 home: http://github.com/kubernetes/cloud-provider-openstack icon: https://github.com/kubernetes/kubernetes/blob/master/logo/logo.png maintainers: diff --git a/charts/openstack-cloud-controller-manager/Chart.yaml b/charts/openstack-cloud-controller-manager/Chart.yaml index 468eb44a66..9c5181b128 100644 --- a/charts/openstack-cloud-controller-manager/Chart.yaml +++ b/charts/openstack-cloud-controller-manager/Chart.yaml @@ -1,10 +1,10 @@ apiVersion: v2 -appVersion: v1.31.3 +appVersion: v1.31.4 description: Openstack Cloud Controller Manager Helm Chart icon: https://object-storage-ca-ymq-1.vexxhost.net/swift/v1/6e4619c416ff4bd19e1c087f27a43eea/www-images-prod/openstack-logo/OpenStack-Logo-Vertical.png home: https://github.com/kubernetes/cloud-provider-openstack name: openstack-cloud-controller-manager -version: 2.31.3 +version: 2.31.4 maintainers: - name: eumel8 email: f.kloeker@telekom.de diff --git a/cloudbuild.yaml b/cloudbuild.yaml index 1f80394b82..3cd2651c1c 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -9,7 +9,7 @@ options: substitution_option: ALLOW_LOOSE machineType: 'N1_HIGHCPU_8' steps: - - name: gcr.io/k8s-testimages/gcb-docker-gcloud + - name: gcr.io/k8s-staging-test-infra/gcb-docker-gcloud entrypoint: bash env: # default cloudbuild has HOME=/builder/home and docker buildx is in /root/.docker/cli-plugins/docker-buildx diff --git a/docs/cinder-csi-plugin/multi-region-clouds.md b/docs/cinder-csi-plugin/multi-region-clouds.md index f4f0283f06..574661ef75 100644 --- a/docs/cinder-csi-plugin/multi-region-clouds.md +++ b/docs/cinder-csi-plugin/multi-region-clouds.md @@ -162,7 +162,7 @@ spec: - name: liveness-probe ... - name: cinder-csi-plugin - image: docker.io/k8scloudprovider/cinder-csi-plugin:v1.31.3 + image: docker.io/k8scloudprovider/cinder-csi-plugin:v1.31.4 args: - /bin/cinder-csi-plugin - --endpoint=$(CSI_ENDPOINT) @@ -212,7 +212,7 @@ spec: - name: liveness-probe ... - name: cinder-csi-plugin - image: docker.io/k8scloudprovider/cinder-csi-plugin:v1.31.3 + image: docker.io/k8scloudprovider/cinder-csi-plugin:v1.31.4 args: - /bin/cinder-csi-plugin - --endpoint=$(CSI_ENDPOINT) @@ -278,7 +278,7 @@ spec: - Topology=true ... - name: cinder-csi-plugin - image: docker.io/k8scloudprovider/cinder-csi-plugin:v1.31.3 + image: docker.io/k8scloudprovider/cinder-csi-plugin:v1.31.4 args: - /bin/cinder-csi-plugin - --endpoint=$(CSI_ENDPOINT) diff --git a/docs/keystone-auth/using-keystone-webhook-authenticator-and-authorizer.md b/docs/keystone-auth/using-keystone-webhook-authenticator-and-authorizer.md index 7a191a802d..c75f8f4870 100644 --- a/docs/keystone-auth/using-keystone-webhook-authenticator-and-authorizer.md +++ b/docs/keystone-auth/using-keystone-webhook-authenticator-and-authorizer.md @@ -252,7 +252,7 @@ it as a service. There are several things we need to notice in the deployment manifest: - We are using image - `registry.k8s.io/provider-os/k8s-keystone-auth:v1.31.3` + `registry.k8s.io/provider-os/k8s-keystone-auth:v1.31.4` - We use `k8s-auth-policy` configmap created above. - The pod uses service account `keystone-auth` created above. - We use `keystone-auth-certs` secret created above to inject the diff --git a/docs/magnum-auto-healer/using-magnum-auto-healer.md b/docs/magnum-auto-healer/using-magnum-auto-healer.md index a9051cbb83..4909d69055 100644 --- a/docs/magnum-auto-healer/using-magnum-auto-healer.md +++ b/docs/magnum-auto-healer/using-magnum-auto-healer.md @@ -73,7 +73,7 @@ user_id=ceb61464a3d341ebabdf97d1d4b97099 user_project_id=b23a5e41d1af4c20974bf58b4dff8e5a password=password region=RegionOne -image=registry.k8s.io/provider-os/magnum-auto-healer:v1.31.3 +image=registry.k8s.io/provider-os/magnum-auto-healer:v1.31.4 cat < /etc/kubernetes/octavia-ingress-controller/deployment.yaml --- diff --git a/examples/webhook/keystone-deployment.yaml b/examples/webhook/keystone-deployment.yaml index 57ce208b7d..c668b3fa68 100644 --- a/examples/webhook/keystone-deployment.yaml +++ b/examples/webhook/keystone-deployment.yaml @@ -18,7 +18,7 @@ spec: serviceAccountName: k8s-keystone containers: - name: k8s-keystone-auth - image: registry.k8s.io/provider-os/k8s-keystone-auth:v1.31.3 + image: registry.k8s.io/provider-os/k8s-keystone-auth:v1.31.4 args: - ./bin/k8s-keystone-auth - --tls-cert-file diff --git a/go.mod b/go.mod index f16b23fc22..072701b8e4 100644 --- a/go.mod +++ b/go.mod @@ -1,10 +1,10 @@ module k8s.io/cloud-provider-openstack -go 1.22.0 +go 1.23.11 require ( github.com/container-storage-interface/spec v1.9.0 - github.com/go-chi/chi/v5 v5.0.8 + github.com/go-chi/chi/v5 v5.2.2 github.com/gophercloud/gophercloud/v2 v2.0.0 github.com/gophercloud/utils/v2 v2.0.0-20240701101423-2401526caee5 github.com/hashicorp/go-version v1.6.0 @@ -29,31 +29,33 @@ require ( gopkg.in/gcfg.v1 v1.2.3 gopkg.in/godo.v2 v2.0.9 gopkg.in/yaml.v2 v2.4.0 - k8s.io/api v0.31.6 - k8s.io/apimachinery v0.31.6 - k8s.io/apiserver v0.31.6 - k8s.io/client-go v0.31.6 - k8s.io/cloud-provider v0.31.6 - k8s.io/component-base v0.31.6 + k8s.io/api v0.31.11 + k8s.io/apimachinery v0.31.11 + k8s.io/apiserver v0.31.11 + k8s.io/client-go v0.31.11 + k8s.io/cloud-provider v0.31.11 + k8s.io/component-base v0.31.11 k8s.io/klog/v2 v2.130.1 - k8s.io/kms v0.31.6 - k8s.io/kubernetes v1.31.6 - k8s.io/mount-utils v0.31.6 + k8s.io/kms v0.31.11 + k8s.io/kubernetes v1.31.11 + k8s.io/mount-utils v0.31.11 k8s.io/utils v0.0.0-20241210054802-24370beab758 software.sslmate.com/src/go-pkcs12 v0.5.0 ) // the below fixes the "go list -m all" execution replace ( - k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.31.6 - k8s.io/dynamic-resource-allocation => k8s.io/dynamic-resource-allocation v0.31.6 - k8s.io/endpointslice => k8s.io/endpointslice v0.31.6 - k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.31.6 - k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.31.6 - k8s.io/kube-proxy => k8s.io/kube-proxy v0.31.6 - k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.31.6 - k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.31.6 - k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.31.6 + k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.31.11 + k8s.io/cri-client => k8s.io/cri-client v0.31.11 + k8s.io/dynamic-resource-allocation => k8s.io/dynamic-resource-allocation v0.31.11 + k8s.io/endpointslice => k8s.io/endpointslice v0.31.11 + k8s.io/externaljwt => k8s.io/externaljwt v0.31.11 + k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.31.11 + k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.31.11 + k8s.io/kube-proxy => k8s.io/kube-proxy v0.31.11 + k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.31.11 + k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.31.11 + k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.31.11 ) require ( @@ -156,14 +158,14 @@ require ( gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/apiextensions-apiserver v0.31.6 // indirect - k8s.io/component-helpers v0.31.6 // indirect - k8s.io/controller-manager v0.31.6 // indirect - k8s.io/csi-translation-lib v0.31.6 // indirect + k8s.io/apiextensions-apiserver v0.31.11 // indirect + k8s.io/component-helpers v0.31.11 // indirect + k8s.io/controller-manager v0.31.11 // indirect + k8s.io/csi-translation-lib v0.31.11 // indirect k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect - k8s.io/kubectl v0.31.6 // indirect - k8s.io/kubelet v0.31.6 // indirect - k8s.io/pod-security-admission v0.31.6 // indirect + k8s.io/kubectl v0.31.11 // indirect + k8s.io/kubelet v0.31.11 // indirect + k8s.io/pod-security-admission v0.31.11 // indirect sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.30.3 // 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/go.sum b/go.sum index bc5d4403c4..8825e45669 100644 --- a/go.sum +++ b/go.sum @@ -113,8 +113,8 @@ github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyT github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-chi/chi/v5 v5.0.8 h1:lD+NLqFcAi1ovnVZpsnObHGW4xb4J8lNmoYVfECH1Y0= -github.com/go-chi/chi/v5 v5.0.8/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/go-chi/chi/v5 v5.2.2 h1:CMwsvRVTbXVytCk1Wd72Zy1LAsAh9GxMmSNWLHCG618= +github.com/go-chi/chi/v5 v5.2.2/go.mod h1:L2yAIGWB3H+phAw1NxKwWM+7eUH/lU8pOMm5hHcoops= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -835,43 +835,43 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.31.6 h1:ocWG/UhC9Mqp5oEfYWy9wCddbZiZyBAFTlBt0LVlhDg= -k8s.io/api v0.31.6/go.mod h1:i16xSiKMgVIVhsJMxfWq0mJbXA+Z7KhjPgYmwT41hl4= -k8s.io/apiextensions-apiserver v0.31.6 h1:v9sqyWlrgFZpAPdEb/bEiXfM98TfSppwRF0X/uWKXh0= -k8s.io/apiextensions-apiserver v0.31.6/go.mod h1:QVH3CFwqzGZtwsxPYzJlA/Qiwgb5FXmRMGls3CjzvbI= -k8s.io/apimachinery v0.31.6 h1:Pn96A0wHD0X8+l7QTdAzdLQPrpav1s8rU6A+v2/9UEY= -k8s.io/apimachinery v0.31.6/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo= -k8s.io/apiserver v0.31.6 h1:FEhEGLsz1PbMOHeQZDbOUlMh36zRZbjgKwJCoMhdGmw= -k8s.io/apiserver v0.31.6/go.mod h1:dpFh+xqFQ02O8vLYCIqoiV7sJIpZsUULeNuag6Y9HGo= -k8s.io/client-go v0.31.6 h1:51HT40qVIZ13BrHKeWxFuU52uoPnFhxTYJnv4+LTgp4= -k8s.io/client-go v0.31.6/go.mod h1:MEq7JQJelUQ0/4fMoPEUrc/OOFyGo/9LmGA38H6O6xY= -k8s.io/cloud-provider v0.31.6 h1:5vVMyf/m/n8ij/GmSJLRcatchmciRr0gs4peBcxqvKk= -k8s.io/cloud-provider v0.31.6/go.mod h1:iT6kIEMEXrTIvRBAaRU5qefRzgPaSV6kwTc6mjhhnEw= -k8s.io/component-base v0.31.6 h1:FgI25PuZtCp2n7AFpOaDpMQOLieFdrpAbpeoZu7VhDI= -k8s.io/component-base v0.31.6/go.mod h1:aVRrh8lAI1kSShFmwcKLhc3msQoUcmFWPBDf0sXaISM= -k8s.io/component-helpers v0.31.6 h1:Af8BcE6pElKlLaerwW9s04jTQVFa66wmI1pkaNfDWzE= -k8s.io/component-helpers v0.31.6/go.mod h1:6CRV6M+7R13eqtz4FBm2ty9eH+QajDcP3y0Bklzh2FA= -k8s.io/controller-manager v0.31.6 h1:HQRUV6nogHo2N7vr3cgVNjZ+wvHIMvxEMjTeCrHitE4= -k8s.io/controller-manager v0.31.6/go.mod h1:0HDNTZVapQFa9G96jNxrU99ht7fQJVEKBXDzqKDMez0= -k8s.io/csi-translation-lib v0.31.6 h1:mBkF3AG8pRcwZv8SY7qT1JWznRsmYjZfT5Lxel9nN4Q= -k8s.io/csi-translation-lib v0.31.6/go.mod h1:I2F51irYJyt78so7wdral65B7PB7jR3keZ2MpB78mWw= +k8s.io/api v0.31.11 h1:jmrs+NBmdyaYMOIhAmi2g2eemugqiMwRSKtdpk0FAFc= +k8s.io/api v0.31.11/go.mod h1:t1/N5KEcY/DCwEzCbtCoJeJt4b00phLCRVgM11Ijb6o= +k8s.io/apiextensions-apiserver v0.31.11 h1:7VSwWgEKI8F4JfX1XLoRV9p5PaSwLUD5BBunq9mk24w= +k8s.io/apiextensions-apiserver v0.31.11/go.mod h1:c9qU0INuaGrRKNeQdyM73GPcgbJmcZeZoDrIT+dLxhs= +k8s.io/apimachinery v0.31.11 h1:QsYPEVrKOTBtuzj0gmfwVkM7RwPB+IbOUceBAuK4ips= +k8s.io/apimachinery v0.31.11/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo= +k8s.io/apiserver v0.31.11 h1:j5K8wj08jZImaZKmmWJg8rlTLL6ewUCW0MSRcBkeOmo= +k8s.io/apiserver v0.31.11/go.mod h1:yGaiSFKV7RXmgxMT9mcBU3hnCl5I63Ala8xM7sCh088= +k8s.io/client-go v0.31.11 h1:uhc+e8vfsGtm9xVoIs0+ajGW0mWNW64VSjej3bXF+WA= +k8s.io/client-go v0.31.11/go.mod h1:y11StjQTOP0nd/o/RHxqwmdr1CWdBvnpvGs9k7MWYnA= +k8s.io/cloud-provider v0.31.11 h1:UAlqOFIHdwCPP/Hvhz46JdgdEYrXaqUFdNXMZkzmsV8= +k8s.io/cloud-provider v0.31.11/go.mod h1:VYXy7JDjEVZKH6vwDR/CqOwDwoK1425ThgIgPruO9jw= +k8s.io/component-base v0.31.11 h1:uPQCr7SJGhk/oFp4YmxG5ctHrDocZRGSOaheFrbAvoM= +k8s.io/component-base v0.31.11/go.mod h1:huE8dXdht4KoOPo8CSb0ifLjpGUc/dh+cmNGplRGZno= +k8s.io/component-helpers v0.31.11 h1:A3UbO910SOVoUmhkbGX8b3V4k5Ed2a02DtNgyTHBtss= +k8s.io/component-helpers v0.31.11/go.mod h1:+APbittkpj1TRGnNiQFUfJvq7zJ0ekvDu7IX+FZpPRg= +k8s.io/controller-manager v0.31.11 h1:zO/+eR9ZpUO7KABQSP5JC++0DnD7x1YrE/NaLcyB9hc= +k8s.io/controller-manager v0.31.11/go.mod h1:E6SvFTBj4QjY8oPDm4omD+u3O+0MPS4dE8flTmp0y0g= +k8s.io/csi-translation-lib v0.31.11 h1:oW9HXySDI3I4JQnH8Y54U3aQQg9GbqkPKPBcTg6NXn0= +k8s.io/csi-translation-lib v0.31.11/go.mod h1:M4nUwDP4AGtoslFXG2Pl/w0q+47j9exBe88xLa04qzk= k8s.io/klog/v2 v2.70.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kms v0.31.6 h1:p7OY+9Hp8nPtgzm0vT9TrERNigQQSu8tkgWqn+GvB2w= -k8s.io/kms v0.31.6/go.mod h1:OZKwl1fan3n3N5FFxnW5C4V3ygrah/3YXeJWS3O6+94= +k8s.io/kms v0.31.11 h1:NjOFtzHMHb8TaxJ2qQNZsFdZ5ofFe8w2HXMjg93dqL0= +k8s.io/kms v0.31.11/go.mod h1:OZKwl1fan3n3N5FFxnW5C4V3ygrah/3YXeJWS3O6+94= k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= -k8s.io/kubectl v0.31.6 h1:ngzql/UugqpEbeeyQX678BlVHXks19JR3CFjwKnWuFI= -k8s.io/kubectl v0.31.6/go.mod h1:m6OXbx9s0sZiaZrfHHSEmJUD5CjWPA5+cVg0GZnVdzM= -k8s.io/kubelet v0.31.6 h1:lxVvyLNDcb/QTpQNkDySk3iscgq4zubeSZs3cF6PmaA= -k8s.io/kubelet v0.31.6/go.mod h1:BPghO52ilF7UzFEVBmYFOxdVtLge0P1gixjz84lBzzc= -k8s.io/kubernetes v1.31.6 h1:zVhgWDFHmIj51o5sNARmjdgNvpq4K2Smya8pS5vxqlc= -k8s.io/kubernetes v1.31.6/go.mod h1:9xmT2buyTYj8TRKwRae7FcuY8k5+xlxv7VivvO0KKfs= -k8s.io/mount-utils v0.31.6 h1:MYRoh63q/fFjSiwPNpDv8H9L1cJDVrSNYzXzNUKANZY= -k8s.io/mount-utils v0.31.6/go.mod h1:HV/VYBUGqYUj4vt82YltzpWvgv8FPg0G9ItyInT3NPU= -k8s.io/pod-security-admission v0.31.6 h1:5WnXyl+UNmQb73O0L1w82uaUEPuvp+sxdhXRiOLdCkY= -k8s.io/pod-security-admission v0.31.6/go.mod h1:b+ZpSSR+XMx3t9Pvy/GdcXoI0CEpiWGT7IGAhcOBcGM= +k8s.io/kubectl v0.31.11 h1:rVr5JrMxSwtteB1n9Dyiy8u5qaRKwuhs7XjhDEpAiE4= +k8s.io/kubectl v0.31.11/go.mod h1:mF36H/0z8PuxC1J3lyLm+ryGuB3nZRwGEnEQ7vpQHYU= +k8s.io/kubelet v0.31.11 h1:HYoj3wiufFOUjIpcCUis+FVxg5AVFInIFLDkL34MaEQ= +k8s.io/kubelet v0.31.11/go.mod h1:nRUoDj5L7pV5uYK0QXjV0Sm3Scxm9S+3bRFhfEjtRa4= +k8s.io/kubernetes v1.31.11 h1:O5iuiUNzOcnhgy4HTYvhyJdGaw8yCFlcuomeojxu2sA= +k8s.io/kubernetes v1.31.11/go.mod h1:9xmT2buyTYj8TRKwRae7FcuY8k5+xlxv7VivvO0KKfs= +k8s.io/mount-utils v0.31.11 h1:gkvBKSlXY7V2hxNDCJZ9kibk6j8qORXDuECw40Mg7h0= +k8s.io/mount-utils v0.31.11/go.mod h1:HV/VYBUGqYUj4vt82YltzpWvgv8FPg0G9ItyInT3NPU= +k8s.io/pod-security-admission v0.31.11 h1:ESxlSHUbvq1v3G1as9uj0NYyIasKeNux0J04Xpn/NRY= +k8s.io/pod-security-admission v0.31.11/go.mod h1:zalSa2Eyl/xf8KY5qd5Z7dpAqJVmr9IJMB4FF6g2owo= k8s.io/utils v0.0.0-20241210054802-24370beab758 h1:sdbE21q2nlQtFh65saZY+rRM6x6aJJI8IUa1AmH/qa0= k8s.io/utils v0.0.0-20241210054802-24370beab758/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= diff --git a/manifests/barbican-kms/ds.yaml b/manifests/barbican-kms/ds.yaml index 70fb6ef485..98e842196d 100644 --- a/manifests/barbican-kms/ds.yaml +++ b/manifests/barbican-kms/ds.yaml @@ -30,7 +30,7 @@ spec: serviceAccountName: cloud-controller-manager containers: - name: barbican-kms - image: registry.k8s.io/provider-os/barbican-kms-plugin:v1.31.3 + image: registry.k8s.io/provider-os/barbican-kms-plugin:v1.31.4 args: - /bin/barbican-kms-plugin - --socketpath=$(KMS_ENDPOINT) diff --git a/manifests/barbican-kms/pod.yaml b/manifests/barbican-kms/pod.yaml index 61cf9af9bb..c6db0386aa 100644 --- a/manifests/barbican-kms/pod.yaml +++ b/manifests/barbican-kms/pod.yaml @@ -5,7 +5,7 @@ metadata: spec: containers: - name: barbican-kms - image: registry.k8s.io/provider-os/barbican-kms-plugin:v1.31.3 + image: registry.k8s.io/provider-os/barbican-kms-plugin:v1.31.4 args: - "--socketpath=/kms/kms.sock" - "--cloud-config=/etc/kubernetes/cloud-config" diff --git a/manifests/cinder-csi-plugin/cinder-csi-controllerplugin.yaml b/manifests/cinder-csi-plugin/cinder-csi-controllerplugin.yaml index 0d66c0d07d..eb5370616e 100644 --- a/manifests/cinder-csi-plugin/cinder-csi-controllerplugin.yaml +++ b/manifests/cinder-csi-plugin/cinder-csi-controllerplugin.yaml @@ -93,7 +93,7 @@ spec: - mountPath: /var/lib/csi/sockets/pluginproxy/ name: socket-dir - name: cinder-csi-plugin - image: registry.k8s.io/provider-os/cinder-csi-plugin:v1.31.3 + image: registry.k8s.io/provider-os/cinder-csi-plugin:v1.31.4 args: - /bin/cinder-csi-plugin - "--endpoint=$(CSI_ENDPOINT)" diff --git a/manifests/cinder-csi-plugin/cinder-csi-nodeplugin.yaml b/manifests/cinder-csi-plugin/cinder-csi-nodeplugin.yaml index 71f4ce7c36..07a1f4211e 100644 --- a/manifests/cinder-csi-plugin/cinder-csi-nodeplugin.yaml +++ b/manifests/cinder-csi-plugin/cinder-csi-nodeplugin.yaml @@ -53,7 +53,7 @@ spec: capabilities: add: ["SYS_ADMIN"] allowPrivilegeEscalation: true - image: registry.k8s.io/provider-os/cinder-csi-plugin:v1.31.3 + image: registry.k8s.io/provider-os/cinder-csi-plugin:v1.31.4 args: - /bin/cinder-csi-plugin - "--endpoint=$(CSI_ENDPOINT)" diff --git a/manifests/controller-manager/openstack-cloud-controller-manager-ds.yaml b/manifests/controller-manager/openstack-cloud-controller-manager-ds.yaml index e6fd868343..9f69cdecf1 100644 --- a/manifests/controller-manager/openstack-cloud-controller-manager-ds.yaml +++ b/manifests/controller-manager/openstack-cloud-controller-manager-ds.yaml @@ -38,7 +38,7 @@ spec: serviceAccountName: cloud-controller-manager containers: - name: openstack-cloud-controller-manager - image: registry.k8s.io/provider-os/openstack-cloud-controller-manager:v1.31.3 + image: registry.k8s.io/provider-os/openstack-cloud-controller-manager:v1.31.4 args: - /bin/openstack-cloud-controller-manager - --v=1 diff --git a/manifests/controller-manager/openstack-cloud-controller-manager-pod.yaml b/manifests/controller-manager/openstack-cloud-controller-manager-pod.yaml index 9bc8ddb82e..97df4d68b4 100644 --- a/manifests/controller-manager/openstack-cloud-controller-manager-pod.yaml +++ b/manifests/controller-manager/openstack-cloud-controller-manager-pod.yaml @@ -11,7 +11,7 @@ metadata: spec: containers: - name: openstack-cloud-controller-manager - image: registry.k8s.io/provider-os/openstack-cloud-controller-manager:v1.31.3 + image: registry.k8s.io/provider-os/openstack-cloud-controller-manager:v1.31.4 args: - /bin/openstack-cloud-controller-manager - --v=1 diff --git a/manifests/magnum-auto-healer/magnum-auto-healer.yaml b/manifests/magnum-auto-healer/magnum-auto-healer.yaml index f460d3e576..2725f6bd1d 100644 --- a/manifests/magnum-auto-healer/magnum-auto-healer.yaml +++ b/manifests/magnum-auto-healer/magnum-auto-healer.yaml @@ -88,7 +88,7 @@ spec: node-role.kubernetes.io/control-plane: "" containers: - name: magnum-auto-healer - image: registry.k8s.io/provider-os/magnum-auto-healer:v1.31.3 + image: registry.k8s.io/provider-os/magnum-auto-healer:v1.31.4 imagePullPolicy: Always args: - /bin/magnum-auto-healer diff --git a/manifests/manila-csi-plugin/csi-controllerplugin.yaml b/manifests/manila-csi-plugin/csi-controllerplugin.yaml index 86a5701e46..7fab7475d8 100644 --- a/manifests/manila-csi-plugin/csi-controllerplugin.yaml +++ b/manifests/manila-csi-plugin/csi-controllerplugin.yaml @@ -77,7 +77,7 @@ spec: capabilities: add: ["SYS_ADMIN"] allowPrivilegeEscalation: true - image: registry.k8s.io/provider-os/manila-csi-plugin:v1.31.3 + image: registry.k8s.io/provider-os/manila-csi-plugin:v1.31.4 command: ["/bin/sh", "-c", '/bin/manila-csi-plugin --nodeid=$(NODE_ID) diff --git a/manifests/manila-csi-plugin/csi-nodeplugin.yaml b/manifests/manila-csi-plugin/csi-nodeplugin.yaml index 1122797280..3c1636e65c 100644 --- a/manifests/manila-csi-plugin/csi-nodeplugin.yaml +++ b/manifests/manila-csi-plugin/csi-nodeplugin.yaml @@ -50,7 +50,7 @@ spec: capabilities: add: ["SYS_ADMIN"] allowPrivilegeEscalation: true - image: registry.k8s.io/provider-os/manila-csi-plugin:v1.31.3 + image: registry.k8s.io/provider-os/manila-csi-plugin:v1.31.4 command: ["/bin/sh", "-c", '/bin/manila-csi-plugin --nodeid=$(NODE_ID) diff --git a/pkg/csi/cinder/openstack/openstack_volumes.go b/pkg/csi/cinder/openstack/openstack_volumes.go index b60dbe6819..fa48816d16 100644 --- a/pkg/csi/cinder/openstack/openstack_volumes.go +++ b/pkg/csi/cinder/openstack/openstack_volumes.go @@ -36,6 +36,7 @@ import ( const ( VolumeAvailableStatus = "available" VolumeInUseStatus = "in-use" + VolumeDetachingStatus = "detaching" operationFinishInitDelay = 1 * time.Second operationFinishFactor = 1.1 operationFinishSteps = 10 @@ -292,6 +293,11 @@ func (os *OpenStack) DetachVolume(instanceID, volumeID string) error { klog.V(2).Infof("volume: %s has been detached from compute: %s ", volume.ID, instanceID) return nil } + // If the volume is already in detaching state, we can return nil + if volume.Status == VolumeDetachingStatus { + klog.V(2).Infof("volume: %s is already in detaching state from compute %s ", volume.ID, instanceID) + return nil + } if volume.Status != VolumeInUseStatus { return fmt.Errorf("can not detach volume %s, its status is %s", volume.Name, volume.Status) diff --git a/pkg/kms/barbican/barbican.go b/pkg/kms/barbican/barbican.go index f56b9a77df..fd94ba1cd4 100644 --- a/pkg/kms/barbican/barbican.go +++ b/pkg/kms/barbican/barbican.go @@ -2,11 +2,13 @@ package barbican import ( "context" + "os" "github.com/gophercloud/gophercloud/v2" "github.com/gophercloud/gophercloud/v2/openstack" "github.com/gophercloud/gophercloud/v2/openstack/keymanager/v1/secrets" "k8s.io/cloud-provider-openstack/pkg/client" + "k8s.io/klog/v2" ) type KMSOpts struct { @@ -26,6 +28,17 @@ type Barbican struct { // NewBarbicanClient creates new BarbicanClient func NewBarbicanClient(cfg Config) (*gophercloud.ServiceClient, error) { + if cfg.Global.UseClouds { + if cfg.Global.CloudsFile != "" { + os.Setenv("OS_CLIENT_CONFIG_FILE", cfg.Global.CloudsFile) + } + if err := client.ReadClouds(&cfg.Global); err != nil { + return nil, err + } + klog.V(5).Infof("Config, loaded from the %s:", cfg.Global.CloudsFile) + client.LogCfg(cfg.Global) + } + provider, err := client.NewOpenStackClient(&cfg.Global, "barbican-kms-plugin") if err != nil { return nil, err diff --git a/pkg/openstack/loadbalancer.go b/pkg/openstack/loadbalancer.go index bf24306e44..d391370623 100644 --- a/pkg/openstack/loadbalancer.go +++ b/pkg/openstack/loadbalancer.go @@ -1515,9 +1515,9 @@ func (lbaas *LbaasV2) makeSvcConf(serviceName string, service *corev1.Service, s svcConf.nodeSelectors = getKeyValueFromServiceAnnotation(service, ServiceAnnotationLoadBalancerNodeSelector, lbaas.opts.NodeSelector) for key, value := range svcConf.nodeSelectors { if value == "" { - klog.V(3).InfoS("Target node label %s key is set to LoadBalancer service %s", key, serviceName) + klog.V(3).Infof("Target node label %s key is set to LoadBalancer service %s", key, serviceName) } else { - klog.V(3).InfoS("Target node label %s=%s is set to LoadBalancer service %s", key, value, serviceName) + klog.V(3).Infof("Target node label %s=%s is set to LoadBalancer service %s", key, value, serviceName) } } diff --git a/tests/ci-csi-cinder-e2e.sh b/tests/ci-csi-cinder-e2e.sh index 2c5bbfe33d..a1e0bbfca1 100755 --- a/tests/ci-csi-cinder-e2e.sh +++ b/tests/ci-csi-cinder-e2e.sh @@ -41,6 +41,24 @@ cleanup() { } trap cleanup EXIT +# Install Ansible from Trixie (Debian Testing) to allow us to talk to a host +# running Python 3.12 like Ubuntu 24.04 +# +# https://woju.eu/blog/2025/03/ansible-bookworm/ +cat << EOF > /etc/apt/sources.list.d/trixie.list +deb https://deb.debian.org/debian trixie main +EOF + +cat << EOF > /etc/apt/preferences.d/ansible.pref +Package: * +Pin: release n=trixie +Pin-Priority: -10 + +Package: ansible* python3-netaddr +Pin: release n=trixie +Pin-Priority: 990 +EOF + apt-get update apt-get install -y python3-requests ansible diff --git a/tests/ci-csi-manila-e2e.sh b/tests/ci-csi-manila-e2e.sh index 7b285320ea..d6be16b35c 100755 --- a/tests/ci-csi-manila-e2e.sh +++ b/tests/ci-csi-manila-e2e.sh @@ -41,6 +41,24 @@ cleanup() { } trap cleanup EXIT +# Install Ansible from Trixie (Debian Testing) to allow us to talk to a host +# running Python 3.12 like Ubuntu 24.04 +# +# https://woju.eu/blog/2025/03/ansible-bookworm/ +cat << EOF > /etc/apt/sources.list.d/trixie.list +deb https://deb.debian.org/debian trixie main +EOF + +cat << EOF > /etc/apt/preferences.d/ansible.pref +Package: * +Pin: release n=trixie +Pin-Priority: -10 + +Package: ansible* python3-netaddr +Pin: release n=trixie +Pin-Priority: 990 +EOF + apt-get update apt-get install -y python3-requests ansible diff --git a/tests/ci-occm-e2e.sh b/tests/ci-occm-e2e.sh index 4e60b2d363..230f74b4bd 100755 --- a/tests/ci-occm-e2e.sh +++ b/tests/ci-occm-e2e.sh @@ -42,6 +42,24 @@ cleanup() { } trap cleanup EXIT +# Install Ansible from Trixie (Debian Testing) to allow us to talk to a host +# running Python 3.12 like Ubuntu 24.04 +# +# https://woju.eu/blog/2025/03/ansible-bookworm/ +cat << EOF > /etc/apt/sources.list.d/trixie.list +deb https://deb.debian.org/debian trixie main +EOF + +cat << EOF > /etc/apt/preferences.d/ansible.pref +Package: * +Pin: release n=trixie +Pin-Priority: -10 + +Package: ansible* python3-netaddr +Pin: release n=trixie +Pin-Priority: 990 +EOF + apt-get update apt-get install -y python3-requests ansible @@ -133,4 +151,4 @@ scp -i ~/.ssh/google_compute_engine \ # If Boskos is being used then release the resource back to Boskos. [ -z "${BOSKOS_HOST:-}" ] || python3 tests/scripts/boskos.py --release >> "$ARTIFACTS/logs/boskos.log" 2>&1 -exit ${exit_code} \ No newline at end of file +exit ${exit_code} diff --git a/tests/playbooks/roles/install-cpo-occm/tasks/main.yaml b/tests/playbooks/roles/install-cpo-occm/tasks/main.yaml index c8cbc304cf..cfd889da1b 100644 --- a/tests/playbooks/roles/install-cpo-occm/tasks/main.yaml +++ b/tests/playbooks/roles/install-cpo-occm/tasks/main.yaml @@ -128,7 +128,7 @@ msg: *failmsg - name: Run functional tests for openstack-cloud-controller-manager - when: run_e2e + when: run_e2e | bool register: run_tests shell: executable: /bin/bash @@ -145,7 +145,7 @@ - name: Print logs for debugging when: - - run_e2e + - run_e2e | bool - run_tests.failed block: - name: Show openstack-cloud-controller-manager pod logs diff --git a/tests/playbooks/roles/install-csi-cinder/tasks/main.yaml b/tests/playbooks/roles/install-csi-cinder/tasks/main.yaml index 1e5b7735da..23354effea 100644 --- a/tests/playbooks/roles/install-csi-cinder/tasks/main.yaml +++ b/tests/playbooks/roles/install-csi-cinder/tasks/main.yaml @@ -187,14 +187,16 @@ -storage.testdriver=tests/e2e/csi/cinder/test-driver.yaml \ --ginkgo.focus='External.Storage' \ --ginkgo.skip='\[Disruptive\]|\[Testpattern:\s+Dynamic\s+PV\s+\(default\s+fs\)\]\s+provisioning\s+should\s+mount\s+multiple\s+PV\s+pointing\s+to\s+the\s+same\s+storage\s+on\s+the\s+same\s+node|\[Testpattern:\s+Dynamic\s+PV\s+\(default\s+fs\)\]\s+provisioning\s+should\s+provision\s+storage\s+with\s+any\s+volume\s+data\s+source\s+\[Serial\]|should\s+support\s+expansion\s+of\s+pvcs\s+created\s+for\s+ephemeral\s+pvcs' \ + --ginkgo.v \ --ginkgo.noColor \ --ginkgo.progress \ - --ginkgo.v \ - --ginkgo.timeout=24h \ + --ginkgo.timeout=1h45m \ -test.timeout=0 \ -report-dir="/var/log/csi-pod" | tee "/var/log/csi-pod/cinder-csi-e2e.log" register: functional_test_result ignore_errors: true + async: 6600 # wait 1h50m (i.e. 5 mins longer than the ginkgo timeout) then fail and fetch the logs + poll: 15 - name: Collect pod logs for debug purpose shell: diff --git a/tests/playbooks/roles/install-csi-manila/tasks/main.yaml b/tests/playbooks/roles/install-csi-manila/tasks/main.yaml index 99fd24d231..9db71c027d 100644 --- a/tests/playbooks/roles/install-csi-manila/tasks/main.yaml +++ b/tests/playbooks/roles/install-csi-manila/tasks/main.yaml @@ -227,21 +227,23 @@ set +x; source {{ devstack_workdir }}/openrc demo demo > /dev/null; set -x cd {{ ansible_user_dir }}/src/k8s.io/cloud-provider-openstack - - # GATEWAY_IP is the default value in devstack mkdir -p /var/log/csi-pod + # GATEWAY_IP is the default value in devstack GATEWAY_IP=172.24.5.1 \ OS_RC={{ devstack_workdir }}/openrc \ go test -v ./cmd/tests/manila-csi-e2e-suite/manila_csi_e2e_suite_test.go \ + --ginkgo.focus="\[manila-csi-e2e\]" \ + --ginkgo.skip="\[Disruptive\]|\[sig-storage\]\s+\[manila-csi-e2e\]\s+CSI\s+Volumes\s+\[Driver:\s+nfs.manila.csi.openstack.org\]\s+\[Testpattern:\s+Dynamic\s+PV\s+\(default\s+fs\)\]\s+provisioning\s+should\s+provision\s+storage\s+with\s+any\s+volume\s+data\s+source\s+\[Serial\]|should\s+provision\s+storage\s+with\s+snapshot\s+data\s+source|restoring\s+snapshot\s+to\s+larger\s+size" \ --ginkgo.v \ --ginkgo.noColor \ --ginkgo.progress \ - --ginkgo.skip="\[Disruptive\]|\[sig-storage\]\s+\[manila-csi-e2e\]\s+CSI\s+Volumes\s+\[Driver:\s+nfs.manila.csi.openstack.org\]\s+\[Testpattern:\s+Dynamic\s+PV\s+\(default\s+fs\)\]\s+provisioning\s+should\s+provision\s+storage\s+with\s+any\s+volume\s+data\s+source\s+\[Serial\]|should\s+provision\s+storage\s+with\s+snapshot\s+data\s+source|restoring\s+snapshot\s+to\s+larger\s+size" \ - --ginkgo.focus="\[manila-csi-e2e\]" \ - -report-dir /var/log/csi-pod \ - -timeout=0 | tee "/var/log/csi-pod/manila-csi-e2e.log" + --ginkgo.timeout=1h45m \ + -timeout=0 \ + -report-dir /var/log/csi-pod | tee "/var/log/csi-pod/manila-csi-e2e.log" register: functional_test_result ignore_errors: true + async: 6600 # wait 1h50m (i.e. 5 mins longer than the ginkgo timeout) then fail and fetch the logs + poll: 15 - name: Collect pod logs for debug purpose shell: diff --git a/tests/playbooks/roles/install-devstack/defaults/main.yaml b/tests/playbooks/roles/install-devstack/defaults/main.yaml index 5812d9c97e..c73699bbd5 100644 --- a/tests/playbooks/roles/install-devstack/defaults/main.yaml +++ b/tests/playbooks/roles/install-devstack/defaults/main.yaml @@ -1,7 +1,7 @@ --- user: "stack" workdir: "/home/{{ user }}/devstack" -branch: "stable/2023.2" +branch: "stable/2025.1" enable_services: - nova - glance @@ -10,6 +10,6 @@ enable_services: - octavia - ovn-octavia - barbican -octavia_amphora_url: "https://tarballs.opendev.org/openstack/octavia/test-images/test-only-amphora-x64-haproxy-ubuntu-jammy.qcow2" +octavia_amphora_url: "https://tarballs.opendev.org/openstack/octavia/test-images/test-only-amphora-x64-haproxy-ubuntu-noble.qcow2" octavia_amphora_dir: /opt/octavia-amphora octavia_amphora_filename: amphora-x64-haproxy.qcow2 diff --git a/tests/playbooks/roles/install-devstack/tasks/main.yml b/tests/playbooks/roles/install-devstack/tasks/main.yml index 1115520321..6a8f07969b 100644 --- a/tests/playbooks/roles/install-devstack/tasks/main.yml +++ b/tests/playbooks/roles/install-devstack/tasks/main.yml @@ -115,3 +115,37 @@ cmd: | set -ex sudo -u {{ user }} -H ./stack.sh + + - name: Create volumev3 service type + shell: + executable: /bin/bash + chdir: "{{ workdir }}" + cmd: | + set -ex + export OS_CLOUD=devstack-admin + if openstack service show volumev3 > /dev/null 2>&1; then + echo "Service volumev3 already exists" + exit 0 + fi + URL="$(openstack endpoint list --service block-storage -f value -c URL || true)" + if [ -z "${URL}" ]; then + exit 0 + fi + openstack service create --name cinder volumev3 + openstack endpoint create --region RegionOne volumev3 public "${URL}" + + # FIXME(stephenfin): We should remove this as soon as [1] merges and we + # bump our dependencies to include it. + # [1] https://github.com/gophercloud/gophercloud/pull/3435 + - name: Delete legacy manila endpoint + shell: + executable: /bin/bash + chdir: "{{ workdir }}" + cmd: | + set -ex + export OS_CLOUD=devstack-admin + + # delete legacy manila API endpoints + if openstack service show manila > /dev/null 2>&1; then + openstack service delete manila + fi diff --git a/tests/playbooks/roles/install-devstack/templates/local.conf.j2 b/tests/playbooks/roles/install-devstack/templates/local.conf.j2 index 6ac3707636..58bc49e563 100644 --- a/tests/playbooks/roles/install-devstack/templates/local.conf.j2 +++ b/tests/playbooks/roles/install-devstack/templates/local.conf.j2 @@ -3,7 +3,6 @@ RECLONE=False HOST_IP={{ local_ip_address }} DEST=/opt/stack DATA_DIR=${DEST}/data -USE_PYTHON3=True LOGFILE=$DEST/logs/stack.sh.log VERBOSE=True LOG_COLOR=False @@ -29,6 +28,7 @@ enable_service n-cond enable_service n-sch enable_service n-api-meta +# Placement enable_service placement-api enable_service placement-client {% endif %} @@ -81,7 +81,6 @@ enable_service o-hk enable_service o-da enable_service o-api -LIBS_FROM_GIT+=,python-octaviaclient DIB_REPOLOCATION_amphora_agent=https://github.com/openstack/octavia.git DIB_REPOLOCATION_octavia_lib=https://github.com/openstack/octavia-lib.git @@ -101,8 +100,6 @@ enable_plugin ovn-octavia-provider https://opendev.org/openstack/ovn-octavia-pro # Barbican enable_plugin barbican ${GIT_BASE}/openstack/barbican.git {{ branch }} enable_service barbican-vault - -LIBS_FROM_GIT+=,python-barbicanclient {% endif %} {% if "manila" in enable_services %} @@ -131,6 +128,16 @@ if [ -f /opt/stack/data/venv/bin/activate ]; then deactivate fi +{% if "nova" in enable_services %} +[[post-config|$NOVA_CONF]] +[libvirt] +# Workaround for nova bug #2119114. Until that bug is resolved, Nova will +# always timeout when detaching volumes (which affects deletion of PVCs) +# +# https://bugs.launchpad.net/nova/+bug/2119114 +device_detach_timeout = 1 +{% endif %} + {% if "glance" in enable_services %} [[post-config|$GLANCE_API_CONF]] [glance_store] diff --git a/tests/playbooks/test-occm-e2e.yaml b/tests/playbooks/test-occm-e2e.yaml index af5a3cd61e..058796b03c 100644 --- a/tests/playbooks/test-occm-e2e.yaml +++ b/tests/playbooks/test-occm-e2e.yaml @@ -25,5 +25,5 @@ - role: install-k3s worker_node_count: 0 - role: install-cpo-occm - run_e2e: "{{ run_e2e }}" + run_e2e: "{{ run_e2e | bool }}" octavia_provider: "{{ octavia_provider }}" diff --git a/tests/scripts/create-gce-vm.sh b/tests/scripts/create-gce-vm.sh index ad0e90fb7f..9f861e665b 100755 --- a/tests/scripts/create-gce-vm.sh +++ b/tests/scripts/create-gce-vm.sh @@ -91,17 +91,18 @@ main() { case "${FLAVOR}" in "default") - if ! gcloud compute disks describe devstack-${FLAVOR} --zone "${GCP_ZONE}" > /dev/null 2>&1; + local disk_name="devstack-${FLAVOR}-ubuntu2404" + if ! gcloud compute disks describe "${disk_name}" --zone "${GCP_ZONE}" > /dev/null 2>&1; then - gcloud compute disks create devstack-${FLAVOR} \ + gcloud compute disks create "${disk_name}" \ --image-project ubuntu-os-cloud --image-family ubuntu-2404-lts-amd64 \ --zone "${GCP_ZONE}" fi - if ! gcloud compute images describe devstack-${FLAVOR} > /dev/null 2>&1; + if ! gcloud compute images describe "${disk_name}" > /dev/null 2>&1; then - gcloud compute images create devstack-${FLAVOR} \ - --source-disk devstack-${FLAVOR} --source-disk-zone "${GCP_ZONE}" \ + gcloud compute images create "${disk_name}" \ + --source-disk "${disk_name}" --source-disk-zone "${GCP_ZONE}" \ --licenses "https://www.googleapis.com/compute/v1/projects/vm-options/global/licenses/enable-vmx" fi ;; @@ -115,7 +116,7 @@ main() { then gcloud compute instances create devstack \ --zone "${GCP_ZONE}" \ - --image devstack-${FLAVOR} \ + --image "${disk_name}" \ --boot-disk-size 30G \ --boot-disk-type pd-ssd \ --can-ip-forward \ diff --git a/tools/csi-deps-check.sh b/tools/csi-deps-check.sh index 097c409e39..80b3b1baba 100755 --- a/tools/csi-deps-check.sh +++ b/tools/csi-deps-check.sh @@ -21,6 +21,7 @@ set -o errexit # This utils are using by # go mod k8s.io/mount-utils +/bin/sh -c true /bin/mount -V /bin/umount -V /sbin/blkid -V diff --git a/tools/csi-deps.sh b/tools/csi-deps.sh index d902ef62a8..a78f8d6a78 100755 --- a/tools/csi-deps.sh +++ b/tools/csi-deps.sh @@ -62,6 +62,10 @@ else mkdir -p ${DEST}/lib64 && cp -Lv /lib64/ld-linux-*.so.* ${DEST}/lib64/ fi +# Copy POSIX shell +copy_deps /bin/dash +copy_deps /bin/sh + # To collect dmesg logs copy_deps /usr/bin/dmesg || true copy_deps /bin/dmesg || true diff --git a/vendor/github.com/go-chi/chi/v5/CHANGELOG.md b/vendor/github.com/go-chi/chi/v5/CHANGELOG.md index a1feeec055..25b45b9743 100644 --- a/vendor/github.com/go-chi/chi/v5/CHANGELOG.md +++ b/vendor/github.com/go-chi/chi/v5/CHANGELOG.md @@ -1,5 +1,26 @@ # Changelog +## v5.0.12 (2024-02-16) + +- History of changes: see https://github.com/go-chi/chi/compare/v5.0.11...v5.0.12 + + +## v5.0.11 (2023-12-19) + +- History of changes: see https://github.com/go-chi/chi/compare/v5.0.10...v5.0.11 + + +## v5.0.10 (2023-07-13) + +- Fixed small edge case in tests of v5.0.9 for older Go versions +- History of changes: see https://github.com/go-chi/chi/compare/v5.0.9...v5.0.10 + + +## v5.0.9 (2023-07-13) + +- History of changes: see https://github.com/go-chi/chi/compare/v5.0.8...v5.0.9 + + ## v5.0.8 (2022-12-07) - History of changes: see https://github.com/go-chi/chi/compare/v5.0.7...v5.0.8 @@ -90,14 +111,14 @@ incremental, with the architecture and api being the same today as it was origin makes chi a pretty easy project to maintain, as well thanks to the many amazing community contributions over the years to who all help make chi better (total of 86 contributors to date -- thanks all!). -Chi has been an labour of love, art and engineering, with the goals to offer beautiful ergonomics, flexibility, performance +Chi has been a labour of love, art and engineering, with the goals to offer beautiful ergonomics, flexibility, performance and simplicity when building HTTP services with Go. I've strived to keep the router very minimal in surface area / code size, and always improving the code wherever possible -- and as of today the `chi` package is just 1082 lines of code (not counting middlewares, which are all optional). As well, I don't have the exact metrics, but from my analysis and email exchanges from companies and developers, chi is used by thousands of projects around the world -- thank you all as there is no better form of joy for me than to have art I had started be helpful and enjoyed by others. And of course I use chi in all of my own projects too :) -For me, the asthetics of chi's code and usage are very important. With the introduction of Go's module support +For me, the aesthetics of chi's code and usage are very important. With the introduction of Go's module support (which I'm a big fan of), chi's past versioning scheme choice to v2, v3 and v4 would mean I'd require the import path of "github.com/go-chi/chi/v4", leading to the lengthy discussion at https://github.com/go-chi/chi/issues/462. Haha, to some, you may be scratching your head why I've spent > 1 year stalling to adopt "/vXX" convention in the import @@ -289,13 +310,13 @@ Cheers all, happy coding! ## v2.0.0-rc1 (2016-07-26) -- Huge update! chi v2 is a large refactor targetting Go 1.7+. As of Go 1.7, the popular +- Huge update! chi v2 is a large refactor targeting Go 1.7+. As of Go 1.7, the popular community `"net/context"` package has been included in the standard library as `"context"` and utilized by `"net/http"` and `http.Request` to managing deadlines, cancelation signals and other request-scoped values. We're very excited about the new context addition and are proud to introduce chi v2, a minimal and powerful routing package for building large HTTP services, with zero external dependencies. Chi focuses on idiomatic design and encourages the use of - stdlib HTTP handlers and middlwares. + stdlib HTTP handlers and middlewares. - chi v2 deprecates its `chi.Handler` interface and requires `http.Handler` or `http.HandlerFunc` - chi v2 stores URL routing parameters and patterns in the standard request context: `r.Context()` - chi v2 lower-level routing context is accessible by `chi.RouteContext(r.Context()) *chi.Context`, diff --git a/vendor/github.com/go-chi/chi/v5/CONTRIBUTING.md b/vendor/github.com/go-chi/chi/v5/CONTRIBUTING.md index c0ac2dfe85..b4a6268d57 100644 --- a/vendor/github.com/go-chi/chi/v5/CONTRIBUTING.md +++ b/vendor/github.com/go-chi/chi/v5/CONTRIBUTING.md @@ -14,7 +14,7 @@ A typical workflow is: -1. [Fork the repository.][fork] [This tip maybe also helpful.][go-fork-tip] +1. [Fork the repository.][fork] 2. [Create a topic branch.][branch] 3. Add tests for your change. 4. Run `go test`. If your tests pass, return to the step 3. @@ -24,8 +24,8 @@ A typical workflow is: 8. [Submit a pull request.][pull-req] [go-install]: https://golang.org/doc/install -[go-fork-tip]: http://blog.campoy.cat/2014/03/github-and-go-forking-pull-requests-and.html -[fork]: https://help.github.com/articles/fork-a-repo -[branch]: http://learn.github.com/p/branching.html -[git-help]: https://guides.github.com -[pull-req]: https://help.github.com/articles/using-pull-requests +[fork]: https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/fork-a-repo +[branch]: https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-branches +[git-help]: https://docs.github.com/en +[pull-req]: https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests + diff --git a/vendor/github.com/go-chi/chi/v5/README.md b/vendor/github.com/go-chi/chi/v5/README.md index 3e4cc4a2e1..c58a0e20ce 100644 --- a/vendor/github.com/go-chi/chi/v5/README.md +++ b/vendor/github.com/go-chi/chi/v5/README.md @@ -1,7 +1,7 @@ # chi -[![GoDoc Widget]][GoDoc] [![Travis Widget]][Travis] +[![GoDoc Widget]][GoDoc] `chi` is a lightweight, idiomatic and composable router for building Go HTTP services. It's especially good at helping you write large REST API services that are kept maintainable as your @@ -20,7 +20,9 @@ and [docgen](https://github.com/go-chi/docgen). We hope you enjoy it too! ## Install -`go get -u github.com/go-chi/chi/v5` +```sh +go get -u github.com/go-chi/chi/v5 +``` ## Features @@ -65,7 +67,7 @@ func main() { **REST Preview:** -Here is a little preview of how routing looks like with chi. Also take a look at the generated routing docs +Here is a little preview of what routing looks like with chi. Also take a look at the generated routing docs in JSON ([routes.json](https://github.com/go-chi/chi/blob/master/_examples/rest/routes.json)) and in Markdown ([routes.md](https://github.com/go-chi/chi/blob/master/_examples/rest/routes.md)). @@ -194,7 +196,7 @@ type Router interface { // path, with a fresh middleware stack for the inline-Router. Group(fn func(r Router)) Router - // Route mounts a sub-Router along a `pattern`` string. + // Route mounts a sub-Router along a `pattern` string. Route(pattern string, fn func(r Router)) Router // Mount attaches another http.Handler along ./pattern/* @@ -354,6 +356,7 @@ with `net/http` can be used with chi's mux. | [RouteHeaders] | Route handling for request headers | | [SetHeader] | Short-hand middleware to set a response header key/value | | [StripSlashes] | Strip slashes on routing paths | +| [Sunset] | Sunset set Deprecation/Sunset header to response | | [Throttle] | Puts a ceiling on the number of concurrent requests | | [Timeout] | Signals to the request context when the timeout deadline is reached | | [URLFormat] | Parse extension from url and put it on request context | @@ -380,6 +383,7 @@ with `net/http` can be used with chi's mux. [RouteHeaders]: https://pkg.go.dev/github.com/go-chi/chi/middleware#RouteHeaders [SetHeader]: https://pkg.go.dev/github.com/go-chi/chi/middleware#SetHeader [StripSlashes]: https://pkg.go.dev/github.com/go-chi/chi/middleware#StripSlashes +[Sunset]: https://pkg.go.dev/github.com/go-chi/chi/v5/middleware#Sunset [Throttle]: https://pkg.go.dev/github.com/go-chi/chi/middleware#Throttle [ThrottleBacklog]: https://pkg.go.dev/github.com/go-chi/chi/middleware#ThrottleBacklog [ThrottleWithOpts]: https://pkg.go.dev/github.com/go-chi/chi/middleware#ThrottleWithOpts @@ -467,7 +471,8 @@ how setting context on a request in Go works. * Carl Jackson for https://github.com/zenazn/goji * Parts of chi's thinking comes from goji, and chi's middleware package - sources from goji. + sources from [goji](https://github.com/zenazn/goji/tree/master/web/middleware). + * Please see goji's [LICENSE](https://github.com/zenazn/goji/blob/master/LICENSE) (MIT) * Armon Dadgar for https://github.com/armon/go-radix * Contributions: [@VojtechVitek](https://github.com/VojtechVitek) @@ -494,7 +499,7 @@ Copyright (c) 2015-present [Peter Kieltyka](https://github.com/pkieltyka) Licensed under [MIT License](./LICENSE) -[GoDoc]: https://pkg.go.dev/github.com/go-chi/chi?tab=versions +[GoDoc]: https://pkg.go.dev/github.com/go-chi/chi/v5 [GoDoc Widget]: https://godoc.org/github.com/go-chi/chi?status.svg [Travis]: https://travis-ci.org/go-chi/chi [Travis Widget]: https://travis-ci.org/go-chi/chi.svg?branch=master diff --git a/vendor/github.com/go-chi/chi/v5/SECURITY.md b/vendor/github.com/go-chi/chi/v5/SECURITY.md new file mode 100644 index 0000000000..7e937f87f3 --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/SECURITY.md @@ -0,0 +1,5 @@ +# Reporting Security Issues + +We appreciate your efforts to responsibly disclose your findings, and will make every effort to acknowledge your contributions. + +To report a security issue, please use the GitHub Security Advisory ["Report a Vulnerability"](https://github.com/go-chi/chi/security/advisories/new) tab. diff --git a/vendor/github.com/go-chi/chi/v5/chi.go b/vendor/github.com/go-chi/chi/v5/chi.go index a1691bbeb1..2b6ebd337c 100644 --- a/vendor/github.com/go-chi/chi/v5/chi.go +++ b/vendor/github.com/go-chi/chi/v5/chi.go @@ -37,8 +37,7 @@ // // A placeholder with a name followed by a colon allows a regular // expression match, for example {number:\\d+}. The regular expression -// syntax is Go's normal regexp RE2 syntax, except that regular expressions -// including { or } are not supported, and / will never be +// syntax is Go's normal regexp RE2 syntax, except that / will never be // matched. An anonymous regexp pattern is allowed, using an empty string // before the colon in the placeholder, such as {:\\d+} // @@ -51,7 +50,7 @@ // "/user/{name}" matches "/user/jsmith" but not "/user/jsmith/info" or "/user/jsmith/" // "/user/{name}/info" matches "/user/jsmith/info" // "/page/*" matches "/page/intro/latest" -// "/page/{other}/index" also matches "/page/intro/latest" +// "/page/{other}/latest" also matches "/page/intro/latest" // "/date/{yyyy:\\d\\d\\d\\d}/{mm:\\d\\d}/{dd:\\d\\d}" matches "/date/2017/04/01" package chi @@ -127,6 +126,10 @@ type Routes interface { // the method/path - similar to routing a http request, but without // executing the handler thereafter. Match(rctx *Context, method, path string) bool + + // Find searches the routing tree for the pattern that matches + // the method/path. + Find(rctx *Context, method, path string) string } // Middlewares type is a slice of standard middleware handlers with methods diff --git a/vendor/github.com/go-chi/chi/v5/context.go b/vendor/github.com/go-chi/chi/v5/context.go index e78a2385d8..aacf6eff72 100644 --- a/vendor/github.com/go-chi/chi/v5/context.go +++ b/vendor/github.com/go-chi/chi/v5/context.go @@ -60,7 +60,7 @@ type Context struct { URLParams RouteParams // Route parameters matched for the current sub-router. It is - // intentionally unexported so it cant be tampered. + // intentionally unexported so it can't be tampered. routeParams RouteParams // The endpoint routing pattern that matched the request URI path @@ -74,7 +74,7 @@ type Context struct { // patterns across a stack of sub-routers. RoutePatterns []string - // methodNotAllowed hint + methodsAllowed []methodTyp // allowed methods in case of a 405 methodNotAllowed bool } @@ -91,6 +91,7 @@ func (x *Context) Reset() { x.routeParams.Keys = x.routeParams.Keys[:0] x.routeParams.Values = x.routeParams.Values[:0] x.methodNotAllowed = false + x.methodsAllowed = x.methodsAllowed[:0] x.parentCtx = nil } @@ -108,22 +109,27 @@ func (x *Context) URLParam(key string) string { // RoutePattern builds the routing pattern string for the particular // request, at the particular point during routing. This means, the value // will change throughout the execution of a request in a router. That is -// why its advised to only use this value after calling the next handler. +// why it's advised to only use this value after calling the next handler. // // For example, // -// func Instrument(next http.Handler) http.Handler { -// return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { -// next.ServeHTTP(w, r) -// routePattern := chi.RouteContext(r.Context()).RoutePattern() -// measure(w, r, routePattern) -// }) -// } +// func Instrument(next http.Handler) http.Handler { +// return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { +// next.ServeHTTP(w, r) +// routePattern := chi.RouteContext(r.Context()).RoutePattern() +// measure(w, r, routePattern) +// }) +// } func (x *Context) RoutePattern() string { + if x == nil { + return "" + } routePattern := strings.Join(x.RoutePatterns, "") routePattern = replaceWildcards(routePattern) - routePattern = strings.TrimSuffix(routePattern, "//") - routePattern = strings.TrimSuffix(routePattern, "/") + if routePattern != "/" { + routePattern = strings.TrimSuffix(routePattern, "//") + routePattern = strings.TrimSuffix(routePattern, "/") + } return routePattern } diff --git a/vendor/github.com/go-chi/chi/v5/mux.go b/vendor/github.com/go-chi/chi/v5/mux.go index 47e64cf296..f1266971b4 100644 --- a/vendor/github.com/go-chi/chi/v5/mux.go +++ b/vendor/github.com/go-chi/chi/v5/mux.go @@ -107,12 +107,22 @@ func (mx *Mux) Use(middlewares ...func(http.Handler) http.Handler) { // Handle adds the route `pattern` that matches any http method to // execute the `handler` http.Handler. func (mx *Mux) Handle(pattern string, handler http.Handler) { + if method, rest, found := strings.Cut(pattern, " "); found { + mx.Method(method, rest, handler) + return + } + mx.handle(mALL, pattern, handler) } // HandleFunc adds the route `pattern` that matches any http method to // execute the `handlerFn` http.HandlerFunc. func (mx *Mux) HandleFunc(pattern string, handlerFn http.HandlerFunc) { + if method, rest, found := strings.Cut(pattern, " "); found { + mx.Method(method, rest, handlerFn) + return + } + mx.handle(mALL, pattern, handlerFn) } @@ -156,7 +166,7 @@ func (mx *Mux) Head(pattern string, handlerFn http.HandlerFunc) { mx.handle(mHEAD, pattern, handlerFn) } -// Options adds the route `pattern` that matches a OPTIONS http method to +// Options adds the route `pattern` that matches an OPTIONS http method to // execute the `handlerFn` http.HandlerFunc. func (mx *Mux) Options(pattern string, handlerFn http.HandlerFunc) { mx.handle(mOPTIONS, pattern, handlerFn) @@ -250,20 +260,19 @@ func (mx *Mux) With(middlewares ...func(http.Handler) http.Handler) Router { return im } -// Group creates a new inline-Mux with a fresh middleware stack. It's useful +// Group creates a new inline-Mux with a copy of middleware stack. It's useful // for a group of handlers along the same routing path that use an additional // set of middlewares. See _examples/. func (mx *Mux) Group(fn func(r Router)) Router { - im := mx.With().(*Mux) + im := mx.With() if fn != nil { fn(im) } return im } -// Route creates a new Mux with a fresh middleware stack and mounts it -// along the `pattern` as a subrouter. Effectively, this is a short-hand -// call to Mount. See _examples/. +// Route creates a new Mux and mounts it along the `pattern` as a subrouter. +// Effectively, this is a short-hand call to Mount. See _examples/. func (mx *Mux) Route(pattern string, fn func(r Router)) Router { if fn == nil { panic(fmt.Sprintf("chi: attempting to Route() a nil subrouter on '%s'", pattern)) @@ -352,19 +361,40 @@ func (mx *Mux) Middlewares() Middlewares { // Note: the *Context state is updated during execution, so manage // the state carefully or make a NewRouteContext(). func (mx *Mux) Match(rctx *Context, method, path string) bool { + return mx.Find(rctx, method, path) != "" +} + +// Find searches the routing tree for the pattern that matches +// the method/path. +// +// Note: the *Context state is updated during execution, so manage +// the state carefully or make a NewRouteContext(). +func (mx *Mux) Find(rctx *Context, method, path string) string { m, ok := methodMap[method] if !ok { - return false + return "" } - node, _, h := mx.tree.FindRoute(rctx, m, path) + node, _, _ := mx.tree.FindRoute(rctx, m, path) + pattern := rctx.routePattern + + if node != nil { + if node.subroutes == nil { + e := node.endpoints[m] + return e.pattern + } - if node != nil && node.subroutes != nil { rctx.RoutePath = mx.nextRoutePath(rctx) - return node.subroutes.Match(rctx, method, rctx.RoutePath) + subPattern := node.subroutes.Find(rctx, method, rctx.RoutePath) + if subPattern == "" { + return "" + } + + pattern = strings.TrimSuffix(pattern, "/*") + pattern += subPattern } - return h != nil + return pattern } // NotFoundHandler returns the default Mux 404 responder whenever a route @@ -378,11 +408,11 @@ func (mx *Mux) NotFoundHandler() http.HandlerFunc { // MethodNotAllowedHandler returns the default Mux 405 responder whenever // a method cannot be resolved for a route. -func (mx *Mux) MethodNotAllowedHandler() http.HandlerFunc { +func (mx *Mux) MethodNotAllowedHandler(methodsAllowed ...methodTyp) http.HandlerFunc { if mx.methodNotAllowedHandler != nil { return mx.methodNotAllowedHandler } - return methodNotAllowedHandler + return methodNotAllowedHandler(methodsAllowed...) } // handle registers a http.Handler in the routing tree for a particular http method @@ -441,11 +471,15 @@ func (mx *Mux) routeHTTP(w http.ResponseWriter, r *http.Request) { // Find the route if _, _, h := mx.tree.FindRoute(rctx, method, routePath); h != nil { + if supportsPathValue { + setPathValue(rctx, r) + } + h.ServeHTTP(w, r) return } if rctx.methodNotAllowed { - mx.MethodNotAllowedHandler().ServeHTTP(w, r) + mx.MethodNotAllowedHandler(rctx.methodsAllowed...).ServeHTTP(w, r) } else { mx.NotFoundHandler().ServeHTTP(w, r) } @@ -480,8 +514,14 @@ func (mx *Mux) updateRouteHandler() { } // methodNotAllowedHandler is a helper function to respond with a 405, -// method not allowed. -func methodNotAllowedHandler(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(405) - w.Write(nil) +// method not allowed. It sets the Allow header with the list of allowed +// methods for the route. +func methodNotAllowedHandler(methodsAllowed ...methodTyp) func(w http.ResponseWriter, r *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + for _, m := range methodsAllowed { + w.Header().Add("Allow", reverseMethodMap[m]) + } + w.WriteHeader(405) + w.Write(nil) + } } diff --git a/vendor/github.com/go-chi/chi/v5/path_value.go b/vendor/github.com/go-chi/chi/v5/path_value.go new file mode 100644 index 0000000000..77c840f019 --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/path_value.go @@ -0,0 +1,21 @@ +//go:build go1.22 && !tinygo +// +build go1.22,!tinygo + + +package chi + +import "net/http" + +// supportsPathValue is true if the Go version is 1.22 and above. +// +// If this is true, `net/http.Request` has methods `SetPathValue` and `PathValue`. +const supportsPathValue = true + +// setPathValue sets the path values in the Request value +// based on the provided request context. +func setPathValue(rctx *Context, r *http.Request) { + for i, key := range rctx.URLParams.Keys { + value := rctx.URLParams.Values[i] + r.SetPathValue(key, value) + } +} diff --git a/vendor/github.com/go-chi/chi/v5/path_value_fallback.go b/vendor/github.com/go-chi/chi/v5/path_value_fallback.go new file mode 100644 index 0000000000..749a8520a7 --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/path_value_fallback.go @@ -0,0 +1,19 @@ +//go:build !go1.22 || tinygo +// +build !go1.22 tinygo + +package chi + +import "net/http" + +// supportsPathValue is true if the Go version is 1.22 and above. +// +// If this is true, `net/http.Request` has methods `SetPathValue` and `PathValue`. +const supportsPathValue = false + +// setPathValue sets the path values in the Request value +// based on the provided request context. +// +// setPathValue is only supported in Go 1.22 and above so +// this is just a blank function so that it compiles. +func setPathValue(rctx *Context, r *http.Request) { +} diff --git a/vendor/github.com/go-chi/chi/v5/tree.go b/vendor/github.com/go-chi/chi/v5/tree.go index 4189b5228b..85fcfdbb8d 100644 --- a/vendor/github.com/go-chi/chi/v5/tree.go +++ b/vendor/github.com/go-chi/chi/v5/tree.go @@ -43,6 +43,18 @@ var methodMap = map[string]methodTyp{ http.MethodTrace: mTRACE, } +var reverseMethodMap = map[methodTyp]string{ + mCONNECT: http.MethodConnect, + mDELETE: http.MethodDelete, + mGET: http.MethodGet, + mHEAD: http.MethodHead, + mOPTIONS: http.MethodOptions, + mPATCH: http.MethodPatch, + mPOST: http.MethodPost, + mPUT: http.MethodPut, + mTRACE: http.MethodTrace, +} + // RegisterMethod adds support for custom HTTP method handlers, available // via Router#Method and Router#MethodFunc func RegisterMethod(method string) { @@ -454,6 +466,13 @@ func (n *node) findRoute(rctx *Context, method methodTyp, path string) *node { return xn } + for endpoints := range xn.endpoints { + if endpoints == mALL || endpoints == mSTUB { + continue + } + rctx.methodsAllowed = append(rctx.methodsAllowed, endpoints) + } + // flag that the routing context found a route, but not a corresponding // supported method rctx.methodNotAllowed = true @@ -493,6 +512,13 @@ func (n *node) findRoute(rctx *Context, method methodTyp, path string) *node { return xn } + for endpoints := range xn.endpoints { + if endpoints == mALL || endpoints == mSTUB { + continue + } + rctx.methodsAllowed = append(rctx.methodsAllowed, endpoints) + } + // flag that the routing context found a route, but not a corresponding // supported method rctx.methodNotAllowed = true @@ -704,11 +730,9 @@ func patNextSegment(pattern string) (nodeTyp, string, string, byte, int, int) { tail = pattern[pe] } - var rexpat string - if idx := strings.Index(key, ":"); idx >= 0 { + key, rexpat, isRegexp := strings.Cut(key, ":") + if isRegexp { nt = ntRegexp - rexpat = key[idx+1:] - key = key[:idx] } if len(rexpat) > 0 { diff --git a/vendor/k8s.io/apiserver/pkg/storage/etcd3/watcher.go b/vendor/k8s.io/apiserver/pkg/storage/etcd3/watcher.go index 536f2e1c08..4bc3a45dee 100644 --- a/vendor/k8s.io/apiserver/pkg/storage/etcd3/watcher.go +++ b/vendor/k8s.io/apiserver/pkg/storage/etcd3/watcher.go @@ -438,7 +438,12 @@ func (wc *watchChan) serialProcessEvents(wg *sync.WaitGroup) { for { select { case e := <-wc.incomingEventChan: - res := wc.transform(e) + res, err := wc.transform(e) + if err != nil { + wc.sendError(err) + return + } + if res == nil { continue } @@ -461,10 +466,8 @@ func (wc *watchChan) serialProcessEvents(wg *sync.WaitGroup) { func (wc *watchChan) concurrentProcessEvents(wg *sync.WaitGroup) { p := concurrentOrderedEventProcessing{ - input: wc.incomingEventChan, - processFunc: wc.transform, - output: wc.resultChan, - processingQueue: make(chan chan *watch.Event, processEventConcurrency-1), + wc: wc, + processingQueue: make(chan chan *processingResult, processEventConcurrency-1), objectType: wc.watcher.objectType, groupResource: wc.watcher.groupResource, @@ -481,12 +484,15 @@ func (wc *watchChan) concurrentProcessEvents(wg *sync.WaitGroup) { }() } +type processingResult struct { + event *watch.Event + err error +} + type concurrentOrderedEventProcessing struct { - input chan *event - processFunc func(*event) *watch.Event - output chan watch.Event + wc *watchChan - processingQueue chan chan *watch.Event + processingQueue chan chan *processingResult // Metadata for logging objectType string groupResource schema.GroupResource @@ -498,28 +504,29 @@ func (p *concurrentOrderedEventProcessing) scheduleEventProcessing(ctx context.C select { case <-ctx.Done(): return - case e = <-p.input: + case e = <-p.wc.incomingEventChan: } - processingResponse := make(chan *watch.Event, 1) + processingResponse := make(chan *processingResult, 1) select { case <-ctx.Done(): return case p.processingQueue <- processingResponse: } wg.Add(1) - go func(e *event, response chan<- *watch.Event) { + go func(e *event, response chan<- *processingResult) { defer wg.Done() + responseEvent, err := p.wc.transform(e) select { case <-ctx.Done(): - case response <- p.processFunc(e): + case response <- &processingResult{event: responseEvent, err: err}: } }(e, processingResponse) } } func (p *concurrentOrderedEventProcessing) collectEventProcessing(ctx context.Context) { - var processingResponse chan *watch.Event - var e *watch.Event + var processingResponse chan *processingResult + var r *processingResult for { select { case <-ctx.Done(): @@ -529,21 +536,25 @@ func (p *concurrentOrderedEventProcessing) collectEventProcessing(ctx context.Co select { case <-ctx.Done(): return - case e = <-processingResponse: + case r = <-processingResponse: } - if e == nil { + if r.err != nil { + p.wc.sendError(r.err) + return + } + if r.event == nil { continue } - if len(p.output) == cap(p.output) { - klog.V(3).InfoS("Fast watcher, slow processing. Probably caused by slow dispatching events to watchers", "outgoingEvents", outgoingBufSize, "objectType", p.objectType, "groupResource", p.groupResource) + if len(p.wc.resultChan) == cap(p.wc.resultChan) { + klog.V(3).InfoS("Fast watcher, slow processing. Probably caused by slow dispatching events to watchers", "outgoingEvents", outgoingBufSize, "objectType", p.wc.watcher.objectType, "groupResource", p.wc.watcher.groupResource) } // If user couldn't receive results fast enough, we also block incoming events from watcher. // Because storing events in local will cause more memory usage. // The worst case would be closing the fast watcher. select { - case <-ctx.Done(): + case p.wc.resultChan <- *r.event: + case <-p.wc.ctx.Done(): return - case p.output <- *e: } } } @@ -561,12 +572,11 @@ func (wc *watchChan) acceptAll() bool { } // transform transforms an event into a result for user if not filtered. -func (wc *watchChan) transform(e *event) (res *watch.Event) { +func (wc *watchChan) transform(e *event) (res *watch.Event, err error) { curObj, oldObj, err := wc.prepareObjs(e) if err != nil { klog.Errorf("failed to prepare current and previous objects: %v", err) - wc.sendError(err) - return nil + return nil, err } switch { @@ -574,12 +584,11 @@ func (wc *watchChan) transform(e *event) (res *watch.Event) { object := wc.watcher.newFunc() if err := wc.watcher.versioner.UpdateObject(object, uint64(e.rev)); err != nil { klog.Errorf("failed to propagate object version: %v", err) - return nil + return nil, fmt.Errorf("failed to propagate object resource version: %w", err) } if e.isInitialEventsEndBookmark { if err := storage.AnnotateInitialEventsEndBookmark(object); err != nil { - wc.sendError(fmt.Errorf("error while accessing object's metadata gr: %v, type: %v, obj: %#v, err: %v", wc.watcher.groupResource, wc.watcher.objectType, object, err)) - return nil + return nil, fmt.Errorf("error while accessing object's metadata gr: %v, type: %v, obj: %#v, err: %w", wc.watcher.groupResource, wc.watcher.objectType, object, err) } } res = &watch.Event{ @@ -588,7 +597,7 @@ func (wc *watchChan) transform(e *event) (res *watch.Event) { } case e.isDeleted: if !wc.filter(oldObj) { - return nil + return nil, nil } res = &watch.Event{ Type: watch.Deleted, @@ -596,7 +605,7 @@ func (wc *watchChan) transform(e *event) (res *watch.Event) { } case e.isCreated: if !wc.filter(curObj) { - return nil + return nil, nil } res = &watch.Event{ Type: watch.Added, @@ -608,7 +617,7 @@ func (wc *watchChan) transform(e *event) (res *watch.Event) { Type: watch.Modified, Object: curObj, } - return res + return res, nil } curObjPasses := wc.filter(curObj) oldObjPasses := wc.filter(oldObj) @@ -630,7 +639,7 @@ func (wc *watchChan) transform(e *event) (res *watch.Event) { } } } - return res + return res, nil } func transformErrorToEvent(err error) *watch.Event { diff --git a/vendor/k8s.io/component-base/metrics/prometheus/slis/routes.go b/vendor/k8s.io/component-base/metrics/prometheus/slis/routes.go index 4e88b7c24a..a88607fa50 100644 --- a/vendor/k8s.io/component-base/metrics/prometheus/slis/routes.go +++ b/vendor/k8s.io/component-base/metrics/prometheus/slis/routes.go @@ -38,8 +38,8 @@ type SLIMetrics struct{} func (s SLIMetrics) Install(m mux) { installOnce.Do(func() { Register(Registry) - m.Handle("/metrics/slis", metrics.HandlerFor(Registry, metrics.HandlerOpts{})) }) + m.Handle("/metrics/slis", metrics.HandlerFor(Registry, metrics.HandlerOpts{})) } type SLIMetricsWithReset struct{} @@ -48,6 +48,6 @@ type SLIMetricsWithReset struct{} func (s SLIMetricsWithReset) Install(m mux) { installWithResetOnce.Do(func() { Register(Registry) - m.Handle("/metrics/slis", metrics.HandlerWithReset(Registry, metrics.HandlerOpts{})) }) + m.Handle("/metrics/slis", metrics.HandlerWithReset(Registry, metrics.HandlerOpts{})) } diff --git a/vendor/k8s.io/kubernetes/pkg/features/kube_features.go b/vendor/k8s.io/kubernetes/pkg/features/kube_features.go index 1156442802..66adabcd8b 100644 --- a/vendor/k8s.io/kubernetes/pkg/features/kube_features.go +++ b/vendor/k8s.io/kubernetes/pkg/features/kube_features.go @@ -546,6 +546,12 @@ const ( // Permits kubelet to run with swap enabled. NodeSwap featuregate.Feature = "NodeSwap" + // owner: @cici37 + // kep: https://kep.k8s.io/5080 + // + // Enables ordered namespace deletion. + OrderedNamespaceDeletion featuregate.Feature = "OrderedNamespaceDeletion" + // owner: @mortent, @atiratree, @ravig // kep: http://kep.k8s.io/3018 // alpha: v1.26 @@ -1137,6 +1143,8 @@ var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureS NodeSwap: {Default: true, PreRelease: featuregate.Beta}, + OrderedNamespaceDeletion: {Default: false, PreRelease: featuregate.Beta}, + PDBUnhealthyPodEvictionPolicy: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.33 PersistentVolumeLastPhaseTransitionTime: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.33 diff --git a/vendor/k8s.io/kubernetes/pkg/volume/util/resize_util.go b/vendor/k8s.io/kubernetes/pkg/volume/util/resize_util.go index 2bf54b4b85..599f220976 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/util/resize_util.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/util/resize_util.go @@ -236,6 +236,27 @@ func MarkFSResizeFinished( return updatedPVC, err } +func MarkNodeExpansionFinishedWithRecovery( + pvc *v1.PersistentVolumeClaim, + newSize resource.Quantity, + kubeClient clientset.Interface) (*v1.PersistentVolumeClaim, error) { + newPVC := pvc.DeepCopy() + + newPVC.Status.Capacity[v1.ResourceStorage] = newSize + + allocatedResourceStatusMap := newPVC.Status.AllocatedResourceStatuses + delete(allocatedResourceStatusMap, v1.ResourceStorage) + if len(allocatedResourceStatusMap) == 0 { + newPVC.Status.AllocatedResourceStatuses = nil + } else { + newPVC.Status.AllocatedResourceStatuses = allocatedResourceStatusMap + } + + newPVC = MergeResizeConditionOnPVC(newPVC, []v1.PersistentVolumeClaimCondition{}, false /* keepOldResizeConditions */) + updatedPVC, err := PatchPVCStatus(pvc /*oldPVC*/, newPVC, kubeClient) + return updatedPVC, err +} + // MarkNodeExpansionInfeasible marks a PVC for node expansion as failed. Kubelet should not retry expansion // of volumes which are in failed state. func MarkNodeExpansionInfeasible(pvc *v1.PersistentVolumeClaim, kubeClient clientset.Interface, err error) (*v1.PersistentVolumeClaim, error) { diff --git a/vendor/k8s.io/kubernetes/test/e2e/feature/feature.go b/vendor/k8s.io/kubernetes/test/e2e/feature/feature.go index a3aaf16509..24c6a93b26 100644 --- a/vendor/k8s.io/kubernetes/test/e2e/feature/feature.go +++ b/vendor/k8s.io/kubernetes/test/e2e/feature/feature.go @@ -251,6 +251,10 @@ var ( // TODO: document the feature (owning SIG, when to use this feature for a test) NodeOutOfServiceVolumeDetach = framework.WithFeature(framework.ValidFeatures.Add("NodeOutOfServiceVolumeDetach")) + // Owner: sig-api-machinery + // Marks tests that enforce ordered namespace deletion. + OrderedNamespaceDeletion = framework.WithFeature(framework.ValidFeatures.Add("OrderedNamespaceDeletion")) + // Owner: sig-network // Marks a single test that tests cluster DNS performance with many services. PerformanceDNS = framework.WithFeature(framework.ValidFeatures.Add("PerformanceDNS")) diff --git a/vendor/k8s.io/kubernetes/test/utils/image/manifest.go b/vendor/k8s.io/kubernetes/test/utils/image/manifest.go index bfed292325..eafaa37c2b 100644 --- a/vendor/k8s.io/kubernetes/test/utils/image/manifest.go +++ b/vendor/k8s.io/kubernetes/test/utils/image/manifest.go @@ -229,7 +229,7 @@ func initImageConfigs(list RegistryList) (map[ImageID]Config, map[ImageID]Config configs[BusyBox] = Config{list.PromoterE2eRegistry, "busybox", "1.36.1-1"} configs[CudaVectorAdd] = Config{list.PromoterE2eRegistry, "cuda-vector-add", "1.0"} configs[CudaVectorAdd2] = Config{list.PromoterE2eRegistry, "cuda-vector-add", "2.3"} - configs[DistrolessIptables] = Config{list.BuildImageRegistry, "distroless-iptables", "v0.5.13"} + configs[DistrolessIptables] = Config{list.BuildImageRegistry, "distroless-iptables", "v0.6.11"} configs[Etcd] = Config{list.GcEtcdRegistry, "etcd", "3.5.15-0"} configs[Httpd] = Config{list.PromoterE2eRegistry, "httpd", "2.4.38-4"} configs[HttpdNew] = Config{list.PromoterE2eRegistry, "httpd", "2.4.39-4"} diff --git a/vendor/modules.txt b/vendor/modules.txt index ec4852134b..07d6578d17 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -56,8 +56,8 @@ github.com/fsnotify/fsnotify # github.com/fxamacker/cbor/v2 v2.7.0 ## explicit; go 1.17 github.com/fxamacker/cbor/v2 -# github.com/go-chi/chi/v5 v5.0.8 -## explicit; go 1.14 +# github.com/go-chi/chi/v5 v5.2.2 +## explicit; go 1.20 github.com/go-chi/chi/v5 # github.com/go-logr/logr v1.4.2 ## explicit; go 1.18 @@ -774,7 +774,7 @@ gopkg.in/yaml.v2 # gopkg.in/yaml.v3 v3.0.1 ## explicit gopkg.in/yaml.v3 -# k8s.io/api v0.31.6 +# k8s.io/api v0.31.11 ## explicit; go 1.22.0 k8s.io/api/admission/v1 k8s.io/api/admission/v1beta1 @@ -834,12 +834,12 @@ k8s.io/api/storage/v1 k8s.io/api/storage/v1alpha1 k8s.io/api/storage/v1beta1 k8s.io/api/storagemigration/v1alpha1 -# k8s.io/apiextensions-apiserver v0.31.6 +# k8s.io/apiextensions-apiserver v0.31.11 ## explicit; go 1.22.0 k8s.io/apiextensions-apiserver/pkg/apis/apiextensions k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1 k8s.io/apiextensions-apiserver/pkg/features -# k8s.io/apimachinery v0.31.6 +# k8s.io/apimachinery v0.31.11 ## explicit; go 1.22.0 k8s.io/apimachinery/pkg/api/equality k8s.io/apimachinery/pkg/api/errors @@ -906,7 +906,7 @@ k8s.io/apimachinery/pkg/watch k8s.io/apimachinery/third_party/forked/golang/json k8s.io/apimachinery/third_party/forked/golang/netutil k8s.io/apimachinery/third_party/forked/golang/reflect -# k8s.io/apiserver v0.31.6 +# k8s.io/apiserver v0.31.11 ## explicit; go 1.22.0 k8s.io/apiserver/pkg/admission k8s.io/apiserver/pkg/admission/configuration @@ -1057,7 +1057,7 @@ k8s.io/apiserver/plugin/pkg/audit/webhook k8s.io/apiserver/plugin/pkg/authenticator/token/webhook k8s.io/apiserver/plugin/pkg/authorizer/webhook k8s.io/apiserver/plugin/pkg/authorizer/webhook/metrics -# k8s.io/client-go v0.31.6 +# k8s.io/client-go v0.31.11 ## explicit; go 1.22.0 k8s.io/client-go/applyconfigurations k8s.io/client-go/applyconfigurations/admissionregistration/v1 @@ -1404,7 +1404,7 @@ k8s.io/client-go/util/keyutil k8s.io/client-go/util/retry k8s.io/client-go/util/watchlist k8s.io/client-go/util/workqueue -# k8s.io/cloud-provider v0.31.6 +# k8s.io/cloud-provider v0.31.11 ## explicit; go 1.22.0 k8s.io/cloud-provider k8s.io/cloud-provider/api @@ -1425,7 +1425,7 @@ k8s.io/cloud-provider/names k8s.io/cloud-provider/node/helpers k8s.io/cloud-provider/options k8s.io/cloud-provider/service/helpers -# k8s.io/component-base v0.31.6 +# k8s.io/component-base v0.31.11 ## explicit; go 1.22.0 k8s.io/component-base/cli k8s.io/component-base/cli/flag @@ -1456,14 +1456,14 @@ k8s.io/component-base/tracing k8s.io/component-base/tracing/api/v1 k8s.io/component-base/version k8s.io/component-base/version/verflag -# k8s.io/component-helpers v0.31.6 +# k8s.io/component-helpers v0.31.11 ## explicit; go 1.22.0 k8s.io/component-helpers/node/util k8s.io/component-helpers/node/util/sysctl k8s.io/component-helpers/scheduling/corev1 k8s.io/component-helpers/scheduling/corev1/nodeaffinity k8s.io/component-helpers/storage/ephemeral -# k8s.io/controller-manager v0.31.6 +# k8s.io/controller-manager v0.31.11 ## explicit; go 1.22.0 k8s.io/controller-manager/app k8s.io/controller-manager/config @@ -1480,7 +1480,7 @@ k8s.io/controller-manager/pkg/informerfactory k8s.io/controller-manager/pkg/leadermigration k8s.io/controller-manager/pkg/leadermigration/config k8s.io/controller-manager/pkg/leadermigration/options -# k8s.io/csi-translation-lib v0.31.6 +# k8s.io/csi-translation-lib v0.31.11 ## explicit; go 1.22.0 k8s.io/csi-translation-lib k8s.io/csi-translation-lib/plugins @@ -1495,7 +1495,7 @@ k8s.io/klog/v2/internal/severity k8s.io/klog/v2/internal/sloghandler k8s.io/klog/v2/internal/verbosity k8s.io/klog/v2/textlogger -# k8s.io/kms v0.31.6 +# k8s.io/kms v0.31.11 ## explicit; go 1.22.0 k8s.io/kms/apis/v1beta1 k8s.io/kms/apis/v2 @@ -1522,14 +1522,14 @@ k8s.io/kube-openapi/pkg/validation/errors k8s.io/kube-openapi/pkg/validation/spec k8s.io/kube-openapi/pkg/validation/strfmt k8s.io/kube-openapi/pkg/validation/strfmt/bson -# k8s.io/kubectl v0.31.6 +# k8s.io/kubectl v0.31.11 ## explicit; go 1.22.0 k8s.io/kubectl/pkg/scale k8s.io/kubectl/pkg/util/podutils -# k8s.io/kubelet v0.31.6 +# k8s.io/kubelet v0.31.11 ## explicit; go 1.22.0 k8s.io/kubelet/pkg/apis -# k8s.io/kubernetes v1.31.6 +# k8s.io/kubernetes v1.31.11 ## explicit; go 1.22.0 k8s.io/kubernetes/pkg/api/legacyscheme k8s.io/kubernetes/pkg/api/service @@ -1598,10 +1598,10 @@ k8s.io/kubernetes/test/utils k8s.io/kubernetes/test/utils/format k8s.io/kubernetes/test/utils/image k8s.io/kubernetes/test/utils/kubeconfig -# k8s.io/mount-utils v0.31.6 +# k8s.io/mount-utils v0.31.11 ## explicit; go 1.22.0 k8s.io/mount-utils -# k8s.io/pod-security-admission v0.31.6 +# k8s.io/pod-security-admission v0.31.11 ## explicit; go 1.22.0 k8s.io/pod-security-admission/api k8s.io/pod-security-admission/policy @@ -1651,12 +1651,14 @@ sigs.k8s.io/yaml/goyaml.v2 ## explicit; go 1.19 software.sslmate.com/src/go-pkcs12 software.sslmate.com/src/go-pkcs12/internal/rc2 -# k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.31.6 -# k8s.io/dynamic-resource-allocation => k8s.io/dynamic-resource-allocation v0.31.6 -# k8s.io/endpointslice => k8s.io/endpointslice v0.31.6 -# k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.31.6 -# k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.31.6 -# k8s.io/kube-proxy => k8s.io/kube-proxy v0.31.6 -# k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.31.6 -# k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.31.6 -# k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.31.6 +# k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.31.11 +# k8s.io/cri-client => k8s.io/cri-client v0.31.11 +# k8s.io/dynamic-resource-allocation => k8s.io/dynamic-resource-allocation v0.31.11 +# k8s.io/endpointslice => k8s.io/endpointslice v0.31.11 +# k8s.io/externaljwt => k8s.io/externaljwt v0.31.11 +# k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.31.11 +# k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.31.11 +# k8s.io/kube-proxy => k8s.io/kube-proxy v0.31.11 +# k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.31.11 +# k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.31.11 +# k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.31.11