diff --git a/CHANGELOG/CHANGELOG-0.6.md b/CHANGELOG/CHANGELOG-0.6.md new file mode 100644 index 000000000..e421d8512 --- /dev/null +++ b/CHANGELOG/CHANGELOG-0.6.md @@ -0,0 +1,42 @@ +# v0.6.0 - Changelog Since v0.5.0 + +## Breaking Changes + +- Some of the API objects in the deployment specs have changed names/labels/namespaces, please tear down old driver before deploying this version to avoid orphaning old objects. You will also no longer see the driver in the `default` namespace. +- Some error codes have been changed, please see below for details if you rely on specific error codes of the driver + +## New Features + +- Add support for Raw Block devices. ([#283](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/283), [@davidz627](https://github.com/davidz627)) +- Operations in the node driver are now parallelized, except those involving a volume already being operated on now return an error. ([#303](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/303), [@hantaowang](https://github.com/hantaowang)) +- Adds support for ControllerExpandVolume and NodeExpandVolume ([#317](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/317), [@davidz627](https://github.com/davidz627)) +- Operations in the controller driver on a volume already being operated on now return an error. ([#316](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/316), [@hantaowang](https://github.com/hantaowang)) +- Picking up support for inline volume migration and some fixes for backward compatible access modes for migration ([#324](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/324), [@davidz627](https://github.com/davidz627)) + + +## Bug Fixes + +- Reduces node attach limits by 1 since the node boot disk is considered an attachable disk ([#361](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/361), [@davidz627](https://github.com/davidz627)) +- Fixed a bug that causes disks in the same zone/region to be provisioned serially ([#344](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/344), [@hantaowang](https://github.com/hantaowang)) +- Remove cross validation of access modes, multiple access modes can be specified that represent all the capabilities of the volume ([#289](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/289), [@davidz627](https://github.com/davidz627)) +- Driver should check socket parent directory before trying to bind it ([#339](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/339), [@zhucan](https://github.com/zhucan)) +- Updated CSI Attacher to stop ignoring errors from ControllerUnpublish ([#378](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/378), [@davidz627](https://github.com/davidz627)) +- CreateVolume will now fail with NOT_FOUND error when VolumeContentSource SnapshotId does not refer to a snapshot that can be found ([#312](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/312), [@davidz627](https://github.com/davidz627)) +- ControllerUnpublishVolume now returns success when the Node is GCE API NotFound. +Invalid format VolumeID is now GRPC InvalidArgument error instead of GRPC NotFound. +Underspecified disks not found in any zone now return GRPC NotFound. ([#368](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/368), [@davidz627](https://github.com/davidz627)) + + +## Other Notable Changes + +- Deployment spec updates: +The deployment is no longer in namespace `default` +Changed "app" label key to "k8s-app" +csi-snapshotter version has been changed to v1.2.0-gke.0 +The resizer role binding has been renamed to "csi-controller-resizer-binding" +Removed driver-registrar role. ([#364](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/364), [@verult](https://github.com/verult)) +- Updating the following image versions in stable deployment specs: +gcp-compute-persistent-disk-csi-driver: v0.6.0-gke.0 +csi-provisioner: v1.4.0-gke.0 +csi-attacher: v2.0.0-gke.0 +csi-node-driver-registrar: v1.2.0-gke.0 ([#400](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/400), [@verult](https://github.com/verult)) \ No newline at end of file diff --git a/CHANGELOG/CHANGELOG-0.7.md b/CHANGELOG/CHANGELOG-0.7.md new file mode 100644 index 000000000..2adf2695d --- /dev/null +++ b/CHANGELOG/CHANGELOG-0.7.md @@ -0,0 +1,33 @@ +# v0.7.0 - Changelog Since v0.6.0 + +## Changes with Action Required + +- Adding `PodSecurityPoliciy` to allow `csi-gce-pd-node` in clusters with policies enabled. +IF LOCAL PSP MANIFEST PATCH IS USED PLEASE BEWARE THAT YOU WILL NEED TO DELETE LOCAL CHANGES AND USE THE UPSTREAM ([#448](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/448), [@ffilippopoulos](https://github.com/ffilippopoulos)) +- BREAKING CHANGE: All deployment objects in setup-cluster.yaml have been renamed. When deleting the deployment using ./delete-driver.sh, make sure to use specs from your previous deployment version to ensure the correct objects are cleaned up. ([#405](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/405), [@verult](https://github.com/verult)) + +## New Features + +- Add GET_VOLUME_STATS Node Service Capability and implementation for getting stats for volume ([#406](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/406), [@davidz627](https://github.com/davidz627)) +- ValidateVolumeCapabilities validates that the given volume conforms to all capabilities in the request. Validation of existing volumes during inserts also improved to check all parameters. ([#467](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/467), [@davidz627](https://github.com/davidz627)) +- It is now possible to disable the controller service by setting `--run-controller-service=false`. Similarly, it is possible to disable the node service by setting `--run-node-service=false`. The latter enables running the controller server of the GCE PD driver separately/outside of the cluster it is serving. Also, if both `project-id` and `zone` are specified in the GCE cloud config then the controller server does no longer try to contact the GCE metadata service. ([#449](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/449), [@rfranzke](https://github.com/rfranzke)) +- Add support for formatting and mounting an XFS filesystem ([#447](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/447), [@davidz627](https://github.com/davidz627)) +- Add a blanket toleration to the Node Daemonset of the driver deployment so that it can be deployed on all nodes ([#417](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/417), [@davidz627](https://github.com/davidz627)) +- Adds LIST_VOLUMES and LIST_VOLUMES_PUBLISHED_NODES capabilities with respective functionality ([#392](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/392), [@davidz627](https://github.com/davidz627)) + + +## Bug Fixes + +- Fixed bug where ControllerExpandVolume was returning incorrect size when disk was already the requested size or larger ([#462](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/462), [@davidz627](https://github.com/davidz627)) +- Set volume limits to 15 only for machine-types: "f1-micro", "g1-small", "e2-micro", "e2-small", "e2-medium". Limit is 127 for all others ([#455](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/455), [@davidz627](https://github.com/davidz627)) +- Changed deployment of Controller and Node components to use hostNetwork for compatibility with GKE Workload Identity ([#436](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/436), [@davidz627](https://github.com/davidz627)) +- During NodeStageVolume run udevadm --trigger to fix device symlinks if device path is not found or device path points to the wrong device ([#459](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/459), [@davidz627](https://github.com/davidz627)) +- Bump external-snapshotter version to v1.2.2 for fix of CVE-2019-11255 ([#434](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/434), [@davidz627](https://github.com/davidz627)) + + +## Other Notable Changes + +- Update driver base image distro to debian-amd64:v2.0.0 and build with go v1.13.4 ([#439](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/439), [@davidz627](https://github.com/davidz627)) +- Mounting an unformatted volume with an fstype as read-only now throws a more descriptive error ([#458](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/458), [@davidz627](https://github.com/davidz627)) +- Remove explicit stripping of secrets from RPC request/response logs since the driver doesn't accept secrets for operations ([#428](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/428), [@davidz627](https://github.com/davidz627)) +- Improve driver logs to log success in all paths as well as logging additional useful information ([#409](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/409), [@davidz627](https://github.com/davidz627)) \ No newline at end of file diff --git a/CHANGELOG/CHANGELOG-1.0.md b/CHANGELOG/CHANGELOG-1.0.md new file mode 100644 index 000000000..ad4c87639 --- /dev/null +++ b/CHANGELOG/CHANGELOG-1.0.md @@ -0,0 +1,359 @@ +# v1.0.4 - Changelog since v1.0.2 + +### Other + +- Fix build for various go versions, ([#832](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/832), [@mattcary](https://github.com/mattcary)) + +# v1.0.3 - **Bad tag, skipped** + +# v1.0.2 - Changelog since v1.0.1 + +### Bug or Regression + +- Update base image to buster-v.1.9.0 ([#829](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/829), [@mattcary](https://github.com/mattcary)) + +## Dependencies + +### Added +_Nothing has changed._ + +### Changed +_Nothing has changed._ + +### Removed +_Nothing has changed._ + +# v1.0.1 - Changelog since v1.0.0 + +## Changes by Kind + +### Other (Cleanup or Flake) + +- Update GCE PD CSI Driver Docker base image to `k8s.gcr.io/build-image/debian-base-amd64:v2.1.3` (previously `gcr.io/google-containers/debian-base-amd64:v2.0.0`) to address CVEs. ([#598](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/598), [@saad-ali](https://github.com/saad-ali)) + +## Dependencies + +### Added +_Nothing has changed._ + +### Changed +_Nothing has changed._ + +### Removed +_Nothing has changed._ + +# v1.0.0 - Changelog since v0.7.0 + +## Changes by Kind + +### Feature + +- Add support for multi-writer raw block devices. ([#415](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/415), [@sschmitt](https://github.com/sschmitt)) +- Enable CSI Snapshotter (2.x) side car for PD CSI driver ([#500](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/500), [@saikat-royc](https://github.com/saikat-royc)) +- Enable CSI snapshotter side car (beta) for PD CSI driver. ([#507](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/507), [@saikat-royc](https://github.com/saikat-royc)) +- Increase sidecar operation timeout for stable overlay ([#577](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/577), [@saikat-royc](https://github.com/saikat-royc)) +- Provisioned GCE PD Description will contain JSON with information about what PVC/PV disk was created for (similar to volumes provisioned by in-tree GCE PD plugin). This feature requires the `--extra-create-metadata` flag to be set on the CSI external-provisioner. ([#570](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/570), [@saad-ali](https://github.com/saad-ali)) +- The driver deployment now has leader election enabled, and the controller deployment uses a Deployment instead of a StatefulSet. ([#521](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/521), [@verult](https://github.com/verult)) +- Updating the following image versions in stable deployment specs: + - csi-provisioner: v1.6.0-gke.0 + - csi-attacher: v2.2.0-gke.0 + - csi-node-driver-registrar: v1.3.0-gke.0 + - csi-resizer: v0.5.0-gke.0 ([#517](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/517), [@verult](https://github.com/verult)) +- Add Windows support in GCE PD driver with the use of csi-proxy (https://github.com/kubernetes-csi/csi-proxy/). ([#483](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/483), [@jingxu97](https://github.com/jingxu97)) +- Adds new build rules using docker buildx feature for allowing to build windows container image on either windows or linux node. ([#489](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/489), [@jingxu97](https://github.com/jingxu97)) +- Install CSIDriver object as part of driver deployment. ([#575](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/575), [@Jiawei0227](https://github.com/Jiawei0227)) + +### Bug or Regression + +- Increase provisioner and attacher op timeout to reduce retries ([#542](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/542), [@saikat-royc](https://github.com/saikat-royc)) +- Fixed issue where provisioning of GCE PDs with CMEK used to sometimes fails with `disk already exists with same name` error. ([#563](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/563), [@saad-ali](https://github.com/saad-ali)) +- Honor image-type in GKE cluster deploy ([#536](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/536), [@saikat-royc](https://github.com/saikat-royc)) +- In GCE PersistentDisk CSI Driver CreateVolume call, wait for disk to reach a READY status, before returning success to caller. ([#527](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/527), [@saikat-royc](https://github.com/saikat-royc)) +- Skip NodeExpandVolume for block volumes. ([#571](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/571), [@saad-ali](https://github.com/saad-ali)) + +### Failing Test + +- Add autorepair options for GKE release channel ([#538](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/538), [@saikat-royc](https://github.com/saikat-royc)) +- Disable the optional capability to handle volume in user errors for staging-head PD driver. ([#540](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/540), [@saikat-royc](https://github.com/saikat-royc)) +- Add hook to deploy GKE with GCE PD CSI driver, and run kubernetes e2e tests against the managed driver ([#515](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/515), [@saikat-royc](https://github.com/saikat-royc)) +- Enable PD CSI snapshot tests for release-staging-head and release-staging-rc ([#505](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/505), [@saikat-royc](https://github.com/saikat-royc)) + +### Documentation + +- Update documentation and user guides for beta snapshotter ([#508](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/508), [@saikat-royc](https://github.com/saikat-royc)) + + +## Dependencies + +### Added +- bitbucket.org/bertimus9/systemstat: 0eeff89 +- github.com/Azure/go-autorest/autorest/adal: [v0.5.0](https://github.com/Azure/go-autorest/autorest/adal/tree/v0.5.0) +- github.com/Azure/go-autorest/autorest/date: [v0.1.0](https://github.com/Azure/go-autorest/autorest/date/tree/v0.1.0) +- github.com/Azure/go-autorest/autorest/mocks: [v0.2.0](https://github.com/Azure/go-autorest/autorest/mocks/tree/v0.2.0) +- github.com/Azure/go-autorest/autorest/to: [v0.2.0](https://github.com/Azure/go-autorest/autorest/to/tree/v0.2.0) +- github.com/Azure/go-autorest/autorest/validation: [v0.1.0](https://github.com/Azure/go-autorest/autorest/validation/tree/v0.1.0) +- github.com/Azure/go-autorest/autorest: [v0.9.0](https://github.com/Azure/go-autorest/autorest/tree/v0.9.0) +- github.com/Azure/go-autorest/logger: [v0.1.0](https://github.com/Azure/go-autorest/logger/tree/v0.1.0) +- github.com/Azure/go-autorest/tracing: [v0.5.0](https://github.com/Azure/go-autorest/tracing/tree/v0.5.0) +- github.com/JeffAshton/win_pdh: [76bb4ee](https://github.com/JeffAshton/win_pdh/tree/76bb4ee) +- github.com/MakeNowJust/heredoc: [bb23615](https://github.com/MakeNowJust/heredoc/tree/bb23615) +- github.com/Microsoft/hcsshim: [672e52e](https://github.com/Microsoft/hcsshim/tree/672e52e) +- github.com/OpenPeeDeeP/depguard: [v1.0.1](https://github.com/OpenPeeDeeP/depguard/tree/v1.0.1) +- github.com/Rican7/retry: [v0.1.0](https://github.com/Rican7/retry/tree/v0.1.0) +- github.com/StackExchange/wmi: [5d04971](https://github.com/StackExchange/wmi/tree/5d04971) +- github.com/agnivade/levenshtein: [v1.0.1](https://github.com/agnivade/levenshtein/tree/v1.0.1) +- github.com/ajstarks/svgo: [644b8db](https://github.com/ajstarks/svgo/tree/644b8db) +- github.com/andreyvit/diff: [c7f18ee](https://github.com/andreyvit/diff/tree/c7f18ee) +- github.com/anmitsu/go-shlex: [648efa6](https://github.com/anmitsu/go-shlex/tree/648efa6) +- github.com/armon/circbuf: [bbbad09](https://github.com/armon/circbuf/tree/bbbad09) +- github.com/auth0/go-jwt-middleware: [5493cab](https://github.com/auth0/go-jwt-middleware/tree/5493cab) +- github.com/bazelbuild/bazel-gazelle: [70208cb](https://github.com/bazelbuild/bazel-gazelle/tree/70208cb) +- github.com/bazelbuild/rules_go: [6dae44d](https://github.com/bazelbuild/rules_go/tree/6dae44d) +- github.com/bifurcation/mint: [93c51c6](https://github.com/bifurcation/mint/tree/93c51c6) +- github.com/boltdb/bolt: [v1.3.1](https://github.com/boltdb/bolt/tree/v1.3.1) +- github.com/bradfitz/go-smtpd: [deb6d62](https://github.com/bradfitz/go-smtpd/tree/deb6d62) +- github.com/caddyserver/caddy: [v1.0.3](https://github.com/caddyserver/caddy/tree/v1.0.3) +- github.com/cenkalti/backoff: [v2.1.1+incompatible](https://github.com/cenkalti/backoff/tree/v2.1.1) +- github.com/cespare/prettybench: [03b8cfe](https://github.com/cespare/prettybench/tree/03b8cfe) +- github.com/chai2010/gettext-go: [c6fed77](https://github.com/chai2010/gettext-go/tree/c6fed77) +- github.com/checkpoint-restore/go-criu: [17b0214](https://github.com/checkpoint-restore/go-criu/tree/17b0214) +- github.com/cheekybits/genny: [9127e81](https://github.com/cheekybits/genny/tree/9127e81) +- github.com/cilium/ebpf: [95b36a5](https://github.com/cilium/ebpf/tree/95b36a5) +- github.com/clusterhq/flocker-go: [2b8b725](https://github.com/clusterhq/flocker-go/tree/2b8b725) +- github.com/cockroachdb/datadriven: [80d97fb](https://github.com/cockroachdb/datadriven/tree/80d97fb) +- github.com/codegangsta/negroni: [v1.0.0](https://github.com/codegangsta/negroni/tree/v1.0.0) +- github.com/containerd/console: [84eeaae](https://github.com/containerd/console/tree/84eeaae) +- github.com/containerd/containerd: [v1.0.2](https://github.com/containerd/containerd/tree/v1.0.2) +- github.com/containerd/typeurl: [2a93cfd](https://github.com/containerd/typeurl/tree/2a93cfd) +- github.com/containernetworking/cni: [v0.7.1](https://github.com/containernetworking/cni/tree/v0.7.1) +- github.com/coredns/corefile-migration: [v1.0.6](https://github.com/coredns/corefile-migration/tree/v1.0.6) +- github.com/creack/pty: [v1.1.7](https://github.com/creack/pty/tree/v1.1.7) +- github.com/cyphar/filepath-securejoin: [v0.2.2](https://github.com/cyphar/filepath-securejoin/tree/v0.2.2) +- github.com/daviddengcn/go-colortext: [511bcaf](https://github.com/daviddengcn/go-colortext/tree/511bcaf) +- github.com/dnaeon/go-vcr: [v1.0.1](https://github.com/dnaeon/go-vcr/tree/v1.0.1) +- github.com/docker/libnetwork: [c8a5fca](https://github.com/docker/libnetwork/tree/c8a5fca) +- github.com/euank/go-kmsg-parser: [v2.0.0+incompatible](https://github.com/euank/go-kmsg-parser/tree/v2.0.0) +- github.com/exponent-io/jsonpath: [d6023ce](https://github.com/exponent-io/jsonpath/tree/d6023ce) +- github.com/fatih/camelcase: [v1.0.0](https://github.com/fatih/camelcase/tree/v1.0.0) +- github.com/flynn/go-shlex: [3f9db97](https://github.com/flynn/go-shlex/tree/3f9db97) +- github.com/fogleman/gg: [0403632](https://github.com/fogleman/gg/tree/0403632) +- github.com/gliderlabs/ssh: [v0.1.1](https://github.com/gliderlabs/ssh/tree/v0.1.1) +- github.com/go-acme/lego: [v2.5.0+incompatible](https://github.com/go-acme/lego/tree/v2.5.0) +- github.com/go-bindata/go-bindata: [v3.1.1+incompatible](https://github.com/go-bindata/go-bindata/tree/v3.1.1) +- github.com/go-critic/go-critic: [1df3008](https://github.com/go-critic/go-critic/tree/1df3008) +- github.com/go-lintpack/lintpack: [v0.5.2](https://github.com/go-lintpack/lintpack/tree/v0.5.2) +- github.com/go-ole/go-ole: [v1.2.1](https://github.com/go-ole/go-ole/tree/v1.2.1) +- github.com/go-ozzo/ozzo-validation: [v3.5.0+incompatible](https://github.com/go-ozzo/ozzo-validation/tree/v3.5.0) +- github.com/go-toolsmith/astcast: [v1.0.0](https://github.com/go-toolsmith/astcast/tree/v1.0.0) +- github.com/go-toolsmith/astcopy: [v1.0.0](https://github.com/go-toolsmith/astcopy/tree/v1.0.0) +- github.com/go-toolsmith/astequal: [v1.0.0](https://github.com/go-toolsmith/astequal/tree/v1.0.0) +- github.com/go-toolsmith/astfmt: [v1.0.0](https://github.com/go-toolsmith/astfmt/tree/v1.0.0) +- github.com/go-toolsmith/astinfo: [9809ff7](https://github.com/go-toolsmith/astinfo/tree/9809ff7) +- github.com/go-toolsmith/astp: [v1.0.0](https://github.com/go-toolsmith/astp/tree/v1.0.0) +- github.com/go-toolsmith/pkgload: [v1.0.0](https://github.com/go-toolsmith/pkgload/tree/v1.0.0) +- github.com/go-toolsmith/strparse: [v1.0.0](https://github.com/go-toolsmith/strparse/tree/v1.0.0) +- github.com/go-toolsmith/typep: [v1.0.0](https://github.com/go-toolsmith/typep/tree/v1.0.0) +- github.com/gobwas/glob: [v0.2.3](https://github.com/gobwas/glob/tree/v0.2.3) +- github.com/godbus/dbus: [2ff6f7f](https://github.com/godbus/dbus/tree/2ff6f7f) +- github.com/golang/freetype: [e2365df](https://github.com/golang/freetype/tree/e2365df) +- github.com/golangci/check: [cfe4005](https://github.com/golangci/check/tree/cfe4005) +- github.com/golangci/dupl: [3e9179a](https://github.com/golangci/dupl/tree/3e9179a) +- github.com/golangci/errcheck: [ef45e06](https://github.com/golangci/errcheck/tree/ef45e06) +- github.com/golangci/go-misc: [927a3d8](https://github.com/golangci/go-misc/tree/927a3d8) +- github.com/golangci/go-tools: [e32c541](https://github.com/golangci/go-tools/tree/e32c541) +- github.com/golangci/goconst: [041c5f2](https://github.com/golangci/goconst/tree/041c5f2) +- github.com/golangci/gocyclo: [2becd97](https://github.com/golangci/gocyclo/tree/2becd97) +- github.com/golangci/gofmt: [0b8337e](https://github.com/golangci/gofmt/tree/0b8337e) +- github.com/golangci/golangci-lint: [v1.18.0](https://github.com/golangci/golangci-lint/tree/v1.18.0) +- github.com/golangci/gosec: [66fb7fc](https://github.com/golangci/gosec/tree/66fb7fc) +- github.com/golangci/ineffassign: [42439a7](https://github.com/golangci/ineffassign/tree/42439a7) +- github.com/golangci/lint-1: [ee948d0](https://github.com/golangci/lint-1/tree/ee948d0) +- github.com/golangci/maligned: [b1d8939](https://github.com/golangci/maligned/tree/b1d8939) +- github.com/golangci/misspell: [950f5d1](https://github.com/golangci/misspell/tree/950f5d1) +- github.com/golangci/prealloc: [215b22d](https://github.com/golangci/prealloc/tree/215b22d) +- github.com/golangci/revgrep: [d9c87f5](https://github.com/golangci/revgrep/tree/d9c87f5) +- github.com/golangci/unconvert: [28b1c44](https://github.com/golangci/unconvert/tree/28b1c44) +- github.com/golangplus/bytes: [45c989f](https://github.com/golangplus/bytes/tree/45c989f) +- github.com/golangplus/fmt: [2a5d6d7](https://github.com/golangplus/fmt/tree/2a5d6d7) +- github.com/golangplus/testing: [af21d9c](https://github.com/golangplus/testing/tree/af21d9c) +- github.com/google/cadvisor: [v0.35.0](https://github.com/google/cadvisor/tree/v0.35.0) +- github.com/google/renameio: [v0.1.0](https://github.com/google/renameio/tree/v0.1.0) +- github.com/gopherjs/gopherjs: [0766667](https://github.com/gopherjs/gopherjs/tree/0766667) +- github.com/gostaticanalysis/analysisutil: [v0.0.3](https://github.com/gostaticanalysis/analysisutil/tree/v0.0.3) +- github.com/hashicorp/go-syslog: [v1.0.0](https://github.com/hashicorp/go-syslog/tree/v1.0.0) +- github.com/heketi/heketi: [c2e2a4a](https://github.com/heketi/heketi/tree/c2e2a4a) +- github.com/heketi/tests: [f3775cb](https://github.com/heketi/tests/tree/f3775cb) +- github.com/jellevandenhooff/dkim: [f50fe3d](https://github.com/jellevandenhooff/dkim/tree/f50fe3d) +- github.com/jimstudt/http-authentication: [3eca13d](https://github.com/jimstudt/http-authentication/tree/3eca13d) +- github.com/jtolds/gls: [v4.20.0+incompatible](https://github.com/jtolds/gls/tree/v4.20.0) +- github.com/jung-kurt/gofpdf: [24315ac](https://github.com/jung-kurt/gofpdf/tree/24315ac) +- github.com/karrick/godirwalk: [v1.7.5](https://github.com/karrick/godirwalk/tree/v1.7.5) +- github.com/kubernetes-csi/csi-proxy/client: [9eff164](https://github.com/kubernetes-csi/csi-proxy/client/tree/9eff164) +- github.com/kylelemons/godebug: [d65d576](https://github.com/kylelemons/godebug/tree/d65d576) +- github.com/libopenstorage/openstorage: [v1.0.0](https://github.com/libopenstorage/openstorage/tree/v1.0.0) +- github.com/liggitt/tabwriter: [89fcab3](https://github.com/liggitt/tabwriter/tree/89fcab3) +- github.com/lithammer/dedent: [v1.1.0](https://github.com/lithammer/dedent/tree/v1.1.0) +- github.com/logrusorgru/aurora: [a7b3b31](https://github.com/logrusorgru/aurora/tree/a7b3b31) +- github.com/lpabon/godbc: [v0.1.1](https://github.com/lpabon/godbc/tree/v0.1.1) +- github.com/lucas-clemente/aes12: [cd47fb3](https://github.com/lucas-clemente/aes12/tree/cd47fb3) +- github.com/lucas-clemente/quic-clients: [v0.1.0](https://github.com/lucas-clemente/quic-clients/tree/v0.1.0) +- github.com/lucas-clemente/quic-go-certificates: [d2f8652](https://github.com/lucas-clemente/quic-go-certificates/tree/d2f8652) +- github.com/lucas-clemente/quic-go: [v0.10.2](https://github.com/lucas-clemente/quic-go/tree/v0.10.2) +- github.com/marten-seemann/qtls: [v0.2.3](https://github.com/marten-seemann/qtls/tree/v0.2.3) +- github.com/mattn/go-shellwords: [v1.0.5](https://github.com/mattn/go-shellwords/tree/v1.0.5) +- github.com/mattn/goveralls: [v0.0.2](https://github.com/mattn/goveralls/tree/v0.0.2) +- github.com/mesos/mesos-go: [v0.0.9](https://github.com/mesos/mesos-go/tree/v0.0.9) +- github.com/mholt/certmagic: [6a42ef9](https://github.com/mholt/certmagic/tree/6a42ef9) +- github.com/miekg/dns: [v1.1.4](https://github.com/miekg/dns/tree/v1.1.4) +- github.com/mindprince/gonvml: [9ebdce4](https://github.com/mindprince/gonvml/tree/9ebdce4) +- github.com/mistifyio/go-zfs: [v2.1.1+incompatible](https://github.com/mistifyio/go-zfs/tree/v2.1.1) +- github.com/mitchellh/go-ps: [4fdf99a](https://github.com/mitchellh/go-ps/tree/4fdf99a) +- github.com/mitchellh/go-wordwrap: [v1.0.0](https://github.com/mitchellh/go-wordwrap/tree/v1.0.0) +- github.com/mohae/deepcopy: [491d360](https://github.com/mohae/deepcopy/tree/491d360) +- github.com/morikuni/aec: [v1.0.0](https://github.com/morikuni/aec/tree/v1.0.0) +- github.com/mozilla/tls-observatory: [8791a20](https://github.com/mozilla/tls-observatory/tree/8791a20) +- github.com/mrunalp/fileutils: [7d4729f](https://github.com/mrunalp/fileutils/tree/7d4729f) +- github.com/mvdan/xurls: [v1.1.0](https://github.com/mvdan/xurls/tree/v1.1.0) +- github.com/naoina/go-stringutil: [v0.1.0](https://github.com/naoina/go-stringutil/tree/v0.1.0) +- github.com/naoina/toml: [v0.1.1](https://github.com/naoina/toml/tree/v0.1.1) +- github.com/nbutton23/zxcvbn-go: [eafdab6](https://github.com/nbutton23/zxcvbn-go/tree/eafdab6) +- github.com/opencontainers/runc: [v1.0.0-rc10](https://github.com/opencontainers/runc/tree/v1.0.0-rc10) +- github.com/opencontainers/runtime-spec: [v1.0.0](https://github.com/opencontainers/runtime-spec/tree/v1.0.0) +- github.com/opencontainers/selinux: [5215b18](https://github.com/opencontainers/selinux/tree/5215b18) +- github.com/pquerna/ffjson: [af8b230](https://github.com/pquerna/ffjson/tree/af8b230) +- github.com/quasilyte/go-consistent: [c6f3937](https://github.com/quasilyte/go-consistent/tree/c6f3937) +- github.com/quobyte/api: [v0.1.2](https://github.com/quobyte/api/tree/v0.1.2) +- github.com/robfig/cron: [v1.1.0](https://github.com/robfig/cron/tree/v1.1.0) +- github.com/rogpeppe/fastuuid: [6724a57](https://github.com/rogpeppe/fastuuid/tree/6724a57) +- github.com/rogpeppe/go-internal: [v1.3.0](https://github.com/rogpeppe/go-internal/tree/v1.3.0) +- github.com/rubiojr/go-vhd: [0bfd3b3](https://github.com/rubiojr/go-vhd/tree/0bfd3b3) +- github.com/ryanuber/go-glob: [256dc44](https://github.com/ryanuber/go-glob/tree/256dc44) +- github.com/seccomp/libseccomp-golang: [v0.9.1](https://github.com/seccomp/libseccomp-golang/tree/v0.9.1) +- github.com/sergi/go-diff: [v1.0.0](https://github.com/sergi/go-diff/tree/v1.0.0) +- github.com/shirou/gopsutil: [c95755e](https://github.com/shirou/gopsutil/tree/c95755e) +- github.com/shirou/w32: [bb4de01](https://github.com/shirou/w32/tree/bb4de01) +- github.com/shurcooL/go-goon: [37c2f52](https://github.com/shurcooL/go-goon/tree/37c2f52) +- github.com/smartystreets/assertions: [b2de0cb](https://github.com/smartystreets/assertions/tree/b2de0cb) +- github.com/smartystreets/goconvey: [v1.6.4](https://github.com/smartystreets/goconvey/tree/v1.6.4) +- github.com/sourcegraph/go-diff: [v0.5.1](https://github.com/sourcegraph/go-diff/tree/v0.5.1) +- github.com/storageos/go-api: [343b3ef](https://github.com/storageos/go-api/tree/343b3ef) +- github.com/syndtr/gocapability: [d983527](https://github.com/syndtr/gocapability/tree/d983527) +- github.com/tarm/serial: [98f6abe](https://github.com/tarm/serial/tree/98f6abe) +- github.com/thecodeteam/goscaleio: [v0.1.0](https://github.com/thecodeteam/goscaleio/tree/v0.1.0) +- github.com/tidwall/pretty: [v1.0.0](https://github.com/tidwall/pretty/tree/v1.0.0) +- github.com/timakin/bodyclose: [87058b9](https://github.com/timakin/bodyclose/tree/87058b9) +- github.com/ultraware/funlen: [v0.0.2](https://github.com/ultraware/funlen/tree/v0.0.2) +- github.com/urfave/negroni: [v1.0.0](https://github.com/urfave/negroni/tree/v1.0.0) +- github.com/valyala/bytebufferpool: [v1.0.0](https://github.com/valyala/bytebufferpool/tree/v1.0.0) +- github.com/valyala/fasthttp: [v1.2.0](https://github.com/valyala/fasthttp/tree/v1.2.0) +- github.com/valyala/quicktemplate: [v1.1.1](https://github.com/valyala/quicktemplate/tree/v1.1.1) +- github.com/valyala/tcplisten: [ceec8f9](https://github.com/valyala/tcplisten/tree/ceec8f9) +- github.com/vektah/gqlparser: [v1.1.2](https://github.com/vektah/gqlparser/tree/v1.1.2) +- github.com/vishvananda/netlink: [v1.0.0](https://github.com/vishvananda/netlink/tree/v1.0.0) +- github.com/vishvananda/netns: [be1fbed](https://github.com/vishvananda/netns/tree/be1fbed) +- github.com/vmware/govmomi: [v0.20.3](https://github.com/vmware/govmomi/tree/v0.20.3) +- go.mongodb.org/mongo-driver: v1.1.2 +- go4.org: 417644f +- golang.org/x/build: 2835ba2 +- golang.org/x/mod: c90efee +- golang.org/x/perf: 6e6d33e +- golang.org/x/tools/gopls: v0.3.3 +- gonum.org/v1/plot: e2840ee +- gopkg.in/errgo.v2: v2.1.0 +- gopkg.in/mcuadros/go-syslog.v2: v2.2.1 +- gopkg.in/resty.v1: v1.12.0 +- gotest.tools/gotestsum: v0.3.5 +- grpc.go4.org: 11d0a25 +- k8s.io/cli-runtime: v0.18.0 +- k8s.io/cloud-provider: v0.18.0 +- k8s.io/cluster-bootstrap: v0.18.0 +- k8s.io/cri-api: v0.18.0 +- k8s.io/csi-translation-lib: v0.18.0 +- k8s.io/heapster: v1.2.0-beta.1 +- k8s.io/kube-aggregator: v0.18.0 +- k8s.io/kube-controller-manager: v0.18.0 +- k8s.io/kube-proxy: v0.18.0 +- k8s.io/kube-scheduler: v0.18.0 +- k8s.io/kubectl: v0.18.0 +- k8s.io/kubelet: v0.18.0 +- k8s.io/legacy-cloud-providers: v0.18.0 +- k8s.io/metrics: v0.18.0 +- k8s.io/repo-infra: v0.0.1-alpha.1 +- k8s.io/sample-apiserver: v0.18.0 +- k8s.io/system-validators: v1.0.4 +- mvdan.cc/interfacer: c200402 +- mvdan.cc/lint: adc824a +- mvdan.cc/unparam: fbb5962 +- rsc.io/pdf: v0.1.1 +- sigs.k8s.io/apiserver-network-proxy/konnectivity-client: v0.0.7 +- sigs.k8s.io/kustomize: v2.0.3+incompatible +- sigs.k8s.io/structured-merge-diff/v3: v3.0.0 +- sourcegraph.com/sqs/pbtypes: d3ebe8f + +### Changed +- github.com/Azure/azure-sdk-for-go: [v21.1.0+incompatible → v35.0.0+incompatible](https://github.com/Azure/azure-sdk-for-go/compare/v21.1.0...v35.0.0) +- github.com/GoogleCloudPlatform/k8s-cloud-provider: [2e19bb3 → 27a4ced](https://github.com/GoogleCloudPlatform/k8s-cloud-provider/compare/2e19bb3...27a4ced) +- github.com/asaskevich/govalidator: [f9ffefc → f61b66f](https://github.com/asaskevich/govalidator/compare/f9ffefc...f61b66f) +- github.com/aws/aws-sdk-go: [v1.23.22 → v1.28.2](https://github.com/aws/aws-sdk-go/compare/v1.23.22...v1.28.2) +- github.com/coreos/etcd: [v3.3.13+incompatible → v3.3.10+incompatible](https://github.com/coreos/etcd/compare/v3.3.13...v3.3.10) +- github.com/coreos/go-oidc: [065b426 → v2.1.0+incompatible](https://github.com/coreos/go-oidc/compare/065b426...v2.1.0) +- github.com/coreos/go-semver: [v0.2.0 → v0.3.0](https://github.com/coreos/go-semver/compare/v0.2.0...v0.3.0) +- github.com/coreos/go-systemd: [39ca1b0 → 95778df](https://github.com/coreos/go-systemd/compare/39ca1b0...95778df) +- github.com/docker/distribution: [83389a1 → v2.7.1+incompatible](https://github.com/docker/distribution/compare/83389a1...v2.7.1) +- github.com/docker/go-units: [v0.3.3 → v0.4.0](https://github.com/docker/go-units/compare/v0.3.3...v0.4.0) +- github.com/elazarl/goproxy: [c4fc265 → 947c36d](https://github.com/elazarl/goproxy/compare/c4fc265...947c36d) +- github.com/envoyproxy/go-control-plane: [v0.9.0 → 5f8ba28](https://github.com/envoyproxy/go-control-plane/compare/v0.9.0...5f8ba28) +- github.com/go-openapi/analysis: [v0.17.2 → v0.19.5](https://github.com/go-openapi/analysis/compare/v0.17.2...v0.19.5) +- github.com/go-openapi/errors: [v0.17.2 → v0.19.2](https://github.com/go-openapi/errors/compare/v0.17.2...v0.19.2) +- github.com/go-openapi/loads: [v0.17.2 → v0.19.4](https://github.com/go-openapi/loads/compare/v0.17.2...v0.19.4) +- github.com/go-openapi/runtime: [v0.17.2 → v0.19.4](https://github.com/go-openapi/runtime/compare/v0.17.2...v0.19.4) +- github.com/go-openapi/strfmt: [v0.17.0 → v0.19.3](https://github.com/go-openapi/strfmt/compare/v0.17.0...v0.19.3) +- github.com/go-openapi/validate: [v0.18.0 → v0.19.5](https://github.com/go-openapi/validate/compare/v0.18.0...v0.19.5) +- github.com/gogo/protobuf: [65acae2 → v1.3.1](https://github.com/gogo/protobuf/compare/65acae2...v1.3.1) +- github.com/golang/protobuf: [v1.3.2 → v1.3.4](https://github.com/golang/protobuf/compare/v1.3.2...v1.3.4) +- github.com/google/gofuzz: [v1.0.0 → v1.1.0](https://github.com/google/gofuzz/compare/v1.0.0...v1.1.0) +- github.com/gophercloud/gophercloud: [c818fa6 → v0.1.0](https://github.com/gophercloud/gophercloud/compare/c818fa6...v0.1.0) +- github.com/gorilla/mux: [v1.6.2 → v1.7.0](https://github.com/gorilla/mux/compare/v1.6.2...v1.7.0) +- github.com/gorilla/websocket: [4201258 → v1.4.0](https://github.com/gorilla/websocket/compare/4201258...v1.4.0) +- github.com/grpc-ecosystem/go-grpc-middleware: [v1.0.0 → f849b54](https://github.com/grpc-ecosystem/go-grpc-middleware/compare/v1.0.0...f849b54) +- github.com/grpc-ecosystem/grpc-gateway: [v1.4.1 → v1.9.5](https://github.com/grpc-ecosystem/grpc-gateway/compare/v1.4.1...v1.9.5) +- github.com/mailru/easyjson: [b2ccc51 → v0.7.0](https://github.com/mailru/easyjson/compare/b2ccc51...v0.7.0) +- github.com/mattn/go-isatty: [v0.0.4 → v0.0.9](https://github.com/mattn/go-isatty/compare/v0.0.4...v0.0.9) +- github.com/munnerz/goautoneg: [a547fc6 → a7dc8b6](https://github.com/munnerz/goautoneg/compare/a547fc6...a7dc8b6) +- github.com/onsi/ginkgo: [v1.10.3 → v1.11.0](https://github.com/onsi/ginkgo/compare/v1.10.3...v1.11.0) +- github.com/prometheus/client_model: [14fe0d1 → v0.2.0](https://github.com/prometheus/client_model/compare/14fe0d1...v0.2.0) +- github.com/satori/go.uuid: [0aa62d5 → v1.2.0](https://github.com/satori/go.uuid/compare/0aa62d5...v1.2.0) +- github.com/spf13/jwalterweatherman: [v1.0.0 → v1.1.0](https://github.com/spf13/jwalterweatherman/compare/v1.0.0...v1.1.0) +- github.com/urfave/cli: [v1.18.0 → v1.20.0](https://github.com/urfave/cli/compare/v1.18.0...v1.20.0) +- github.com/xiang90/probing: [07dd2e8 → 43a291a](https://github.com/xiang90/probing/compare/07dd2e8...43a291a) +- go.etcd.io/bbolt: v1.3.1-etcd.7 → v1.3.3 +- go.etcd.io/etcd: 83304cf → 3cf2f69 +- go.uber.org/zap: v1.9.1 → v1.10.0 +- golang.org/x/crypto: 5c40567 → bac4c82 +- golang.org/x/tools: 5eefd05 → 6862ede +- golang.org/x/xerrors: a985d34 → 1b5146a +- gonum.org/v1/gonum: 3d26580 → v0.6.2 +- google.golang.org/grpc: v1.25.1 → v1.27.1 +- gopkg.in/natefinch/lumberjack.v2: 20b71e5 → v2.0.0 +- gopkg.in/square/go-jose.v2: 89060de → v2.2.2 +- gopkg.in/yaml.v2: v2.2.7 → v2.2.8 +- honnef.co/go/tools: ea95bdf → v0.0.1-2020.1.3 +- k8s.io/api: bd6ac52 → v0.18.0 +- k8s.io/apiextensions-apiserver: 3de7581 → v0.18.0 +- k8s.io/apimachinery: v0.17.1 → v0.18.0 +- k8s.io/apiserver: 1e17798 → v0.18.0 +- k8s.io/client-go: 6502b5e → v0.18.0 +- k8s.io/code-generator: 732c9ca → v0.18.0 +- k8s.io/component-base: ed2f086 → v0.18.0 +- k8s.io/gengo: 26a6646 → 36b2048 +- k8s.io/kube-openapi: 30be4d1 → bf4fb3b +- k8s.io/kubernetes: v1.14.7 → v1.18.0 +- k8s.io/utils: 8619460 → a9aa75a +- mvdan.cc/xurls/v2: v2.0.0 → v2.1.0 +- sigs.k8s.io/yaml: v1.1.0 → v1.2.0 + +### Removed +- github.com/coreos/bbolt: [v1.3.1-coreos.6](https://github.com/coreos/bbolt/tree/v1.3.1-coreos.6) +- github.com/natefinch/lumberjack: [v2.0.0+incompatible](https://github.com/natefinch/lumberjack/tree/v2.0.0) +- gopkg.in/yaml.v1: 9f9df34 +- sigs.k8s.io/structured-merge-diff: 15d366b diff --git a/CHANGELOG/CHANGELOG-1.1.md b/CHANGELOG/CHANGELOG-1.1.md new file mode 100644 index 000000000..c7ffa5938 --- /dev/null +++ b/CHANGELOG/CHANGELOG-1.1.md @@ -0,0 +1,47 @@ +# v1.1.0 - Changelog since v1.0.0 + +## Changes by Kind + +## Feature + +- Improved Windows Support + - Update driver to use CSI proxy beta for Windows ([#607](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/607), [@jingxu97](https://github.com/jingxu97)) + - Add volume expansion support for Windows in GCE PD CSI driver ([#637](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/637), [@jingxu97](https://github.com/jingxu97)) + - Add defensive check for Windows. GCE PD CSI driver only support ntfs for Windows. If other fstype is passed, return error. ([#641](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/641), [@jingxu97](https://github.com/jingxu97)) + - Modify NodeUnstageVolume call for Windows to use csi_proxy dismount call. With CSI proxy v0.2.2+, this will also result in flush of data cache before mount point removal. ([#633](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/633), [@jingxu97](https://github.com/jingxu97)) + - Add VolumeStats for Windows ([#627](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/627), [@jingxu97](https://github.com/jingxu97)) + +## Bug or Regression + +- Add PSP for the controller Deployment ([#623](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/623), [@george-angel](https://github.com/george-angel)) +- Update GCE PD CSI Driver Docker base image to `k8s.gcr.io/build-image/debian-base-amd64:v2.1.3` (previously `gcr.io/google-containers/debian-base-amd64:v2.0.0`) to address CVEs. ([#596](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/596), [@saad-ali](https://github.com/saad-ali)) + - Also cherry picked to 1.0.1. + +## Tests + +- PD CSI e2e test infra should take GKE node version as an optional input argument. ([#603](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/603), [@saikat-royc](https://github.com/saikat-royc)) +- Collect managed pd csi driver logs from node ([#619](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/619), [@saikat-royc](https://github.com/saikat-royc)) +- Enable dump GKE node logs ([#635](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/635), [@saikat-royc](https://github.com/saikat-royc)) +- Enable volume expansion test for GKE managed driver ([#584](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/584), [@saikat-royc](https://github.com/saikat-royc)) +- Provide a knob to run intree and csi plugin tests ([#629](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/629), [@saikat-royc](https://github.com/saikat-royc)) +- Fix CI script focus string ([#630](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/630), [@saikat-royc](https://github.com/saikat-royc)) +- Build only linux container image for tests on Linux ([#636](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/636), [@jingxu97](https://github.com/jingxu97)) + +## Dependencies + +### Added +- google.golang.org/protobuf: v1.25.0 + +### Changed +- github.com/golang/protobuf: [v1.3.4 → v1.4.1](https://github.com/golang/protobuf/compare/v1.3.4...v1.4.1) +- github.com/google/go-cmp: [v0.3.1 → v0.5.0](https://github.com/google/go-cmp/compare/v0.3.1...v0.5.0) +- github.com/kubernetes-csi/csi-proxy/client: [9eff164 → v0.2.1](https://github.com/kubernetes-csi/csi-proxy/client/compare/9eff164...v0.2.1) +- golang.org/x/mod: c90efee → 4bf6d31 +- golang.org/x/tools: 6862ede → 5eefd05 +- golang.org/x/xerrors: 1b5146a → 9bdfabe +- google.golang.org/genproto: 6bbd007 → cb27e3a +- honnef.co/go/tools: v0.0.1-2020.1.3 → v0.0.1-2019.2.2 +- mvdan.cc/xurls/v2: v2.1.0 → v2.0.0 + +### Removed +- golang.org/x/tools/gopls: v0.3.3 diff --git a/CHANGELOG/CHANGELOG-1.10.md b/CHANGELOG/CHANGELOG-1.10.md new file mode 100644 index 000000000..36c1ac18b --- /dev/null +++ b/CHANGELOG/CHANGELOG-1.10.md @@ -0,0 +1,611 @@ +# v1.10.14 - Changelog since v1.10.13 + +## Changes by Kind + +### Bug + +- Change GetDisk error reporting to temporary in CreateVolume codepath ([#1602])https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1602), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) + +# v1.10.13 - Changelog since v1.10.12 + +## Changes by Kind + +### Uncategorized + +- Bump golang.org/x/crypto from v0.14.0 to v0.17.0 to fix CVE-2023-48795 ([#1551](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1551), [@sunnylovestiramisu](https://github.com/sunnylovestiramisu)) + +## Dependencies + +### Added +_Nothing has changed._ + +### Changed +- golang.org/x/crypto: v0.14.0 → v0.17.0 +- golang.org/x/sys: v0.13.0 → v0.15.0 +- golang.org/x/term: v0.13.0 → v0.15.0 +- golang.org/x/text: v0.13.0 → v0.14.0 + +### Removed +_Nothing has changed._ + + +# v1.10.12 - Changelog since v1.10.11 + +## Changes by Kind + +### Uncategorized + +- Properly wrap error from GCE Images.Get() API call, to fix a potential nil-ptr dereference ([#1517](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1517), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) +- Reduce log spam when identifying NVMe devices located in `/dev` ([#1545](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1545), [@pwschuurman](https://github.com/pwschuurman)) +- Update golang builder to 1.20.12 ([#1541](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1541), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) + +## Dependencies + +### Added +_Nothing has changed._ + +### Changed +_Nothing has changed._ + +### Removed +_Nothing has changed._ + + +# v1.10.11 - Changelog since v1.10.10 + +## Changes by Kind + +### Bug or Regression + +- Bump Golang Builder version to 1.20.11 ([#1506](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1506), [@uriel-guzman](https://github.com/uriel-guzman)) +- Bump google.golang.org/grpc from v1.53.0 to v1.56.3 to fix CVE-2023-44487. ([#1494](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1494), [@uriel-guzman](https://github.com/uriel-guzman)) + +## Dependencies + +### Added +- github.com/google/go-pkcs11: [v0.2.0](https://github.com/google/go-pkcs11/tree/v0.2.0) +- github.com/google/s2a-go: [v0.1.4](https://github.com/google/s2a-go/tree/v0.1.4) +- google.golang.org/genproto/googleapis/api: ccb25ca +- google.golang.org/genproto/googleapis/bytestream: 659f7aa +- google.golang.org/genproto/googleapis/rpc: 659f7aa + +### Changed +- cloud.google.com/go/accessapproval: v1.5.0 → v1.7.1 +- cloud.google.com/go/accesscontextmanager: v1.4.0 → v1.8.1 +- cloud.google.com/go/aiplatform: v1.27.0 → v1.45.0 +- cloud.google.com/go/analytics: v0.12.0 → v0.21.2 +- cloud.google.com/go/apigateway: v1.4.0 → v1.6.1 +- cloud.google.com/go/apigeeconnect: v1.4.0 → v1.6.1 +- cloud.google.com/go/apigeeregistry: v0.4.0 → v0.7.1 +- cloud.google.com/go/appengine: v1.5.0 → v1.8.1 +- cloud.google.com/go/area120: v0.6.0 → v0.8.1 +- cloud.google.com/go/artifactregistry: v1.9.0 → v1.14.1 +- cloud.google.com/go/asset: v1.10.0 → v1.14.1 +- cloud.google.com/go/assuredworkloads: v1.9.0 → v1.11.1 +- cloud.google.com/go/automl: v1.8.0 → v1.13.1 +- cloud.google.com/go/baremetalsolution: v0.4.0 → v0.5.0 +- cloud.google.com/go/batch: v0.4.0 → v0.7.0 +- cloud.google.com/go/beyondcorp: v0.3.0 → v0.6.1 +- cloud.google.com/go/bigquery: v1.44.0 → v1.52.0 +- cloud.google.com/go/billing: v1.7.0 → v1.16.0 +- cloud.google.com/go/binaryauthorization: v1.4.0 → v1.6.1 +- cloud.google.com/go/certificatemanager: v1.4.0 → v1.7.1 +- cloud.google.com/go/channel: v1.9.0 → v1.16.0 +- cloud.google.com/go/cloudbuild: v1.4.0 → v1.10.1 +- cloud.google.com/go/clouddms: v1.4.0 → v1.6.1 +- cloud.google.com/go/cloudtasks: v1.8.0 → v1.11.1 +- cloud.google.com/go/compute: v1.18.0 → v1.20.1 +- cloud.google.com/go/contactcenterinsights: v1.4.0 → v1.9.1 +- cloud.google.com/go/container: v1.7.0 → v1.22.1 +- cloud.google.com/go/containeranalysis: v0.6.0 → v0.10.1 +- cloud.google.com/go/datacatalog: v1.8.0 → v1.14.1 +- cloud.google.com/go/dataflow: v0.7.0 → v0.9.1 +- cloud.google.com/go/dataform: v0.5.0 → v0.8.1 +- cloud.google.com/go/datafusion: v1.5.0 → v1.7.1 +- cloud.google.com/go/datalabeling: v0.6.0 → v0.8.1 +- cloud.google.com/go/dataplex: v1.4.0 → v1.8.1 +- cloud.google.com/go/dataproc: v1.8.0 → v1.12.0 +- cloud.google.com/go/dataqna: v0.6.0 → v0.8.1 +- cloud.google.com/go/datastore: v1.10.0 → v1.12.0 +- cloud.google.com/go/datastream: v1.5.0 → v1.9.1 +- cloud.google.com/go/deploy: v1.5.0 → v1.11.0 +- cloud.google.com/go/dialogflow: v1.29.0 → v1.38.0 +- cloud.google.com/go/dlp: v1.7.0 → v1.10.1 +- cloud.google.com/go/documentai: v1.10.0 → v1.20.0 +- cloud.google.com/go/domains: v0.7.0 → v0.9.1 +- cloud.google.com/go/edgecontainer: v0.2.0 → v1.1.1 +- cloud.google.com/go/essentialcontacts: v1.4.0 → v1.6.2 +- cloud.google.com/go/eventarc: v1.8.0 → v1.12.1 +- cloud.google.com/go/filestore: v1.4.0 → v1.7.1 +- cloud.google.com/go/firestore: v1.9.0 → v1.11.0 +- cloud.google.com/go/functions: v1.9.0 → v1.15.1 +- cloud.google.com/go/gaming: v1.8.0 → v1.10.1 +- cloud.google.com/go/gkebackup: v0.3.0 → v0.4.0 +- cloud.google.com/go/gkeconnect: v0.6.0 → v0.8.1 +- cloud.google.com/go/gkehub: v0.10.0 → v0.14.1 +- cloud.google.com/go/gkemulticloud: v0.4.0 → v0.6.1 +- cloud.google.com/go/gsuiteaddons: v1.4.0 → v1.6.1 +- cloud.google.com/go/iam: v0.11.0 → v1.1.0 +- cloud.google.com/go/iap: v1.5.0 → v1.8.1 +- cloud.google.com/go/ids: v1.2.0 → v1.4.1 +- cloud.google.com/go/iot: v1.4.0 → v1.7.1 +- cloud.google.com/go/kms: v1.6.0 → v1.12.1 +- cloud.google.com/go/language: v1.8.0 → v1.10.1 +- cloud.google.com/go/lifesciences: v0.6.0 → v0.9.1 +- cloud.google.com/go/logging: v1.6.1 → v1.7.0 +- cloud.google.com/go/longrunning: v0.3.0 → v0.5.1 +- cloud.google.com/go/managedidentities: v1.4.0 → v1.6.1 +- cloud.google.com/go/maps: v0.1.0 → v0.7.0 +- cloud.google.com/go/mediatranslation: v0.6.0 → v0.8.1 +- cloud.google.com/go/memcache: v1.7.0 → v1.10.1 +- cloud.google.com/go/metastore: v1.8.0 → v1.11.1 +- cloud.google.com/go/monitoring: v1.8.0 → v1.15.1 +- cloud.google.com/go/networkconnectivity: v1.7.0 → v1.12.1 +- cloud.google.com/go/networkmanagement: v1.5.0 → v1.8.0 +- cloud.google.com/go/networksecurity: v0.6.0 → v0.9.1 +- cloud.google.com/go/notebooks: v1.5.0 → v1.9.1 +- cloud.google.com/go/optimization: v1.2.0 → v1.4.1 +- cloud.google.com/go/orchestration: v1.4.0 → v1.8.1 +- cloud.google.com/go/orgpolicy: v1.5.0 → v1.11.1 +- cloud.google.com/go/osconfig: v1.10.0 → v1.12.1 +- cloud.google.com/go/oslogin: v1.7.0 → v1.10.1 +- cloud.google.com/go/phishingprotection: v0.6.0 → v0.8.1 +- cloud.google.com/go/policytroubleshooter: v1.4.0 → v1.7.1 +- cloud.google.com/go/privatecatalog: v0.6.0 → v0.9.1 +- cloud.google.com/go/pubsub: v1.27.1 → v1.32.0 +- cloud.google.com/go/pubsublite: v1.5.0 → v1.8.1 +- cloud.google.com/go/recaptchaenterprise/v2: v2.5.0 → v2.7.2 +- cloud.google.com/go/recommendationengine: v0.6.0 → v0.8.1 +- cloud.google.com/go/recommender: v1.8.0 → v1.10.1 +- cloud.google.com/go/redis: v1.10.0 → v1.13.1 +- cloud.google.com/go/resourcemanager: v1.4.0 → v1.9.1 +- cloud.google.com/go/resourcesettings: v1.4.0 → v1.6.1 +- cloud.google.com/go/retail: v1.11.0 → v1.14.1 +- cloud.google.com/go/run: v0.3.0 → v0.9.0 +- cloud.google.com/go/scheduler: v1.7.0 → v1.10.1 +- cloud.google.com/go/secretmanager: v1.9.0 → v1.11.1 +- cloud.google.com/go/security: v1.10.0 → v1.15.1 +- cloud.google.com/go/securitycenter: v1.16.0 → v1.23.0 +- cloud.google.com/go/servicedirectory: v1.7.0 → v1.10.1 +- cloud.google.com/go/shell: v1.4.0 → v1.7.1 +- cloud.google.com/go/spanner: v1.41.0 → v1.47.0 +- cloud.google.com/go/speech: v1.9.0 → v1.17.1 +- cloud.google.com/go/storagetransfer: v1.6.0 → v1.10.0 +- cloud.google.com/go/talent: v1.4.0 → v1.6.2 +- cloud.google.com/go/texttospeech: v1.5.0 → v1.7.1 +- cloud.google.com/go/tpu: v1.4.0 → v1.6.1 +- cloud.google.com/go/trace: v1.4.0 → v1.10.1 +- cloud.google.com/go/translate: v1.4.0 → v1.8.1 +- cloud.google.com/go/video: v1.9.0 → v1.17.1 +- cloud.google.com/go/videointelligence: v1.9.0 → v1.11.1 +- cloud.google.com/go/vision/v2: v2.5.0 → v2.7.2 +- cloud.google.com/go/vmmigration: v1.3.0 → v1.7.1 +- cloud.google.com/go/vmwareengine: v0.1.0 → v0.4.1 +- cloud.google.com/go/vpcaccess: v1.5.0 → v1.7.1 +- cloud.google.com/go/webrisk: v1.7.0 → v1.9.1 +- cloud.google.com/go/websecurityscanner: v1.4.0 → v1.6.1 +- cloud.google.com/go/workflows: v1.9.0 → v1.11.1 +- cloud.google.com/go: v0.107.0 → v0.110.4 +- github.com/cncf/xds/go: [06c439d → e9ce688](https://github.com/cncf/xds/go/compare/06c439d...e9ce688) +- github.com/envoyproxy/go-control-plane: [v0.10.3 → 9239064](https://github.com/envoyproxy/go-control-plane/compare/v0.10.3...9239064) +- github.com/envoyproxy/protoc-gen-validate: [v0.9.1 → v0.10.1](https://github.com/envoyproxy/protoc-gen-validate/compare/v0.9.1...v0.10.1) +- github.com/golang/glog: [v1.0.0 → v1.1.0](https://github.com/golang/glog/compare/v1.0.0...v1.1.0) +- github.com/golang/protobuf: [v1.5.2 → v1.5.3](https://github.com/golang/protobuf/compare/v1.5.2...v1.5.3) +- github.com/googleapis/enterprise-certificate-proxy: [v0.2.3 → v0.2.5](https://github.com/googleapis/enterprise-certificate-proxy/compare/v0.2.3...v0.2.5) +- github.com/googleapis/gax-go/v2: [v2.7.0 → v2.12.0](https://github.com/googleapis/gax-go/v2/compare/v2.7.0...v2.12.0) +- github.com/yuin/goldmark: [v1.4.1 → v1.4.13](https://github.com/yuin/goldmark/compare/v1.4.1...v1.4.13) +- golang.org/x/oauth2: v0.5.0 → v0.10.0 +- golang.org/x/sync: v0.1.0 → v0.3.0 +- google.golang.org/api: v0.111.0 → v0.134.0 +- google.golang.org/genproto: 637eb22 → ccb25ca +- google.golang.org/grpc: v1.53.0 → v1.56.3 +- google.golang.org/protobuf: v1.28.1 → v1.31.0 + +### Removed +- cloud.google.com/go/apikeys: v0.4.0 +- cloud.google.com/go/servicecontrol: v1.5.0 +- cloud.google.com/go/servicemanagement: v1.5.0 +- cloud.google.com/go/serviceusage: v1.4.0 + +# v1.10.10 - Changelog since v1.10.8 + +## Changes by Kind + +### Bug or Regression + +- CVE fixes: CVE-2023-39323 ([#1412](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1412), [@dannawang0221](https://github.com/dannawang0221)) + +### Other (Cleanup or Flake) + +- Update go version to 1.20.10 ([#1453](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1453), [@tyuchn](https://github.com/tyuchn)) + +## Dependencies + +### Changed + +- golang.org/x/crypto: v0.11.0 → v0.14.0 +- golang.org/x/net: v0.12.0 → v0.17.0 +- golang.org/x/sys: v0.10.0 → v0.13.0 +- golang.org/x/term: v0.10.0 → v0.13.0 +- golang.org/x/text: v0.11.0 → v0.13.0 + +# v1.10.8 - Changelog since v1.10.7 + +## Changes by Kind + +### Bug or Regression + +- bump go version to 1.20.8 ([#1394](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1394), [@tyuchn](https://github.com/tyuchn)) +- Remove ARG BUILDPLATFORM from Dockerfile ([#1385](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1385), [@tyuchn](https://github.com/tyuchn)) +- Update test/run-e2e.sh to match PROW configuration ([#1360](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1360), [@pwschuurman](https://github.com/pwschuurman)) +- Always call LoggedError for errors returned from CloudProvider methods ([#1381](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1381), [@amacaskill](https://github.com/amacaskill)) + +# v1.10.7 - Changelog since v1.10.6 + +## Changes by Kind + +### Uncategorized + +- Update go version to 1.20.7 to fix CVE-2023-29409 CVE-2023-39533 ([#1348](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1348), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) + +# v1.10.6 - Changelog since v1.10.5 + +## Changes by Kind + +### Bug or Regression + +- Update go version to 1.20.6 to fix CVE-2023-29406 ([#1331](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1331), [@pwschuurman](https://github.com/pwschuurman)) + +# v1.10.5 - Changelog since v1.10.4 + +## Changes by Kind + +### Bug or Regression + +- Add option for serializing formatAndMount, including fsck as well as mkfs. ([#1313](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1313), [@mattcary](https://github.com/mattcary)) + +### Uncategorized + +- Add disk type for all operations metrics. ([#1295](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1295), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) +- Fix resource parsing when the gcp project name ends with alpha, beta or v1 ([#1307](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1307), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) +- Use original error code when responding with a backoff error on publish or unpublish. ([#1311](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1311), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) +- Added support in PDCSI driver to create confidential hyperdisk storage on GCE. ([#1315](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1315), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) + + +# v1.10.4 - Changelog since v1.10.3 + +## Changes by Kind + +## Features + +- Add alpha-level force attach storage class parameter. ([#1257](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1257), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) + +## Bug or Regression + +- Fix provisioned-iops-on-create passing logic([#1282](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1282)) +- Bugfix for empty disk type being registered in metric for Create volume function. ([#1267](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1267), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) + +### Cleanup + +- Update go version to 1.20.5 to address CVE fixes ([#1265](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1265), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) +- [release-1.10] Update Docker.Windows to 1.20.5 ([#1272](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1272), [@saikat-royc](https://github.com/saikat-royc)) + +# v1.10.3 - Changelog since v1.10.2 + +### Feature + +- Add alpha-level force attach storage class parameter. ([#1257](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1257), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) + +### Cleanup + +- Add metrics for CSI server side error count ([#1237](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1237), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) + + +# v1.10.2 - Changelog since v1.10.1 + +### Bug or Regression + +- Add libraries needed for determining XFS volume expansion ([#1204](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1204), [@nberlee](https://github.com/nberlee)) + +### Cleanup + +- Add metrics for CSI server side error count ([#1237](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1237), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) +- Updates error message to be more user friendly when PD CSI Driver encounters an disk type UNSUPPORTED_OPERATION on ControllerPublishVolume ([#1221](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1221), [@pwschuurman](https://github.com/pwschuurman)) +- Use errors.As so we can detect wrapped errors, and check for existing error codes in CodesForError ([#1233](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1233), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) + +# v1.10.1 - Changelog since v1.10.0 + +## Changes by Kind + +### Bug or Regression + +- Add missing libraries, libbsd and libmd, that are dependencies for XFS volume expansion. ([#1204](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1204), [@nberlee](https://github.com/nberlee)) + +# v1.10.0 - Changelog since v1.9.2 + +## Changes by Kind + +### Feature +- It is no longer necessary to specify allowedTopologies for zonal -> zonal cloning and zonal/regional -> regional cloning to ensure that the clone zone is compatible with the GCE volume cloning requirements. ([#1150](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1150), [@amacaskill](https://github.com/amacaskill)) + +### Bug or Regression + +- Fix missing libedit.so.2 error ([#1177](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1177), [@sunnylovestiramisu](https://github.com/sunnylovestiramisu)) +- Set concurrency limit to prevent OOMing when issuing multiple concurrent mkfs calls. ([#1169](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1169/commits/7f1e04e15631b14f7d3f441cc97bed1a968f2e47), [@artemvmin](https://github.com/artemvmin)) + +### Other (Cleanup or Flake) + +- Update go version to 1.20.3 for k/k 1.27 ([#1180](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1180), [@sunnylovestiramisu](https://github.com/sunnylovestiramisu)) +- Upgrade mount-utils to v0.27.0. ([#1169](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1169/commits/232bd0aa691a72c1bd806d8c4ed881bb3a47174f), [@artemvmin](https://github.com/artemvmin)) +- Break dependency on k/k test/e2e/storage/podlogs. ([#1169](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1169/commits/1b6e7e537bbc264a1c076c317e6194a976509011), [@artemvmin](https://github.com/artemvmin)) + +## Dependencies + +### Added +- cloud.google.com/go/accessapproval: v1.5.0 +- cloud.google.com/go/accesscontextmanager: v1.4.0 +- cloud.google.com/go/aiplatform: v1.27.0 +- cloud.google.com/go/analytics: v0.12.0 +- cloud.google.com/go/apigateway: v1.4.0 +- cloud.google.com/go/apigeeconnect: v1.4.0 +- cloud.google.com/go/apigeeregistry: v0.4.0 +- cloud.google.com/go/apikeys: v0.4.0 +- cloud.google.com/go/appengine: v1.5.0 +- cloud.google.com/go/area120: v0.6.0 +- cloud.google.com/go/artifactregistry: v1.9.0 +- cloud.google.com/go/asset: v1.10.0 +- cloud.google.com/go/assuredworkloads: v1.9.0 +- cloud.google.com/go/automl: v1.8.0 +- cloud.google.com/go/baremetalsolution: v0.4.0 +- cloud.google.com/go/batch: v0.4.0 +- cloud.google.com/go/beyondcorp: v0.3.0 +- cloud.google.com/go/billing: v1.7.0 +- cloud.google.com/go/binaryauthorization: v1.4.0 +- cloud.google.com/go/certificatemanager: v1.4.0 +- cloud.google.com/go/channel: v1.9.0 +- cloud.google.com/go/cloudbuild: v1.4.0 +- cloud.google.com/go/clouddms: v1.4.0 +- cloud.google.com/go/cloudtasks: v1.8.0 +- cloud.google.com/go/compute/metadata: v0.2.3 +- cloud.google.com/go/contactcenterinsights: v1.4.0 +- cloud.google.com/go/container: v1.7.0 +- cloud.google.com/go/containeranalysis: v0.6.0 +- cloud.google.com/go/datacatalog: v1.8.0 +- cloud.google.com/go/dataflow: v0.7.0 +- cloud.google.com/go/dataform: v0.5.0 +- cloud.google.com/go/datafusion: v1.5.0 +- cloud.google.com/go/datalabeling: v0.6.0 +- cloud.google.com/go/dataplex: v1.4.0 +- cloud.google.com/go/dataproc: v1.8.0 +- cloud.google.com/go/dataqna: v0.6.0 +- cloud.google.com/go/datastream: v1.5.0 +- cloud.google.com/go/deploy: v1.5.0 +- cloud.google.com/go/dialogflow: v1.29.0 +- cloud.google.com/go/dlp: v1.7.0 +- cloud.google.com/go/documentai: v1.10.0 +- cloud.google.com/go/domains: v0.7.0 +- cloud.google.com/go/edgecontainer: v0.2.0 +- cloud.google.com/go/errorreporting: v0.3.0 +- cloud.google.com/go/essentialcontacts: v1.4.0 +- cloud.google.com/go/eventarc: v1.8.0 +- cloud.google.com/go/filestore: v1.4.0 +- cloud.google.com/go/functions: v1.9.0 +- cloud.google.com/go/gaming: v1.8.0 +- cloud.google.com/go/gkebackup: v0.3.0 +- cloud.google.com/go/gkeconnect: v0.6.0 +- cloud.google.com/go/gkehub: v0.10.0 +- cloud.google.com/go/gkemulticloud: v0.4.0 +- cloud.google.com/go/gsuiteaddons: v1.4.0 +- cloud.google.com/go/iap: v1.5.0 +- cloud.google.com/go/ids: v1.2.0 +- cloud.google.com/go/iot: v1.4.0 +- cloud.google.com/go/language: v1.8.0 +- cloud.google.com/go/lifesciences: v0.6.0 +- cloud.google.com/go/longrunning: v0.3.0 +- cloud.google.com/go/managedidentities: v1.4.0 +- cloud.google.com/go/maps: v0.1.0 +- cloud.google.com/go/mediatranslation: v0.6.0 +- cloud.google.com/go/memcache: v1.7.0 +- cloud.google.com/go/metastore: v1.8.0 +- cloud.google.com/go/monitoring: v1.8.0 +- cloud.google.com/go/networkconnectivity: v1.7.0 +- cloud.google.com/go/networkmanagement: v1.5.0 +- cloud.google.com/go/networksecurity: v0.6.0 +- cloud.google.com/go/notebooks: v1.5.0 +- cloud.google.com/go/optimization: v1.2.0 +- cloud.google.com/go/orchestration: v1.4.0 +- cloud.google.com/go/orgpolicy: v1.5.0 +- cloud.google.com/go/osconfig: v1.10.0 +- cloud.google.com/go/oslogin: v1.7.0 +- cloud.google.com/go/phishingprotection: v0.6.0 +- cloud.google.com/go/policytroubleshooter: v1.4.0 +- cloud.google.com/go/privatecatalog: v0.6.0 +- cloud.google.com/go/pubsublite: v1.5.0 +- cloud.google.com/go/recaptchaenterprise/v2: v2.5.0 +- cloud.google.com/go/recommendationengine: v0.6.0 +- cloud.google.com/go/recommender: v1.8.0 +- cloud.google.com/go/redis: v1.10.0 +- cloud.google.com/go/resourcemanager: v1.4.0 +- cloud.google.com/go/resourcesettings: v1.4.0 +- cloud.google.com/go/retail: v1.11.0 +- cloud.google.com/go/run: v0.3.0 +- cloud.google.com/go/scheduler: v1.7.0 +- cloud.google.com/go/secretmanager: v1.9.0 +- cloud.google.com/go/security: v1.10.0 +- cloud.google.com/go/securitycenter: v1.16.0 +- cloud.google.com/go/servicecontrol: v1.5.0 +- cloud.google.com/go/servicedirectory: v1.7.0 +- cloud.google.com/go/servicemanagement: v1.5.0 +- cloud.google.com/go/serviceusage: v1.4.0 +- cloud.google.com/go/shell: v1.4.0 +- cloud.google.com/go/spanner: v1.41.0 +- cloud.google.com/go/speech: v1.9.0 +- cloud.google.com/go/storagetransfer: v1.6.0 +- cloud.google.com/go/talent: v1.4.0 +- cloud.google.com/go/texttospeech: v1.5.0 +- cloud.google.com/go/tpu: v1.4.0 +- cloud.google.com/go/trace: v1.4.0 +- cloud.google.com/go/translate: v1.4.0 +- cloud.google.com/go/video: v1.9.0 +- cloud.google.com/go/videointelligence: v1.9.0 +- cloud.google.com/go/vision/v2: v2.5.0 +- cloud.google.com/go/vmmigration: v1.3.0 +- cloud.google.com/go/vmwareengine: v0.1.0 +- cloud.google.com/go/vpcaccess: v1.5.0 +- cloud.google.com/go/webrisk: v1.7.0 +- cloud.google.com/go/websecurityscanner: v1.4.0 +- cloud.google.com/go/workflows: v1.9.0 +- github.com/docker/spdystream: [449fdfc](https://github.com/docker/spdystream/tree/449fdfc) +- github.com/golangplus/bytes: [45c989f](https://github.com/golangplus/bytes/tree/45c989f) +- github.com/golangplus/fmt: [2a5d6d7](https://github.com/golangplus/fmt/tree/2a5d6d7) +- github.com/natefinch/lumberjack: [v2.0.0+incompatible](https://github.com/natefinch/lumberjack/tree/v2.0.0) +- gopkg.in/yaml.v1: 9f9df34 +- sigs.k8s.io/kustomize: v2.0.3+incompatible +- sigs.k8s.io/structured-merge-diff/v3: v3.0.0 + +### Changed +- cloud.google.com/go/bigquery: v1.8.0 → v1.44.0 +- cloud.google.com/go/compute: v1.7.0 → v1.18.0 +- cloud.google.com/go/datastore: v1.1.0 → v1.10.0 +- cloud.google.com/go/firestore: v1.1.0 → v1.9.0 +- cloud.google.com/go/iam: v0.3.0 → v0.11.0 +- cloud.google.com/go/kms: v1.4.0 → v1.6.0 +- cloud.google.com/go/logging: v1.0.0 → v1.6.1 +- cloud.google.com/go/pubsub: v1.4.0 → v1.27.1 +- cloud.google.com/go/storage: v1.23.0 → v1.12.0 +- cloud.google.com/go: v0.103.0 → v0.107.0 +- dmitri.shuralyov.com/gpu/mtl: 28db891 → 666a987 +- github.com/Azure/azure-sdk-for-go: [v55.0.0+incompatible → v42.3.0+incompatible](https://github.com/Azure/azure-sdk-for-go/compare/v55.0.0...v42.3.0) +- github.com/Azure/go-autorest/autorest/to: [v0.4.0 → v0.3.0](https://github.com/Azure/go-autorest/autorest/to/compare/v0.4.0...v0.3.0) +- github.com/Microsoft/hcsshim: [v0.8.22 → v0.8.7](https://github.com/Microsoft/hcsshim/compare/v0.8.22...v0.8.7) +- github.com/aws/aws-sdk-go: [v1.38.49 → v1.37.22](https://github.com/aws/aws-sdk-go/compare/v1.38.49...v1.37.22) +- github.com/census-instrumentation/opencensus-proto: [v0.2.1 → v0.4.1](https://github.com/census-instrumentation/opencensus-proto/compare/v0.2.1...v0.4.1) +- github.com/cespare/xxhash/v2: [v2.1.2 → v2.2.0](https://github.com/cespare/xxhash/v2/compare/v2.1.2...v2.2.0) +- github.com/cncf/udpa/go: [04548b0 → c52dc94](https://github.com/cncf/udpa/go/compare/04548b0...c52dc94) +- github.com/cncf/xds/go: [cb28da3 → 06c439d](https://github.com/cncf/xds/go/compare/cb28da3...06c439d) +- github.com/containerd/cgroups: [v1.0.1 → bf292b2](https://github.com/containerd/cgroups/compare/v1.0.1...bf292b2) +- github.com/containerd/console: [v1.0.3 → c12b1e7](https://github.com/containerd/console/compare/v1.0.3...c12b1e7) +- github.com/containerd/containerd: [v1.4.12 → v1.3.3](https://github.com/containerd/containerd/compare/v1.4.12...v1.3.3) +- github.com/containerd/continuity: [v0.1.0 → 26c1120](https://github.com/containerd/continuity/compare/v0.1.0...26c1120) +- github.com/containerd/fifo: [v1.0.0 → a9fb20d](https://github.com/containerd/fifo/compare/v1.0.0...a9fb20d) +- github.com/containerd/go-runc: [v1.0.0 → 5a6d9f3](https://github.com/containerd/go-runc/compare/v1.0.0...5a6d9f3) +- github.com/containerd/ttrpc: [v1.0.2 → 0e0f228](https://github.com/containerd/ttrpc/compare/v1.0.2...0e0f228) +- github.com/containerd/typeurl: [v1.0.2 → a93fcdb](https://github.com/containerd/typeurl/compare/v1.0.2...a93fcdb) +- github.com/coreos/bbolt: [v1.3.2 → v1.3.3](https://github.com/coreos/bbolt/compare/v1.3.2...v1.3.3) +- github.com/coreos/etcd: [v3.3.13+incompatible → v3.3.17+incompatible](https://github.com/coreos/etcd/compare/v3.3.13...v3.3.17) +- github.com/cyphar/filepath-securejoin: [v0.2.3 → v0.2.2](https://github.com/cyphar/filepath-securejoin/compare/v0.2.3...v0.2.2) +- github.com/docker/distribution: [v2.8.1+incompatible → v2.7.1+incompatible](https://github.com/docker/distribution/compare/v2.8.1...v2.7.1) +- github.com/docker/docker: [v20.10.12+incompatible → v1.13.1](https://github.com/docker/docker/compare/v20.10.12...v1.13.1) +- github.com/envoyproxy/go-control-plane: [49ff273 → v0.10.3](https://github.com/envoyproxy/go-control-plane/compare/49ff273...v0.10.3) +- github.com/envoyproxy/protoc-gen-validate: [v0.1.0 → v0.9.1](https://github.com/envoyproxy/protoc-gen-validate/compare/v0.1.0...v0.9.1) +- github.com/frankban/quicktest: [v1.11.3 → v1.8.1](https://github.com/frankban/quicktest/compare/v1.11.3...v1.8.1) +- github.com/godbus/dbus/v5: [v5.0.6 → v5.0.4](https://github.com/godbus/dbus/v5/compare/v5.0.6...v5.0.4) +- github.com/googleapis/enterprise-certificate-proxy: [v0.1.0 → v0.2.3](https://github.com/googleapis/enterprise-certificate-proxy/compare/v0.1.0...v0.2.3) +- github.com/googleapis/gax-go/v2: [v2.4.0 → v2.7.0](https://github.com/googleapis/gax-go/v2/compare/v2.4.0...v2.7.0) +- github.com/gopherjs/gopherjs: [fce0ec3 → 0766667](https://github.com/gopherjs/gopherjs/compare/fce0ec3...0766667) +- github.com/karrick/godirwalk: [v1.16.1 → v1.10.3](https://github.com/karrick/godirwalk/compare/v1.16.1...v1.10.3) +- github.com/kr/pretty: [v0.2.1 → v0.3.0](https://github.com/kr/pretty/compare/v0.2.1...v0.3.0) +- github.com/moby/sys/mountinfo: [v0.6.0 → v0.6.2](https://github.com/moby/sys/mountinfo/compare/v0.6.0...v0.6.2) +- github.com/olekukonko/tablewriter: [v0.0.4 → a0225b3](https://github.com/olekukonko/tablewriter/compare/v0.0.4...a0225b3) +- github.com/opencontainers/go-digest: [v1.0.0 → v1.0.0-rc1](https://github.com/opencontainers/go-digest/compare/v1.0.0...v1.0.0-rc1) +- github.com/opencontainers/image-spec: [v1.0.2 → v1.0.1](https://github.com/opencontainers/image-spec/compare/v1.0.2...v1.0.1) +- github.com/opencontainers/runc: [v1.1.1 → v0.1.1](https://github.com/opencontainers/runc/compare/v1.1.1...v0.1.1) +- github.com/opencontainers/runtime-spec: [1c3f411 → 5b71a03](https://github.com/opencontainers/runtime-spec/compare/1c3f411...5b71a03) +- github.com/rubiojr/go-vhd: [02e2102 → 0bfd3b3](https://github.com/rubiojr/go-vhd/compare/02e2102...0bfd3b3) +- github.com/smartystreets/assertions: [v1.1.0 → v1.0.0](https://github.com/smartystreets/assertions/compare/v1.1.0...v1.0.0) +- github.com/stretchr/objx: [v0.2.0 → v0.5.0](https://github.com/stretchr/objx/compare/v0.2.0...v0.5.0) +- github.com/stretchr/testify: [v1.7.0 → v1.8.1](https://github.com/stretchr/testify/compare/v1.7.0...v1.8.1) +- github.com/syndtr/gocapability: [42c35b4 → db04d3c](https://github.com/syndtr/gocapability/compare/42c35b4...db04d3c) +- github.com/urfave/cli: [v1.22.2 → v1.20.0](https://github.com/urfave/cli/compare/v1.22.2...v1.20.0) +- go.etcd.io/etcd: 83304cf → dd1b699 +- go.opencensus.io: v0.23.0 → v0.24.0 +- golang.org/x/exp: 85be41e → 6cc2880 +- golang.org/x/mobile: e6ae53a → 597adff +- golang.org/x/net: v0.5.0 → v0.7.0 +- golang.org/x/oauth2: 128564f → v0.5.0 +- golang.org/x/sync: 0de741c → v0.1.0 +- golang.org/x/sys: v0.4.0 → v0.5.0 +- golang.org/x/term: v0.4.0 → v0.5.0 +- golang.org/x/text: v0.6.0 → v0.7.0 +- golang.org/x/xerrors: 65e6541 → 5ec99f8 +- gonum.org/v1/gonum: v0.6.2 → 3d26580 +- google.golang.org/api: v0.86.0 → v0.111.0 +- google.golang.org/genproto: 176da50 → 637eb22 +- google.golang.org/grpc: v1.48.0 → v1.53.0 +- google.golang.org/protobuf: v1.28.0 → v1.28.1 +- gopkg.in/check.v1: 8fa4692 → 10cb982 +- k8s.io/apiextensions-apiserver: v0.24.1 → v0.21.1 +- k8s.io/cli-runtime: v0.24.1 → v0.17.3 +- k8s.io/code-generator: v0.24.1 → v0.21.1 +- k8s.io/csi-translation-lib: v0.24.1 → v0.17.4 +- k8s.io/gengo: c02415c → 485abfe +- k8s.io/klog/v2: v2.60.1 → v2.90.1 +- k8s.io/kubectl: v0.24.1 → v0.17.2 +- k8s.io/kubernetes: v1.24.1 → v1.14.7 +- k8s.io/legacy-cloud-providers: v0.24.1 → v0.17.4 +- k8s.io/metrics: v0.24.1 → v0.17.2 +- k8s.io/mount-utils: v0.24.1 → v0.27.0-alpha.3 +- k8s.io/utils: 56c0de1 → a36077c +- sigs.k8s.io/structured-merge-diff: 15d366b → v1.0.1 + +### Removed +- bitbucket.org/bertimus9/systemstat: 0eeff89 +- github.com/JeffAshton/win_pdh: [76bb4ee](https://github.com/JeffAshton/win_pdh/tree/76bb4ee) +- github.com/ajstarks/svgo: [644b8db](https://github.com/ajstarks/svgo/tree/644b8db) +- github.com/antlr/antlr4/runtime/Go/antlr: [b48c857](https://github.com/antlr/antlr4/runtime/Go/antlr/tree/b48c857) +- github.com/auth0/go-jwt-middleware: [v1.0.1](https://github.com/auth0/go-jwt-middleware/tree/v1.0.1) +- github.com/boltdb/bolt: [v1.3.1](https://github.com/boltdb/bolt/tree/v1.3.1) +- github.com/checkpoint-restore/go-criu/v5: [v5.3.0](https://github.com/checkpoint-restore/go-criu/v5/tree/v5.3.0) +- github.com/cilium/ebpf: [v0.7.0](https://github.com/cilium/ebpf/tree/v0.7.0) +- github.com/clusterhq/flocker-go: [2b8b725](https://github.com/clusterhq/flocker-go/tree/2b8b725) +- github.com/coredns/caddy: [v1.1.0](https://github.com/coredns/caddy/tree/v1.1.0) +- github.com/coredns/corefile-migration: [v1.0.14](https://github.com/coredns/corefile-migration/tree/v1.0.14) +- github.com/euank/go-kmsg-parser: [v2.0.0+incompatible](https://github.com/euank/go-kmsg-parser/tree/v2.0.0) +- github.com/fogleman/gg: [0403632](https://github.com/fogleman/gg/tree/0403632) +- github.com/go-errors/errors: [v1.0.1](https://github.com/go-errors/errors/tree/v1.0.1) +- github.com/go-ozzo/ozzo-validation: [v3.5.0+incompatible](https://github.com/go-ozzo/ozzo-validation/tree/v3.5.0) +- github.com/gofrs/uuid: [v4.0.0+incompatible](https://github.com/gofrs/uuid/tree/v4.0.0) +- github.com/golang/freetype: [e2365df](https://github.com/golang/freetype/tree/e2365df) +- github.com/google/cadvisor: [v0.44.1](https://github.com/google/cadvisor/tree/v0.44.1) +- github.com/google/cel-go: [v0.10.1](https://github.com/google/cel-go/tree/v0.10.1) +- github.com/google/cel-spec: [v0.6.0](https://github.com/google/cel-spec/tree/v0.6.0) +- github.com/google/shlex: [e7afc7f](https://github.com/google/shlex/tree/e7afc7f) +- github.com/googleapis/go-type-adapters: [v1.0.0](https://github.com/googleapis/go-type-adapters/tree/v1.0.0) +- github.com/heketi/heketi: [v10.3.0+incompatible](https://github.com/heketi/heketi/tree/v10.3.0) +- github.com/heketi/tests: [f3775cb](https://github.com/heketi/tests/tree/f3775cb) +- github.com/ishidawataru/sctp: [7c296d4](https://github.com/ishidawataru/sctp/tree/7c296d4) +- github.com/jung-kurt/gofpdf: [24315ac](https://github.com/jung-kurt/gofpdf/tree/24315ac) +- github.com/libopenstorage/openstorage: [v1.0.0](https://github.com/libopenstorage/openstorage/tree/v1.0.0) +- github.com/lpabon/godbc: [v0.1.1](https://github.com/lpabon/godbc/tree/v0.1.1) +- github.com/mindprince/gonvml: [9ebdce4](https://github.com/mindprince/gonvml/tree/9ebdce4) +- github.com/mistifyio/go-zfs: [f784269](https://github.com/mistifyio/go-zfs/tree/f784269) +- github.com/moby/ipvs: [v1.0.1](https://github.com/moby/ipvs/tree/v1.0.1) +- github.com/monochromegane/go-gitignore: [205db1a](https://github.com/monochromegane/go-gitignore/tree/205db1a) +- github.com/mrunalp/fileutils: [v0.5.0](https://github.com/mrunalp/fileutils/tree/v0.5.0) +- github.com/mvdan/xurls: [v1.1.0](https://github.com/mvdan/xurls/tree/v1.1.0) +- github.com/opencontainers/selinux: [v1.10.0](https://github.com/opencontainers/selinux/tree/v1.10.0) +- github.com/quobyte/api: [v0.1.8](https://github.com/quobyte/api/tree/v0.1.8) +- github.com/robfig/cron/v3: [v3.0.1](https://github.com/robfig/cron/v3/tree/v3.0.1) +- github.com/seccomp/libseccomp-golang: [3879420](https://github.com/seccomp/libseccomp-golang/tree/3879420) +- github.com/storageos/go-api: [v2.2.0+incompatible](https://github.com/storageos/go-api/tree/v2.2.0) +- github.com/urfave/negroni: [v1.0.0](https://github.com/urfave/negroni/tree/v1.0.0) +- github.com/vishvananda/netlink: [v1.1.0](https://github.com/vishvananda/netlink/tree/v1.1.0) +- github.com/vishvananda/netns: [db3c7e5](https://github.com/vishvananda/netns/tree/db3c7e5) +- github.com/xlab/treeprint: [a009c39](https://github.com/xlab/treeprint/tree/a009c39) +- go.starlark.net: 8dd3e2e +- gonum.org/v1/plot: e2840ee +- k8s.io/cluster-bootstrap: v0.24.1 +- k8s.io/cri-api: v0.24.1 +- k8s.io/kube-aggregator: v0.24.1 +- k8s.io/kube-controller-manager: v0.24.1 +- k8s.io/kube-proxy: v0.24.1 +- k8s.io/kube-scheduler: v0.24.1 +- k8s.io/kubelet: v0.24.1 +- k8s.io/pod-security-admission: v0.24.1 +- k8s.io/sample-apiserver: v0.24.1 +- k8s.io/system-validators: v1.7.0 +- rsc.io/pdf: v0.1.1 +- sigs.k8s.io/kustomize/api: v0.11.4 +- sigs.k8s.io/kustomize/cmd/config: v0.10.6 +- sigs.k8s.io/kustomize/kustomize/v4: v4.5.4 +- sigs.k8s.io/kustomize/kyaml: v0.13.6 diff --git a/CHANGELOG/CHANGELOG-1.11.md b/CHANGELOG/CHANGELOG-1.11.md new file mode 100644 index 000000000..5f3985fa7 --- /dev/null +++ b/CHANGELOG/CHANGELOG-1.11.md @@ -0,0 +1,441 @@ +# v1.11.9 - Changelog since v1.11.8 + +## Changes by Kind + +### Bug + +- Change GetDisk error reporting to temporary in CreateVolume codepath ([#1601])https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1601), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) + +# v1.11.8 - Changelog since v1.11.7 + +## Changes by Kind + +### Uncategorized + +- Bump golang.org/x/crypto from v0.14.0 to v0.17.0 to fix CVE-2023-48795 ([#1555](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1555), [@sunnylovestiramisu](https://github.com/sunnylovestiramisu)) + +## Dependencies + +### Added +_Nothing has changed._ + +### Changed +- golang.org/x/crypto: v0.14.0 → v0.17.0 +- golang.org/x/sys: v0.13.0 → v0.15.0 +- golang.org/x/term: v0.13.0 → v0.15.0 +- golang.org/x/text: v0.13.0 → v0.14.0 + +### Removed +_Nothing has changed._ + + +# v1.11.7 - Changelog since v1.11.6 + +## Changes by Kind + +### Uncategorized + +- Update golang builder to 1.20.12 ([#1540](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1540), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) + +## Dependencies + +### Added +_Nothing has changed._ + +### Changed +_Nothing has changed._ + +### Removed +_Nothing has changed._ + +# v1.11.6 - Changelog since v1.11.5 + +## Changes by Kind + +### Uncategorized + +- Properly wrap error from GCE Images.Get() API call, to fix a potential nil-ptr dereference ([#1516](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1516), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) + +## Dependencies + +### Added +_Nothing has changed._ + +### Changed +_Nothing has changed._ + +### Removed +_Nothing has changed._ + +# v1.11.5 - Changelog since v1.11.4 + +## Changes by Kind + +### Bug or Regression + +- Bump Golang Builder version to 1.20.11 ([#1507](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1507), [@uriel-guzman](https://github.com/uriel-guzman)) +- Bump google.golang.org/grpc from v1.56.2 to v1.56.3 to fix CVE-2023-44487. ([#1491](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1491), [@uriel-guzman](https://github.com/uriel-guzman)) + +### Uncategorized + +- Reduce log spam when identifying NVMe devices located in `/dev` ([#1488](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1488), [@pwschuurman](https://github.com/pwschuurman)) +- The benign error when DisableDevice is not effective is logged as a warning. ([#1469](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1469), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) + +## Dependencies + +### Added +_Nothing has changed._ + +### Changed +- google.golang.org/grpc: v1.56.2 → v1.56.3 + +### Removed +_Nothing has changed._ +pigateway: v1.4.0 → v1.6.1 +- cloud.google.com/go/apigeeconnect: v1.4.0 → v1.6.1 +- cloud.google.com/go/apigeeregistry: v0.4.0 → v0.7.1 +- cloud.google.com/go/appengine: v1.5.0 → v1.8.1 +- cloud.google.com/go/area120: v0.6.0 → v0.8.1 +- cloud.google.com/go/artifactregistry: v1.9.0 → v1.14.1 +- cloud.google.com/go/asset: v1.10.0 → v1.14.1 +- cloud.google.com/go/assuredworkloads: v1.9.0 → v1.11.1 +- cloud.google.com/go/automl: v1.8.0 → v1.13.1 +- cloud.google.com/go/baremetalsolution: v0.4.0 → v0.5.0 +- cloud.google.com/go/batch: v0.4.0 → v0.7.0 +- cloud.google.com/go/beyondcorp: v0.3.0 → v0.6.1 +- cloud.google.com/go/bigquery: v1.44.0 → v1.52.0 +- cloud.google.com/go/billing: v1.7.0 → v1.16.0 +- cloud.google.com/go/binaryauthorization: v1.4.0 → v1.6.1 +- cloud.google.com/go/certificatemanager: v1.4.0 → v1.7.1 +- cloud.google.com/go/channel: v1.9.0 → v1.16.0 +- cloud.google.com/go/cloudbuild: v1.4.0 → v1.10.1 +- cloud.google.com/go/clouddms: v1.4.0 → v1.6.1 +- cloud.google.com/go/cloudtasks: v1.8.0 → v1.11.1 +- cloud.google.com/go/compute: v1.18.0 → v1.20.1 +- cloud.google.com/go/contactcenterinsights: v1.4.0 → v1.9.1 +- cloud.google.com/go/container: v1.7.0 → v1.22.1 +- cloud.google.com/go/containeranalysis: v0.6.0 → v0.10.1 +- cloud.google.com/go/datacatalog: v1.8.0 → v1.14.1 +- cloud.google.com/go/dataflow: v0.7.0 → v0.9.1 +- cloud.google.com/go/dataform: v0.5.0 → v0.8.1 +- cloud.google.com/go/datafusion: v1.5.0 → v1.7.1 +- cloud.google.com/go/datalabeling: v0.6.0 → v0.8.1 +- cloud.google.com/go/dataplex: v1.4.0 → v1.8.1 +- cloud.google.com/go/dataproc: v1.8.0 → v1.12.0 +- cloud.google.com/go/dataqna: v0.6.0 → v0.8.1 +- cloud.google.com/go/datastore: v1.10.0 → v1.12.0 +- cloud.google.com/go/datastream: v1.5.0 → v1.9.1 +- cloud.google.com/go/deploy: v1.5.0 → v1.11.0 +- cloud.google.com/go/dialogflow: v1.29.0 → v1.38.0 +- cloud.google.com/go/dlp: v1.7.0 → v1.10.1 +- cloud.google.com/go/documentai: v1.10.0 → v1.20.0 +- cloud.google.com/go/domains: v0.7.0 → v0.9.1 +- cloud.google.com/go/edgecontainer: v0.2.0 → v1.1.1 +- cloud.google.com/go/essentialcontacts: v1.4.0 → v1.6.2 +- cloud.google.com/go/eventarc: v1.8.0 → v1.12.1 +- cloud.google.com/go/filestore: v1.4.0 → v1.7.1 +- cloud.google.com/go/firestore: v1.9.0 → v1.11.0 +- cloud.google.com/go/functions: v1.9.0 → v1.15.1 +- cloud.google.com/go/gaming: v1.8.0 → v1.10.1 +- cloud.google.com/go/gkebackup: v0.3.0 → v0.4.0 +- cloud.google.com/go/gkeconnect: v0.6.0 → v0.8.1 +- cloud.google.com/go/gkehub: v0.10.0 → v0.14.1 +- cloud.google.com/go/gkemulticloud: v0.4.0 → v0.6.1 +- cloud.google.com/go/gsuiteaddons: v1.4.0 → v1.6.1 +- cloud.google.com/go/iam: v0.11.0 → v1.1.0 +- cloud.google.com/go/iap: v1.5.0 → v1.8.1 +- cloud.google.com/go/ids: v1.2.0 → v1.4.1 +- cloud.google.com/go/iot: v1.4.0 → v1.7.1 +- cloud.google.com/go/kms: v1.6.0 → v1.12.1 +- cloud.google.com/go/language: v1.8.0 → v1.10.1 +- cloud.google.com/go/lifesciences: v0.6.0 → v0.9.1 +- cloud.google.com/go/logging: v1.6.1 → v1.7.0 +- cloud.google.com/go/longrunning: v0.3.0 → v0.5.1 +- cloud.google.com/go/managedidentities: v1.4.0 → v1.6.1 +- cloud.google.com/go/maps: v0.1.0 → v0.7.0 +- cloud.google.com/go/mediatranslation: v0.6.0 → v0.8.1 +- cloud.google.com/go/memcache: v1.7.0 → v1.10.1 +- cloud.google.com/go/metastore: v1.8.0 → v1.11.1 +- cloud.google.com/go/monitoring: v1.8.0 → v1.15.1 +- cloud.google.com/go/networkconnectivity: v1.7.0 → v1.12.1 +- cloud.google.com/go/networkmanagement: v1.5.0 → v1.8.0 +- cloud.google.com/go/networksecurity: v0.6.0 → v0.9.1 +- cloud.google.com/go/notebooks: v1.5.0 → v1.9.1 +- cloud.google.com/go/optimization: v1.2.0 → v1.4.1 +- cloud.google.com/go/orchestration: v1.4.0 → v1.8.1 +- cloud.google.com/go/orgpolicy: v1.5.0 → v1.11.1 +- cloud.google.com/go/osconfig: v1.10.0 → v1.12.1 +- cloud.google.com/go/oslogin: v1.7.0 → v1.10.1 +- cloud.google.com/go/phishingprotection: v0.6.0 → v0.8.1 +- cloud.google.com/go/policytroubleshooter: v1.4.0 → v1.7.1 +- cloud.google.com/go/privatecatalog: v0.6.0 → v0.9.1 +- cloud.google.com/go/pubsub: v1.27.1 → v1.32.0 +- cloud.google.com/go/pubsublite: v1.5.0 → v1.8.1 +- cloud.google.com/go/recaptchaenterprise/v2: v2.5.0 → v2.7.2 +- cloud.google.com/go/recommendationengine: v0.6.0 → v0.8.1 +- cloud.google.com/go/recommender: v1.8.0 → v1.10.1 +- cloud.google.com/go/redis: v1.10.0 → v1.13.1 +- cloud.google.com/go/resourcemanager: v1.4.0 → v1.9.1 +- cloud.google.com/go/resourcesettings: v1.4.0 → v1.6.1 +- cloud.google.com/go/retail: v1.11.0 → v1.14.1 +- cloud.google.com/go/run: v0.3.0 → v0.9.0 +- cloud.google.com/go/scheduler: v1.7.0 → v1.10.1 +- cloud.google.com/go/secretmanager: v1.9.0 → v1.11.1 +- cloud.google.com/go/security: v1.10.0 → v1.15.1 +- cloud.google.com/go/securitycenter: v1.16.0 → v1.23.0 +- cloud.google.com/go/servicedirectory: v1.7.0 → v1.10.1 +- cloud.google.com/go/shell: v1.4.0 → v1.7.1 +- cloud.google.com/go/spanner: v1.41.0 → v1.47.0 +- cloud.google.com/go/speech: v1.9.0 → v1.17.1 +- cloud.google.com/go/storagetransfer: v1.6.0 → v1.10.0 +- cloud.google.com/go/talent: v1.4.0 → v1.6.2 +- cloud.google.com/go/texttospeech: v1.5.0 → v1.7.1 +- cloud.google.com/go/tpu: v1.4.0 → v1.6.1 +- cloud.google.com/go/trace: v1.4.0 → v1.10.1 +- cloud.google.com/go/translate: v1.4.0 → v1.8.1 +- cloud.google.com/go/video: v1.9.0 → v1.17.1 +- cloud.google.com/go/videointelligence: v1.9.0 → v1.11.1 +- cloud.google.com/go/vision/v2: v2.5.0 → v2.7.2 +- cloud.google.com/go/vmmigration: v1.3.0 → v1.7.1 +- cloud.google.com/go/vmwareengine: v0.1.0 → v0.4.1 +- cloud.google.com/go/vpcaccess: v1.5.0 → v1.7.1 +- cloud.google.com/go/webrisk: v1.7.0 → v1.9.1 +- cloud.google.com/go/websecurityscanner: v1.4.0 → v1.6.1 +- cloud.google.com/go/workflows: v1.9.0 → v1.11.1 +- cloud.google.com/go: v0.107.0 → v0.110.4 +- github.com/cncf/xds/go: [06c439d → e9ce688](https://github.com/cncf/xds/go/compare/06c439d...e9ce688) +- github.com/envoyproxy/go-control-plane: [v0.10.3 → 9239064](https://github.com/envoyproxy/go-control-plane/compare/v0.10.3...9239064) +- github.com/envoyproxy/protoc-gen-validate: [v0.9.1 → v0.10.1](https://github.com/envoyproxy/protoc-gen-validate/compare/v0.9.1...v0.10.1) +- github.com/golang/glog: [v1.0.0 → v1.1.0](https://github.com/golang/glog/compare/v1.0.0...v1.1.0) +- github.com/golang/protobuf: [v1.5.2 → v1.5.3](https://github.com/golang/protobuf/compare/v1.5.2...v1.5.3) +- github.com/googleapis/enterprise-certificate-proxy: [v0.2.3 → v0.2.5](https://github.com/googleapis/enterprise-certificate-proxy/compare/v0.2.3...v0.2.5) +- github.com/googleapis/gax-go/v2: [v2.7.0 → v2.12.0](https://github.com/googleapis/gax-go/v2/compare/v2.7.0...v2.12.0) +- github.com/yuin/goldmark: [v1.4.1 → v1.4.13](https://github.com/yuin/goldmark/compare/v1.4.1...v1.4.13) +- golang.org/x/oauth2: v0.5.0 → v0.10.0 +- golang.org/x/sync: v0.1.0 → v0.3.0 +- google.golang.org/api: v0.111.0 → v0.134.0 +- google.golang.org/genproto: 637eb22 → ccb25ca +- google.golang.org/grpc: v1.53.0 → v1.56.3 +- google.golang.org/protobuf: v1.28.1 → v1.31.0 + +### Removed +- cloud.google.com/go/apikeys: v0.4.0 +- cloud.google.com/go/servicecontrol: v1.5.0 +- cloud.google.com/go/servicemanagement: v1.5.0 +- cloud.google.com/go/serviceusage: v1.4.0 + +# v1.11.4 - Changelog since v1.11.2 + +## Changes by Kind + +### Bug or Regression + +- CVE fixes: CVE-2023-39323 ([#1412](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1412), [@dannawang0221](https://github.com/dannawang0221)) + +### Other (Cleanup or Flake) + +- Update go version to 1.20.10 ([#1453](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1453), [@tyuchn](https://github.com/tyuchn)) + +## Dependencies + +### Changed + +- golang.org/x/crypto: v0.11.0 → v0.14.0 +- golang.org/x/net: v0.12.0 → v0.17.0 +- golang.org/x/sys: v0.10.0 → v0.13.0 +- golang.org/x/term: v0.10.0 → v0.13.0 +- golang.org/x/text: v0.11.0 → v0.13.0 + +# v1.11.2 - Changelog since v1.11.1 +## Changes by Kind + +### Bug or Regression + +- bump go version to 1.20.8 ([#1394](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1394), [@tyuchn](https://github.com/tyuchn)) +- Remove ARG BUILDPLATFORM from Dockerfile ([#1385](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1385), [@tyuchn](https://github.com/tyuchn)) +- Update test/run-e2e.sh to match PROW configuration ([#1360](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1360), [@pwschuurman](https://github.com/pwschuurman)) + +# v1.11.1 - Changelog since v1.11.0 + +## Changes by Kind + +### Bug or Regression + +- Update go version to 1.20.7 to fix CVE-2023-29409 CVE-2023-39533 ([#1347](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1347), [@Sneha-at](https://github.com/Sneha-at)) + +### Uncategorized + +- Fix zone specification in HdT tests ([#1341](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1341), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) + +# v1.11.0 - Changelog since v1.10.5 + +## Changes by Kind + +### Bug or Regression + +- Update go version to 1.20.6 to fix CVE-2023-29406 ([#1330](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1330), [@Sneha-at](https://github.com/Sneha-at)) + +### Other (Cleanup or Flake) + +- Change e2e test machine type to n2-standard-2 to include more Hyperdisk cases ([#1320](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1320), [@sunnylovestiramisu](https://github.com/sunnylovestiramisu)) +- Update k8s-cloud-provider to v1.24.0 and add HdT e2e tests ([#1325](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1325), [@sunnylovestiramisu](https://github.com/sunnylovestiramisu)) + +## Dependencies + +### Added +- github.com/google/go-pkcs11: [v0.2.0](https://github.com/google/go-pkcs11/tree/v0.2.0) +- github.com/google/s2a-go: [v0.1.4](https://github.com/google/s2a-go/tree/v0.1.4) +- google.golang.org/genproto/googleapis/api: ccb25ca +- google.golang.org/genproto/googleapis/bytestream: 659f7aa +- google.golang.org/genproto/googleapis/rpc: 659f7aa + +### Changed +- cloud.google.com/go/accessapproval: v1.5.0 → v1.7.1 +- cloud.google.com/go/accesscontextmanager: v1.4.0 → v1.8.1 +- cloud.google.com/go/aiplatform: v1.27.0 → v1.45.0 +- cloud.google.com/go/analytics: v0.12.0 → v0.21.2 +- cloud.google.com/go/apigateway: v1.4.0 → v1.6.1 +- cloud.google.com/go/apigeeconnect: v1.4.0 → v1.6.1 +- cloud.google.com/go/apigeeregistry: v0.4.0 → v0.7.1 +- cloud.google.com/go/appengine: v1.5.0 → v1.8.1 +- cloud.google.com/go/area120: v0.6.0 → v0.8.1 +- cloud.google.com/go/artifactregistry: v1.9.0 → v1.14.1 +- cloud.google.com/go/asset: v1.10.0 → v1.14.1 +- cloud.google.com/go/assuredworkloads: v1.9.0 → v1.11.1 +- cloud.google.com/go/automl: v1.8.0 → v1.13.1 +- cloud.google.com/go/baremetalsolution: v0.4.0 → v0.5.0 +- cloud.google.com/go/batch: v0.4.0 → v0.7.0 +- cloud.google.com/go/beyondcorp: v0.3.0 → v0.6.1 +- cloud.google.com/go/bigquery: v1.44.0 → v1.52.0 +- cloud.google.com/go/billing: v1.7.0 → v1.16.0 +- cloud.google.com/go/binaryauthorization: v1.4.0 → v1.6.1 +- cloud.google.com/go/certificatemanager: v1.4.0 → v1.7.1 +- cloud.google.com/go/channel: v1.9.0 → v1.16.0 +- cloud.google.com/go/cloudbuild: v1.4.0 → v1.10.1 +- cloud.google.com/go/clouddms: v1.4.0 → v1.6.1 +- cloud.google.com/go/cloudtasks: v1.8.0 → v1.11.1 +- cloud.google.com/go/compute: v1.18.0 → v1.20.1 +- cloud.google.com/go/contactcenterinsights: v1.4.0 → v1.9.1 +- cloud.google.com/go/container: v1.7.0 → v1.22.1 +- cloud.google.com/go/containeranalysis: v0.6.0 → v0.10.1 +- cloud.google.com/go/datacatalog: v1.8.0 → v1.14.1 +- cloud.google.com/go/dataflow: v0.7.0 → v0.9.1 +- cloud.google.com/go/dataform: v0.5.0 → v0.8.1 +- cloud.google.com/go/datafusion: v1.5.0 → v1.7.1 +- cloud.google.com/go/datalabeling: v0.6.0 → v0.8.1 +- cloud.google.com/go/dataplex: v1.4.0 → v1.8.1 +- cloud.google.com/go/dataproc: v1.8.0 → v1.12.0 +- cloud.google.com/go/dataqna: v0.6.0 → v0.8.1 +- cloud.google.com/go/datastore: v1.10.0 → v1.12.0 +- cloud.google.com/go/datastream: v1.5.0 → v1.9.1 +- cloud.google.com/go/deploy: v1.5.0 → v1.11.0 +- cloud.google.com/go/dialogflow: v1.29.0 → v1.38.0 +- cloud.google.com/go/dlp: v1.7.0 → v1.10.1 +- cloud.google.com/go/documentai: v1.10.0 → v1.20.0 +- cloud.google.com/go/domains: v0.7.0 → v0.9.1 +- cloud.google.com/go/edgecontainer: v0.2.0 → v1.1.1 +- cloud.google.com/go/essentialcontacts: v1.4.0 → v1.6.2 +- cloud.google.com/go/eventarc: v1.8.0 → v1.12.1 +- cloud.google.com/go/filestore: v1.4.0 → v1.7.1 +- cloud.google.com/go/firestore: v1.9.0 → v1.11.0 +- cloud.google.com/go/functions: v1.9.0 → v1.15.1 +- cloud.google.com/go/gaming: v1.8.0 → v1.10.1 +- cloud.google.com/go/gkebackup: v0.3.0 → v0.4.0 +- cloud.google.com/go/gkeconnect: v0.6.0 → v0.8.1 +- cloud.google.com/go/gkehub: v0.10.0 → v0.14.1 +- cloud.google.com/go/gkemulticloud: v0.4.0 → v0.6.1 +- cloud.google.com/go/gsuiteaddons: v1.4.0 → v1.6.1 +- cloud.google.com/go/iam: v0.11.0 → v1.1.0 +- cloud.google.com/go/iap: v1.5.0 → v1.8.1 +- cloud.google.com/go/ids: v1.2.0 → v1.4.1 +- cloud.google.com/go/iot: v1.4.0 → v1.7.1 +- cloud.google.com/go/kms: v1.6.0 → v1.12.1 +- cloud.google.com/go/language: v1.8.0 → v1.10.1 +- cloud.google.com/go/lifesciences: v0.6.0 → v0.9.1 +- cloud.google.com/go/logging: v1.6.1 → v1.7.0 +- cloud.google.com/go/longrunning: v0.3.0 → v0.5.1 +- cloud.google.com/go/managedidentities: v1.4.0 → v1.6.1 +- cloud.google.com/go/maps: v0.1.0 → v0.7.0 +- cloud.google.com/go/mediatranslation: v0.6.0 → v0.8.1 +- cloud.google.com/go/memcache: v1.7.0 → v1.10.1 +- cloud.google.com/go/metastore: v1.8.0 → v1.11.1 +- cloud.google.com/go/monitoring: v1.8.0 → v1.15.1 +- cloud.google.com/go/networkconnectivity: v1.7.0 → v1.12.1 +- cloud.google.com/go/networkmanagement: v1.5.0 → v1.8.0 +- cloud.google.com/go/networksecurity: v0.6.0 → v0.9.1 +- cloud.google.com/go/notebooks: v1.5.0 → v1.9.1 +- cloud.google.com/go/optimization: v1.2.0 → v1.4.1 +- cloud.google.com/go/orchestration: v1.4.0 → v1.8.1 +- cloud.google.com/go/orgpolicy: v1.5.0 → v1.11.1 +- cloud.google.com/go/osconfig: v1.10.0 → v1.12.1 +- cloud.google.com/go/oslogin: v1.7.0 → v1.10.1 +- cloud.google.com/go/phishingprotection: v0.6.0 → v0.8.1 +- cloud.google.com/go/policytroubleshooter: v1.4.0 → v1.7.1 +- cloud.google.com/go/privatecatalog: v0.6.0 → v0.9.1 +- cloud.google.com/go/pubsub: v1.27.1 → v1.32.0 +- cloud.google.com/go/pubsublite: v1.5.0 → v1.8.1 +- cloud.google.com/go/recaptchaenterprise/v2: v2.5.0 → v2.7.2 +- cloud.google.com/go/recommendationengine: v0.6.0 → v0.8.1 +- cloud.google.com/go/recommender: v1.8.0 → v1.10.1 +- cloud.google.com/go/redis: v1.10.0 → v1.13.1 +- cloud.google.com/go/resourcemanager: v1.4.0 → v1.9.1 +- cloud.google.com/go/resourcesettings: v1.4.0 → v1.6.1 +- cloud.google.com/go/retail: v1.11.0 → v1.14.1 +- cloud.google.com/go/run: v0.3.0 → v0.9.0 +- cloud.google.com/go/scheduler: v1.7.0 → v1.10.1 +- cloud.google.com/go/secretmanager: v1.9.0 → v1.11.1 +- cloud.google.com/go/security: v1.10.0 → v1.15.1 +- cloud.google.com/go/securitycenter: v1.16.0 → v1.23.0 +- cloud.google.com/go/servicedirectory: v1.7.0 → v1.10.1 +- cloud.google.com/go/shell: v1.4.0 → v1.7.1 +- cloud.google.com/go/spanner: v1.41.0 → v1.47.0 +- cloud.google.com/go/speech: v1.9.0 → v1.17.1 +- cloud.google.com/go/storagetransfer: v1.6.0 → v1.10.0 +- cloud.google.com/go/talent: v1.4.0 → v1.6.2 +- cloud.google.com/go/texttospeech: v1.5.0 → v1.7.1 +- cloud.google.com/go/tpu: v1.4.0 → v1.6.1 +- cloud.google.com/go/trace: v1.4.0 → v1.10.1 +- cloud.google.com/go/translate: v1.4.0 → v1.8.1 +- cloud.google.com/go/video: v1.9.0 → v1.17.1 +- cloud.google.com/go/videointelligence: v1.9.0 → v1.11.1 +- cloud.google.com/go/vision/v2: v2.5.0 → v2.7.2 +- cloud.google.com/go/vmmigration: v1.3.0 → v1.7.1 +- cloud.google.com/go/vmwareengine: v0.1.0 → v0.4.1 +- cloud.google.com/go/vpcaccess: v1.5.0 → v1.7.1 +- cloud.google.com/go/webrisk: v1.7.0 → v1.9.1 +- cloud.google.com/go/websecurityscanner: v1.4.0 → v1.6.1 +- cloud.google.com/go/workflows: v1.9.0 → v1.11.1 +- cloud.google.com/go: v0.107.0 → v0.110.4 +- github.com/GoogleCloudPlatform/k8s-cloud-provider: [v1.18.0 → v1.24.0](https://github.com/GoogleCloudPlatform/k8s-cloud-provider/compare/v1.18.0...v1.24.0) +- github.com/cncf/xds/go: [06c439d → e9ce688](https://github.com/cncf/xds/go/compare/06c439d...e9ce688) +- github.com/envoyproxy/go-control-plane: [v0.10.3 → 9239064](https://github.com/envoyproxy/go-control-plane/compare/v0.10.3...9239064) +- github.com/envoyproxy/protoc-gen-validate: [v0.9.1 → v0.10.1](https://github.com/envoyproxy/protoc-gen-validate/compare/v0.9.1...v0.10.1) +- github.com/golang/glog: [v1.0.0 → v1.1.0](https://github.com/golang/glog/compare/v1.0.0...v1.1.0) +- github.com/golang/protobuf: [v1.5.2 → v1.5.3](https://github.com/golang/protobuf/compare/v1.5.2...v1.5.3) +- github.com/golang/snappy: [v0.0.3 → v0.0.1](https://github.com/golang/snappy/compare/v0.0.3...v0.0.1) +- github.com/google/martian/v3: [v3.2.1 → v3.1.0](https://github.com/google/martian/v3/compare/v3.2.1...v3.1.0) +- github.com/google/pprof: [4bb14d4 → 94a9f03](https://github.com/google/pprof/compare/4bb14d4...94a9f03) +- github.com/googleapis/enterprise-certificate-proxy: [v0.2.3 → v0.2.5](https://github.com/googleapis/enterprise-certificate-proxy/compare/v0.2.3...v0.2.5) +- github.com/googleapis/gax-go/v2: [v2.7.0 → v2.12.0](https://github.com/googleapis/gax-go/v2/compare/v2.7.0...v2.12.0) +- github.com/rogpeppe/go-internal: [v1.5.2 → v1.9.0](https://github.com/rogpeppe/go-internal/compare/v1.5.2...v1.9.0) +- github.com/yuin/goldmark: [v1.4.1 → v1.4.13](https://github.com/yuin/goldmark/compare/v1.4.1...v1.4.13) +- golang.org/x/crypto: 8634188 → v0.11.0 +- golang.org/x/mod: 86c51ed → v0.8.0 +- golang.org/x/net: v0.7.0 → v0.12.0 +- golang.org/x/oauth2: v0.5.0 → v0.10.0 +- golang.org/x/sync: v0.1.0 → v0.3.0 +- golang.org/x/sys: v0.5.0 → v0.10.0 +- golang.org/x/term: v0.5.0 → v0.10.0 +- golang.org/x/text: v0.7.0 → v0.11.0 +- golang.org/x/tools: v0.5.0 → v0.6.0 +- google.golang.org/api: v0.111.0 → v0.134.0 +- google.golang.org/genproto: 637eb22 → ccb25ca +- google.golang.org/grpc: v1.53.0 → v1.56.2 +- google.golang.org/protobuf: v1.28.1 → v1.31.0 + +### Removed +- cloud.google.com/go/apikeys: v0.4.0 +- cloud.google.com/go/servicecontrol: v1.5.0 +- cloud.google.com/go/servicemanagement: v1.5.0 +- cloud.google.com/go/serviceusage: v1.4.0 +- google.golang.org/grpc/cmd/protoc-gen-go-grpc: v1.1.0 diff --git a/CHANGELOG/CHANGELOG-1.12.md b/CHANGELOG/CHANGELOG-1.12.md new file mode 100644 index 000000000..9c88122d1 --- /dev/null +++ b/CHANGELOG/CHANGELOG-1.12.md @@ -0,0 +1,333 @@ +# v1.12.13 - Changelog since v1.12.11 + +## Changes by Kind + +### Bug +- Update Go version and dependencies to fix CVE-2024-24790,CVE-2024-24789 by @Sneha-at in #1851 + +# v1.12.12 - Changelog since v1.12.11 + +## Changes by Kind + +### Bug +- Automated cherry pick of #1658: Add support for checking if a device is being used by a filesystem by @pwschuurman in #1845 + + +# v1.12.11 - Changelog since v1.12.10 + +## Changes by Kind + +### Bug +- [release-1.12] Update debian image from bullseye to bookworm to fix CVEs by @k8s-infra-cherrypick-robot in #1735 +- Reverting the Dockerfile debian image from bookworm to bullseye due to regression by @Sneha-at in #1774 +- [release-1.12] Return Unavailable for 'connection reset by peer' errors by @k8s-infra-cherrypick-robot in #1813 +- Automated cherry pick of #1708: Properly unwrap gce-compute error code. by @hime in #1840 + +# v1.12.10 - Changelog since v1.12.9 + +## Changes by Kind + +### Bug +- Fix CVE-2023-45288 by @dannawang0221 in #1682 + + +# v1.12.9 - Changelog since v1.12.8 + +## Changes by Kind + +### Bug + +- Change GetDisk error reporting to temporary in CreateVolume codepath ([#1600])https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1600), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) +- [release-1.12] Fix nvme path filtering logic for udevadm trigger by @k8s-infra-cherrypick-robot in #1647 + +# v1.12.8 - Changelog since v1.12.7 + +## Changes by Kind + +### Bug + +- Change GetDisk error reporting to temporary in CreateVolume codepath ([#1600])https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1600), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) + +# v1.12.7 - Changelog since v1.12.6 + +## Changes by Kind + +### Uncategorized + +- Filter user misconfigured multiattach errors. ([#1560](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1560), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) + +## Dependencies + +### Added +_Nothing has changed._ + +### Changed +_Nothing has changed._ + +### Removed +_Nothing has changed._ + + +# v1.12.6 - Changelog since v1.12.5 + +## Changes by Kind + +### Uncategorized + +- Bump golang.org/x/crypto from v0.15.0 to v0.17.0 to fix CVE-2023-48795 ([#1550](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1550), [@sunnylovestiramisu](https://github.com/sunnylovestiramisu)) + +## Dependencies + +### Added +_Nothing has changed._ + +### Changed +- golang.org/x/crypto: v0.14.0 → v0.17.0 +- golang.org/x/sys: v0.13.0 → v0.15.0 +- golang.org/x/term: v0.13.0 → v0.15.0 +- golang.org/x/text: v0.13.0 → v0.14.0 + +### Removed +_Nothing has changed._ + + +# v1.12.5 - Changelog since v1.12.4 + +## Changes by Kind + +### Other (Cleanup or Flake) + +- Update golang builder to 1.20.12 ([#1536](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1536), [@msau42](https://github.com/msau42)) + +### Uncategorized + +- Add --fallback-requisite-zones flag to allow disk provisioning to fallback to a default set of zones when there are an insufficient number of zones available in a passed in requisite topology in CreateVolume. ([#1542](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1542), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) +- Properly wrap error from GCE Images.Get() API call, to fix a potential nil-ptr dereference ([#1515](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1515), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) + +## Dependencies + +### Added +_Nothing has changed._ + +### Changed +_Nothing has changed._ + +### Removed +_Nothing has changed._ + +# v1.12.4 - Changelog since v1.12.3 + +## Changes by Kind + +### Uncategorized + +- Properly wrap error from GCE Images.Get() API call, to fix a potential nil-ptr dereference ([#1515](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1515), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) + +## Dependencies + +### Added +_Nothing has changed._ + +### Changed +_Nothing has changed._ + +### Removed +_Nothing has changed._ + +# v1.12.3 - Changelog since v1.12.2 + +## Changes by Kind + +### Bug or Regression + +- Bump Golang Builder version to 1.20.11 ([#1502](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1502), [@uriel-guzman](https://github.com/uriel-guzman)) +- Bump google.golang.org/grpc from v1.56.2 to v1.56.3 to fix CVE-2023-44487. ([#1492](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1492), [@uriel-guzman](https://github.com/uriel-guzman)) + +### Uncategorized + +- Reduce log spam when identifying NVMe devices located in `/dev` ([#1487](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1487), [@pwschuurman](https://github.com/pwschuurman)) +- The benign error when DisableDevice is not effective is logged as a warning. ([#1468](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1468), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) +- Update go version to 1.20.10 ([#1460](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1460), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) + +## Dependencies + +### Added +_Nothing has changed._ + +### Changed +- google.golang.org/grpc: v1.56.2 → v1.56.3 + +### Removed +_Nothing has changed._ +e.com/go/area120: v0.6.0 → v0.8.1 +- cloud.google.com/go/artifactregistry: v1.9.0 → v1.14.1 +- cloud.google.com/go/asset: v1.10.0 → v1.14.1 +- cloud.google.com/go/assuredworkloads: v1.9.0 → v1.11.1 +- cloud.google.com/go/automl: v1.8.0 → v1.13.1 +- cloud.google.com/go/baremetalsolution: v0.4.0 → v0.5.0 +- cloud.google.com/go/batch: v0.4.0 → v0.7.0 +- cloud.google.com/go/beyondcorp: v0.3.0 → v0.6.1 +- cloud.google.com/go/bigquery: v1.44.0 → v1.52.0 +- cloud.google.com/go/billing: v1.7.0 → v1.16.0 +- cloud.google.com/go/binaryauthorization: v1.4.0 → v1.6.1 +- cloud.google.com/go/certificatemanager: v1.4.0 → v1.7.1 +- cloud.google.com/go/channel: v1.9.0 → v1.16.0 +- cloud.google.com/go/cloudbuild: v1.4.0 → v1.10.1 +- cloud.google.com/go/clouddms: v1.4.0 → v1.6.1 +- cloud.google.com/go/cloudtasks: v1.8.0 → v1.11.1 +- cloud.google.com/go/compute: v1.18.0 → v1.20.1 +- cloud.google.com/go/contactcenterinsights: v1.4.0 → v1.9.1 +- cloud.google.com/go/container: v1.7.0 → v1.22.1 +- cloud.google.com/go/containeranalysis: v0.6.0 → v0.10.1 +- cloud.google.com/go/datacatalog: v1.8.0 → v1.14.1 +- cloud.google.com/go/dataflow: v0.7.0 → v0.9.1 +- cloud.google.com/go/dataform: v0.5.0 → v0.8.1 +- cloud.google.com/go/datafusion: v1.5.0 → v1.7.1 +- cloud.google.com/go/datalabeling: v0.6.0 → v0.8.1 +- cloud.google.com/go/dataplex: v1.4.0 → v1.8.1 +- cloud.google.com/go/dataproc: v1.8.0 → v1.12.0 +- cloud.google.com/go/dataqna: v0.6.0 → v0.8.1 +- cloud.google.com/go/datastore: v1.10.0 → v1.12.0 +- cloud.google.com/go/datastream: v1.5.0 → v1.9.1 +- cloud.google.com/go/deploy: v1.5.0 → v1.11.0 +- cloud.google.com/go/dialogflow: v1.29.0 → v1.38.0 +- cloud.google.com/go/dlp: v1.7.0 → v1.10.1 +- cloud.google.com/go/documentai: v1.10.0 → v1.20.0 +- cloud.google.com/go/domains: v0.7.0 → v0.9.1 +- cloud.google.com/go/edgecontainer: v0.2.0 → v1.1.1 +- cloud.google.com/go/essentialcontacts: v1.4.0 → v1.6.2 +- cloud.google.com/go/eventarc: v1.8.0 → v1.12.1 +- cloud.google.com/go/filestore: v1.4.0 → v1.7.1 +- cloud.google.com/go/firestore: v1.9.0 → v1.11.0 +- cloud.google.com/go/functions: v1.9.0 → v1.15.1 +- cloud.google.com/go/gaming: v1.8.0 → v1.10.1 +- cloud.google.com/go/gkebackup: v0.3.0 → v0.4.0 +- cloud.google.com/go/gkeconnect: v0.6.0 → v0.8.1 +- cloud.google.com/go/gkehub: v0.10.0 → v0.14.1 +- cloud.google.com/go/gkemulticloud: v0.4.0 → v0.6.1 +- cloud.google.com/go/gsuiteaddons: v1.4.0 → v1.6.1 +- cloud.google.com/go/iam: v0.11.0 → v1.1.0 +- cloud.google.com/go/iap: v1.5.0 → v1.8.1 +- cloud.google.com/go/ids: v1.2.0 → v1.4.1 +- cloud.google.com/go/iot: v1.4.0 → v1.7.1 +- cloud.google.com/go/kms: v1.6.0 → v1.12.1 +- cloud.google.com/go/language: v1.8.0 → v1.10.1 +- cloud.google.com/go/lifesciences: v0.6.0 → v0.9.1 +- cloud.google.com/go/logging: v1.6.1 → v1.7.0 +- cloud.google.com/go/longrunning: v0.3.0 → v0.5.1 +- cloud.google.com/go/managedidentities: v1.4.0 → v1.6.1 +- cloud.google.com/go/maps: v0.1.0 → v0.7.0 +- cloud.google.com/go/mediatranslation: v0.6.0 → v0.8.1 +- cloud.google.com/go/memcache: v1.7.0 → v1.10.1 +- cloud.google.com/go/metastore: v1.8.0 → v1.11.1 +- cloud.google.com/go/monitoring: v1.8.0 → v1.15.1 +- cloud.google.com/go/networkconnectivity: v1.7.0 → v1.12.1 +- cloud.google.com/go/networkmanagement: v1.5.0 → v1.8.0 +- cloud.google.com/go/networksecurity: v0.6.0 → v0.9.1 +- cloud.google.com/go/notebooks: v1.5.0 → v1.9.1 +- cloud.google.com/go/optimization: v1.2.0 → v1.4.1 +- cloud.google.com/go/orchestration: v1.4.0 → v1.8.1 +- cloud.google.com/go/orgpolicy: v1.5.0 → v1.11.1 +- cloud.google.com/go/osconfig: v1.10.0 → v1.12.1 +- cloud.google.com/go/oslogin: v1.7.0 → v1.10.1 +- cloud.google.com/go/phishingprotection: v0.6.0 → v0.8.1 +- cloud.google.com/go/policytroubleshooter: v1.4.0 → v1.7.1 +- cloud.google.com/go/privatecatalog: v0.6.0 → v0.9.1 +- cloud.google.com/go/pubsub: v1.27.1 → v1.32.0 +- cloud.google.com/go/pubsublite: v1.5.0 → v1.8.1 +- cloud.google.com/go/recaptchaenterprise/v2: v2.5.0 → v2.7.2 +- cloud.google.com/go/recommendationengine: v0.6.0 → v0.8.1 +- cloud.google.com/go/recommender: v1.8.0 → v1.10.1 +- cloud.google.com/go/redis: v1.10.0 → v1.13.1 +- cloud.google.com/go/resourcemanager: v1.4.0 → v1.9.1 +- cloud.google.com/go/resourcesettings: v1.4.0 → v1.6.1 +- cloud.google.com/go/retail: v1.11.0 → v1.14.1 +- cloud.google.com/go/run: v0.3.0 → v0.9.0 +- cloud.google.com/go/scheduler: v1.7.0 → v1.10.1 +- cloud.google.com/go/secretmanager: v1.9.0 → v1.11.1 +- cloud.google.com/go/security: v1.10.0 → v1.15.1 +- cloud.google.com/go/securitycenter: v1.16.0 → v1.23.0 +- cloud.google.com/go/servicedirectory: v1.7.0 → v1.10.1 +- cloud.google.com/go/shell: v1.4.0 → v1.7.1 +- cloud.google.com/go/spanner: v1.41.0 → v1.47.0 +- cloud.google.com/go/speech: v1.9.0 → v1.17.1 +- cloud.google.com/go/storagetransfer: v1.6.0 → v1.10.0 +- cloud.google.com/go/talent: v1.4.0 → v1.6.2 +- cloud.google.com/go/texttospeech: v1.5.0 → v1.7.1 +- cloud.google.com/go/tpu: v1.4.0 → v1.6.1 +- cloud.google.com/go/trace: v1.4.0 → v1.10.1 +- cloud.google.com/go/translate: v1.4.0 → v1.8.1 +- cloud.google.com/go/video: v1.9.0 → v1.17.1 +- cloud.google.com/go/videointelligence: v1.9.0 → v1.11.1 +- cloud.google.com/go/vision/v2: v2.5.0 → v2.7.2 +- cloud.google.com/go/vmmigration: v1.3.0 → v1.7.1 +- cloud.google.com/go/vmwareengine: v0.1.0 → v0.4.1 +- cloud.google.com/go/vpcaccess: v1.5.0 → v1.7.1 +- cloud.google.com/go/webrisk: v1.7.0 → v1.9.1 +- cloud.google.com/go/websecurityscanner: v1.4.0 → v1.6.1 +- cloud.google.com/go/workflows: v1.9.0 → v1.11.1 +- cloud.google.com/go: v0.107.0 → v0.110.4 +- github.com/cncf/xds/go: [06c439d → e9ce688](https://github.com/cncf/xds/go/compare/06c439d...e9ce688) +- github.com/envoyproxy/go-control-plane: [v0.10.3 → 9239064](https://github.com/envoyproxy/go-control-plane/compare/v0.10.3...9239064) +- github.com/envoyproxy/protoc-gen-validate: [v0.9.1 → v0.10.1](https://github.com/envoyproxy/protoc-gen-validate/compare/v0.9.1...v0.10.1) +- github.com/golang/glog: [v1.0.0 → v1.1.0](https://github.com/golang/glog/compare/v1.0.0...v1.1.0) +- github.com/golang/protobuf: [v1.5.2 → v1.5.3](https://github.com/golang/protobuf/compare/v1.5.2...v1.5.3) +- github.com/googleapis/enterprise-certificate-proxy: [v0.2.3 → v0.2.5](https://github.com/googleapis/enterprise-certificate-proxy/compare/v0.2.3...v0.2.5) +- github.com/googleapis/gax-go/v2: [v2.7.0 → v2.12.0](https://github.com/googleapis/gax-go/v2/compare/v2.7.0...v2.12.0) +- github.com/yuin/goldmark: [v1.4.1 → v1.4.13](https://github.com/yuin/goldmark/compare/v1.4.1...v1.4.13) +- golang.org/x/oauth2: v0.5.0 → v0.10.0 +- golang.org/x/sync: v0.1.0 → v0.3.0 +- google.golang.org/api: v0.111.0 → v0.134.0 +- google.golang.org/genproto: 637eb22 → ccb25ca +- google.golang.org/grpc: v1.53.0 → v1.56.3 +- google.golang.org/protobuf: v1.28.1 → v1.31.0 + +### Removed +- cloud.google.com/go/apikeys: v0.4.0 +- cloud.google.com/go/servicecontrol: v1.5.0 +- cloud.google.com/go/servicemanagement: v1.5.0 +- cloud.google.com/go/serviceusage: v1.4.0 + +# v1.12.2 - Changelog since v1.12.0 + +## Changes by Kind + +### Bug or Regression + +- CVE fixes: CVE-2023-39323 ([#1412](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1412), [@dannawang0221](https://github.com/dannawang0221)) + +### Other (Cleanup or Flake) + +- Update go version to 1.20.10 ([#1453](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1453), [@tyuchn](https://github.com/tyuchn)) + +## Dependencies + +### Changed + +- golang.org/x/crypto: v0.11.0 → v0.14.0 +- golang.org/x/net: v0.12.0 → v0.17.0 +- golang.org/x/sys: v0.10.0 → v0.13.0 +- golang.org/x/term: v0.10.0 → v0.13.0 +- golang.org/x/text: v0.11.0 → v0.13.0 + +# v1.12.0 - Changelog since v1.11.1 + +## Changes by Kind + +### Uncategorized + +- Build and publish arm64 images ([#1369](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1369), [@upodroid](https://github.com/upodroid)) + +## Dependencies + +### Added + +_Nothing has changed._ + +### Changed + +_Nothing has changed._ + +### Removed + +_Nothing has changed._ diff --git a/CHANGELOG/CHANGELOG-1.13.md b/CHANGELOG/CHANGELOG-1.13.md new file mode 100644 index 000000000..e96b2f4ff --- /dev/null +++ b/CHANGELOG/CHANGELOG-1.13.md @@ -0,0 +1,414 @@ +# v1.13.8 - Changelog since v1.13.7 + +## Changes by Kind + +### Uncategorized + +- [release-1.13] Properly unwrap gce-compute error code. by @hime in #1839 + + +# v1.13.7 - Changelog since v1.13.6 + +## Changes by Kind + +### Uncategorized + +- [release-1.13] Reassign error returned from validateStoragePools so InvalidArgument is recorded by @k8s-infra-cherrypick-robot in #1721 +- [release-1.13] Return Unavailable for 'connection reset by peer' errors by @k8s-infra-cherrypick-robot in #1724 +- [release-1.13] Update debian image from bullseye to bookworm to fix CVEs by @k8s-infra-cherrypick-robot in #1734 +- Reverting the Dockerfile debian image from bookworm to bullseye due to regression by @Sneha-at in #1775 +- Automated cherry pick of #1658: Add support for checking if a device is being used by a by @pwschuurman in #1805 + + +# v1.13.6 - Changelog since v1.13.5 + +## Changes by Kind + +### Uncategorized + +- Automated cherry pick of #1666: migrate hyperdisk/chd/storagepools to GCE v1 disk API +#1667: remove support for GCE Alpha Disks by @amacaskill in #1669 +- [release-1.13] Record original error code to operation_errors metric for temporary errors by @k8s-infra-cherrypick-robot in #1672 +- [release-1.13] Remove short variable declaration from validateStoragePools by @k8s-infra-cherrypick-robot in #1674 +- Fix CVE-2023-45288 by @dannawang0221 in #1683 + + +# v1.13.5 - Changelog since v1.13.4 + +## Changes by Kind + +### Uncategorized +_Nothing has changed._ + + +# v1.13.4 - Changelog since v1.13.3 + +## Changes by Kind + +### Uncategorized + +- Fixes a regression in the NVMe device search path ([#1634](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1634), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) + +## Dependencies + +### Added +_Nothing has changed._ + +### Changed +_Nothing has changed._ + +### Removed +_Nothing has changed._ + +# v1.13.3 - Changelog since v1.13.2 + +## Changes by Kind + +### Uncategorized + +- Flag --use-instance-api-to-poll-attachment-disk-types uses instances.get API when polling for disk attachment in ControllerPublish for passed in disk types ([#1630](https://github.com/kube +rnetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1630), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) +- Support for read_ahead_kb mount flag to change block device readahead ([#1631](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1631), [@k8s-infra-cherrypick- +robot](https://github.com/k8s-infra-cherrypick-robot)) + +## Dependencies + +### Added +_Nothing has changed._ + +### Changed +_Nothing has changed._ + +### Removed +_Nothing has changed._ + +# v1.13.2 - Changelog since v1.13.1 + +## Changes by Kind + +### Bug + +- Fix error when no compute endpoint is passed ([#1622](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1622), [@Sneha-at](https://github.com/Sneha-at)) + +## Dependencies + +### Added +_Nothing has changed._ + +### Changed +_Nothing has changed._ + +### Removed +_Nothing has changed._ + +# v1.13.1 - Changelog since v1.13.0 + +## Changes by Kind + +### Feature + +- Add support for multi-zone volumeHandle ([#1616](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1616), [@pwschuurman](https://github.com/pwschuurman)) +- Update driver to support staging compute ([#1614](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1614), [@Sneha-at](https://github.com/Sneha-at)) + +### Other (Cleanup or Flake) + +- Map UNSUPPORTED_OPERATION GCE operation error codes to InvalidArgument ([#1610](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1610), [@amacaskill](https://github.com/amacaskill)) + +## Dependencies + +### Added +_Nothing has changed._ + +### Changed +_Nothing has changed._ + +### Removed +_Nothing has changed._ + + +# v1.13.0 - Changelog since v1.12.6 + +## Changes by Kind + +### Feature + +- Added enable-otel-tracing flag to enable opentelemetry tracing for self-managed drivers. The flag is disabled by default ([#1403](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1403), [@Fricounet](https://github.com/Fricounet)) +- Adds validation and support for creating volumes in storage pools. ([#1526](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1526), [@amacaskill](https://github.com/amacaskill)) + +### Bug or Regression + +- Add --fallback-requisite-zones flag to allow disk provisioning to fallback to a default set of zones when there are an insufficient number of zones available in a passed in requisite topology in CreateVolume. ([#1532](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1532), [@pwschuurman](https://github.com/pwschuurman)) +- CVE fixes: CVE-2023-39323 ([#1412](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1412), [@dannawang0221](https://github.com/dannawang0221)) +- Filter user misconfigured multiattach errors. ([#1559](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1559), [@mattcary](https://github.com/mattcary)) +- Properly wrap error from GCE Images.Get() API call, to fix a potential nil-ptr dereference ([#1514](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1514), [@pwschuurman](https://github.com/pwschuurman)) +- Reduce log spam when identifying NVMe devices located in `/dev` ([#1485](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1485), [@pwschuurman](https://github.com/pwschuurman)) + +### Other (Cleanup or Flake) + +- The benign error when DisableDevice is not effective is logged as a warning. ([#1467](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1467), [@mattcary](https://github.com/mattcary)) +- Update go version to 1.20.10 ([#1453](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1453), [@tyuchn](https://github.com/tyuchn)) + +### Uncategorized + +- Adds enable_storage_pools label to the OperationErrorMetric so we can track CSI operation error rates when storage pools is used. ([#1534](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1534), [@amacaskill](https://github.com/amacaskill)) + +## Dependencies + +### Added +- cloud.google.com/go/apikeys: v0.6.0 +- cloud.google.com/go/dataproc/v2: v2.3.0 +- cloud.google.com/go/grafeas: v0.2.0 +- cloud.google.com/go/recaptchaenterprise: v1.3.1 +- cloud.google.com/go/servicecontrol: v1.11.1 +- cloud.google.com/go/servicemanagement: v1.8.0 +- cloud.google.com/go/serviceusage: v1.6.0 +- cloud.google.com/go/vision: v1.2.0 +- gioui.org: 57750fc +- git.sr.ht/~sbinet/gg: v0.3.1 +- github.com/JohnCGriffin/overflow: [46fa312](https://github.com/JohnCGriffin/overflow/tree/46fa312) +- github.com/ajstarks/deck/generate: [c3f852c](https://github.com/ajstarks/deck/generate/tree/c3f852c) +- github.com/ajstarks/deck: [30c9fc6](https://github.com/ajstarks/deck/tree/30c9fc6) +- github.com/ajstarks/svgo: [1546f12](https://github.com/ajstarks/svgo/tree/1546f12) +- github.com/apache/arrow/go/v10: [v10.0.1](https://github.com/apache/arrow/go/v10/tree/v10.0.1) +- github.com/apache/arrow/go/v11: [v11.0.0](https://github.com/apache/arrow/go/v11/tree/v11.0.0) +- github.com/boombuler/barcode: [v1.0.1](https://github.com/boombuler/barcode/tree/v1.0.1) +- github.com/buger/jsonparser: [v1.1.1](https://github.com/buger/jsonparser/tree/v1.1.1) +- github.com/cenkalti/backoff/v4: [v4.2.1](https://github.com/cenkalti/backoff/v4/tree/v4.2.1) +- github.com/flowstack/go-jsonschema: [v0.1.1](https://github.com/flowstack/go-jsonschema/tree/v0.1.1) +- github.com/fogleman/gg: [v1.3.0](https://github.com/fogleman/gg/tree/v1.3.0) +- github.com/go-fonts/dejavu: [v0.1.0](https://github.com/go-fonts/dejavu/tree/v0.1.0) +- github.com/go-fonts/latin-modern: [v0.2.0](https://github.com/go-fonts/latin-modern/tree/v0.2.0) +- github.com/go-fonts/liberation: [v0.2.0](https://github.com/go-fonts/liberation/tree/v0.2.0) +- github.com/go-fonts/stix: [v0.1.0](https://github.com/go-fonts/stix/tree/v0.1.0) +- github.com/go-latex/latex: [c0d11ff](https://github.com/go-latex/latex/tree/c0d11ff) +- github.com/go-logr/stdr: [v1.2.2](https://github.com/go-logr/stdr/tree/v1.2.2) +- github.com/go-pdf/fpdf: [v0.6.0](https://github.com/go-pdf/fpdf/tree/v0.6.0) +- github.com/goccy/go-json: [v0.9.11](https://github.com/goccy/go-json/tree/v0.9.11) +- github.com/golang/freetype: [e2365df](https://github.com/golang/freetype/tree/e2365df) +- github.com/google/flatbuffers: [v2.0.8+incompatible](https://github.com/google/flatbuffers/tree/v2.0.8) +- github.com/google/gnostic-models: [c7be7c7](https://github.com/google/gnostic-models/tree/c7be7c7) +- github.com/googleapis/go-type-adapters: [v1.0.0](https://github.com/googleapis/go-type-adapters/tree/v1.0.0) +- github.com/googleapis/google-cloud-go-testing: [bcd43fb](https://github.com/googleapis/google-cloud-go-testing/tree/bcd43fb) +- github.com/grpc-ecosystem/grpc-gateway/v2: [v2.16.0](https://github.com/grpc-ecosystem/grpc-gateway/v2/tree/v2.16.0) +- github.com/iancoleman/strcase: [v0.2.0](https://github.com/iancoleman/strcase/tree/v0.2.0) +- github.com/jung-kurt/gofpdf: [24315ac](https://github.com/jung-kurt/gofpdf/tree/24315ac) +- github.com/klauspost/asmfmt: [v1.3.2](https://github.com/klauspost/asmfmt/tree/v1.3.2) +- github.com/klauspost/cpuid/v2: [v2.0.9](https://github.com/klauspost/cpuid/v2/tree/v2.0.9) +- github.com/lyft/protoc-gen-star: [v0.6.1](https://github.com/lyft/protoc-gen-star/tree/v0.6.1) +- github.com/minio/asm2plan9s: [cdd7644](https://github.com/minio/asm2plan9s/tree/cdd7644) +- github.com/minio/c2goasm: [36a3d3b](https://github.com/minio/c2goasm/tree/36a3d3b) +- github.com/phpdave11/gofpdf: [v1.4.2](https://github.com/phpdave11/gofpdf/tree/v1.4.2) +- github.com/phpdave11/gofpdi: [v1.0.13](https://github.com/phpdave11/gofpdi/tree/v1.0.13) +- github.com/pierrec/lz4/v4: [v4.1.15](https://github.com/pierrec/lz4/v4/tree/v4.1.15) +- github.com/pkg/diff: [20ebb0f](https://github.com/pkg/diff/tree/20ebb0f) +- github.com/ruudk/golang-pdf417: [a7e3863](https://github.com/ruudk/golang-pdf417/tree/a7e3863) +- github.com/zeebo/assert: [v1.3.0](https://github.com/zeebo/assert/tree/v1.3.0) +- github.com/zeebo/xxh3: [v1.0.2](https://github.com/zeebo/xxh3/tree/v1.0.2) +- go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc: v1.21.0 +- go.opentelemetry.io/otel/exporters/otlp/otlptrace: v1.21.0 +- gonum.org/v1/plot: v0.10.1 +- google.golang.org/grpc/cmd/protoc-gen-go-grpc: v1.1.0 +- lukechampine.com/uint128: v1.2.0 +- modernc.org/cc/v3: v3.36.3 +- modernc.org/ccgo/v3: v3.16.9 +- modernc.org/ccorpus: v1.11.6 +- modernc.org/httpfs: v1.0.6 +- modernc.org/libc: v1.17.1 +- modernc.org/memory: v1.2.1 +- modernc.org/opt: v0.1.3 +- modernc.org/sqlite: v1.18.1 +- modernc.org/tcl: v1.13.1 +- modernc.org/token: v1.0.0 +- modernc.org/z: v1.5.1 +- rsc.io/pdf: v0.1.1 + +### Changed +- cloud.google.com/go/accessapproval: v1.7.1 → v1.7.4 +- cloud.google.com/go/accesscontextmanager: v1.8.1 → v1.8.4 +- cloud.google.com/go/aiplatform: v1.45.0 → v1.57.0 +- cloud.google.com/go/analytics: v0.21.2 → v0.21.6 +- cloud.google.com/go/apigateway: v1.6.1 → v1.6.4 +- cloud.google.com/go/apigeeconnect: v1.6.1 → v1.6.4 +- cloud.google.com/go/apigeeregistry: v0.7.1 → v0.8.2 +- cloud.google.com/go/appengine: v1.8.1 → v1.8.4 +- cloud.google.com/go/area120: v0.8.1 → v0.8.4 +- cloud.google.com/go/artifactregistry: v1.14.1 → v1.14.6 +- cloud.google.com/go/asset: v1.14.1 → v1.15.3 +- cloud.google.com/go/assuredworkloads: v1.11.1 → v1.11.4 +- cloud.google.com/go/automl: v1.13.1 → v1.13.4 +- cloud.google.com/go/baremetalsolution: v0.5.0 → v1.2.3 +- cloud.google.com/go/batch: v0.7.0 → v1.7.0 +- cloud.google.com/go/beyondcorp: v0.6.1 → v1.0.3 +- cloud.google.com/go/bigquery: v1.52.0 → v1.57.1 +- cloud.google.com/go/billing: v1.16.0 → v1.18.0 +- cloud.google.com/go/binaryauthorization: v1.6.1 → v1.8.0 +- cloud.google.com/go/certificatemanager: v1.7.1 → v1.7.4 +- cloud.google.com/go/channel: v1.16.0 → v1.17.3 +- cloud.google.com/go/cloudbuild: v1.10.1 → v1.15.0 +- cloud.google.com/go/clouddms: v1.6.1 → v1.7.3 +- cloud.google.com/go/cloudtasks: v1.11.1 → v1.12.4 +- cloud.google.com/go/compute: v1.20.1 → v1.23.3 +- cloud.google.com/go/contactcenterinsights: v1.9.1 → v1.12.1 +- cloud.google.com/go/container: v1.22.1 → v1.29.0 +- cloud.google.com/go/containeranalysis: v0.10.1 → v0.11.3 +- cloud.google.com/go/datacatalog: v1.14.1 → v1.19.0 +- cloud.google.com/go/dataflow: v0.9.1 → v0.9.4 +- cloud.google.com/go/dataform: v0.8.1 → v0.9.1 +- cloud.google.com/go/datafusion: v1.7.1 → v1.7.4 +- cloud.google.com/go/datalabeling: v0.8.1 → v0.8.4 +- cloud.google.com/go/dataplex: v1.8.1 → v1.13.0 +- cloud.google.com/go/dataqna: v0.8.1 → v0.8.4 +- cloud.google.com/go/datastore: v1.12.0 → v1.15.0 +- cloud.google.com/go/datastream: v1.9.1 → v1.10.3 +- cloud.google.com/go/deploy: v1.11.0 → v1.16.0 +- cloud.google.com/go/dialogflow: v1.38.0 → v1.47.0 +- cloud.google.com/go/dlp: v1.10.1 → v1.11.1 +- cloud.google.com/go/documentai: v1.20.0 → v1.23.6 +- cloud.google.com/go/domains: v0.9.1 → v0.9.4 +- cloud.google.com/go/edgecontainer: v1.1.1 → v1.1.4 +- cloud.google.com/go/essentialcontacts: v1.6.2 → v1.6.5 +- cloud.google.com/go/eventarc: v1.12.1 → v1.13.3 +- cloud.google.com/go/filestore: v1.7.1 → v1.8.0 +- cloud.google.com/go/firestore: v1.11.0 → v1.14.0 +- cloud.google.com/go/functions: v1.15.1 → v1.15.4 +- cloud.google.com/go/gaming: v1.10.1 → v1.9.0 +- cloud.google.com/go/gkebackup: v0.4.0 → v1.3.4 +- cloud.google.com/go/gkeconnect: v0.8.1 → v0.8.4 +- cloud.google.com/go/gkehub: v0.14.1 → v0.14.4 +- cloud.google.com/go/gkemulticloud: v0.6.1 → v1.0.3 +- cloud.google.com/go/gsuiteaddons: v1.6.1 → v1.6.4 +- cloud.google.com/go/iam: v1.1.0 → v1.1.5 +- cloud.google.com/go/iap: v1.8.1 → v1.9.3 +- cloud.google.com/go/ids: v1.4.1 → v1.4.4 +- cloud.google.com/go/iot: v1.7.1 → v1.7.4 +- cloud.google.com/go/kms: v1.12.1 → v1.15.5 +- cloud.google.com/go/language: v1.10.1 → v1.12.2 +- cloud.google.com/go/lifesciences: v0.9.1 → v0.9.4 +- cloud.google.com/go/logging: v1.7.0 → v1.8.1 +- cloud.google.com/go/longrunning: v0.5.1 → v0.5.4 +- cloud.google.com/go/managedidentities: v1.6.1 → v1.6.4 +- cloud.google.com/go/maps: v0.7.0 → v1.6.2 +- cloud.google.com/go/mediatranslation: v0.8.1 → v0.8.4 +- cloud.google.com/go/memcache: v1.10.1 → v1.10.4 +- cloud.google.com/go/metastore: v1.11.1 → v1.13.3 +- cloud.google.com/go/monitoring: v1.15.1 → v1.16.3 +- cloud.google.com/go/networkconnectivity: v1.12.1 → v1.14.3 +- cloud.google.com/go/networkmanagement: v1.8.0 → v1.9.3 +- cloud.google.com/go/networksecurity: v0.9.1 → v0.9.4 +- cloud.google.com/go/notebooks: v1.9.1 → v1.11.2 +- cloud.google.com/go/optimization: v1.4.1 → v1.6.2 +- cloud.google.com/go/orchestration: v1.8.1 → v1.8.4 +- cloud.google.com/go/orgpolicy: v1.11.1 → v1.11.4 +- cloud.google.com/go/osconfig: v1.12.1 → v1.12.4 +- cloud.google.com/go/oslogin: v1.10.1 → v1.12.2 +- cloud.google.com/go/phishingprotection: v0.8.1 → v0.8.4 +- cloud.google.com/go/policytroubleshooter: v1.7.1 → v1.10.2 +- cloud.google.com/go/privatecatalog: v0.9.1 → v0.9.4 +- cloud.google.com/go/pubsub: v1.32.0 → v1.33.0 +- cloud.google.com/go/recaptchaenterprise/v2: v2.7.2 → v2.9.0 +- cloud.google.com/go/recommendationengine: v0.8.1 → v0.8.4 +- cloud.google.com/go/recommender: v1.10.1 → v1.11.3 +- cloud.google.com/go/redis: v1.13.1 → v1.14.1 +- cloud.google.com/go/resourcemanager: v1.9.1 → v1.9.4 +- cloud.google.com/go/resourcesettings: v1.6.1 → v1.6.4 +- cloud.google.com/go/retail: v1.14.1 → v1.14.4 +- cloud.google.com/go/run: v0.9.0 → v1.3.3 +- cloud.google.com/go/scheduler: v1.10.1 → v1.10.5 +- cloud.google.com/go/secretmanager: v1.11.1 → v1.11.4 +- cloud.google.com/go/security: v1.15.1 → v1.15.4 +- cloud.google.com/go/securitycenter: v1.23.0 → v1.24.3 +- cloud.google.com/go/servicedirectory: v1.10.1 → v1.11.3 +- cloud.google.com/go/shell: v1.7.1 → v1.7.4 +- cloud.google.com/go/spanner: v1.47.0 → v1.53.1 +- cloud.google.com/go/speech: v1.17.1 → v1.21.0 +- cloud.google.com/go/storage: v1.12.0 → v1.29.0 +- cloud.google.com/go/storagetransfer: v1.10.0 → v1.10.3 +- cloud.google.com/go/talent: v1.6.2 → v1.6.5 +- cloud.google.com/go/texttospeech: v1.7.1 → v1.7.4 +- cloud.google.com/go/tpu: v1.6.1 → v1.6.4 +- cloud.google.com/go/trace: v1.10.1 → v1.10.4 +- cloud.google.com/go/translate: v1.8.1 → v1.9.3 +- cloud.google.com/go/video: v1.17.1 → v1.20.3 +- cloud.google.com/go/videointelligence: v1.11.1 → v1.11.4 +- cloud.google.com/go/vision/v2: v2.7.2 → v2.7.5 +- cloud.google.com/go/vmmigration: v1.7.1 → v1.7.4 +- cloud.google.com/go/vmwareengine: v0.4.1 → v1.0.3 +- cloud.google.com/go/vpcaccess: v1.7.1 → v1.7.4 +- cloud.google.com/go/webrisk: v1.9.1 → v1.9.4 +- cloud.google.com/go/websecurityscanner: v1.6.1 → v1.6.4 +- cloud.google.com/go/workflows: v1.11.1 → v1.12.3 +- cloud.google.com/go: v0.110.4 → v0.111.0 +- github.com/Microsoft/go-winio: [v0.4.17 → v0.6.1](https://github.com/Microsoft/go-winio/compare/v0.4.17...v0.6.1) +- github.com/andybalholm/brotli: [5f990b6 → v1.0.4](https://github.com/andybalholm/brotli/compare/5f990b6...v1.0.4) +- github.com/apache/thrift: [v0.12.0 → v0.16.0](https://github.com/apache/thrift/compare/v0.12.0...v0.16.0) +- github.com/envoyproxy/go-control-plane: [9239064 → v0.11.1](https://github.com/envoyproxy/go-control-plane/compare/9239064...v0.11.1) +- github.com/envoyproxy/protoc-gen-validate: [v0.10.1 → v1.0.2](https://github.com/envoyproxy/protoc-gen-validate/compare/v0.10.1...v1.0.2) +- github.com/felixge/httpsnoop: [v1.0.1 → v1.0.4](https://github.com/felixge/httpsnoop/compare/v1.0.1...v1.0.4) +- github.com/go-logr/logr: [v1.2.3 → v1.3.0](https://github.com/go-logr/logr/compare/v1.2.3...v1.3.0) +- github.com/go-openapi/jsonpointer: [v0.19.5 → v0.20.0](https://github.com/go-openapi/jsonpointer/compare/v0.19.5...v0.20.0) +- github.com/go-openapi/swag: [v0.21.1 → v0.22.4](https://github.com/go-openapi/swag/compare/v0.21.1...v0.22.4) +- github.com/go-task/slim-sprig: [348f09d → 52ccab3](https://github.com/go-task/slim-sprig/compare/348f09d...52ccab3) +- github.com/golang/glog: [v1.1.0 → v1.1.2](https://github.com/golang/glog/compare/v1.1.0...v1.1.2) +- github.com/golang/snappy: [v0.0.1 → v0.0.4](https://github.com/golang/snappy/compare/v0.0.1...v0.0.4) +- github.com/google/gnostic: [v0.5.7-v3refs → v0.7.0](https://github.com/google/gnostic/compare/v0.5.7-v3refs...v0.7.0) +- github.com/google/go-cmp: [v0.5.9 → v0.6.0](https://github.com/google/go-cmp/compare/v0.5.9...v0.6.0) +- github.com/google/go-pkcs11: [v0.2.0 → c6f7932](https://github.com/google/go-pkcs11/compare/v0.2.0...c6f7932) +- github.com/google/martian/v3: [v3.1.0 → v3.3.2](https://github.com/google/martian/v3/compare/v3.1.0...v3.3.2) +- github.com/google/pprof: [94a9f03 → 4bb14d4](https://github.com/google/pprof/compare/94a9f03...4bb14d4) +- github.com/google/s2a-go: [v0.1.4 → v0.1.7](https://github.com/google/s2a-go/compare/v0.1.4...v0.1.7) +- github.com/google/uuid: [v1.3.0 → v1.5.0](https://github.com/google/uuid/compare/v1.3.0...v1.5.0) +- github.com/googleapis/enterprise-certificate-proxy: [v0.2.5 → v0.3.2](https://github.com/googleapis/enterprise-certificate-proxy/compare/v0.2.5...v0.3.2) +- github.com/klauspost/compress: [v1.13.6 → v1.15.9](https://github.com/klauspost/compress/compare/v1.13.6...v1.15.9) +- github.com/kr/pretty: [v0.3.0 → v0.3.1](https://github.com/kr/pretty/compare/v0.3.0...v0.3.1) +- github.com/kubernetes-csi/csi-proxy/client: [v1.1.1 → v1.1.3](https://github.com/kubernetes-csi/csi-proxy/client/compare/v1.1.1...v1.1.3) +- github.com/mattn/go-isatty: [v0.0.12 → v0.0.16](https://github.com/mattn/go-isatty/compare/v0.0.12...v0.0.16) +- github.com/onsi/ginkgo/v2: [v2.7.1 → v2.14.0](https://github.com/onsi/ginkgo/v2/compare/v2.7.1...v2.14.0) +- github.com/onsi/gomega: [v1.25.0 → v1.30.0](https://github.com/onsi/gomega/compare/v1.25.0...v1.30.0) +- github.com/pkg/sftp: [v1.10.1 → v1.13.1](https://github.com/pkg/sftp/compare/v1.10.1...v1.13.1) +- github.com/remyoudompheng/bigfft: [52369c6 → eec4a21](https://github.com/remyoudompheng/bigfft/compare/52369c6...eec4a21) +- github.com/rogpeppe/go-internal: [v1.9.0 → v1.10.0](https://github.com/rogpeppe/go-internal/compare/v1.9.0...v1.10.0) +- github.com/sirupsen/logrus: [v1.8.1 → v1.9.0](https://github.com/sirupsen/logrus/compare/v1.8.1...v1.9.0) +- github.com/spf13/afero: [v1.6.0 → v1.9.2](https://github.com/spf13/afero/compare/v1.6.0...v1.9.2) +- github.com/stretchr/testify: [v1.8.1 → v1.8.4](https://github.com/stretchr/testify/compare/v1.8.1...v1.8.4) +- github.com/xeipuuv/gojsonschema: [v1.1.0 → v1.2.0](https://github.com/xeipuuv/gojsonschema/compare/v1.1.0...v1.2.0) +- go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc: v0.20.0 → v0.46.1 +- go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp: v0.20.0 → v0.46.1 +- go.opentelemetry.io/otel/metric: v0.20.0 → v1.21.0 +- go.opentelemetry.io/otel/sdk: v0.20.0 → v1.21.0 +- go.opentelemetry.io/otel/trace: v0.20.0 → v1.21.0 +- go.opentelemetry.io/otel: v0.20.0 → v1.21.0 +- go.opentelemetry.io/proto/otlp: v0.7.0 → v1.0.0 +- go.uber.org/goleak: v1.1.10 → v1.3.0 +- golang.org/x/crypto: v0.11.0 → v0.18.0 +- golang.org/x/exp: 6cc2880 → 334a238 +- golang.org/x/image: cff245a → 723b81c +- golang.org/x/mod: v0.8.0 → v0.14.0 +- golang.org/x/net: v0.12.0 → v0.20.0 +- golang.org/x/oauth2: v0.10.0 → v0.16.0 +- golang.org/x/sync: v0.3.0 → v0.6.0 +- golang.org/x/sys: v0.10.0 → v0.16.0 +- golang.org/x/term: v0.10.0 → v0.16.0 +- golang.org/x/text: v0.11.0 → v0.14.0 +- golang.org/x/time: 90d013b → v0.5.0 +- golang.org/x/tools: v0.6.0 → v0.16.1 +- golang.org/x/xerrors: 5ec99f8 → 04be3eb +- gonum.org/v1/gonum: 3d26580 → v0.11.0 +- google.golang.org/api: v0.134.0 → v0.156.0 +- google.golang.org/appengine: v1.6.7 → v1.6.8 +- google.golang.org/genproto/googleapis/api: ccb25ca → 995d672 +- google.golang.org/genproto/googleapis/bytestream: 659f7aa → 50ed04b +- google.golang.org/genproto/googleapis/rpc: 659f7aa → 50ed04b +- google.golang.org/genproto: ccb25ca → 995d672 +- google.golang.org/grpc: v1.56.2 → v1.60.1 +- google.golang.org/protobuf: v1.31.0 → v1.32.0 +- honnef.co/go/tools: v0.0.1-2020.1.4 → v0.1.3 +- k8s.io/klog/v2: v2.90.1 → v2.100.1 +- k8s.io/mount-utils: v0.27.0-alpha.3 → v0.29.0-alpha.2 +- k8s.io/utils: a36077c → 3b25d92 +- modernc.org/mathutil: v1.0.0 → v1.5.0 +- modernc.org/strutil: v1.0.0 → v1.1.3 +- sigs.k8s.io/structured-merge-diff/v4: v4.2.1 → v4.4.1 +- sigs.k8s.io/yaml: v1.3.0 → v1.4.0 + +### Removed +_Nothing has changed._ diff --git a/CHANGELOG/CHANGELOG-1.14.md b/CHANGELOG/CHANGELOG-1.14.md new file mode 100644 index 000000000..f1da406f4 --- /dev/null +++ b/CHANGELOG/CHANGELOG-1.14.md @@ -0,0 +1,219 @@ +# v1.14.3 - Changelog since v1.14.2 + +## Changes by Kind + +### Bug or Regression +- Update base image to bookworm-v1.0.4-gke.2 by @k8s-infra-cherrypick-robot in #1834 + + +# v1.14.2 - Changelog since v1.14.1 + +## Changes by Kind + +### Uncategorized +- [release-1.14] Change OPERATION_CANCELED_BY_USER to Canceled instead of Aborted by @k8s-infra-cherrypick-robot in #1790 + +# v1.14.1 - Changelog since v1.14.0 + +## Changes by Kind + +### Bug or Regression +- [release-1.14] Adding missing libgpg-error.so.0 required by nvme-cli by @k8s-infra-cherrypick-robot in #1765 + + +# v1.14.0 - Changelog since v1.13.6 + +## Changes by Kind + +### Feature + +- Add support for provisioning multi-zone volume handles ([#1733](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1733), [@pwschuurman](https://github.com/pwschuurman)) +- Users can now attach existing tags to GCP Compute Disk, Image, Snapshot resources created by the driver. The driver now accepts a new argument, `--extra-tags`, and a list of tags can be provided to the driver using this argument. The argument is optional, and if the tags are not provided, then there is no change in the existing behavior. ([#1377](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1377), [@arkadeepsen](https://github.com/arkadeepsen)) + +### Bug or Regression + +- Reassign error returned from validateStoragePools so InvalidArgument is recorded ([#1710](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1710), [@amacaskill](https://github.com/amacaskill)) +- Remove disable device call on node unstage. This call was producing spurious error messages and was not effective. ([#1689](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1689), [@mattcary](https://github.com/mattcary)) +- Update debian base image from bullseye to bookworm to fix CVE-2024-33600, CVE-2024-33602, CVE-2024-2961, CVE-2024-33601, CVE-2024-33599 ([#1694](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1694), [@Sneha-at](https://github.com/Sneha-at)) + +### Other (Cleanup or Flake) + +- Properly parse comma separated input flags to filter out empty strings ([#1730](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1730), [@pwschuurman](https://github.com/pwschuurman)) +- Return Unavailable for 'connection reset by peer' errors. ([#1720](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1720), [@amacaskill](https://github.com/amacaskill)) +- Upgrade google.golang.org/api from 172.0 -> 182.0 ([#1725](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1725), [@pwschuurman](https://github.com/pwschuurman)) + +### Uncategorized + +- Error codes extracted from errors part of compute engine api are now exposed with correct http errors instead of being classified as Unknown. ([#1708](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1708), [@hime](https://github.com/hime)) +- The --instances-list-filters command line flag allows the driver to filter on response properties when listing VMs from the GCE API in ListVolumes RPC. + The --use-instance-api-to-list-volumes-published-nodes command line flag allows the driver to use the instances.list API instead of disks.list API when determining PublishedNodeIs in ListVolumes RPC. + ``` + + **Testing**: + + Validated existing behavior with: ([#1696](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1696), [@pwschuurman](https://github.com/pwschuurman)) +- Update logging on multi-zone feature support for volume snapshot and resize ([#1718](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1718), [@hungnguyen243](https://github.com/hungnguyen243)) + +## Dependencies + +### Added +- cloud.google.com/go/auth/oauth2adapt: v0.2.2 +- cloud.google.com/go/auth: v0.5.1 +- github.com/chromedp/cdproto: [3cf4e6d](https://github.com/chromedp/cdproto/tree/3cf4e6d) +- github.com/chromedp/chromedp: [v0.9.2](https://github.com/chromedp/chromedp/tree/v0.9.2) +- github.com/chromedp/sysutil: [v1.0.0](https://github.com/chromedp/sysutil/tree/v1.0.0) +- github.com/go-task/slim-sprig/v3: [v3.0.0](https://github.com/go-task/slim-sprig/v3/tree/v3.0.0) +- github.com/gobwas/httphead: [v0.1.0](https://github.com/gobwas/httphead/tree/v0.1.0) +- github.com/gobwas/pool: [v0.2.1](https://github.com/gobwas/pool/tree/v0.2.1) +- github.com/gobwas/ws: [v1.2.1](https://github.com/gobwas/ws/tree/v1.2.1) +- golang.org/x/telemetry: f48c80b + +### Changed +- cloud.google.com/go/accessapproval: v1.7.4 → v1.7.7 +- cloud.google.com/go/accesscontextmanager: v1.8.4 → v1.8.7 +- cloud.google.com/go/aiplatform: v1.58.0 → v1.67.0 +- cloud.google.com/go/analytics: v0.22.0 → v0.23.2 +- cloud.google.com/go/apigateway: v1.6.4 → v1.6.7 +- cloud.google.com/go/apigeeconnect: v1.6.4 → v1.6.7 +- cloud.google.com/go/apigeeregistry: v0.8.2 → v0.8.5 +- cloud.google.com/go/appengine: v1.8.4 → v1.8.7 +- cloud.google.com/go/area120: v0.8.4 → v0.8.7 +- cloud.google.com/go/artifactregistry: v1.14.6 → v1.14.9 +- cloud.google.com/go/asset: v1.17.0 → v1.19.1 +- cloud.google.com/go/assuredworkloads: v1.11.4 → v1.11.7 +- cloud.google.com/go/automl: v1.13.4 → v1.13.7 +- cloud.google.com/go/baremetalsolution: v1.2.3 → v1.2.6 +- cloud.google.com/go/batch: v1.7.0 → v1.8.6 +- cloud.google.com/go/beyondcorp: v1.0.3 → v1.0.6 +- cloud.google.com/go/bigquery: v1.58.0 → v1.61.0 +- cloud.google.com/go/billing: v1.18.0 → v1.18.5 +- cloud.google.com/go/binaryauthorization: v1.8.0 → v1.8.3 +- cloud.google.com/go/certificatemanager: v1.7.4 → v1.8.1 +- cloud.google.com/go/channel: v1.17.4 → v1.17.7 +- cloud.google.com/go/cloudbuild: v1.15.0 → v1.16.1 +- cloud.google.com/go/clouddms: v1.7.3 → v1.7.6 +- cloud.google.com/go/cloudtasks: v1.12.4 → v1.12.8 +- cloud.google.com/go/compute/metadata: v0.2.3 → v0.3.0 +- cloud.google.com/go/compute: v1.23.4 → v1.27.0 +- cloud.google.com/go/contactcenterinsights: v1.12.1 → v1.13.2 +- cloud.google.com/go/container: v1.29.0 → v1.35.1 +- cloud.google.com/go/containeranalysis: v0.11.3 → v0.11.6 +- cloud.google.com/go/datacatalog: v1.19.2 → v1.20.1 +- cloud.google.com/go/dataflow: v0.9.4 → v0.9.7 +- cloud.google.com/go/dataform: v0.9.1 → v0.9.4 +- cloud.google.com/go/datafusion: v1.7.4 → v1.7.7 +- cloud.google.com/go/datalabeling: v0.8.4 → v0.8.7 +- cloud.google.com/go/dataplex: v1.14.0 → v1.16.0 +- cloud.google.com/go/dataproc/v2: v2.3.0 → v2.4.2 +- cloud.google.com/go/dataqna: v0.8.4 → v0.8.7 +- cloud.google.com/go/datastore: v1.15.0 → v1.17.0 +- cloud.google.com/go/datastream: v1.10.3 → v1.10.6 +- cloud.google.com/go/deploy: v1.17.0 → v1.19.0 +- cloud.google.com/go/dialogflow: v1.48.1 → v1.53.0 +- cloud.google.com/go/dlp: v1.11.1 → v1.13.0 +- cloud.google.com/go/documentai: v1.23.7 → v1.28.1 +- cloud.google.com/go/domains: v0.9.4 → v0.9.7 +- cloud.google.com/go/edgecontainer: v1.1.4 → v1.2.1 +- cloud.google.com/go/essentialcontacts: v1.6.5 → v1.6.8 +- cloud.google.com/go/eventarc: v1.13.3 → v1.13.6 +- cloud.google.com/go/filestore: v1.8.0 → v1.8.3 +- cloud.google.com/go/firestore: v1.14.0 → v1.15.0 +- cloud.google.com/go/functions: v1.15.4 → v1.16.2 +- cloud.google.com/go/gkebackup: v1.3.4 → v1.5.0 +- cloud.google.com/go/gkeconnect: v0.8.4 → v0.8.7 +- cloud.google.com/go/gkehub: v0.14.4 → v0.14.7 +- cloud.google.com/go/gkemulticloud: v1.1.0 → v1.2.0 +- cloud.google.com/go/gsuiteaddons: v1.6.4 → v1.6.7 +- cloud.google.com/go/iam: v1.1.5 → v1.1.8 +- cloud.google.com/go/iap: v1.9.3 → v1.9.6 +- cloud.google.com/go/ids: v1.4.4 → v1.4.7 +- cloud.google.com/go/iot: v1.7.4 → v1.7.7 +- cloud.google.com/go/kms: v1.15.5 → v1.17.1 +- cloud.google.com/go/language: v1.12.2 → v1.12.5 +- cloud.google.com/go/lifesciences: v0.9.4 → v0.9.7 +- cloud.google.com/go/logging: v1.9.0 → v1.10.0 +- cloud.google.com/go/longrunning: v0.5.4 → v0.5.7 +- cloud.google.com/go/managedidentities: v1.6.4 → v1.6.7 +- cloud.google.com/go/maps: v1.6.3 → v1.10.0 +- cloud.google.com/go/mediatranslation: v0.8.4 → v0.8.7 +- cloud.google.com/go/memcache: v1.10.4 → v1.10.7 +- cloud.google.com/go/metastore: v1.13.3 → v1.13.6 +- cloud.google.com/go/monitoring: v1.17.0 → v1.19.0 +- cloud.google.com/go/networkconnectivity: v1.14.3 → v1.14.6 +- cloud.google.com/go/networkmanagement: v1.9.3 → v1.13.2 +- cloud.google.com/go/networksecurity: v0.9.4 → v0.9.7 +- cloud.google.com/go/notebooks: v1.11.2 → v1.11.5 +- cloud.google.com/go/optimization: v1.6.2 → v1.6.5 +- cloud.google.com/go/orchestration: v1.8.4 → v1.9.2 +- cloud.google.com/go/orgpolicy: v1.12.0 → v1.12.3 +- cloud.google.com/go/osconfig: v1.12.4 → v1.12.7 +- cloud.google.com/go/oslogin: v1.13.0 → v1.13.3 +- cloud.google.com/go/phishingprotection: v0.8.4 → v0.8.7 +- cloud.google.com/go/policytroubleshooter: v1.10.2 → v1.10.5 +- cloud.google.com/go/privatecatalog: v0.9.4 → v0.9.7 +- cloud.google.com/go/pubsub: v1.34.0 → v1.38.0 +- cloud.google.com/go/recaptchaenterprise/v2: v2.9.0 → v2.13.0 +- cloud.google.com/go/recommendationengine: v0.8.4 → v0.8.7 +- cloud.google.com/go/recommender: v1.12.0 → v1.12.3 +- cloud.google.com/go/redis: v1.14.1 → v1.15.0 +- cloud.google.com/go/resourcemanager: v1.9.4 → v1.9.7 +- cloud.google.com/go/resourcesettings: v1.6.4 → v1.6.7 +- cloud.google.com/go/retail: v1.14.4 → v1.16.2 +- cloud.google.com/go/run: v1.3.3 → v1.3.7 +- cloud.google.com/go/scheduler: v1.10.5 → v1.10.8 +- cloud.google.com/go/secretmanager: v1.11.4 → v1.13.1 +- cloud.google.com/go/security: v1.15.4 → v1.17.0 +- cloud.google.com/go/securitycenter: v1.24.3 → v1.30.0 +- cloud.google.com/go/servicedirectory: v1.11.3 → v1.11.7 +- cloud.google.com/go/shell: v1.7.4 → v1.7.7 +- cloud.google.com/go/spanner: v1.55.0 → v1.63.0 +- cloud.google.com/go/speech: v1.21.0 → v1.23.1 +- cloud.google.com/go/storage: v1.29.0 → v1.40.0 +- cloud.google.com/go/storagetransfer: v1.10.3 → v1.10.6 +- cloud.google.com/go/talent: v1.6.5 → v1.6.8 +- cloud.google.com/go/texttospeech: v1.7.4 → v1.7.7 +- cloud.google.com/go/tpu: v1.6.4 → v1.6.7 +- cloud.google.com/go/trace: v1.10.4 → v1.10.7 +- cloud.google.com/go/translate: v1.10.0 → v1.10.3 +- cloud.google.com/go/video: v1.20.3 → v1.20.6 +- cloud.google.com/go/videointelligence: v1.11.4 → v1.11.7 +- cloud.google.com/go/vision/v2: v2.7.5 → v2.8.2 +- cloud.google.com/go/vmmigration: v1.7.4 → v1.7.7 +- cloud.google.com/go/vmwareengine: v1.0.3 → v1.1.3 +- cloud.google.com/go/vpcaccess: v1.7.4 → v1.7.7 +- cloud.google.com/go/webrisk: v1.9.4 → v1.9.7 +- cloud.google.com/go/websecurityscanner: v1.6.4 → v1.6.7 +- cloud.google.com/go/workflows: v1.12.3 → v1.12.6 +- cloud.google.com/go: v0.112.0 → v0.114.0 +- github.com/chzyer/readline: [2972be2 → v1.5.1](https://github.com/chzyer/readline/compare/2972be2...v1.5.1) +- github.com/cncf/xds/go: [0fa0005 → 8a4994d](https://github.com/cncf/xds/go/compare/0fa0005...8a4994d) +- github.com/go-task/slim-sprig: [52ccab3 → 348f09d](https://github.com/go-task/slim-sprig/compare/52ccab3...348f09d) +- github.com/google/martian/v3: [v3.3.2 → v3.3.3](https://github.com/google/martian/v3/compare/v3.3.2...v3.3.3) +- github.com/google/pprof: [4bb14d4 → a892ee0](https://github.com/google/pprof/compare/4bb14d4...a892ee0) +- github.com/googleapis/gax-go/v2: [v2.12.3 → v2.12.4](https://github.com/googleapis/gax-go/v2/compare/v2.12.3...v2.12.4) +- github.com/ianlancetaylor/demangle: [28f6c0f → bd984b5](https://github.com/ianlancetaylor/demangle/compare/28f6c0f...bd984b5) +- github.com/onsi/ginkgo/v2: [v2.14.0 → v2.19.0](https://github.com/onsi/ginkgo/v2/compare/v2.14.0...v2.19.0) +- github.com/onsi/gomega: [v1.30.0 → v1.33.1](https://github.com/onsi/gomega/compare/v1.30.0...v1.33.1) +- github.com/stretchr/testify: [v1.8.4 → v1.9.0](https://github.com/stretchr/testify/compare/v1.8.4...v1.9.0) +- go.opentelemetry.io/otel/sdk: v1.21.0 → v1.24.0 +- golang.org/x/crypto: v0.22.0 → v0.24.0 +- golang.org/x/mod: v0.14.0 → v0.18.0 +- golang.org/x/net: v0.24.0 → v0.26.0 +- golang.org/x/oauth2: v0.18.0 → v0.21.0 +- golang.org/x/sync: v0.6.0 → v0.7.0 +- golang.org/x/sys: v0.19.0 → v0.21.0 +- golang.org/x/term: v0.19.0 → v0.21.0 +- golang.org/x/text: v0.14.0 → v0.16.0 +- golang.org/x/tools: v0.16.1 → e35e4cc +- google.golang.org/api: v0.172.0 → v0.183.0 +- google.golang.org/genproto/googleapis/api: a219d84 → d264139 +- google.golang.org/genproto/googleapis/bytestream: 94a12d6 → 5315273 +- google.golang.org/genproto/googleapis/rpc: 94a12d6 → 5315273 +- google.golang.org/genproto: ef43131 → 5315273 +- google.golang.org/grpc: v1.62.1 → v1.64.0 +- google.golang.org/protobuf: v1.33.0 → v1.34.1 +- k8s.io/klog/v2: v2.100.1 → v2.120.1 +- k8s.io/mount-utils: v0.29.0-alpha.2 → v0.30.1 + +### Removed +_Nothing has changed._ diff --git a/CHANGELOG/CHANGELOG-1.15.md b/CHANGELOG/CHANGELOG-1.15.md new file mode 100644 index 000000000..087b286d2 --- /dev/null +++ b/CHANGELOG/CHANGELOG-1.15.md @@ -0,0 +1,44 @@ +# v1.15.4 - Changelog since v1.15.3 +- [release-1.15] [metrics] Fix panic during metrics manager startup by @k8s-infra-cherrypick-robot in https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1898 + +# v1.15.3 - Changelog since v1.15.2 +* [release-1.15] Don't overwrite libc in distroless debian base image by @k8s-infra-cherrypick-robot in https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1884 +* [release-1.15] Refactor metric defer() statements to gRPC metric interceptor by @k8s-infra-cherrypick-robot in https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1886 +* Automated cherry pick of #1875: Require VACs to use SI units by @travisyx in https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1892 + +# v1.15.2 - Changelog since v1.15.1 + +- [release-1.15] Map RESOURCE_OPERATION_RATE_EXCEEDED to ResourceExhausted by @k8s-infra-cherrypick-robot in #1848 +- [release-1.15] Add StatusConflict http kind to userErrorCodeMap. by @k8s-infra-cherrypick-robot in #1850 +- Automated cherry pick of #1826: Add ControllerModifyVolume E2E tests +- #1836: Create documentation for ControllerModifyVolume and controller default +- #1838: Enable VolumeAttributesClass feature gate for CI runs + + +# v1.15.1 - Changelog since v1.15.0 +### Bug +- Update base image to bookworm-v1.0.4-gke.2 by @k8s-infra-cherrypick-robot in #1833 + +# v1.15.0 - Changelog since v1.14.3 + +## Changes by Kind + +### Bug or Regression +- Adding missing libgpg-error.so.0 required by nvme-cli by @pwschuurman in #1760 +- Format byte array error output from google_nvme_id as string by @pwschuurman in #1761 + +### Feature +- Add ControllerModifyVolume functionality by @travisyx in #1801 + +### Uncategorized +- Add verify-docker-deps.sh to verify-all.sh by @pwschuurman in #1762 +- Change OPERATION_CANCELED_BY_USER to Canceled instead of Aborted by @amacaskill in #1789 +- Bump the onsi group across 1 directory with 2 updates by @dependabot in #1811 +- Upgrade sanity tests to v5.3.0 and CSI Spec to v1.10.0 by @travisyx in #1814 +- Add manual deployment instructions for Storage Pools by @amacaskill in #1817 +- Update stable rc master image to point to v1.14.2-rc1 by @amacaskill in #1806 +- Bump golang from 1.22.5 to 1.23.0 by @dependabot in #1808 +- Bump golang from 1.22.4 to 1.22.5 by @dependabot in #1778 +- prune changelog for 1.14 by @pwschuurman in #1745 +- Add back CHANGELOG, removed in #1745 by mistake by @pwschuurman in #1746 +- Add support for running tests on confidential VMs that use NVMe by @pwschuurman in #1636 diff --git a/CHANGELOG/CHANGELOG-1.17.md b/CHANGELOG/CHANGELOG-1.17.md new file mode 100644 index 000000000..60b215bf2 --- /dev/null +++ b/CHANGELOG/CHANGELOG-1.17.md @@ -0,0 +1,59 @@ +# v1.17.12 - Changelog since v1.17.11 +- [Bump up golang.org version to 0.39](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/2071) + +# v1.17.11 - Changelog since v1.17.10 +- [Remove no-op Watcher logs for GKE Data Cache in 1.17 release branch](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/2069) + +# v1.17.10 - Changelog since v1.17.9 +- [Fix hyperdisk attach limits](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/2060) +- [Fix Hyperdisk Resize That Requires Iops/Throughput Adjustment](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/2061) + +# v1.17.9 - Changelog since v1.17.8 +- [Relax volumeContentSource restriction for ROX multi-zone dynamic volume creation](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/2036) + +# v1.17.8 - Changelog since v1.17.7 +- [Automated cherry pick of #2037: update cache logic to calculate chunk size based on total](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/2039) + +# v1.17.7 - Changelog since v1.17.6 +- [Add Attach Limit for Hyperdisk + Gen4 VMs](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/2021) +- [Add pageToken response check to ListSnapshots gRPC API](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/2020) +- [fix outdated metadata error in watcher](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/2029) + +# v1.17.6 - Changelog since v1.17.5 +- [Use strings.Fields for whitespace splitting to fix issues with strings.Split in case of multiple consecutive spaces](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/2008) +- [Fix units for cache size while calculating chunk size for LVM](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/2012) +- [Map insufficient free space error during cache creating to InvalidArgument error](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/2011) + +# v1.17.5 - Changelog since v1.17.4 +- [Add handling for TPC to GetRegionFromZones](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1998) + +# v1.17.4 - Changelog since v1.17.3 +- [Update changelog and test image to release-v1.17.1](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1971) +- [Fix CVE-2025-22870](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1991) +- [Pass performance parameters when creating regional disks.](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1992) +- [Fix logic bug while checking available LSSDs for RAIDing for Data Cache](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1994) +- [Add exponential backoff retries for getting Node from API server logic](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1995) + +# v1.17.3 - Changelog since v1.17.2 +- [Bump the onsi group across 1 directory with 2 updates](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1924) +- [Adding additional checks for data cache watcher and reduceVolumeGroup](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1966) +- [Fix build issues for Windows image](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1953) +- [Bump golang from 1.23.0 to 1.24.0](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1943) +- [Bump the golang-x group across 1 directory with 10 updates](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1963) +- [Fix CVE-2022-1996](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1967) +- [Pass performance parameters when creating regional disks](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1989) +- [Update change log and docs for release v1.17.1 to master](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1973) + +# v1.17.2 - Changelog since v1.17.1 +- [Fixed CVE-2022-1996](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1977) + +# v1.17.1 - Changelog since v1.17.0 +- [Setup caching only for designated node pools](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1966) + +# v1.17.0 - Changelog since v1.16.1 +- [Data cache feature support for PDCSI driver](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1932) +- [Handle reboot scenarios for cached nodes](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1946) +- [Add data cache error code](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1948) +- [Update RAID logic and post RAID integration](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1950) +- [Fix chunksize bug for large cache size](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1954) +- [Distinguish between user errors](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1960) \ No newline at end of file diff --git a/CHANGELOG/CHANGELOG-1.18.md b/CHANGELOG/CHANGELOG-1.18.md new file mode 100644 index 000000000..19c6b839d --- /dev/null +++ b/CHANGELOG/CHANGELOG-1.18.md @@ -0,0 +1,2 @@ +# v1.18.0 - Changelog since v1.17.12 +To be filled in via a copy of the automatically generated release notes once the v1.18.0 tag is created. (TODO: julianKatz@) diff --git a/CHANGELOG/CHANGELOG-1.2.md b/CHANGELOG/CHANGELOG-1.2.md new file mode 100644 index 000000000..75a70458e --- /dev/null +++ b/CHANGELOG/CHANGELOG-1.2.md @@ -0,0 +1,139 @@ +# v1.2.6 - Changelog since v1.2.5 + +## Changes by Kind + +### Uncategorized + +- Cherry-pick #930: Update golang version to 1.17.8 for building drivers. ([#938](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/938), [@pwschuurman](https://github.com/pwschuurman)) + +## Dependencies + +### Added +_Nothing has changed._ + +### Changed +_Nothing has changed._ + +### Removed +_Nothing has changed._ + +# v1.2.5 - Changelog since v1.2.4 + +- Update base image to buster-1.10.0 + +# v1.2.4 - Changelog since v1.2.3 + +## Changes by Kind + +### Bug or Regression + +- Update go builder to 1.17 ([#850](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/850), [@mattcary](https://github.com/mattcary)) + +## Dependencies + +### Added +_Nothing has changed._ + +### Changed +_Nothing has changed._ + +### Removed +_Nothing has changed._ + +# v1.2.3 - Changelog since v1.2.1 + +## Changes by Kind + +### Bug or Regression + +- Update debian images to buster-v1.9.0 ([#839](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/839), [@mattcary](https://github.com/mattcary)) + +### Uncategorized + +- It is now possible to mount a volume with XFS filesystem and its restored snapshot. ([#838](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/838), [@leiyiz](https://github.com/leiyiz)) + +## Dependencies + +### Added +_Nothing has changed._ + +### Changed +_Nothing has changed._ + +### Removed +_Nothing has changed._ + +# v1.2.2 - Changelog since v1.2.1 + +## Changes by Kind + +### Feature + +- Update base image to buster-1.6.0 ([#760](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/760), [@cpanato](https://github.com/cpanato)) + +- Update base image to buster-1.5.0. ([#755](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/755), [@mattcary](https://github.com/mattcary)) + +## Dependencies + +### Added +_Nothing has changed._ + +### Changed +_Nothing has changed._ + +### Removed +_Nothing has changed._ + + +# v1.2.1 - Changelog since v1.2.0 + +## Tests + +- Update kustomize to 3.9.4 ([703](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/703), [@saikat-royc](https://github.com/saikat-royc)) +- Fix cluster list parsing for latest gcloud version ([720](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/720), [@verult](https://github.com/verult)) + +## Other + +- Remove Probe logging ([682](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/682), [@Jiawei0227](https://github.com/Jiawei0227)) +- Round up pdcsi driver size in CreateVolume ([684](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/684), [@Jiawei0227](https://github.com/Jiawei0227)) +- Add gce disk labels support via create volume parameters ([718](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/718), [@mattcary](https://github.com/mattcary)) +- Emit GKE PDCSI component version metric ([719](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/719), [@saikat-royc](https://github.com/saikat-royc)) +- Add cloudbuild configuration to build the image gcp-compute-persistent-disk-csi-driver ([734](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/734), [@cpanato](https://github.com/cpanato)) +- Bump go to the latest 1.13 available in Dockerfile ([734](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/734), [@cpanato](https://github.com/cpanato)) + +# v1.2.0 - Changelog since v1.1.0 + +## Features + +- Improved Windows Support + - Add Disk online/offline logic in nodeStageVolume/nodeUnstageVolume calls for Windows. This requires the CSI Proxy `disk.v1beta2` group, which is only available in CSI proxy v0.2.2+. ([#661](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/661), [@jingxu97](https://github.com/jingxu97)) + +## Bugs or Regressions + +- Fix "volume is mounted" check during NodePublishVolume for Windows ([#666](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/666), [@jingxu97](https://github.com/jingxu97)) +- Add empty string check on returned volumeIds to avoid nil pointer panic ([#673](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/673), [@jingxu97](https://github.com/jingxu97)) + +## Tests + +- Update kustomizer to 3.8.6. ([#661](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/661), [@jingxu97](https://github.com/jingxu97)) +- Updates named pipe path in node.yaml for base deployment overlay to use CSI proxy disk v1beta2 (previously v1beta1) for Windows. ([#669](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/669), [@jingxu97](https://github.com/jingxu97)) +- Fix node version check for node skew tests. ([#645](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/645), [@saikat-royc](https://github.com/saikat-royc)) +- Add run-k8s-integration-ci.sh that the prow driver now expects to be in each release. ([#655](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/655), [@mattcary](https://github.com/mattcary)) +- Use node version on GKE when detecting XFS compatibility. ([#656](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/656), [@mattcary](https://github.com/mattcary)) +- Skip Pod fsgroupchange policy tests for < 1.20 k8s. ([#667](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/667), [@saikat-royc](https://github.com/saikat-royc)) +- Shorten the GKE cluster name. ([#671](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/671), [@saikat-royc](https://github.com/saikat-royc)) + +## Documentation + +No notable changes. + +## Dependencies + +### Added +_Nothing has changed._ + +### Changed +- github.com/kubernetes-csi/csi-proxy/client: [v0.2.1 → v0.2.2](https://github.com/kubernetes-csi/csi-proxy/client/compare/v0.2.1...v0.2.2) + +### Removed +_Nothing has changed._ diff --git a/CHANGELOG/CHANGELOG-1.3.md b/CHANGELOG/CHANGELOG-1.3.md new file mode 100644 index 000000000..5ae26b7a5 --- /dev/null +++ b/CHANGELOG/CHANGELOG-1.3.md @@ -0,0 +1,150 @@ +# v1.3.8 - Changelog since v1.3.7 + +- Update base image to bullseye-v1.4.2 to fix CVE-2021-46828, CVE-2022-2509. + +# v1.3.7 - Changelog since v1.3.6 + +- Update to go1.18.4 and base image to bullseye-v1.4.1 to fix CVE-2022-1271, CVE-2022-1664, CVE-2022-24675, CVE-2022-34903, CVE-2018-25032, CVE-2022-28327, CVE-2021-43618 ([#1033](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1033), [@mattcary](https://github.com/mattcary)) +- Default to MAXPROCS=1 to improve memory usage on nodes with many CPUs. ([#1022](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1022), [@mattcary](https://github.com/mattcary)) +- Remove passwd- file to make CIS benchmark happy. ([#1021](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1021), [@mattcary](https://github.com/mattcary)) + +# v1.3.6 - Changelog since v1.3.5 + +## Changes by Kind + +### Uncategorized + +- Cherry-pick #930: Update golang version to 1.17.8 for building drivers. ([#937](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/937), [@pwschuurman](https://github.com/pwschuurman)) + +## Dependencies + +### Added +_Nothing has changed._ + +### Changed +_Nothing has changed._ + +### Removed +_Nothing has changed._ + +# v1.3.5 - Changelog since v1.3.4 + +- Bump base image to buster-v1.10.0 + + +# v1.3.4 - Changelog since v1.3.3 + +## Changes by Kind + +### Bug or Regression + +- Update go builder to 1.17 ([#850](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/850), [@mattcary](https://github.com/mattcary)) + +## Dependencies + +### Added +_Nothing has changed._ + +### Changed +_Nothing has changed._ + +### Removed +_Nothing has changed._ + +# v1.3.3 - Changelog since v1.3.1 + +## Changes by Kind + +### Bug or Regression + +- Update debian image to buster-1.9.0. ([#841](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/841), [@mattcary](https://github.com/mattcary)) + +## Dependencies + +### Added +_Nothing has changed._ + +### Changed +_Nothing has changed._ + +### Removed +_Nothing has changed._ + +# v1.3.1 - Changelog since v1.3.0 + +### Issues + +- Fixes issue where `ControllerPublishVolume` is called repeatly if gke nodes are in different cloud zones than the gke controller ([#817](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/817), [@leiyiz](https://github.com/leiyiz)) + +## Dependencies + +### Added +_Nothing has changed._ + +### Changed +_Nothing has changed._ + +### Removed +_Nothing has changed._ + +# v1.3.0 - Changelog since v1.2.2 + +### Feature + +- A new `k8s-tag-cluster-id` command line option has been added. If specified, the resulting PD disk will be labeled with "kubernetes_io_cluster_": "owned". ([#693](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/693), [@tsmetana](https://github.com/tsmetana)) +- Add cloudbuild config to build gcp-compute-persistent-disk-csi-driver image ([#724](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/724), [@cpanato](https://github.com/cpanato)) +- Added Support for Windows Server 2004 and 20H2. ([#691](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/691), [@jeremyje](https://github.com/jeremyje)) +- Bumped csi-proxy client library to v1.0.0 ([#738](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/738), [@mauriciopoppe](https://github.com/mauriciopoppe)) +- It is now possible to access snapshots and volumes across different projects. ([#782](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/782), [@christian-roggia](https://github.com/christian-roggia)) +- Updating the following image versions in stable deployment specs: + - csi-provisioner: v2.1.0 + - csi-attacher: v3.1.0 + - csi-resizer: v1.1.0 + - csi-snapshotter: v3.0.3 + - csi-node-driver-registrar: v2.1.0 + - Adding a liveness probe to restart a sidecar if it fails leader election health check. ([#699](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/699), [@verult](https://github.com/verult)) +- Users will be able to set the storage locations for snapshots by specifying them in the snapshot class. ([#793](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/793), [@TeweiLuo](https://github.com/TeweiLuo)) +- Disk labels support via CreateVolume (and hence StorageClass) parameters ([#718](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/718), [@mattcary](https://github.com/mattcary)) + +### Documentation + +- Documentation for overlays ([#708](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/708), [@saikat-royc](https://github.com/saikat-royc)) +- Update README for overlays ([#715](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/715), [@saikat-royc](https://github.com/saikat-royc)) + +### Failing Test + +- V1 CSIDriver resources are deployed for 1.18+ clusters. ([#783](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/783), [@mattcary](https://github.com/mattcary)) + +### Bug or Regression + +- Do not run controller service in node. ([#702](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/702), [@mattcary](https://github.com/mattcary)) +- Fix a bug that CreateVolume should round up the request_bytes. ([#684](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/684), [@Jiawei0227](https://github.com/Jiawei0227)) +- It is now possible to mount a volume with XFS filesystem and its restored snapshot. ([#788](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/788), [@jsafrane](https://github.com/jsafrane)) + +### Other (Cleanup or Flake) + +- Emit GKE component version metric ([#719](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/719), [@saikat-royc](https://github.com/saikat-royc)) + +### Uncategorized + +- Remove probe logging to reduce noise ([#682](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/682), [@Jiawei0227](https://github.com/Jiawei0227)) + +## Dependencies + +### Added +- k8s.io/klog/v2: v2.4.0 +- k8s.io/mount-utils: v0.20.6 + +### Changed +- github.com/Microsoft/go-winio: [v0.4.14 → v0.4.16](https://github.com/Microsoft/go-winio/compare/v0.4.14...v0.4.16) +- github.com/go-logr/logr: [v0.1.0 → v0.2.0](https://github.com/go-logr/logr/compare/v0.1.0...v0.2.0) +- github.com/kr/pretty: [v0.1.0 → v0.2.0](https://github.com/kr/pretty/compare/v0.1.0...v0.2.0) +- github.com/kubernetes-csi/csi-proxy/client: [v0.2.2 → v1.0.0](https://github.com/kubernetes-csi/csi-proxy/client/compare/v0.2.2...v1.0.0) +- github.com/pkg/errors: [v0.8.1 → v0.9.1](https://github.com/pkg/errors/compare/v0.8.1...v0.9.1) +- github.com/stretchr/testify: [v1.4.0 → v1.6.1](https://github.com/stretchr/testify/compare/v1.4.0...v1.6.1) +- gopkg.in/check.v1: 788fd78 → 41f04d3 +- gopkg.in/yaml.v3: 674ba3e → 9f266ea +- k8s.io/utils: a9aa75a → 67b214c + +### Removed +_Nothing has changed._ diff --git a/CHANGELOG/CHANGELOG-1.4.md b/CHANGELOG/CHANGELOG-1.4.md new file mode 100644 index 000000000..ab67839c5 --- /dev/null +++ b/CHANGELOG/CHANGELOG-1.4.md @@ -0,0 +1,439 @@ +# v1.4.1 - Changelog since v1.4.0 + +## Changes by Kind + +### Bug or Regression + +- Fix #942 that can cause attacher to think a disk has been attached even if the attach failed. (#945, @mattcary) + +### Uncategorized + +- Add support for NVMe persistent disks (#946, @pwschuurman) +- Cherry-pick #930: Update golang version to 1.17.8 for building drivers. (#936, @pwschuurman) + +## Dependencies + +### Added +_Nothing has changed._ + +### Changed +_Nothing has changed._ + +### Removed +_Nothing has changed._ + +# v1.4.0 - Changelog since v1.3.4 + +## Changes by Kind + +### Feature + +- Updates Kubernetes dependencies to v1.22.0 ([#814](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/814), [@chrishenzie](https://github.com/chrishenzie)) +- Add attach/detach back off ([#847](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/847), [@lizhuqi](https://github.com/lizhuqi)) +- Enables volume cloning. ([#854](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/854), [@amacaskill](https://github.com/amacaskill)) +- Use the most recent 1.3.4 image for prow rc master ([#864](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/864), [@saikat-royc](https://github.com/saikat-royc)) +- Change to distroless base image ([#870](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/870), [@amacaskill](https://github.com/amacaskill)) +- Turn on controller-publish-readonly flag and add validation in pd-csi driver for when readonly is on ([#869](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/869), [@leiyiz](https://github.com/leiyiz)) + +### Documentation + +- Doc and image update for 1.3.4 release ([#855](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/855), [@saikat-royc](https://github.com/saikat-royc)) +- Update release 1.2.4 CHANGELOG ([#862](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/862), [@saikat-royc](https://github.com/saikat-royc)) + +### Bug or Regression + +### Other (Cleanup or Flake) + +- Update debian base image to 1.9.0 ([#826](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/826), [@saikat-royc](https://github.com/saikat-royc)) +- Updates the CSI sanity test suite to v4.2.0 ([#816](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/816), [@chrishenzie](https://github.com/chrishenzie)) + +### Uncategorized + +- Update snapshot sidecar roles ([#857](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/857), [@saikat-royc](https://github.com/saikat-royc)) + +## Dependencies + +### Added +- cloud.google.com/go/firestore: v1.1.0 +- github.com/OneOfOne/xxhash: [v1.2.2](https://github.com/OneOfOne/xxhash/tree/v1.2.2) +- github.com/antihax/optional: [v1.0.0](https://github.com/antihax/optional/tree/v1.0.0) +- github.com/armon/go-metrics: [f0300d1](https://github.com/armon/go-metrics/tree/f0300d1) +- github.com/armon/go-radix: [7fddfc3](https://github.com/armon/go-radix/tree/7fddfc3) +- github.com/benbjohnson/clock: [v1.0.3](https://github.com/benbjohnson/clock/tree/v1.0.3) +- github.com/bits-and-blooms/bitset: [v1.2.0](https://github.com/bits-and-blooms/bitset/tree/v1.2.0) +- github.com/bketelsen/crypt: [5cbc8cc](https://github.com/bketelsen/crypt/tree/5cbc8cc) +- github.com/certifi/gocertifi: [2c3bb06](https://github.com/certifi/gocertifi/tree/2c3bb06) +- github.com/cespare/xxhash/v2: [v2.1.1](https://github.com/cespare/xxhash/v2/tree/v2.1.1) +- github.com/cespare/xxhash: [v1.1.0](https://github.com/cespare/xxhash/tree/v1.1.0) +- github.com/checkpoint-restore/go-criu/v5: [v5.0.0](https://github.com/checkpoint-restore/go-criu/v5/tree/v5.0.0) +- github.com/cockroachdb/errors: [v1.2.4](https://github.com/cockroachdb/errors/tree/v1.2.4) +- github.com/cockroachdb/logtags: [eb05cc2](https://github.com/cockroachdb/logtags/tree/eb05cc2) +- github.com/containerd/cgroups: [0dbf7f0](https://github.com/containerd/cgroups/tree/0dbf7f0) +- github.com/containerd/continuity: [aaeac12](https://github.com/containerd/continuity/tree/aaeac12) +- github.com/containerd/fifo: [a9fb20d](https://github.com/containerd/fifo/tree/a9fb20d) +- github.com/containerd/go-runc: [5a6d9f3](https://github.com/containerd/go-runc/tree/5a6d9f3) +- github.com/containerd/ttrpc: [v1.0.2](https://github.com/containerd/ttrpc/tree/v1.0.2) +- github.com/coredns/caddy: [v1.1.0](https://github.com/coredns/caddy/tree/v1.1.0) +- github.com/coreos/bbolt: [v1.3.2](https://github.com/coreos/bbolt/tree/v1.3.2) +- github.com/coreos/go-systemd/v22: [v22.3.2](https://github.com/coreos/go-systemd/v22/tree/v22.3.2) +- github.com/cpuguy83/go-md2man/v2: [v2.0.0](https://github.com/cpuguy83/go-md2man/v2/tree/v2.0.0) +- github.com/dgryski/go-sip13: [e10d5fe](https://github.com/dgryski/go-sip13/tree/e10d5fe) +- github.com/felixge/httpsnoop: [v1.0.1](https://github.com/felixge/httpsnoop/tree/v1.0.1) +- github.com/form3tech-oss/jwt-go: [v3.2.3+incompatible](https://github.com/form3tech-oss/jwt-go/tree/v3.2.3) +- github.com/frankban/quicktest: [v1.11.3](https://github.com/frankban/quicktest/tree/v1.11.3) +- github.com/fvbommel/sortorder: [v1.0.1](https://github.com/fvbommel/sortorder/tree/v1.0.1) +- github.com/getsentry/raven-go: [v0.2.0](https://github.com/getsentry/raven-go/tree/v0.2.0) +- github.com/go-errors/errors: [v1.0.1](https://github.com/go-errors/errors/tree/v1.0.1) +- github.com/go-kit/log: [v0.1.0](https://github.com/go-kit/log/tree/v0.1.0) +- github.com/godbus/dbus/v5: [v5.0.4](https://github.com/godbus/dbus/v5/tree/v5.0.4) +- github.com/gofrs/uuid: [v4.0.0+incompatible](https://github.com/gofrs/uuid/tree/v4.0.0) +- github.com/google/shlex: [e7afc7f](https://github.com/google/shlex/tree/e7afc7f) +- github.com/hashicorp/consul/api: [v1.1.0](https://github.com/hashicorp/consul/api/tree/v1.1.0) +- github.com/hashicorp/consul/sdk: [v0.1.1](https://github.com/hashicorp/consul/sdk/tree/v0.1.1) +- github.com/hashicorp/go-cleanhttp: [v0.5.1](https://github.com/hashicorp/go-cleanhttp/tree/v0.5.1) +- github.com/hashicorp/go-immutable-radix: [v1.0.0](https://github.com/hashicorp/go-immutable-radix/tree/v1.0.0) +- github.com/hashicorp/go-msgpack: [v0.5.3](https://github.com/hashicorp/go-msgpack/tree/v0.5.3) +- github.com/hashicorp/go-rootcerts: [v1.0.0](https://github.com/hashicorp/go-rootcerts/tree/v1.0.0) +- github.com/hashicorp/go-sockaddr: [v1.0.0](https://github.com/hashicorp/go-sockaddr/tree/v1.0.0) +- github.com/hashicorp/go-uuid: [v1.0.1](https://github.com/hashicorp/go-uuid/tree/v1.0.1) +- github.com/hashicorp/go.net: [v0.0.1](https://github.com/hashicorp/go.net/tree/v0.0.1) +- github.com/hashicorp/logutils: [v1.0.0](https://github.com/hashicorp/logutils/tree/v1.0.0) +- github.com/hashicorp/mdns: [v1.0.0](https://github.com/hashicorp/mdns/tree/v1.0.0) +- github.com/hashicorp/memberlist: [v0.1.3](https://github.com/hashicorp/memberlist/tree/v0.1.3) +- github.com/hashicorp/serf: [v0.8.2](https://github.com/hashicorp/serf/tree/v0.8.2) +- github.com/ishidawataru/sctp: [7c296d4](https://github.com/ishidawataru/sctp/tree/7c296d4) +- github.com/jmespath/go-jmespath/internal/testify: [v1.5.1](https://github.com/jmespath/go-jmespath/internal/testify/tree/v1.5.1) +- github.com/josharian/intern: [v1.0.0](https://github.com/josharian/intern/tree/v1.0.0) +- github.com/jpillora/backoff: [v1.0.0](https://github.com/jpillora/backoff/tree/v1.0.0) +- github.com/kubernetes-csi/csi-test/v4: [v4.2.0](https://github.com/kubernetes-csi/csi-test/v4/tree/v4.2.0) +- github.com/mitchellh/cli: [v1.0.0](https://github.com/mitchellh/cli/tree/v1.0.0) +- github.com/mitchellh/go-testing-interface: [v1.0.0](https://github.com/mitchellh/go-testing-interface/tree/v1.0.0) +- github.com/mitchellh/gox: [v0.4.0](https://github.com/mitchellh/gox/tree/v0.4.0) +- github.com/mitchellh/iochan: [v1.0.0](https://github.com/mitchellh/iochan/tree/v1.0.0) +- github.com/moby/ipvs: [v1.0.1](https://github.com/moby/ipvs/tree/v1.0.1) +- github.com/moby/spdystream: [v0.2.0](https://github.com/moby/spdystream/tree/v0.2.0) +- github.com/moby/sys/mountinfo: [v0.4.1](https://github.com/moby/sys/mountinfo/tree/v0.4.1) +- github.com/moby/term: [9d4ed18](https://github.com/moby/term/tree/9d4ed18) +- github.com/monochromegane/go-gitignore: [205db1a](https://github.com/monochromegane/go-gitignore/tree/205db1a) +- github.com/niemeyer/pretty: [a10e7ca](https://github.com/niemeyer/pretty/tree/a10e7ca) +- github.com/nxadm/tail: [v1.4.5](https://github.com/nxadm/tail/tree/v1.4.5) +- github.com/oklog/ulid: [v1.3.1](https://github.com/oklog/ulid/tree/v1.3.1) +- github.com/opentracing/opentracing-go: [v1.1.0](https://github.com/opentracing/opentracing-go/tree/v1.1.0) +- github.com/pascaldekloe/goe: [57f6aae](https://github.com/pascaldekloe/goe/tree/57f6aae) +- github.com/posener/complete: [v1.1.1](https://github.com/posener/complete/tree/v1.1.1) +- github.com/prometheus/tsdb: [v0.7.1](https://github.com/prometheus/tsdb/tree/v0.7.1) +- github.com/robertkrimen/otto: [ef014fd](https://github.com/robertkrimen/otto/tree/ef014fd) +- github.com/robfig/cron/v3: [v3.0.1](https://github.com/robfig/cron/v3/tree/v3.0.1) +- github.com/russross/blackfriday/v2: [v2.0.1](https://github.com/russross/blackfriday/v2/tree/v2.0.1) +- github.com/ryanuber/columnize: [9b3edd6](https://github.com/ryanuber/columnize/tree/9b3edd6) +- github.com/sean-/seed: [e2103e2](https://github.com/sean-/seed/tree/e2103e2) +- github.com/shurcooL/sanitized_anchor_name: [v1.0.0](https://github.com/shurcooL/sanitized_anchor_name/tree/v1.0.0) +- github.com/spaolacci/murmur3: [f09979e](https://github.com/spaolacci/murmur3/tree/f09979e) +- github.com/stoewer/go-strcase: [v1.2.0](https://github.com/stoewer/go-strcase/tree/v1.2.0) +- github.com/subosito/gotenv: [v1.2.0](https://github.com/subosito/gotenv/tree/v1.2.0) +- github.com/willf/bitset: [v1.1.11](https://github.com/willf/bitset/tree/v1.1.11) +- github.com/xlab/treeprint: [a009c39](https://github.com/xlab/treeprint/tree/a009c39) +- go.etcd.io/etcd/api/v3: v3.5.0 +- go.etcd.io/etcd/client/pkg/v3: v3.5.0 +- go.etcd.io/etcd/client/v2: v2.305.0 +- go.etcd.io/etcd/client/v3: v3.5.0 +- go.etcd.io/etcd/pkg/v3: v3.5.0 +- go.etcd.io/etcd/raft/v3: v3.5.0 +- go.etcd.io/etcd/server/v3: v3.5.0 +- go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc: v0.20.0 +- go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp: v0.20.0 +- go.opentelemetry.io/contrib: v0.20.0 +- go.opentelemetry.io/otel/exporters/otlp: v0.20.0 +- go.opentelemetry.io/otel/metric: v0.20.0 +- go.opentelemetry.io/otel/oteltest: v0.20.0 +- go.opentelemetry.io/otel/sdk/export/metric: v0.20.0 +- go.opentelemetry.io/otel/sdk/metric: v0.20.0 +- go.opentelemetry.io/otel/sdk: v0.20.0 +- go.opentelemetry.io/otel/trace: v0.20.0 +- go.opentelemetry.io/otel: v0.20.0 +- go.opentelemetry.io/proto/otlp: v0.7.0 +- go.starlark.net: 8dd3e2e +- go.uber.org/goleak: v1.1.10 +- golang.org/x/term: 6a3ed07 +- gopkg.in/ini.v1: v1.51.0 +- gopkg.in/sourcemap.v1: v1.0.5 +- gotest.tools/v3: v3.0.3 +- k8s.io/component-helpers: v0.22.0 +- k8s.io/controller-manager: v0.22.0 +- k8s.io/pod-security-admission: v0.22.0 +- sigs.k8s.io/kustomize/api: v0.8.11 +- sigs.k8s.io/kustomize/cmd/config: v0.9.13 +- sigs.k8s.io/kustomize/kustomize/v4: v4.2.0 +- sigs.k8s.io/kustomize/kyaml: v0.11.0 +- sigs.k8s.io/structured-merge-diff/v4: v4.1.2 + +### Changed +- dmitri.shuralyov.com/gpu/mtl: 666a987 → 28db891 +- github.com/Azure/azure-sdk-for-go: [v35.0.0+incompatible → v55.0.0+incompatible](https://github.com/Azure/azure-sdk-for-go/compare/v35.0.0...v55.0.0) +- github.com/Azure/go-ansiterm: [d6e3b33 → d185dfc](https://github.com/Azure/go-ansiterm/compare/d6e3b33...d185dfc) +- github.com/Azure/go-autorest/autorest/adal: [v0.5.0 → v0.9.13](https://github.com/Azure/go-autorest/autorest/adal/compare/v0.5.0...v0.9.13) +- github.com/Azure/go-autorest/autorest/date: [v0.1.0 → v0.3.0](https://github.com/Azure/go-autorest/autorest/date/compare/v0.1.0...v0.3.0) +- github.com/Azure/go-autorest/autorest/mocks: [v0.2.0 → v0.4.1](https://github.com/Azure/go-autorest/autorest/mocks/compare/v0.2.0...v0.4.1) +- github.com/Azure/go-autorest/autorest/to: [v0.2.0 → v0.4.0](https://github.com/Azure/go-autorest/autorest/to/compare/v0.2.0...v0.4.0) +- github.com/Azure/go-autorest/autorest: [v0.9.0 → v0.11.18](https://github.com/Azure/go-autorest/autorest/compare/v0.9.0...v0.11.18) +- github.com/Azure/go-autorest/logger: [v0.1.0 → v0.2.1](https://github.com/Azure/go-autorest/logger/compare/v0.1.0...v0.2.1) +- github.com/Azure/go-autorest/tracing: [v0.5.0 → v0.6.0](https://github.com/Azure/go-autorest/tracing/compare/v0.5.0...v0.6.0) +- github.com/Azure/go-autorest: [v11.1.2+incompatible → v14.2.0+incompatible](https://github.com/Azure/go-autorest/compare/v11.1.2...v14.2.0) +- github.com/GoogleCloudPlatform/k8s-cloud-provider: [27a4ced → 7901bc8](https://github.com/GoogleCloudPlatform/k8s-cloud-provider/compare/27a4ced...7901bc8) +- github.com/Microsoft/hcsshim: [672e52e → 5eafd15](https://github.com/Microsoft/hcsshim/compare/672e52e...5eafd15) +- github.com/NYTimes/gziphandler: [56545f4 → v1.1.1](https://github.com/NYTimes/gziphandler/compare/56545f4...v1.1.1) +- github.com/alecthomas/template: [a0175ee → fb15b89](https://github.com/alecthomas/template/compare/a0175ee...fb15b89) +- github.com/alecthomas/units: [2efee85 → f65c72e](https://github.com/alecthomas/units/compare/2efee85...f65c72e) +- github.com/auth0/go-jwt-middleware: [5493cab → v1.0.1](https://github.com/auth0/go-jwt-middleware/compare/5493cab...v1.0.1) +- github.com/aws/aws-sdk-go: [v1.28.2 → v1.38.49](https://github.com/aws/aws-sdk-go/compare/v1.28.2...v1.38.49) +- github.com/cilium/ebpf: [95b36a5 → v0.6.2](https://github.com/cilium/ebpf/compare/95b36a5...v0.6.2) +- github.com/cncf/udpa/go: [269d4d4 → 5459f2c](https://github.com/cncf/udpa/go/compare/269d4d4...5459f2c) +- github.com/cockroachdb/datadriven: [80d97fb → bf6692d](https://github.com/cockroachdb/datadriven/compare/80d97fb...bf6692d) +- github.com/container-storage-interface/spec: [v1.2.0 → v1.5.0](https://github.com/container-storage-interface/spec/compare/v1.2.0...v1.5.0) +- github.com/containerd/console: [84eeaae → v1.0.2](https://github.com/containerd/console/compare/84eeaae...v1.0.2) +- github.com/containerd/containerd: [v1.0.2 → v1.4.4](https://github.com/containerd/containerd/compare/v1.0.2...v1.4.4) +- github.com/containerd/typeurl: [2a93cfd → v1.0.1](https://github.com/containerd/typeurl/compare/2a93cfd...v1.0.1) +- github.com/containernetworking/cni: [v0.7.1 → v0.8.1](https://github.com/containernetworking/cni/compare/v0.7.1...v0.8.1) +- github.com/coredns/corefile-migration: [v1.0.6 → v1.0.12](https://github.com/coredns/corefile-migration/compare/v1.0.6...v1.0.12) +- github.com/coreos/etcd: [v3.3.10+incompatible → v3.3.13+incompatible](https://github.com/coreos/etcd/compare/v3.3.10...v3.3.13) +- github.com/coreos/pkg: [97fdf19 → 399ea9e](https://github.com/coreos/pkg/compare/97fdf19...399ea9e) +- github.com/creack/pty: [v1.1.7 → v1.1.11](https://github.com/creack/pty/compare/v1.1.7...v1.1.11) +- github.com/docker/docker: [71cd53e → v20.10.2+incompatible](https://github.com/docker/docker/compare/71cd53e...v20.10.2) +- github.com/envoyproxy/go-control-plane: [v0.9.4 → 668b12f](https://github.com/envoyproxy/go-control-plane/compare/v0.9.4...668b12f) +- github.com/evanphx/json-patch: [v4.5.0+incompatible → v4.11.0+incompatible](https://github.com/evanphx/json-patch/compare/v4.5.0...v4.11.0) +- github.com/fsnotify/fsnotify: [v1.4.7 → v1.4.9](https://github.com/fsnotify/fsnotify/compare/v1.4.7...v1.4.9) +- github.com/go-kit/kit: [v0.8.0 → v0.9.0](https://github.com/go-kit/kit/compare/v0.8.0...v0.9.0) +- github.com/go-logfmt/logfmt: [v0.3.0 → v0.5.0](https://github.com/go-logfmt/logfmt/compare/v0.3.0...v0.5.0) +- github.com/go-logr/logr: [v0.2.0 → v0.4.0](https://github.com/go-logr/logr/compare/v0.2.0...v0.4.0) +- github.com/go-openapi/jsonpointer: [v0.19.3 → v0.19.5](https://github.com/go-openapi/jsonpointer/compare/v0.19.3...v0.19.5) +- github.com/go-openapi/jsonreference: [v0.19.3 → v0.19.5](https://github.com/go-openapi/jsonreference/compare/v0.19.3...v0.19.5) +- github.com/go-openapi/swag: [v0.19.5 → v0.19.14](https://github.com/go-openapi/swag/compare/v0.19.5...v0.19.14) +- github.com/gogo/protobuf: [v1.3.1 → v1.3.2](https://github.com/gogo/protobuf/compare/v1.3.1...v1.3.2) +- github.com/golang/groupcache: [8c9f03a → 41bb18b](https://github.com/golang/groupcache/compare/8c9f03a...41bb18b) +- github.com/golang/protobuf: [v1.4.2 → v1.5.2](https://github.com/golang/protobuf/compare/v1.4.2...v1.5.2) +- github.com/google/btree: [v1.0.0 → v1.0.1](https://github.com/google/btree/compare/v1.0.0...v1.0.1) +- github.com/google/cadvisor: [v0.35.0 → v0.39.2](https://github.com/google/cadvisor/compare/v0.35.0...v0.39.2) +- github.com/google/go-cmp: [v0.5.2 → v0.5.5](https://github.com/google/go-cmp/compare/v0.5.2...v0.5.5) +- github.com/google/uuid: [v1.1.1 → v1.1.2](https://github.com/google/uuid/compare/v1.1.1...v1.1.2) +- github.com/googleapis/gnostic: [v0.3.1 → v0.5.5](https://github.com/googleapis/gnostic/compare/v0.3.1...v0.5.5) +- github.com/gopherjs/gopherjs: [0766667 → fce0ec3](https://github.com/gopherjs/gopherjs/compare/0766667...fce0ec3) +- github.com/gorilla/mux: [v1.7.0 → v1.8.0](https://github.com/gorilla/mux/compare/v1.7.0...v1.8.0) +- github.com/gorilla/websocket: [v1.4.0 → v1.4.2](https://github.com/gorilla/websocket/compare/v1.4.0...v1.4.2) +- github.com/grpc-ecosystem/go-grpc-middleware: [f849b54 → v1.3.0](https://github.com/grpc-ecosystem/go-grpc-middleware/compare/f849b54...v1.3.0) +- github.com/grpc-ecosystem/grpc-gateway: [v1.9.5 → v1.16.0](https://github.com/grpc-ecosystem/grpc-gateway/compare/v1.9.5...v1.16.0) +- github.com/heketi/heketi: [c2e2a4a → v10.3.0+incompatible](https://github.com/heketi/heketi/compare/c2e2a4a...v10.3.0) +- github.com/jmespath/go-jmespath: [c2b33e8 → v0.4.0](https://github.com/jmespath/go-jmespath/compare/c2b33e8...v0.4.0) +- github.com/jonboulle/clockwork: [v0.1.0 → v0.2.2](https://github.com/jonboulle/clockwork/compare/v0.1.0...v0.2.2) +- github.com/json-iterator/go: [v1.1.8 → v1.1.11](https://github.com/json-iterator/go/compare/v1.1.8...v1.1.11) +- github.com/julienschmidt/httprouter: [v1.2.0 → v1.3.0](https://github.com/julienschmidt/httprouter/compare/v1.2.0...v1.3.0) +- github.com/karrick/godirwalk: [v1.7.5 → v1.16.1](https://github.com/karrick/godirwalk/compare/v1.7.5...v1.16.1) +- github.com/kisielk/errcheck: [v1.2.0 → v1.5.0](https://github.com/kisielk/errcheck/compare/v1.2.0...v1.5.0) +- github.com/konsorten/go-windows-terminal-sequences: [v1.0.2 → v1.0.3](https://github.com/konsorten/go-windows-terminal-sequences/compare/v1.0.2...v1.0.3) +- github.com/kr/pretty: [v0.2.0 → v0.2.1](https://github.com/kr/pretty/compare/v0.2.0...v0.2.1) +- github.com/kr/text: [v0.1.0 → v0.2.0](https://github.com/kr/text/compare/v0.1.0...v0.2.0) +- github.com/mailru/easyjson: [v0.7.0 → v0.7.6](https://github.com/mailru/easyjson/compare/v0.7.0...v0.7.6) +- github.com/mattn/go-isatty: [v0.0.9 → v0.0.4](https://github.com/mattn/go-isatty/compare/v0.0.9...v0.0.4) +- github.com/mattn/go-runewidth: [v0.0.2 → v0.0.7](https://github.com/mattn/go-runewidth/compare/v0.0.2...v0.0.7) +- github.com/matttproud/golang_protobuf_extensions: [v1.0.1 → c182aff](https://github.com/matttproud/golang_protobuf_extensions/compare/v1.0.1...c182aff) +- github.com/miekg/dns: [v1.1.4 → v1.0.14](https://github.com/miekg/dns/compare/v1.1.4...v1.0.14) +- github.com/mistifyio/go-zfs: [v2.1.1+incompatible → f784269](https://github.com/mistifyio/go-zfs/compare/v2.1.1...f784269) +- github.com/mrunalp/fileutils: [7d4729f → v0.5.0](https://github.com/mrunalp/fileutils/compare/7d4729f...v0.5.0) +- github.com/mwitkow/go-conntrack: [cc309e4 → 2f06839](https://github.com/mwitkow/go-conntrack/compare/cc309e4...2f06839) +- github.com/olekukonko/tablewriter: [a0225b3 → v0.0.4](https://github.com/olekukonko/tablewriter/compare/a0225b3...v0.0.4) +- github.com/onsi/ginkgo: [v1.11.0 → v1.14.2](https://github.com/onsi/ginkgo/compare/v1.11.0...v1.14.2) +- github.com/onsi/gomega: [v1.7.1 → v1.10.4](https://github.com/onsi/gomega/compare/v1.7.1...v1.10.4) +- github.com/opencontainers/go-digest: [v1.0.0-rc1 → v1.0.0](https://github.com/opencontainers/go-digest/compare/v1.0.0-rc1...v1.0.0) +- github.com/opencontainers/runc: [v1.0.0-rc10 → v1.0.1](https://github.com/opencontainers/runc/compare/v1.0.0-rc10...v1.0.1) +- github.com/opencontainers/runtime-spec: [v1.0.0 → 1c3f411](https://github.com/opencontainers/runtime-spec/compare/v1.0.0...1c3f411) +- github.com/opencontainers/selinux: [5215b18 → v1.8.2](https://github.com/opencontainers/selinux/compare/5215b18...v1.8.2) +- github.com/prometheus/client_golang: [v1.0.0 → v1.11.0](https://github.com/prometheus/client_golang/compare/v1.0.0...v1.11.0) +- github.com/prometheus/common: [v0.4.1 → v0.26.0](https://github.com/prometheus/common/compare/v0.4.1...v0.26.0) +- github.com/prometheus/procfs: [v0.0.8 → v0.6.0](https://github.com/prometheus/procfs/compare/v0.0.8...v0.6.0) +- github.com/quobyte/api: [v0.1.2 → v0.1.8](https://github.com/quobyte/api/compare/v0.1.2...v0.1.8) +- github.com/rogpeppe/fastuuid: [6724a57 → v1.2.0](https://github.com/rogpeppe/fastuuid/compare/6724a57...v1.2.0) +- github.com/rubiojr/go-vhd: [0bfd3b3 → 02e2102](https://github.com/rubiojr/go-vhd/compare/0bfd3b3...02e2102) +- github.com/satori/go.uuid: [v1.2.0 → 0aa62d5](https://github.com/satori/go.uuid/compare/v1.2.0...0aa62d5) +- github.com/sergi/go-diff: [v1.0.0 → v1.1.0](https://github.com/sergi/go-diff/compare/v1.0.0...v1.1.0) +- github.com/sirupsen/logrus: [v1.4.2 → v1.8.1](https://github.com/sirupsen/logrus/compare/v1.4.2...v1.8.1) +- github.com/smartystreets/assertions: [b2de0cb → v1.1.0](https://github.com/smartystreets/assertions/compare/b2de0cb...v1.1.0) +- github.com/soheilhy/cmux: [v0.1.4 → v0.1.5](https://github.com/soheilhy/cmux/compare/v0.1.4...v0.1.5) +- github.com/spf13/cobra: [v0.0.5 → v1.1.3](https://github.com/spf13/cobra/compare/v0.0.5...v1.1.3) +- github.com/spf13/jwalterweatherman: [v1.1.0 → v1.0.0](https://github.com/spf13/jwalterweatherman/compare/v1.1.0...v1.0.0) +- github.com/spf13/viper: [v1.3.2 → v1.7.0](https://github.com/spf13/viper/compare/v1.3.2...v1.7.0) +- github.com/storageos/go-api: [343b3ef → v2.2.0+incompatible](https://github.com/storageos/go-api/compare/343b3ef...v2.2.0) +- github.com/stretchr/testify: [v1.6.1 → v1.7.0](https://github.com/stretchr/testify/compare/v1.6.1...v1.7.0) +- github.com/syndtr/gocapability: [d983527 → 42c35b4](https://github.com/syndtr/gocapability/compare/d983527...42c35b4) +- github.com/tmc/grpc-websocket-proxy: [89b8d40 → e5319fd](https://github.com/tmc/grpc-websocket-proxy/compare/89b8d40...e5319fd) +- github.com/ugorji/go: [v1.1.1 → v1.1.4](https://github.com/ugorji/go/compare/v1.1.1...v1.1.4) +- github.com/urfave/cli: [v1.20.0 → v1.22.2](https://github.com/urfave/cli/compare/v1.20.0...v1.22.2) +- github.com/vishvananda/netlink: [v1.0.0 → v1.1.0](https://github.com/vishvananda/netlink/compare/v1.0.0...v1.1.0) +- github.com/vishvananda/netns: [be1fbed → db3c7e5](https://github.com/vishvananda/netns/compare/be1fbed...db3c7e5) +- github.com/yuin/goldmark: [v1.2.1 → v1.3.5](https://github.com/yuin/goldmark/compare/v1.2.1...v1.3.5) +- go.etcd.io/bbolt: v1.3.3 → v1.3.6 +- go.etcd.io/etcd: 3cf2f69 → 83304cf +- go.uber.org/atomic: v1.3.2 → v1.7.0 +- go.uber.org/multierr: v1.1.0 → v1.6.0 +- go.uber.org/zap: v1.10.0 → v1.17.0 +- golang.org/x/crypto: 75b2880 → 5ea612d +- golang.org/x/exp: 6cc2880 → 85be41e +- golang.org/x/lint: 738671d → 6edffad +- golang.org/x/mobile: d2bd2a2 → e6ae53a +- golang.org/x/mod: v0.3.0 → v0.4.2 +- golang.org/x/net: f585440 → 37e1c6a +- golang.org/x/sync: 6e8e738 → 036812b +- golang.org/x/sys: fdedc70 → 59db8d7 +- golang.org/x/text: v0.3.3 → v0.3.6 +- golang.org/x/time: 555d28b → 1f47c86 +- golang.org/x/tools: 39188db → v0.1.2 +- google.golang.org/genproto: 0bd0a95 → f16073e +- google.golang.org/grpc: v1.31.1 → v1.38.0 +- google.golang.org/protobuf: v1.25.0 → v1.26.0 +- gopkg.in/check.v1: 41f04d3 → 8fa4692 +- gopkg.in/yaml.v2: v2.2.8 → v2.4.0 +- gopkg.in/yaml.v3: 9f266ea → 496545a +- k8s.io/api: v0.18.0 → v0.22.0 +- k8s.io/apiextensions-apiserver: v0.18.0 → v0.22.0 +- k8s.io/apimachinery: v0.18.0 → v0.22.0 +- k8s.io/apiserver: v0.18.0 → v0.22.0 +- k8s.io/cli-runtime: v0.18.0 → v0.22.0 +- k8s.io/client-go: v0.18.0 → v0.22.0 +- k8s.io/cloud-provider: v0.18.0 → v0.22.0 +- k8s.io/cluster-bootstrap: v0.18.0 → v0.22.0 +- k8s.io/code-generator: v0.18.0 → v0.22.0 +- k8s.io/component-base: v0.18.0 → v0.22.0 +- k8s.io/cri-api: v0.18.0 → v0.22.0 +- k8s.io/csi-translation-lib: v0.18.0 → v0.22.0 +- k8s.io/gengo: 36b2048 → b6c5ce2 +- k8s.io/klog/v2: v2.4.0 → v2.9.0 +- k8s.io/kube-aggregator: v0.18.0 → v0.22.0 +- k8s.io/kube-controller-manager: v0.18.0 → v0.22.0 +- k8s.io/kube-openapi: bf4fb3b → 9528897 +- k8s.io/kube-proxy: v0.18.0 → v0.22.0 +- k8s.io/kube-scheduler: v0.18.0 → v0.22.0 +- k8s.io/kubectl: v0.18.0 → v0.22.0 +- k8s.io/kubelet: v0.18.0 → v0.22.0 +- k8s.io/kubernetes: v1.18.0 → v1.22.0 +- k8s.io/legacy-cloud-providers: v0.18.0 → v0.22.0 +- k8s.io/metrics: v0.18.0 → v0.22.0 +- k8s.io/mount-utils: v0.20.6 → v0.22.0 +- k8s.io/sample-apiserver: v0.18.0 → v0.22.0 +- k8s.io/system-validators: v1.0.4 → v1.5.0 +- k8s.io/utils: 67b214c → 4b05e18 +- sigs.k8s.io/apiserver-network-proxy/konnectivity-client: v0.0.7 → v0.0.22 + +### Removed +- github.com/OpenPeeDeeP/depguard: [v1.0.1](https://github.com/OpenPeeDeeP/depguard/tree/v1.0.1) +- github.com/Rican7/retry: [v0.1.0](https://github.com/Rican7/retry/tree/v0.1.0) +- github.com/StackExchange/wmi: [5d04971](https://github.com/StackExchange/wmi/tree/5d04971) +- github.com/agnivade/levenshtein: [v1.0.1](https://github.com/agnivade/levenshtein/tree/v1.0.1) +- github.com/andreyvit/diff: [c7f18ee](https://github.com/andreyvit/diff/tree/c7f18ee) +- github.com/anmitsu/go-shlex: [648efa6](https://github.com/anmitsu/go-shlex/tree/648efa6) +- github.com/bazelbuild/bazel-gazelle: [70208cb](https://github.com/bazelbuild/bazel-gazelle/tree/70208cb) +- github.com/bazelbuild/rules_go: [6dae44d](https://github.com/bazelbuild/rules_go/tree/6dae44d) +- github.com/bifurcation/mint: [93c51c6](https://github.com/bifurcation/mint/tree/93c51c6) +- github.com/bradfitz/go-smtpd: [deb6d62](https://github.com/bradfitz/go-smtpd/tree/deb6d62) +- github.com/caddyserver/caddy: [v1.0.3](https://github.com/caddyserver/caddy/tree/v1.0.3) +- github.com/cenkalti/backoff: [v2.1.1+incompatible](https://github.com/cenkalti/backoff/tree/v2.1.1) +- github.com/cespare/prettybench: [03b8cfe](https://github.com/cespare/prettybench/tree/03b8cfe) +- github.com/checkpoint-restore/go-criu: [17b0214](https://github.com/checkpoint-restore/go-criu/tree/17b0214) +- github.com/cheekybits/genny: [9127e81](https://github.com/cheekybits/genny/tree/9127e81) +- github.com/codegangsta/negroni: [v1.0.0](https://github.com/codegangsta/negroni/tree/v1.0.0) +- github.com/docker/libnetwork: [c8a5fca](https://github.com/docker/libnetwork/tree/c8a5fca) +- github.com/docker/spdystream: [449fdfc](https://github.com/docker/spdystream/tree/449fdfc) +- github.com/gliderlabs/ssh: [v0.1.1](https://github.com/gliderlabs/ssh/tree/v0.1.1) +- github.com/globalsign/mgo: [eeefdec](https://github.com/globalsign/mgo/tree/eeefdec) +- github.com/go-acme/lego: [v2.5.0+incompatible](https://github.com/go-acme/lego/tree/v2.5.0) +- github.com/go-bindata/go-bindata: [v3.1.1+incompatible](https://github.com/go-bindata/go-bindata/tree/v3.1.1) +- github.com/go-critic/go-critic: [1df3008](https://github.com/go-critic/go-critic/tree/1df3008) +- github.com/go-lintpack/lintpack: [v0.5.2](https://github.com/go-lintpack/lintpack/tree/v0.5.2) +- github.com/go-ole/go-ole: [v1.2.1](https://github.com/go-ole/go-ole/tree/v1.2.1) +- github.com/go-openapi/analysis: [v0.19.5](https://github.com/go-openapi/analysis/tree/v0.19.5) +- github.com/go-openapi/errors: [v0.19.2](https://github.com/go-openapi/errors/tree/v0.19.2) +- github.com/go-openapi/loads: [v0.19.4](https://github.com/go-openapi/loads/tree/v0.19.4) +- github.com/go-openapi/runtime: [v0.19.4](https://github.com/go-openapi/runtime/tree/v0.19.4) +- github.com/go-openapi/strfmt: [v0.19.3](https://github.com/go-openapi/strfmt/tree/v0.19.3) +- github.com/go-openapi/validate: [v0.19.5](https://github.com/go-openapi/validate/tree/v0.19.5) +- github.com/go-toolsmith/astcast: [v1.0.0](https://github.com/go-toolsmith/astcast/tree/v1.0.0) +- github.com/go-toolsmith/astcopy: [v1.0.0](https://github.com/go-toolsmith/astcopy/tree/v1.0.0) +- github.com/go-toolsmith/astequal: [v1.0.0](https://github.com/go-toolsmith/astequal/tree/v1.0.0) +- github.com/go-toolsmith/astfmt: [v1.0.0](https://github.com/go-toolsmith/astfmt/tree/v1.0.0) +- github.com/go-toolsmith/astinfo: [9809ff7](https://github.com/go-toolsmith/astinfo/tree/9809ff7) +- github.com/go-toolsmith/astp: [v1.0.0](https://github.com/go-toolsmith/astp/tree/v1.0.0) +- github.com/go-toolsmith/pkgload: [v1.0.0](https://github.com/go-toolsmith/pkgload/tree/v1.0.0) +- github.com/go-toolsmith/strparse: [v1.0.0](https://github.com/go-toolsmith/strparse/tree/v1.0.0) +- github.com/go-toolsmith/typep: [v1.0.0](https://github.com/go-toolsmith/typep/tree/v1.0.0) +- github.com/gobwas/glob: [v0.2.3](https://github.com/gobwas/glob/tree/v0.2.3) +- github.com/godbus/dbus: [2ff6f7f](https://github.com/godbus/dbus/tree/2ff6f7f) +- github.com/golangci/check: [cfe4005](https://github.com/golangci/check/tree/cfe4005) +- github.com/golangci/dupl: [3e9179a](https://github.com/golangci/dupl/tree/3e9179a) +- github.com/golangci/errcheck: [ef45e06](https://github.com/golangci/errcheck/tree/ef45e06) +- github.com/golangci/go-misc: [927a3d8](https://github.com/golangci/go-misc/tree/927a3d8) +- github.com/golangci/go-tools: [e32c541](https://github.com/golangci/go-tools/tree/e32c541) +- github.com/golangci/goconst: [041c5f2](https://github.com/golangci/goconst/tree/041c5f2) +- github.com/golangci/gocyclo: [2becd97](https://github.com/golangci/gocyclo/tree/2becd97) +- github.com/golangci/gofmt: [0b8337e](https://github.com/golangci/gofmt/tree/0b8337e) +- github.com/golangci/golangci-lint: [v1.18.0](https://github.com/golangci/golangci-lint/tree/v1.18.0) +- github.com/golangci/gosec: [66fb7fc](https://github.com/golangci/gosec/tree/66fb7fc) +- github.com/golangci/ineffassign: [42439a7](https://github.com/golangci/ineffassign/tree/42439a7) +- github.com/golangci/lint-1: [ee948d0](https://github.com/golangci/lint-1/tree/ee948d0) +- github.com/golangci/maligned: [b1d8939](https://github.com/golangci/maligned/tree/b1d8939) +- github.com/golangci/misspell: [950f5d1](https://github.com/golangci/misspell/tree/950f5d1) +- github.com/golangci/prealloc: [215b22d](https://github.com/golangci/prealloc/tree/215b22d) +- github.com/golangci/revgrep: [d9c87f5](https://github.com/golangci/revgrep/tree/d9c87f5) +- github.com/golangci/unconvert: [28b1c44](https://github.com/golangci/unconvert/tree/28b1c44) +- github.com/golangplus/bytes: [45c989f](https://github.com/golangplus/bytes/tree/45c989f) +- github.com/golangplus/fmt: [2a5d6d7](https://github.com/golangplus/fmt/tree/2a5d6d7) +- github.com/gostaticanalysis/analysisutil: [v0.0.3](https://github.com/gostaticanalysis/analysisutil/tree/v0.0.3) +- github.com/jellevandenhooff/dkim: [f50fe3d](https://github.com/jellevandenhooff/dkim/tree/f50fe3d) +- github.com/jimstudt/http-authentication: [3eca13d](https://github.com/jimstudt/http-authentication/tree/3eca13d) +- github.com/kubernetes-csi/csi-test/v3: [v3.0.0](https://github.com/kubernetes-csi/csi-test/v3/tree/v3.0.0) +- github.com/kylelemons/godebug: [d65d576](https://github.com/kylelemons/godebug/tree/d65d576) +- github.com/logrusorgru/aurora: [a7b3b31](https://github.com/logrusorgru/aurora/tree/a7b3b31) +- github.com/lucas-clemente/aes12: [cd47fb3](https://github.com/lucas-clemente/aes12/tree/cd47fb3) +- github.com/lucas-clemente/quic-clients: [v0.1.0](https://github.com/lucas-clemente/quic-clients/tree/v0.1.0) +- github.com/lucas-clemente/quic-go-certificates: [d2f8652](https://github.com/lucas-clemente/quic-go-certificates/tree/d2f8652) +- github.com/lucas-clemente/quic-go: [v0.10.2](https://github.com/lucas-clemente/quic-go/tree/v0.10.2) +- github.com/marten-seemann/qtls: [v0.2.3](https://github.com/marten-seemann/qtls/tree/v0.2.3) +- github.com/mattn/go-shellwords: [v1.0.5](https://github.com/mattn/go-shellwords/tree/v1.0.5) +- github.com/mattn/goveralls: [v0.0.2](https://github.com/mattn/goveralls/tree/v0.0.2) +- github.com/mesos/mesos-go: [v0.0.9](https://github.com/mesos/mesos-go/tree/v0.0.9) +- github.com/mholt/certmagic: [6a42ef9](https://github.com/mholt/certmagic/tree/6a42ef9) +- github.com/mitchellh/go-ps: [4fdf99a](https://github.com/mitchellh/go-ps/tree/4fdf99a) +- github.com/mozilla/tls-observatory: [8791a20](https://github.com/mozilla/tls-observatory/tree/8791a20) +- github.com/naoina/go-stringutil: [v0.1.0](https://github.com/naoina/go-stringutil/tree/v0.1.0) +- github.com/naoina/toml: [v0.1.1](https://github.com/naoina/toml/tree/v0.1.1) +- github.com/nbutton23/zxcvbn-go: [eafdab6](https://github.com/nbutton23/zxcvbn-go/tree/eafdab6) +- github.com/pborman/uuid: [v1.2.0](https://github.com/pborman/uuid/tree/v1.2.0) +- github.com/pquerna/ffjson: [af8b230](https://github.com/pquerna/ffjson/tree/af8b230) +- github.com/quasilyte/go-consistent: [c6f3937](https://github.com/quasilyte/go-consistent/tree/c6f3937) +- github.com/robfig/cron: [v1.1.0](https://github.com/robfig/cron/tree/v1.1.0) +- github.com/ryanuber/go-glob: [256dc44](https://github.com/ryanuber/go-glob/tree/256dc44) +- github.com/shirou/gopsutil: [c95755e](https://github.com/shirou/gopsutil/tree/c95755e) +- github.com/shirou/w32: [bb4de01](https://github.com/shirou/w32/tree/bb4de01) +- github.com/shurcooL/go-goon: [37c2f52](https://github.com/shurcooL/go-goon/tree/37c2f52) +- github.com/sourcegraph/go-diff: [v0.5.1](https://github.com/sourcegraph/go-diff/tree/v0.5.1) +- github.com/tarm/serial: [98f6abe](https://github.com/tarm/serial/tree/98f6abe) +- github.com/thecodeteam/goscaleio: [v0.1.0](https://github.com/thecodeteam/goscaleio/tree/v0.1.0) +- github.com/tidwall/pretty: [v1.0.0](https://github.com/tidwall/pretty/tree/v1.0.0) +- github.com/timakin/bodyclose: [87058b9](https://github.com/timakin/bodyclose/tree/87058b9) +- github.com/ultraware/funlen: [v0.0.2](https://github.com/ultraware/funlen/tree/v0.0.2) +- github.com/valyala/bytebufferpool: [v1.0.0](https://github.com/valyala/bytebufferpool/tree/v1.0.0) +- github.com/valyala/fasthttp: [v1.2.0](https://github.com/valyala/fasthttp/tree/v1.2.0) +- github.com/valyala/quicktemplate: [v1.1.1](https://github.com/valyala/quicktemplate/tree/v1.1.1) +- github.com/valyala/tcplisten: [ceec8f9](https://github.com/valyala/tcplisten/tree/ceec8f9) +- github.com/vektah/gqlparser: [v1.1.2](https://github.com/vektah/gqlparser/tree/v1.1.2) +- go.mongodb.org/mongo-driver: v1.1.2 +- go4.org: 417644f +- golang.org/x/build: 2835ba2 +- golang.org/x/perf: 6e6d33e +- gopkg.in/mcuadros/go-syslog.v2: v2.2.1 +- gotest.tools/gotestsum: v0.3.5 +- grpc.go4.org: 11d0a25 +- k8s.io/heapster: v1.2.0-beta.1 +- k8s.io/repo-infra: v0.0.1-alpha.1 +- mvdan.cc/interfacer: c200402 +- mvdan.cc/lint: adc824a +- mvdan.cc/unparam: fbb5962 +- sigs.k8s.io/kustomize: v2.0.3+incompatible +- sigs.k8s.io/structured-merge-diff/v3: v3.0.0 +- sourcegraph.com/sqs/pbtypes: d3ebe8f diff --git a/CHANGELOG/CHANGELOG-1.5.md b/CHANGELOG/CHANGELOG-1.5.md new file mode 100644 index 000000000..f273ee4f4 --- /dev/null +++ b/CHANGELOG/CHANGELOG-1.5.md @@ -0,0 +1,26 @@ +# v1.5.0 - Changelog since v1.4.1 + +## Changes by Kind + +### Feature + +- Add parameters to VolumeSnapshotClass for disk image config. ([#926](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/926), [@luohao](https://github.com/luohao)) + +### Bug or Regression + +- Fix ControllerUnpublish backoff ([#953](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/953), [@saikat-royc](https://github.com/saikat-royc)) + +### Documentation + +- Adds documentation for how to use the PD CSI Driver overlays for testing and deploying the driver. ([#932](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/932), [@amacaskill](https://github.com/amacaskill)) + +## Dependencies + +### Added +_Nothing has changed._ + +### Changed +_Nothing has changed._ + +### Removed +- github.com/GoogleCloudPlatform/guest-configs: [a0dacef](https://github.com/GoogleCloudPlatform/guest-configs/tree/a0dacef) diff --git a/CHANGELOG/CHANGELOG-1.6.md b/CHANGELOG/CHANGELOG-1.6.md new file mode 100644 index 000000000..a4fbee066 --- /dev/null +++ b/CHANGELOG/CHANGELOG-1.6.md @@ -0,0 +1,29 @@ +**Attention:** 1.6.0 is not a recommended version to use because of known issues where pods can get stuck (due to controller publish/unpublish failures) during cluster upgrades or during node reboot (as seen in [#987](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/987)). Users should upgrade directly to the 1.7 branch. + + +# v1.6.0 - Changelog since v1.5.1 + +## Changes by Kind + +### Feature + +- Allow to specify how frequently to poll for AttachDisk operation status, or any other global\regional\zonal operation. ([#956](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/956), [@sagor999](https://github.com/sagor999)) + +### Bug or Regression + +- Default to MAXPROCS=1 to improve memory usage on nodes with many CPUs. ([#969](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/969), [@mattcary](https://github.com/mattcary)) + +### Uncategorized + +- Lets users clone a regional disk from a zonal disk if one of the replica zones of the clone matches the zone of the source disk. ([#890](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/890), [@amacaskill](https://github.com/amacaskill)) + +## Dependencies + +### Added +_Nothing has changed._ + +### Changed +- github.com/prometheus/client_golang: [v1.11.0 → v1.11.1](https://github.com/prometheus/client_golang/compare/v1.11.0...v1.11.1) + +### Removed +_Nothing has changed._ diff --git a/CHANGELOG/CHANGELOG-1.7.md b/CHANGELOG/CHANGELOG-1.7.md new file mode 100644 index 000000000..dc7e49b0d --- /dev/null +++ b/CHANGELOG/CHANGELOG-1.7.md @@ -0,0 +1,598 @@ +# v1.7.20 - Changelog since v1.7.19 + +## Changes by Kind + +### Uncategorized + +- Bump golang.org/x/crypto from v0.14.0 to v0.17.0 to fix CVE-2023-48795 ([#1554](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1554), [@sunnylovestiramisu](https://github.com/sunnylovestiramisu)) + +## Dependencies + +### Added +_Nothing has changed._ + +### Changed +- golang.org/x/crypto: v0.14.0 → v0.17.0 +- golang.org/x/sys: v0.13.0 → v0.15.0 +- golang.org/x/term: v0.13.0 → v0.15.0 +- golang.org/x/text: v0.13.0 → v0.14.0 + +### Removed +_Nothing has changed._ + + +# v1.7.19 - Changelog since v1.7.18 + +## Changes by Kind + +### Uncategorized + +- Update golang builder to 1.20.12 ([#1539](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1539), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) + +## Dependencies + +### Added +_Nothing has changed._ + +### Changed +_Nothing has changed._ + +### Removed +_Nothing has changed._ + + +# v1.7.18 - Changelog since v1.7.17 + +## Changes by Kind + +### Bug or Regression + +- Bump Golang Builder version to 1.20.11 ([#1503](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1503), [@uriel-guzman](https://github.com/uriel-guzman)) +- Bump google.golang.org/grpc from v1.55.1 to v1.56.3 to fix CVE-2023-44487. ([#1497](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1497), [@uriel-guzman](https://github.com/uriel-guzman)) + +## Dependencies + +### Added +_Nothing has changed._ + +### Changed +- github.com/cncf/xds/go: [32f1caf → e9ce688](https://github.com/cncf/xds/go/compare/32f1caf...e9ce688) +- github.com/envoyproxy/go-control-plane: [v0.11.0 → 9239064](https://github.com/envoyproxy/go-control-plane/compare/v0.11.0...9239064) +- github.com/envoyproxy/protoc-gen-validate: [v0.10.0 → v0.10.1](https://github.com/envoyproxy/protoc-gen-validate/compare/v0.10.0...v0.10.1) +- google.golang.org/grpc: v1.55.1 → v1.56.3 + +### Removed +_Nothing has changed._ + +# v1.7.17 - Changelog since v1.7.15 + +## Changes by Kind + +### Bug or Regression + +- CVE fixes: CVE-2023-39323 ([#1412](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1412), [@dannawang0221](https://github.com/dannawang0221)) + +### Other (Cleanup or Flake) + +- Update go version to 1.20.10 ([#1453](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1453), [@tyuchn](https://github.com/tyuchn)) + +## Dependencies + +### Added + +_Nothing has changed._ + +### Changed + +- golang.org/x/crypto: v0.9.0 → v0.14.0 +- golang.org/x/net: v0.10.0 → v0.17.0 +- golang.org/x/sys: v0.8.0 → v0.13.0 +- golang.org/x/term: v0.8.0 → v0.13.0 +- golang.org/x/text: v0.9.0 → v0.13.0 + +# v1.7.15 - Changelog since v1.7.13 + +## Changes by Kind + +### Bug or Regression + +- bump go version to 1.20.8 ([#1394](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1394), [@tyuchn](https://github.com/tyuchn)) +- Remove ARG BUILDPLATFORM from Dockerfile ([#1385](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1385), [@tyuchn](https://github.com/tyuchn)) + +# v1.7.13 - Changelog since v1.7.12 + +## Changes by Kind + +### Bug or Regression + +- Upgrade google.golang.org/grpc from v1.55.0 -> v1.55.1 to address https://github.com/grpc/grpc-go/issues/6373 ([#1373](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1373), [@pwschuurman](https://github.com/pwschuurman)) + +# v1.7.12 - Changelog since v1.7.11 + +## Changes by Kind + +### Bug or Regression + +- Update go version to 1.19.12 to fix CVE-2023-29409 CVE-2023-39533 ([#1351](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1351), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) + +# v1.7.11 - Changelog since v1.7.10 + +## Changes by Kind + +### Bug or Regression + +- Update go version to 1.19.11 to fix CVE-2023-29406 ([#1335](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1335), [@Sneha-at](https://github.com/Sneha-at)) + +### Uncategorized + +- #1101: Add provisionedThroughput for hyperdisk + #1227: Adding new metric pdcsi_operation_errors to fetch error + #1296: emit metrics even for success scenarios ([#1305](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1305), [@sunnylovestiramisu](https://github.com/sunnylovestiramisu)) +- Use errors.As so we can detect wrapped errors, and check for existing error codes in CodesForError ([#1326](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1326), [@judemars](https://github.com/judemars)) + +# v1.7.10 - Changelog since v1.7.9 + +## Changes by Kind + +### Feature + +- #1101: Add provisionedThroughput for hyperdisk + #1227: Adding new metric pdcsi_operation_errors to fetch error + #1296: emit metrics even for success scenarios ([#1305](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1305), [@sunnylovestiramisu](https://github.com/sunnylovestiramisu)) +- #1150: satisfy volume cloning topology requirements when choosing zone for CreateVolume + #1079: Add provisionedIops for pd-extreme + #1128: Change iops params directly convert string to int64 ([#1243](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1243), [@sunnylovestiramisu](https://github.com/sunnylovestiramisu)) + +### Other (Cleanup or Flake) + +- Updates error message to be more user friendly when PD CSI Driver encounters an disk type UNSUPPORTED_OPERATION on ControllerPublishVolume ([#1224](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1224), [@pwschuurman](https://github.com/pwschuurman)) + +## Dependencies + +### Added + +- bitbucket.org/creachadair/stringset: v0.0.9 +- cloud.google.com/go/accessapproval: v1.6.0 +- cloud.google.com/go/accesscontextmanager: v1.7.0 +- cloud.google.com/go/aiplatform: v1.37.0 +- cloud.google.com/go/analytics: v0.19.0 +- cloud.google.com/go/apigateway: v1.5.0 +- cloud.google.com/go/apigeeconnect: v1.5.0 +- cloud.google.com/go/apigeeregistry: v0.6.0 +- cloud.google.com/go/appengine: v1.7.1 +- cloud.google.com/go/area120: v0.7.1 +- cloud.google.com/go/artifactregistry: v1.13.0 +- cloud.google.com/go/asset: v1.13.0 +- cloud.google.com/go/assuredworkloads: v1.10.0 +- cloud.google.com/go/automl: v1.12.0 +- cloud.google.com/go/baremetalsolution: v0.5.0 +- cloud.google.com/go/batch: v0.7.0 +- cloud.google.com/go/beyondcorp: v0.5.0 +- cloud.google.com/go/billing: v1.13.0 +- cloud.google.com/go/binaryauthorization: v1.5.0 +- cloud.google.com/go/certificatemanager: v1.6.0 +- cloud.google.com/go/channel: v1.12.0 +- cloud.google.com/go/cloudbuild: v1.9.0 +- cloud.google.com/go/clouddms: v1.5.0 +- cloud.google.com/go/cloudtasks: v1.10.0 +- cloud.google.com/go/compute/metadata: v0.2.3 +- cloud.google.com/go/compute: v1.19.3 +- cloud.google.com/go/contactcenterinsights: v1.6.0 +- cloud.google.com/go/container: v1.15.0 +- cloud.google.com/go/containeranalysis: v0.9.0 +- cloud.google.com/go/datacatalog: v1.13.0 +- cloud.google.com/go/dataflow: v0.8.0 +- cloud.google.com/go/dataform: v0.7.0 +- cloud.google.com/go/datafusion: v1.6.0 +- cloud.google.com/go/datalabeling: v0.7.0 +- cloud.google.com/go/dataplex: v1.6.0 +- cloud.google.com/go/dataproc: v1.12.0 +- cloud.google.com/go/dataqna: v0.7.0 +- cloud.google.com/go/datastream: v1.7.0 +- cloud.google.com/go/deploy: v1.8.0 +- cloud.google.com/go/dialogflow: v1.32.0 +- cloud.google.com/go/dlp: v1.9.0 +- cloud.google.com/go/documentai: v1.18.0 +- cloud.google.com/go/domains: v0.8.0 +- cloud.google.com/go/edgecontainer: v1.0.0 +- cloud.google.com/go/errorreporting: v0.3.0 +- cloud.google.com/go/essentialcontacts: v1.5.0 +- cloud.google.com/go/eventarc: v1.11.0 +- cloud.google.com/go/filestore: v1.6.0 +- cloud.google.com/go/functions: v1.13.0 +- cloud.google.com/go/gaming: v1.9.0 +- cloud.google.com/go/gkebackup: v0.4.0 +- cloud.google.com/go/gkeconnect: v0.7.0 +- cloud.google.com/go/gkehub: v0.12.0 +- cloud.google.com/go/gkemulticloud: v0.5.0 +- cloud.google.com/go/gsuiteaddons: v1.5.0 +- cloud.google.com/go/iam: v1.1.0 +- cloud.google.com/go/iap: v1.7.1 +- cloud.google.com/go/ids: v1.3.0 +- cloud.google.com/go/iot: v1.6.0 +- cloud.google.com/go/kms: v1.14.0 +- cloud.google.com/go/language: v1.9.0 +- cloud.google.com/go/lifesciences: v0.8.0 +- cloud.google.com/go/logging: v1.7.0 +- cloud.google.com/go/longrunning: v0.4.2 +- cloud.google.com/go/managedidentities: v1.5.0 +- cloud.google.com/go/maps: v0.7.0 +- cloud.google.com/go/mediatranslation: v0.7.0 +- cloud.google.com/go/memcache: v1.9.0 +- cloud.google.com/go/metastore: v1.10.0 +- cloud.google.com/go/monitoring: v1.13.0 +- cloud.google.com/go/networkconnectivity: v1.11.0 +- cloud.google.com/go/networkmanagement: v1.6.0 +- cloud.google.com/go/networksecurity: v0.8.0 +- cloud.google.com/go/notebooks: v1.8.0 +- cloud.google.com/go/optimization: v1.3.1 +- cloud.google.com/go/orchestration: v1.6.0 +- cloud.google.com/go/orgpolicy: v1.10.0 +- cloud.google.com/go/osconfig: v1.11.0 +- cloud.google.com/go/oslogin: v1.9.0 +- cloud.google.com/go/phishingprotection: v0.7.0 +- cloud.google.com/go/policytroubleshooter: v1.6.0 +- cloud.google.com/go/privatecatalog: v0.8.0 +- cloud.google.com/go/pubsublite: v1.7.0 +- cloud.google.com/go/recaptchaenterprise/v2: v2.7.0 +- cloud.google.com/go/recommendationengine: v0.7.0 +- cloud.google.com/go/recommender: v1.9.0 +- cloud.google.com/go/redis: v1.11.0 +- cloud.google.com/go/resourcemanager: v1.7.0 +- cloud.google.com/go/resourcesettings: v1.5.0 +- cloud.google.com/go/retail: v1.12.0 +- cloud.google.com/go/run: v0.9.0 +- cloud.google.com/go/scheduler: v1.9.0 +- cloud.google.com/go/secretmanager: v1.10.0 +- cloud.google.com/go/security: v1.13.0 +- cloud.google.com/go/securitycenter: v1.19.0 +- cloud.google.com/go/servicedirectory: v1.9.0 +- cloud.google.com/go/shell: v1.6.0 +- cloud.google.com/go/spanner: v1.45.0 +- cloud.google.com/go/speech: v1.15.0 +- cloud.google.com/go/storagetransfer: v1.8.0 +- cloud.google.com/go/talent: v1.5.0 +- cloud.google.com/go/texttospeech: v1.6.0 +- cloud.google.com/go/tpu: v1.5.0 +- cloud.google.com/go/trace: v1.9.0 +- cloud.google.com/go/translate: v1.7.0 +- cloud.google.com/go/video: v1.15.0 +- cloud.google.com/go/videointelligence: v1.10.0 +- cloud.google.com/go/vision/v2: v2.7.0 +- cloud.google.com/go/vmmigration: v1.6.0 +- cloud.google.com/go/vmwareengine: v0.3.0 +- cloud.google.com/go/vpcaccess: v1.6.0 +- cloud.google.com/go/webrisk: v1.8.0 +- cloud.google.com/go/websecurityscanner: v1.5.0 +- cloud.google.com/go/workflows: v1.10.0 +- contrib.go.opencensus.io/exporter/ocagent: 05415f1 +- github.com/IBM-Cloud/power-go-client: [v1.2.2](https://github.com/IBM-Cloud/power-go-client/tree/v1.2.2) +- github.com/IBM/go-sdk-core/v5: [v5.12.1](https://github.com/IBM/go-sdk-core/v5/tree/v5.12.1) +- github.com/IBM/platform-services-go-sdk: [v0.31.4](https://github.com/IBM/platform-services-go-sdk/tree/v0.31.4) +- github.com/IBM/vpc-go-sdk: [v0.31.0](https://github.com/IBM/vpc-go-sdk/tree/v0.31.0) +- github.com/ProtonMail/go-crypto: [04723f9](https://github.com/ProtonMail/go-crypto/tree/04723f9) +- github.com/acomagu/bufpipe: [v1.0.3](https://github.com/acomagu/bufpipe/tree/v1.0.3) +- github.com/andygrunwald/go-jira: [v1.14.0](https://github.com/andygrunwald/go-jira/tree/v1.14.0) +- github.com/blang/semver/v4: [v4.0.0](https://github.com/blang/semver/v4/tree/v4.0.0) +- github.com/blendle/zapdriver: [v1.3.1](https://github.com/blendle/zapdriver/tree/v1.3.1) +- github.com/cncf/xds/go: [32f1caf](https://github.com/cncf/xds/go/tree/32f1caf) +- github.com/danwakefield/fnmatch: [cbb64ac](https://github.com/danwakefield/fnmatch/tree/cbb64ac) +- github.com/denormal/go-gitignore: [ae8ad1d](https://github.com/denormal/go-gitignore/tree/ae8ad1d) +- github.com/dgrijalva/jwt-go/v4: [v4.0.0-preview1](https://github.com/dgrijalva/jwt-go/v4/tree/v4.0.0-preview1) +- github.com/emirpasic/gods: [v1.12.0](https://github.com/emirpasic/gods/tree/v1.12.0) +- github.com/evanphx/json-patch/v5: [v5.6.0](https://github.com/evanphx/json-patch/v5/tree/v5.6.0) +- github.com/fatih/structs: [v1.1.0](https://github.com/fatih/structs/tree/v1.1.0) +- github.com/felixge/fgprof: [v0.9.1](https://github.com/felixge/fgprof/tree/v0.9.1) +- github.com/go-bindata/go-bindata/v3: [v3.1.3](https://github.com/go-bindata/go-bindata/v3/tree/v3.1.3) +- github.com/go-git/gcfg: [v1.5.0](https://github.com/go-git/gcfg/tree/v1.5.0) +- github.com/go-git/go-billy/v5: [v5.3.1](https://github.com/go-git/go-billy/v5/tree/v5.3.1) +- github.com/go-git/go-git/v5: [v5.4.2](https://github.com/go-git/go-git/v5/tree/v5.4.2) +- github.com/go-openapi/analysis: [v0.21.2](https://github.com/go-openapi/analysis/tree/v0.21.2) +- github.com/go-openapi/errors: [v0.20.2](https://github.com/go-openapi/errors/tree/v0.20.2) +- github.com/go-openapi/loads: [v0.21.1](https://github.com/go-openapi/loads/tree/v0.21.1) +- github.com/go-openapi/runtime: [v0.23.0](https://github.com/go-openapi/runtime/tree/v0.23.0) +- github.com/go-openapi/strfmt: [v0.21.3](https://github.com/go-openapi/strfmt/tree/v0.21.3) +- github.com/go-openapi/validate: [v0.20.3](https://github.com/go-openapi/validate/tree/v0.20.3) +- github.com/go-playground/locales: [v0.14.0](https://github.com/go-playground/locales/tree/v0.14.0) +- github.com/go-playground/universal-translator: [v0.18.0](https://github.com/go-playground/universal-translator/tree/v0.18.0) +- github.com/gobuffalo/flect: [v0.2.5](https://github.com/gobuffalo/flect/tree/v0.2.5) +- github.com/golang-jwt/jwt/v4: [v4.3.0](https://github.com/golang-jwt/jwt/v4/tree/v4.3.0) +- github.com/golang-jwt/jwt: [v3.2.1+incompatible](https://github.com/golang-jwt/jwt/tree/v3.2.1) +- github.com/golang/snappy: [v0.0.3](https://github.com/golang/snappy/tree/v0.0.3) +- github.com/google/gnostic: [v0.5.7-v3refs](https://github.com/google/gnostic/tree/v0.5.7-v3refs) +- github.com/google/s2a-go: [v0.1.4](https://github.com/google/s2a-go/tree/v0.1.4) +- github.com/google/wire: [v0.4.0](https://github.com/google/wire/tree/v0.4.0) +- github.com/googleapis/enterprise-certificate-proxy: [v0.2.3](https://github.com/googleapis/enterprise-certificate-proxy/tree/v0.2.3) +- github.com/googleapis/go-type-adapters: [v1.0.0](https://github.com/googleapis/go-type-adapters/tree/v1.0.0) +- github.com/gorilla/handlers: [v1.4.2](https://github.com/gorilla/handlers/tree/v1.4.2) +- github.com/hashicorp/go-retryablehttp: [v0.7.1](https://github.com/hashicorp/go-retryablehttp/tree/v0.7.1) +- github.com/jbenet/go-context: [d14ea06](https://github.com/jbenet/go-context/tree/d14ea06) +- github.com/kevinburke/ssh_config: [4977a11](https://github.com/kevinburke/ssh_config/tree/4977a11) +- github.com/leodido/go-urn: [v1.2.1](https://github.com/leodido/go-urn/tree/v1.2.1) +- github.com/mattn/go-ieproxy: [v0.0.1](https://github.com/mattn/go-ieproxy/tree/v0.0.1) +- github.com/maxbrunsfeld/counterfeiter/v6: [v6.4.1](https://github.com/maxbrunsfeld/counterfeiter/v6/tree/v6.4.1) +- github.com/prometheus/statsd_exporter: [v0.21.0](https://github.com/prometheus/statsd_exporter/tree/v0.21.0) +- github.com/rwcarlsen/goexif: [9e8deec](https://github.com/rwcarlsen/goexif/tree/9e8deec) +- github.com/trivago/tgo: [v1.0.7](https://github.com/trivago/tgo/tree/v1.0.7) +- github.com/xanzy/ssh-agent: [v0.3.0](https://github.com/xanzy/ssh-agent/tree/v0.3.0) +- go.mongodb.org/mongo-driver: v1.10.0 +- go4.org: d4a0794 +- gocloud.dev: v0.19.0 +- google.golang.org/genproto/googleapis/api: e85fd2c +- google.golang.org/genproto/googleapis/bytestream: e85fd2c +- google.golang.org/genproto/googleapis/rpc: e85fd2c +- google.golang.org/grpc/cmd/protoc-gen-go-grpc: v1.1.0 +- gopkg.in/go-playground/validator.v9: v9.31.0 +- sigs.k8s.io/boskos: a7ef97e +- sigs.k8s.io/controller-tools: v0.9.2 +- sigs.k8s.io/json: 9f7c6b3 + +### Changed + +- cloud.google.com/go/bigquery: v1.8.0 → v1.50.0 +- cloud.google.com/go/datastore: v1.1.0 → v1.11.0 +- cloud.google.com/go/firestore: v1.1.0 → v1.9.0 +- cloud.google.com/go/pubsub: v1.3.1 → v1.30.0 +- cloud.google.com/go/storage: v1.10.0 → v1.22.1 +- cloud.google.com/go: v0.65.0 → v0.110.2 +- contrib.go.opencensus.io/exporter/prometheus: v0.1.0 → v0.4.0 +- github.com/Azure/azure-pipeline-go: [v0.1.9 → v0.2.2](https://github.com/Azure/azure-pipeline-go/compare/v0.1.9...v0.2.2) +- github.com/Azure/azure-sdk-for-go: [v55.0.0+incompatible → v63.3.0+incompatible](https://github.com/Azure/azure-sdk-for-go/compare/v55.0.0...v63.3.0) +- github.com/Azure/azure-storage-blob-go: [457680c → v0.8.0](https://github.com/Azure/azure-storage-blob-go/compare/457680c...v0.8.0) +- github.com/Azure/go-autorest/autorest/adal: [v0.9.13 → v0.9.18](https://github.com/Azure/go-autorest/autorest/adal/compare/v0.9.13...v0.9.18) +- github.com/Azure/go-autorest/autorest/validation: [v0.1.0 → v0.2.0](https://github.com/Azure/go-autorest/autorest/validation/compare/v0.1.0...v0.2.0) +- github.com/Azure/go-autorest/autorest: [v0.11.18 → v0.11.24](https://github.com/Azure/go-autorest/autorest/compare/v0.11.18...v0.11.24) +- github.com/GoogleCloudPlatform/k8s-cloud-provider: [7901bc8 → v1.18.0](https://github.com/GoogleCloudPlatform/k8s-cloud-provider/compare/7901bc8...v1.18.0) +- github.com/GoogleCloudPlatform/testgrid: [v0.0.1-alpha.3 → v0.0.123](https://github.com/GoogleCloudPlatform/testgrid/compare/v0.0.1-alpha.3...v0.0.123) +- github.com/Microsoft/go-winio: [v0.4.16 → v0.5.1](https://github.com/Microsoft/go-winio/compare/v0.4.16...v0.5.1) +- github.com/andygrunwald/go-gerrit: [174420e → 9d38b0b](https://github.com/andygrunwald/go-gerrit/compare/174420e...9d38b0b) +- github.com/asaskevich/govalidator: [f61b66f → f21760c](https://github.com/asaskevich/govalidator/compare/f61b66f...f21760c) +- github.com/aws/aws-sdk-go: [v1.38.49 → v1.44.72](https://github.com/aws/aws-sdk-go/compare/v1.38.49...v1.44.72) +- github.com/bazelbuild/buildtools: [69366ca → 1038451](https://github.com/bazelbuild/buildtools/compare/69366ca...1038451) +- github.com/census-instrumentation/opencensus-proto: [v0.2.1 → v0.4.1](https://github.com/census-instrumentation/opencensus-proto/compare/v0.2.1...v0.4.1) +- github.com/cespare/xxhash/v2: [v2.1.1 → v2.2.0](https://github.com/cespare/xxhash/v2/compare/v2.1.1...v2.2.0) +- github.com/cncf/udpa/go: [5459f2c → c52dc94](https://github.com/cncf/udpa/go/compare/5459f2c...c52dc94) +- github.com/emicklei/go-restful: [v2.9.5+incompatible → v2.15.0+incompatible](https://github.com/emicklei/go-restful/compare/v2.9.5...v2.15.0) +- github.com/envoyproxy/go-control-plane: [668b12f → v0.11.0](https://github.com/envoyproxy/go-control-plane/compare/668b12f...v0.11.0) +- github.com/envoyproxy/protoc-gen-validate: [v0.1.0 → v0.10.0](https://github.com/envoyproxy/protoc-gen-validate/compare/v0.1.0...v0.10.0) +- github.com/evanphx/json-patch: [v4.11.0+incompatible → v4.12.0+incompatible](https://github.com/evanphx/json-patch/compare/v4.11.0...v4.12.0) +- github.com/fatih/color: [v1.7.0 → v1.12.0](https://github.com/fatih/color/compare/v1.7.0...v1.12.0) +- github.com/fsnotify/fsnotify: [v1.4.9 → v1.5.1](https://github.com/fsnotify/fsnotify/compare/v1.4.9...v1.5.1) +- github.com/fsouza/fake-gcs-server: [e85be23 → v1.19.4](https://github.com/fsouza/fake-gcs-server/compare/e85be23...v1.19.4) +- github.com/go-logr/logr: [v1.2.0 → v1.2.2](https://github.com/go-logr/logr/compare/v1.2.0...v1.2.2) +- github.com/go-logr/zapr: [v0.1.1 → v1.2.3](https://github.com/go-logr/zapr/compare/v0.1.1...v1.2.3) +- github.com/go-openapi/jsonreference: [v0.19.5 → v0.19.6](https://github.com/go-openapi/jsonreference/compare/v0.19.5...v0.19.6) +- github.com/go-openapi/spec: [v0.19.4 → v0.20.4](https://github.com/go-openapi/spec/compare/v0.19.4...v0.20.4) +- github.com/go-openapi/swag: [v0.19.14 → v0.21.1](https://github.com/go-openapi/swag/compare/v0.19.14...v0.21.1) +- github.com/go-stack/stack: [v1.8.0 → v1.8.1](https://github.com/go-stack/stack/compare/v1.8.0...v1.8.1) +- github.com/go-test/deep: [v1.0.4 → v1.0.7](https://github.com/go-test/deep/compare/v1.0.4...v1.0.7) +- github.com/gofrs/uuid: [v4.0.0+incompatible → v4.2.0+incompatible](https://github.com/gofrs/uuid/compare/v4.0.0...v4.2.0) +- github.com/golang/glog: [23def4e → v1.1.0](https://github.com/golang/glog/compare/23def4e...v1.1.0) +- github.com/golang/mock: [v1.4.4 → v1.6.0](https://github.com/golang/mock/compare/v1.4.4...v1.6.0) +- github.com/golang/protobuf: [v1.5.2 → v1.5.3](https://github.com/golang/protobuf/compare/v1.5.2...v1.5.3) +- github.com/gomodule/redigo: [v1.7.0 → v1.8.5](https://github.com/gomodule/redigo/compare/v1.7.0...v1.8.5) +- github.com/google/go-cmp: [v0.5.5 → v0.5.9](https://github.com/google/go-cmp/compare/v0.5.5...v0.5.9) +- github.com/google/go-containerregistry: [a3d713f → 00c59d9](https://github.com/google/go-containerregistry/compare/a3d713f...00c59d9) +- github.com/google/go-querystring: [v1.0.0 → v1.1.0](https://github.com/google/go-querystring/compare/v1.0.0...v1.1.0) +- github.com/google/gofuzz: [v1.1.0 → f78f29f](https://github.com/google/gofuzz/compare/v1.1.0...f78f29f) +- github.com/google/martian/v3: [v3.0.0 → v3.2.1](https://github.com/google/martian/v3/compare/v3.0.0...v3.2.1) +- github.com/google/pprof: [1a94d86 → 4bb14d4](https://github.com/google/pprof/compare/1a94d86...4bb14d4) +- github.com/google/uuid: [v1.1.2 → v1.3.0](https://github.com/google/uuid/compare/v1.1.2...v1.3.0) +- github.com/googleapis/gax-go/v2: [v2.0.5 → v2.11.0](https://github.com/googleapis/gax-go/v2/compare/v2.0.5...v2.11.0) +- github.com/googleapis/gax-go: [v2.0.0+incompatible → v2.0.2+incompatible](https://github.com/googleapis/gax-go/compare/v2.0.0...v2.0.2) +- github.com/gorilla/sessions: [v1.1.3 → v1.2.0](https://github.com/gorilla/sessions/compare/v1.1.3...v1.2.0) +- github.com/hashicorp/errwrap: [v1.0.0 → v1.1.0](https://github.com/hashicorp/errwrap/compare/v1.0.0...v1.1.0) +- github.com/hashicorp/go-cleanhttp: [v0.5.1 → v0.5.2](https://github.com/hashicorp/go-cleanhttp/compare/v0.5.1...v0.5.2) +- github.com/hashicorp/go-multierror: [v1.0.0 → v1.1.1](https://github.com/hashicorp/go-multierror/compare/v1.0.0...v1.1.1) +- github.com/hashicorp/golang-lru: [v0.5.3 → v0.5.4](https://github.com/hashicorp/golang-lru/compare/v0.5.3...v0.5.4) +- github.com/ianlancetaylor/demangle: [5e5cf60 → 28f6c0f](https://github.com/ianlancetaylor/demangle/compare/5e5cf60...28f6c0f) +- github.com/imdario/mergo: [v0.3.8 → v0.3.12](https://github.com/imdario/mergo/compare/v0.3.8...v0.3.12) +- github.com/json-iterator/go: [v1.1.11 → v1.1.12](https://github.com/json-iterator/go/compare/v1.1.11...v1.1.12) +- github.com/klauspost/compress: [v1.4.1 → v1.14.4](https://github.com/klauspost/compress/compare/v1.4.1...v1.14.4) +- github.com/kr/pty: [v1.1.5 → v1.1.1](https://github.com/kr/pty/compare/v1.1.5...v1.1.1) +- github.com/magiconair/properties: [v1.8.1 → v1.8.5](https://github.com/magiconair/properties/compare/v1.8.1...v1.8.5) +- github.com/mailru/easyjson: [v0.7.6 → v0.7.7](https://github.com/mailru/easyjson/compare/v0.7.6...v0.7.7) +- github.com/mattn/go-colorable: [v0.0.9 → v0.1.8](https://github.com/mattn/go-colorable/compare/v0.0.9...v0.1.8) +- github.com/mattn/go-isatty: [v0.0.4 → v0.0.12](https://github.com/mattn/go-isatty/compare/v0.0.4...v0.0.12) +- github.com/mattn/go-zglob: [v0.0.1 → v0.0.2](https://github.com/mattn/go-zglob/compare/v0.0.1...v0.0.2) +- github.com/mitchellh/mapstructure: [v1.1.2 → v1.4.3](https://github.com/mitchellh/mapstructure/compare/v1.1.2...v1.4.3) +- github.com/modern-go/reflect2: [v1.0.1 → v1.0.2](https://github.com/modern-go/reflect2/compare/v1.0.1...v1.0.2) +- github.com/opentracing/opentracing-go: [v1.1.0 → v1.2.0](https://github.com/opentracing/opentracing-go/compare/v1.1.0...v1.2.0) +- github.com/pelletier/go-toml: [v1.3.0 → v1.9.3](https://github.com/pelletier/go-toml/compare/v1.3.0...v1.9.3) +- github.com/prometheus/client_golang: [v1.11.1 → v1.12.1](https://github.com/prometheus/client_golang/compare/v1.11.1...v1.12.1) +- github.com/prometheus/common: [v0.26.0 → v0.32.1](https://github.com/prometheus/common/compare/v0.26.0...v0.32.1) +- github.com/prometheus/procfs: [v0.6.0 → v0.7.3](https://github.com/prometheus/procfs/compare/v0.6.0...v0.7.3) +- github.com/satori/go.uuid: [0aa62d5 → v1.2.0](https://github.com/satori/go.uuid/compare/0aa62d5...v1.2.0) +- github.com/shurcooL/githubv4: [51d7b50 → 83ba7b4](https://github.com/shurcooL/githubv4/compare/51d7b50...83ba7b4) +- github.com/shurcooL/graphql: [e4a3a37 → d48a9a7](https://github.com/shurcooL/graphql/compare/e4a3a37...d48a9a7) +- github.com/sirupsen/logrus: [v1.8.1 → v1.9.0](https://github.com/sirupsen/logrus/compare/v1.8.1...v1.9.0) +- github.com/spf13/afero: [v1.2.2 → v1.6.0](https://github.com/spf13/afero/compare/v1.2.2...v1.6.0) +- github.com/spf13/cast: [v1.3.0 → v1.3.1](https://github.com/spf13/cast/compare/v1.3.0...v1.3.1) +- github.com/spf13/cobra: [v1.1.3 → v1.4.0](https://github.com/spf13/cobra/compare/v1.1.3...v1.4.0) +- github.com/spf13/jwalterweatherman: [v1.0.0 → v1.1.0](https://github.com/spf13/jwalterweatherman/compare/v1.0.0...v1.1.0) +- github.com/spf13/viper: [v1.7.0 → v1.8.1](https://github.com/spf13/viper/compare/v1.7.0...v1.8.1) +- github.com/stretchr/objx: [v0.2.0 → v0.5.0](https://github.com/stretchr/objx/compare/v0.2.0...v0.5.0) +- github.com/stretchr/testify: [v1.7.0 → v1.8.1](https://github.com/stretchr/testify/compare/v1.7.0...v1.8.1) +- github.com/tektoncd/pipeline: [v0.8.0 → v0.36.0](https://github.com/tektoncd/pipeline/compare/v0.8.0...v0.36.0) +- github.com/yuin/goldmark: [v1.3.5 → v1.4.13](https://github.com/yuin/goldmark/compare/v1.3.5...v1.4.13) +- go.opencensus.io: v0.22.4 → v0.24.0 +- go.uber.org/atomic: v1.7.0 → v1.9.0 +- go.uber.org/multierr: v1.6.0 → v1.7.0 +- go.uber.org/zap: v1.17.0 → v1.19.1 +- golang.org/x/crypto: 5ea612d → v0.9.0 +- golang.org/x/mod: v0.4.2 → v0.8.0 +- golang.org/x/net: 37e1c6a → v0.10.0 +- golang.org/x/oauth2: 5d25da1 → v0.8.0 +- golang.org/x/sync: 036812b → v0.2.0 +- golang.org/x/sys: 59db8d7 → v0.8.0 +- golang.org/x/term: 6a3ed07 → v0.8.0 +- golang.org/x/text: v0.3.6 → v0.9.0 +- golang.org/x/time: 1f47c86 → 583f2d6 +- golang.org/x/tools: v0.1.2 → v0.6.0 +- golang.org/x/xerrors: 5ec99f8 → 04be3eb +- gomodules.xyz/jsonpatch/v2: v2.0.1 → v2.2.0 +- google.golang.org/api: v0.34.0 → v0.126.0 +- google.golang.org/appengine: v1.6.6 → v1.6.7 +- google.golang.org/genproto: f16073e → e85fd2c +- google.golang.org/grpc: v1.38.0 → v1.55.0 +- google.golang.org/protobuf: v1.26.0 → v1.30.0 +- gopkg.in/ini.v1: v1.51.0 → v1.62.0 +- gopkg.in/yaml.v3: 496545a → v3.0.1 +- k8s.io/gengo: b6c5ce2 → 4627b89 +- k8s.io/klog/v2: v2.60.1 → v2.80.1 +- k8s.io/kube-openapi: 9528897 → 3ee0da9 +- k8s.io/test-infra: 70a5174 → 46ac1a6 +- k8s.io/utils: 4b05e18 → 3019533 +- knative.dev/pkg: 56c2594 → 0a1ec2e +- sigs.k8s.io/controller-runtime: v0.3.0 → v0.12.3 +- sigs.k8s.io/structured-merge-diff/v4: v4.1.2 → v4.2.1 +- sigs.k8s.io/yaml: v1.2.0 → v1.3.0 + +### Removed + +- contrib.go.opencensus.io/exporter/stackdriver: v0.12.8 +- git.apache.org/thrift.git: 2566ecd +- github.com/aws/aws-k8s-tester: [b411acf](https://github.com/aws/aws-k8s-tester/tree/b411acf) +- github.com/coreos/go-etcd: [v2.0.0+incompatible](https://github.com/coreos/go-etcd/tree/v2.0.0) +- github.com/cpuguy83/go-md2man: [v1.0.10](https://github.com/cpuguy83/go-md2man/tree/v1.0.10) +- github.com/denisenkom/go-mssqldb: [2fea367](https://github.com/denisenkom/go-mssqldb/tree/2fea367) +- github.com/docker/cli: [7543883](https://github.com/docker/cli/tree/7543883) +- github.com/docker/docker-credential-helpers: [v0.6.3](https://github.com/docker/docker-credential-helpers/tree/v0.6.3) +- github.com/erikstmartin/go-testdb: [8d10e4a](https://github.com/erikstmartin/go-testdb/tree/8d10e4a) +- github.com/go-sql-driver/mysql: [7ebe0a5](https://github.com/go-sql-driver/mysql/tree/7ebe0a5) +- github.com/go-yaml/yaml: [v2.1.0+incompatible](https://github.com/go-yaml/yaml/tree/v2.1.0) +- github.com/golang/lint: [06c8688](https://github.com/golang/lint/tree/06c8688) +- github.com/gorilla/context: [v1.1.1](https://github.com/gorilla/context/tree/v1.1.1) +- github.com/gotestyourself/gotestyourself: [v2.2.0+incompatible](https://github.com/gotestyourself/gotestyourself/tree/v2.2.0) +- github.com/influxdata/influxdb: [049f9b4](https://github.com/influxdata/influxdb/tree/049f9b4) +- github.com/jinzhu/gorm: [572d0a0](https://github.com/jinzhu/gorm/tree/572d0a0) +- github.com/jinzhu/inflection: [f5c5f50](https://github.com/jinzhu/inflection/tree/f5c5f50) +- github.com/jinzhu/now: [v1.0.1](https://github.com/jinzhu/now/tree/v1.0.1) +- github.com/klauspost/cpuid: [v1.2.2](https://github.com/klauspost/cpuid/tree/v1.2.2) +- github.com/knative/build: [v0.1.2](https://github.com/knative/build/tree/v0.1.2) +- github.com/lib/pq: [v1.0.0](https://github.com/lib/pq/tree/v1.0.0) +- github.com/mattbaird/jsonpatch: [81af803](https://github.com/mattbaird/jsonpatch/tree/81af803) +- github.com/mattn/go-sqlite3: [38ee283](https://github.com/mattn/go-sqlite3/tree/38ee283) +- github.com/mitchellh/ioprogress: [6a23b12](https://github.com/mitchellh/ioprogress/tree/6a23b12) +- github.com/openzipkin/zipkin-go: [v0.1.1](https://github.com/openzipkin/zipkin-go/tree/v0.1.1) +- github.com/shurcooL/go: [9e1955d](https://github.com/shurcooL/go/tree/9e1955d) +- github.com/ugorji/go/codec: [d75b2dc](https://github.com/ugorji/go/codec/tree/d75b2dc) +- github.com/xlab/handysort: [fb3537e](https://github.com/xlab/handysort/tree/fb3537e) +- go.etcd.io/etcd: 83304cf +- gopkg.in/airbrake/gobrake.v2: v2.0.9 +- gopkg.in/cheggaaa/pb.v1: v1.0.25 +- gopkg.in/gemnasium/logrus-airbrake-hook.v2: v2.1.2 +- k8s.io/klog: v1.0.0 +- sigs.k8s.io/testing_frameworks: v0.1.1 +- vbom.ml/util: efcd4e0 + +# v1.7.9 - Changelog since v1.7.8 + +## Changes by Kind + +### Other (Cleanup or Flake) + +- Separate user errors from internal errors ([#1219](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1219), [@sunnylovestiramisu](https://github.com/sunnylovestiramisu)) +- Update go version to 1.19.10 ([#1273](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1273), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) +- Updates error message to be more user friendly when PD CSI Driver encounters an disk type UNSUPPORTED_OPERATION on ControllerPublishVolume ([#1224](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1224), [@pwschuurman](https://github.com/pwschuurman)) + +# v1.7.8 - Changelog since v1.7.7 + +## Changes by Kind + +### Bug or Regression + +- Separate user errors from internal errors. ([#1092](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1092), [@sunnylovestiramisu](https://github.com/sunnylovestiramisu)) +- Upgrade klog v1 to v2 and fix error wrapping. ([#1084](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1084), [@sunnylovestiramisu](https://github.com/sunnylovestiramisu)) + +# v1.7.7 - Changelog since v1.7.6 + +## Changes by Kind + +### Bug or Regression + +- Add missing libraries, libbsd and libmd, that are dependencies for XFS volume expansion. ([#1204](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1204), [@nberlee](https://github.com/nberlee)) + +# v1.7.6 - Changelog since v.1.7.4 + +## Changes by Kind + +### Other (Cleanup or Flake) + +- go version updates ([#1158](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1158), [@saikat-royc](https://github.com/saikat-royc)) +- Fix for CVEs - update base image ([#1162](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1162), [@sunnylovestiramisu](https://github.com/sunnylovestiramisu)) +- Fix missing shared library libedit.so.2 caused from updating base image in [#1162](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1162) ([#1177](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1177), [@sunnylovestiramisu ](https://github.com/sunnylovestiramisu)) + +# v1.7.4 - Changelog since v.1.7.3 + +## Changes by Kind + +### Bug or Regression + +- Add udevadm binary in the container image. ([#1095](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1095), [@mattcary](https://github.com/mattcary)) +- Fixed issue where Regional disks are repeatedly queued for re-attaching and consuming api quota ([#1091](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1091), [@pwschuurman](https://github.com/pwschuurman)) + +## Dependencies + +_Nothing has changed._ + +# v1.7.3 - Changelog since v.1.7.2 + +- Update go builder to 1.18.4. Fixes several CVEs. (#1031, @mattcary) + +- Cherry pick #1028, Improve backoff to be per-node and disk to avoid missing disks from blocking all operations (#1036, @mattcary) + +# v1.7.2 - Changelog since v1.7.1 + +## Changes by Kind + +### Uncategorized + +- Enforce implicit pagination limit of 500 of the ListVolumesResponse#Entry field when ListVolumesRequest#max_entries is not set (#1011, @pwschuurman) + +## Dependencies + +_Nothing has changed._ + +# v1.7.1 - Changelog since v1.7.0 + +- Creates v1.7.1 upstream tag with changes from 1.7.0 release. + - Cloud builder was broken when 1.7.0 was cut, so v1.7.0 upstream tag was not + created. + +# v1.7.0 - Changelog since v1.5.1 + +>**Attention:** 1.6.0 is not a recommended version to use because of known issues where pods can get stuck (due to controller publish/unpublish failures) during cluster upgrades or during node reboot (as seen in [#987](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/987)). Users should upgrade directly to the 1.7 branch. + +## Changes by Kind + +### Feature + +- Allow to specify how frequently to poll for AttachDisk operation status, or any other global\regional\zonal operation. ([#956](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/956), [@sagor999](https://github.com/sagor999)) + +### Bug or Regression + +- Default to MAXPROCS=1 to improve memory usage on nodes with many CPUs. ([#969](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/969), [@mattcary](https://github.com/mattcary)) +- Simplify node backoff logic for controller publish/unpublish op ([#988](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/988), [@saikat-royc](https://github.com/saikat-royc)) + +### Other (Cleanup or Flake) + +- Remove PodSecurityPolicy from deployment for 1.25+ clusters. ([#989](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/989), [@mattcary](https://github.com/mattcary)) + +### Uncategorized + +- Lets users clone a regional disk from a zonal disk if one of the replica zones of the clone matches the zone of the source disk. ([#890](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/890), [@amacaskill](https://github.com/amacaskill)) + +## Dependencies + +### Added + +_Nothing has changed._ + +### Changed + +- github.com/prometheus/client_golang: [v1.11.0 → v1.11.1](https://github.com/prometheus/client_golang/compare/v1.11.0...v1.11.1) + +### Removed + +_Nothing has changed._ diff --git a/CHANGELOG/CHANGELOG-1.8.md b/CHANGELOG/CHANGELOG-1.8.md new file mode 100644 index 000000000..a9ab8c8c0 --- /dev/null +++ b/CHANGELOG/CHANGELOG-1.8.md @@ -0,0 +1,459 @@ +# v1.8.20 - Changelog since v1.8.19 + +## Changes by Kind + +### Bug + +- Change GetDisk error reporting to temporary in CreateVolume codepath ([#1604])https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1604), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) + +# v1.8.19 - Changelog since v1.8.18 + +## Changes by Kind + +### Uncategorized + +- Properly wrap error from GCE Images.Get() API call, to fix a potential nil-ptr dereference ([#1519](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1519), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) +- Reduce log spam when identifying NVMe devices located in `/dev` ([#1581](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1581), [@pwschuurman](https://github.com/pwschuurman)) +- Update golang builder to 1.20.12 ([#1538](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1538), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) + +## Dependencies + +### Added +_Nothing has changed._ + +### Changed +_Nothing has changed._ + +### Removed +_Nothing has changed._ + + +# v1.8.18 - Changelog since v1.8.17 + +## Changes by Kind + +### Uncategorized + +- Update golang builder to 1.20.12 ([#1538](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1538), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) + +## Dependencies + +### Added +_Nothing has changed._ + +### Changed +_Nothing has changed._ + +### Removed +_Nothing has changed._ + + +# v1.8.17 - Changelog since v1.8.16 + +## Changes by Kind + +### Bug or Regression + +- Bump Golang Builder version to 1.20.11 ([#1504](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1504), [@uriel-guzman](https://github.com/uriel-guzman)) +- Bump google.golang.org/grpc from v1.55.1 to v1.56.3 to fix CVE-2023-44487. ([#1496](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1496), [@uriel-guzman](https://github.com/uriel-guzman)) + +## Dependencies + +### Added +_Nothing has changed._ + +### Changed +- cloud.google.com/go/accesscontextmanager: v1.6.0 → v1.7.0 +- cloud.google.com/go/aiplatform: v1.35.0 → v1.37.0 +- cloud.google.com/go/analytics: v0.18.0 → v0.19.0 +- cloud.google.com/go/apigeeregistry: v0.5.0 → v0.6.0 +- cloud.google.com/go/apikeys: v0.5.0 → v0.6.0 +- cloud.google.com/go/appengine: v1.6.0 → v1.7.1 +- cloud.google.com/go/artifactregistry: v1.11.2 → v1.13.0 +- cloud.google.com/go/asset: v1.11.1 → v1.13.0 +- cloud.google.com/go/beyondcorp: v0.4.0 → v0.5.0 +- cloud.google.com/go/bigquery: v1.48.0 → v1.50.0 +- cloud.google.com/go/billing: v1.12.0 → v1.13.0 +- cloud.google.com/go/channel: v1.11.0 → v1.12.0 +- cloud.google.com/go/cloudbuild: v1.7.0 → v1.9.0 +- cloud.google.com/go/cloudtasks: v1.9.0 → v1.10.0 +- cloud.google.com/go/compute: v1.18.0 → v1.19.1 +- cloud.google.com/go/container: v1.13.1 → v1.15.0 +- cloud.google.com/go/containeranalysis: v0.7.0 → v0.9.0 +- cloud.google.com/go/datacatalog: v1.12.0 → v1.13.0 +- cloud.google.com/go/dataform: v0.6.0 → v0.7.0 +- cloud.google.com/go/dataplex: v1.5.2 → v1.6.0 +- cloud.google.com/go/datastore: v1.10.0 → v1.11.0 +- cloud.google.com/go/datastream: v1.6.0 → v1.7.0 +- cloud.google.com/go/deploy: v1.6.0 → v1.8.0 +- cloud.google.com/go/dialogflow: v1.31.0 → v1.32.0 +- cloud.google.com/go/documentai: v1.16.0 → v1.18.0 +- cloud.google.com/go/edgecontainer: v0.3.0 → v1.0.0 +- cloud.google.com/go/eventarc: v1.10.0 → v1.11.0 +- cloud.google.com/go/filestore: v1.5.0 → v1.6.0 +- cloud.google.com/go/functions: v1.10.0 → v1.13.0 +- cloud.google.com/go/gkehub: v0.11.0 → v0.12.0 +- cloud.google.com/go/iam: v0.12.0 → v0.13.0 +- cloud.google.com/go/iap: v1.6.0 → v1.7.1 +- cloud.google.com/go/iot: v1.5.0 → v1.6.0 +- cloud.google.com/go/kms: v1.9.0 → v1.10.1 +- cloud.google.com/go/maps: v0.6.0 → v0.7.0 +- cloud.google.com/go/monitoring: v1.12.0 → v1.13.0 +- cloud.google.com/go/networkconnectivity: v1.10.0 → v1.11.0 +- cloud.google.com/go/networksecurity: v0.7.0 → v0.8.0 +- cloud.google.com/go/notebooks: v1.7.0 → v1.8.0 +- cloud.google.com/go/policytroubleshooter: v1.5.0 → v1.6.0 +- cloud.google.com/go/privatecatalog: v0.7.0 → v0.8.0 +- cloud.google.com/go/pubsub: v1.28.0 → v1.30.0 +- cloud.google.com/go/pubsublite: v1.6.0 → v1.7.0 +- cloud.google.com/go/recaptchaenterprise/v2: v2.6.0 → v2.7.0 +- cloud.google.com/go/resourcemanager: v1.5.0 → v1.7.0 +- cloud.google.com/go/run: v0.8.0 → v0.9.0 +- cloud.google.com/go/scheduler: v1.8.0 → v1.9.0 +- cloud.google.com/go/security: v1.12.0 → v1.13.0 +- cloud.google.com/go/securitycenter: v1.18.1 → v1.19.0 +- cloud.google.com/go/servicecontrol: v1.11.0 → v1.11.1 +- cloud.google.com/go/servicedirectory: v1.8.0 → v1.9.0 +- cloud.google.com/go/servicemanagement: v1.6.0 → v1.8.0 +- cloud.google.com/go/serviceusage: v1.5.0 → v1.6.0 +- cloud.google.com/go/spanner: v1.44.0 → v1.45.0 +- cloud.google.com/go/speech: v1.14.1 → v1.15.0 +- cloud.google.com/go/storagetransfer: v1.7.0 → v1.8.0 +- cloud.google.com/go/trace: v1.8.0 → v1.9.0 +- cloud.google.com/go/translate: v1.6.0 → v1.7.0 +- cloud.google.com/go/video: v1.13.0 → v1.15.0 +- cloud.google.com/go/vision/v2: v2.6.0 → v2.7.0 +- cloud.google.com/go/vmmigration: v1.5.0 → v1.6.0 +- cloud.google.com/go/vmwareengine: v0.2.2 → v0.3.0 +- github.com/cncf/xds/go: [32f1caf → e9ce688](https://github.com/cncf/xds/go/compare/32f1caf...e9ce688) +- github.com/envoyproxy/go-control-plane: [v0.11.0 → 9239064](https://github.com/envoyproxy/go-control-plane/compare/v0.11.0...9239064) +- github.com/envoyproxy/protoc-gen-validate: [v0.10.0 → v0.10.1](https://github.com/envoyproxy/protoc-gen-validate/compare/v0.10.0...v0.10.1) +- github.com/googleapis/gax-go/v2: [v2.7.0 → v2.7.1](https://github.com/googleapis/gax-go/v2/compare/v2.7.0...v2.7.1) +- golang.org/x/oauth2: v0.6.0 → v0.7.0 +- google.golang.org/api: v0.110.0 → v0.114.0 +- google.golang.org/genproto: 7f2fa6f → daa745c +- google.golang.org/grpc: v1.55.1 → v1.56.3 + +### Removed +_Nothing has changed._ + +# v1.8.16 - Changelog since v1.8.14 + +## Changes by Kind + +### Bug or Regression + +- CVE fixes: CVE-2023-39323 ([#1412](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1412), [@dannawang0221](https://github.com/dannawang0221)) + +### Other (Cleanup or Flake) + +- Update go version to 1.20.10 ([#1453](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1453), [@tyuchn](https://github.com/tyuchn)) + +## Dependencies + +### Changed + +- golang.org/x/crypto: 8634188 → v0.14.0 +- golang.org/x/net: v0.8.0 → v0.17.0 +- golang.org/x/sys: v0.6.0 → v0.13.0 +- golang.org/x/term: v0.6.0 → v0.13.0 +- golang.org/x/text: v0.8.0 → v0.13.0 + +# v1.8.14 - Changelog since v1.8.11 + +## Changes by Kind + +### Bug or Regression + +- bump go version to 1.20.8 ([#1394](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1394), [@tyuchn](https://github.com/tyuchn)) +- Remove ARG BUILDPLATFORM from Dockerfile ([#1385](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1385), [@tyuchn](https://github.com/tyuchn)) +- Filter out user errors from GetDisk error returned from ControllerPublishVolume ([#1380](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1380), [@amacaskill](https://github.com/amacaskill)) + +# v1.8.11 - Changelog since v1.8.10 + +## Changes by Kind + +### Bug or Regression + +- Upgrade google.golang.org/grpc from v1.55.0 -> v1.55.1 to address https://github.com/grpc/grpc-go/issues/6373 ([#1371](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1371), [@pwschuurman](https://github.com/pwschuurman)) + +# v1.8.10 - Changelog since v1.8.9 + +## Changes by Kind + +### Bug or Regression + +- Update go version to 1.19.12 to fix CVE-2023-29409 CVE-2023-39533 ([#1350](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1350), [@Sneha-at](https://github.com/Sneha-at)) + +# v1.8.9 - Changelog since v1.8.8 + +## Changes by Kind + +### Bug or Regression + +- Update go version to 1.19.11 to fix CVE-2023-29406 ([#1336](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1336), [@Sneha-at](https://github.com/Sneha-at)) +- Updated dependencies to fix CVE-2022-27664, CVE-2022-32149, CVE-2022-41723, CVE-2022-41721 ([#1334](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1334), [@Sneha-at](https://github.com/Sneha-at)) + +### Uncategorized + +- Add disk type for all operations metrics. ([#1297](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1297), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) + +## Dependencies + +### Added + +- cloud.google.com/go/accessapproval: v1.6.0 +- cloud.google.com/go/accesscontextmanager: v1.6.0 +- cloud.google.com/go/aiplatform: v1.35.0 +- cloud.google.com/go/analytics: v0.18.0 +- cloud.google.com/go/apigateway: v1.5.0 +- cloud.google.com/go/apigeeconnect: v1.5.0 +- cloud.google.com/go/apigeeregistry: v0.5.0 +- cloud.google.com/go/apikeys: v0.5.0 +- cloud.google.com/go/appengine: v1.6.0 +- cloud.google.com/go/area120: v0.7.1 +- cloud.google.com/go/artifactregistry: v1.11.2 +- cloud.google.com/go/asset: v1.11.1 +- cloud.google.com/go/assuredworkloads: v1.10.0 +- cloud.google.com/go/automl: v1.12.0 +- cloud.google.com/go/baremetalsolution: v0.5.0 +- cloud.google.com/go/batch: v0.7.0 +- cloud.google.com/go/beyondcorp: v0.4.0 +- cloud.google.com/go/billing: v1.12.0 +- cloud.google.com/go/binaryauthorization: v1.5.0 +- cloud.google.com/go/certificatemanager: v1.6.0 +- cloud.google.com/go/channel: v1.11.0 +- cloud.google.com/go/cloudbuild: v1.7.0 +- cloud.google.com/go/clouddms: v1.5.0 +- cloud.google.com/go/cloudtasks: v1.9.0 +- cloud.google.com/go/compute/metadata: v0.2.3 +- cloud.google.com/go/contactcenterinsights: v1.6.0 +- cloud.google.com/go/container: v1.13.1 +- cloud.google.com/go/containeranalysis: v0.7.0 +- cloud.google.com/go/datacatalog: v1.12.0 +- cloud.google.com/go/dataflow: v0.8.0 +- cloud.google.com/go/dataform: v0.6.0 +- cloud.google.com/go/datafusion: v1.6.0 +- cloud.google.com/go/datalabeling: v0.7.0 +- cloud.google.com/go/dataplex: v1.5.2 +- cloud.google.com/go/dataproc: v1.12.0 +- cloud.google.com/go/dataqna: v0.7.0 +- cloud.google.com/go/datastream: v1.6.0 +- cloud.google.com/go/deploy: v1.6.0 +- cloud.google.com/go/dialogflow: v1.31.0 +- cloud.google.com/go/dlp: v1.9.0 +- cloud.google.com/go/documentai: v1.16.0 +- cloud.google.com/go/domains: v0.8.0 +- cloud.google.com/go/edgecontainer: v0.3.0 +- cloud.google.com/go/errorreporting: v0.3.0 +- cloud.google.com/go/essentialcontacts: v1.5.0 +- cloud.google.com/go/eventarc: v1.10.0 +- cloud.google.com/go/filestore: v1.5.0 +- cloud.google.com/go/functions: v1.10.0 +- cloud.google.com/go/gaming: v1.9.0 +- cloud.google.com/go/gkebackup: v0.4.0 +- cloud.google.com/go/gkeconnect: v0.7.0 +- cloud.google.com/go/gkehub: v0.11.0 +- cloud.google.com/go/gkemulticloud: v0.5.0 +- cloud.google.com/go/gsuiteaddons: v1.5.0 +- cloud.google.com/go/iap: v1.6.0 +- cloud.google.com/go/ids: v1.3.0 +- cloud.google.com/go/iot: v1.5.0 +- cloud.google.com/go/language: v1.9.0 +- cloud.google.com/go/lifesciences: v0.8.0 +- cloud.google.com/go/longrunning: v0.4.1 +- cloud.google.com/go/managedidentities: v1.5.0 +- cloud.google.com/go/maps: v0.6.0 +- cloud.google.com/go/mediatranslation: v0.7.0 +- cloud.google.com/go/memcache: v1.9.0 +- cloud.google.com/go/metastore: v1.10.0 +- cloud.google.com/go/monitoring: v1.12.0 +- cloud.google.com/go/networkconnectivity: v1.10.0 +- cloud.google.com/go/networkmanagement: v1.6.0 +- cloud.google.com/go/networksecurity: v0.7.0 +- cloud.google.com/go/notebooks: v1.7.0 +- cloud.google.com/go/optimization: v1.3.1 +- cloud.google.com/go/orchestration: v1.6.0 +- cloud.google.com/go/orgpolicy: v1.10.0 +- cloud.google.com/go/osconfig: v1.11.0 +- cloud.google.com/go/oslogin: v1.9.0 +- cloud.google.com/go/phishingprotection: v0.7.0 +- cloud.google.com/go/policytroubleshooter: v1.5.0 +- cloud.google.com/go/privatecatalog: v0.7.0 +- cloud.google.com/go/pubsublite: v1.6.0 +- cloud.google.com/go/recaptchaenterprise/v2: v2.6.0 +- cloud.google.com/go/recommendationengine: v0.7.0 +- cloud.google.com/go/recommender: v1.9.0 +- cloud.google.com/go/redis: v1.11.0 +- cloud.google.com/go/resourcemanager: v1.5.0 +- cloud.google.com/go/resourcesettings: v1.5.0 +- cloud.google.com/go/retail: v1.12.0 +- cloud.google.com/go/run: v0.8.0 +- cloud.google.com/go/scheduler: v1.8.0 +- cloud.google.com/go/secretmanager: v1.10.0 +- cloud.google.com/go/security: v1.12.0 +- cloud.google.com/go/securitycenter: v1.18.1 +- cloud.google.com/go/servicecontrol: v1.11.0 +- cloud.google.com/go/servicedirectory: v1.8.0 +- cloud.google.com/go/servicemanagement: v1.6.0 +- cloud.google.com/go/serviceusage: v1.5.0 +- cloud.google.com/go/shell: v1.6.0 +- cloud.google.com/go/spanner: v1.44.0 +- cloud.google.com/go/speech: v1.14.1 +- cloud.google.com/go/storagetransfer: v1.7.0 +- cloud.google.com/go/talent: v1.5.0 +- cloud.google.com/go/texttospeech: v1.6.0 +- cloud.google.com/go/tpu: v1.5.0 +- cloud.google.com/go/trace: v1.8.0 +- cloud.google.com/go/translate: v1.6.0 +- cloud.google.com/go/video: v1.13.0 +- cloud.google.com/go/videointelligence: v1.10.0 +- cloud.google.com/go/vision/v2: v2.6.0 +- cloud.google.com/go/vmmigration: v1.5.0 +- cloud.google.com/go/vmwareengine: v0.2.2 +- cloud.google.com/go/vpcaccess: v1.6.0 +- cloud.google.com/go/webrisk: v1.8.0 +- cloud.google.com/go/websecurityscanner: v1.5.0 +- cloud.google.com/go/workflows: v1.10.0 + +### Changed + +- cloud.google.com/go/bigquery: v1.8.0 → v1.48.0 +- cloud.google.com/go/compute: v1.7.0 → v1.18.0 +- cloud.google.com/go/datastore: v1.1.0 → v1.10.0 +- cloud.google.com/go/firestore: v1.1.0 → v1.9.0 +- cloud.google.com/go/iam: v0.3.0 → v0.12.0 +- cloud.google.com/go/kms: v1.4.0 → v1.9.0 +- cloud.google.com/go/logging: v1.0.0 → v1.7.0 +- cloud.google.com/go/pubsub: v1.4.0 → v1.28.0 +- cloud.google.com/go/storage: v1.23.0 → v1.12.0 +- cloud.google.com/go: v0.103.0 → v0.110.0 +- github.com/census-instrumentation/opencensus-proto: [v0.2.1 → v0.4.1](https://github.com/census-instrumentation/opencensus-proto/compare/v0.2.1...v0.4.1) +- github.com/cespare/xxhash/v2: [v2.1.2 → v2.2.0](https://github.com/cespare/xxhash/v2/compare/v2.1.2...v2.2.0) +- github.com/cncf/udpa/go: [04548b0 → c52dc94](https://github.com/cncf/udpa/go/compare/04548b0...c52dc94) +- github.com/cncf/xds/go: [cb28da3 → 32f1caf](https://github.com/cncf/xds/go/compare/cb28da3...32f1caf) +- github.com/envoyproxy/go-control-plane: [49ff273 → v0.11.0](https://github.com/envoyproxy/go-control-plane/compare/49ff273...v0.11.0) +- github.com/envoyproxy/protoc-gen-validate: [v0.1.0 → v0.10.0](https://github.com/envoyproxy/protoc-gen-validate/compare/v0.1.0...v0.10.0) +- github.com/golang/glog: [v1.0.0 → v1.1.0](https://github.com/golang/glog/compare/v1.0.0...v1.1.0) +- github.com/golang/protobuf: [v1.5.2 → v1.5.3](https://github.com/golang/protobuf/compare/v1.5.2...v1.5.3) +- github.com/google/go-cmp: [v0.5.8 → v0.5.9](https://github.com/google/go-cmp/compare/v0.5.8...v0.5.9) +- github.com/googleapis/enterprise-certificate-proxy: [v0.1.0 → v0.2.3](https://github.com/googleapis/enterprise-certificate-proxy/compare/v0.1.0...v0.2.3) +- github.com/googleapis/gax-go/v2: [v2.4.0 → v2.7.0](https://github.com/googleapis/gax-go/v2/compare/v2.4.0...v2.7.0) +- github.com/stretchr/objx: [v0.2.0 → v0.5.0](https://github.com/stretchr/objx/compare/v0.2.0...v0.5.0) +- github.com/stretchr/testify: [v1.7.0 → v1.8.1](https://github.com/stretchr/testify/compare/v1.7.0...v1.8.1) +- go.opencensus.io: v0.23.0 → v0.24.0 +- golang.org/x/mod: 9b9b3d8 → v0.8.0 +- golang.org/x/net: a158d28 → v0.8.0 +- golang.org/x/oauth2: 128564f → v0.6.0 +- golang.org/x/sync: 0de741c → v0.1.0 +- golang.org/x/sys: 8c9f86f → v0.6.0 +- golang.org/x/term: 03fcf44 → v0.6.0 +- golang.org/x/text: v0.3.7 → v0.8.0 +- golang.org/x/tools: 897bd77 → v0.6.0 +- golang.org/x/xerrors: 65e6541 → 5ec99f8 +- google.golang.org/api: v0.86.0 → v0.110.0 +- google.golang.org/genproto: 176da50 → 7f2fa6f +- google.golang.org/grpc: v1.48.0 → v1.55.0 +- google.golang.org/protobuf: v1.28.0 → v1.30.0 + +### Removed + +- github.com/googleapis/go-type-adapters: [v1.0.0](https://github.com/googleapis/go-type-adapters/tree/v1.0.0) + +# v1.8.8 - Changelog since v1.8.7 + +## Changes by Kind + +### Uncategorized + +- Add disk type for all operations metrics. ([#1297](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1297), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) +- Fix provisioned-iops-on-create passing logic ([#1284](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1284), [@sunnylovestiramisu](https://github.com/sunnylovestiramisu)) + + +# v1.8.7 - Changelog since v1.8.6 + +### Bug or Regression + +- Fix provisioned-iops-on-create passing logic([#1284](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1284)) +- Bugfix for empty disk type being registered in metric for Create volume function. ([#1269](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1269), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) + +### Cleanup + +- #1079: Add provisionedIops for pd-extreme + #1101: Add provisionedThroughput for hyperdisk + #1240: Change iops params directly convert string to int64 ([#1241](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1241), [@sunnylovestiramisu](https://github.com/sunnylovestiramisu)) +- #1150: fix bug where volume cloning topology requirements are + #1232: Use errors.As so we can detect wrapped errors, and check for + #1227: Adding new metric pdcsi_operation_errors to fetch error ([#1244](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1244), [@sunnylovestiramisu](https://github.com/sunnylovestiramisu)) +- Update go version to 1.19.10 ([#1271](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1271), [@saikat-royc](https://github.com/saikat-royc)) + +# v1.8.6 - Changelog since v1.8.5 + +## Changes by Kind + +### Cleanup + +- Updates error message to be more user friendly when PD CSI Driver encounters an disk type UNSUPPORTED_OPERATION on ControllerPublishVolume ([#1223](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1223), [@pwschuurman](https://github.com/pwschuurman)) + +# v1.8.5 - Changelog since v1.8.4 + +## Changes by Kind + +### Bug or Regression + +- Add missing libraries, libbsd and libmd, that are dependencies for XFS volume expansion. ([#1204](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1204), [@nberlee](https://github.com/nberlee)) + +# v1.8.4 - Changelog since v1.8.2 + + +## Changes by Kind + +### Other (Cleanup or Flake) + +- go version updates ([#1158](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1158), [@saikat-royc](https://github.com/saikat-royc)) +- Fix for CVEs - update base image ([#1162](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1162), [@sunnylovestiramisu](https://github.com/sunnylovestiramisu)) +- Fix missing shared library libedit.so.2 caused from updating base image in [#1162](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1162) ([#1177](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1177), [@sunnylovestiramisu ](https://github.com/sunnylovestiramisu)) + +# v1.8.2 - Changelog since v1.8.1 + + +## Changes by Kind + +### Other (Cleanup or Flake) + +- Update to go 1.19.4 ([#1103](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1103), [@msau42](https://github.com/msau42)) +- limit grpc loging info to a configurable char limit ([#1111](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1111), [@leiyiz](https://github.com/leiyiz)) +- Upgrade klog v1 to v2 and fix error wrapping & separate user errors from internal errors ([#1115](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1115), [@sunnylovestiramisu](https://github.com/sunnylovestiramisu)) +- Add debugging log for the mapping of a PD name to /dev/* path ([#1115](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1115), [@sunnylovestiramisu](https://github.com/sunnylovestiramisu)) + + +# v1.8.1 - Changelog since v1.8.0 + +## Changes by Kind + +### Bug or Regression + +- Add udevadm binary in the container image. ([#1097](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1097), [@mattcary](https://github.com/mattcary)) + +## Dependencies + +_Nothing has changed._ + +# v1.8.0 - Changelog since v.1.7.3 + +## Changes by Kind + +### Feature + +- Add support for setting snapshot labels ([#1017](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1017), [@sagor999](https://github.com/sagor999)) +- Go builder updated from 1.18.4 to 1.19.1. ([#1048](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1048), [@kon-angelo](https://github.com/kon-angelo)) + +### Bug or Regression + +- Disable devices in node unstage prior to detaching. ([#1051](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1051), [@mattcary](https://github.com/mattcary)) +- Enforce implicit pagination limit of 500 of the ListVolumesResponse#Entry field when ListVolumesRequest#max_entries is not set ([#999](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/999), [@pwschuurman](https://github.com/pwschuurman)) +- Fixed issue where Regional disks are repeatedly queued for re-attaching and consuming api quota ([#1050](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1050), [@leiyiz](https://github.com/leiyiz)) + +### Uncategorized + +- Migrate from github.com/golang/protobuf to google.golang.org/protobuf ([#1027](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1027), [@leiyiz](https://github.com/leiyiz)) diff --git a/CHANGELOG/CHANGELOG-1.9.md b/CHANGELOG/CHANGELOG-1.9.md new file mode 100644 index 000000000..c78dc87ef --- /dev/null +++ b/CHANGELOG/CHANGELOG-1.9.md @@ -0,0 +1,555 @@ +# v1.9.17 - Changelog since v1.9.16 + +## Changes by Kind + +### Bug + +- Change GetDisk error reporting to temporary in CreateVolume codepath ([#1603])https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1603), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) + + +# v1.9.16 - Changelog since v1.9.15 + +## Changes by Kind + +### Uncategorized + +- Reduce log spam when identifying NVMe devices located in `/dev` ([#1580](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1580), [@pwschuurman](https://github.com/pwschuurman)) + +## Dependencies + +### Added +_Nothing has changed._ + +### Changed +_Nothing has changed._ + +### Removed +_Nothing has changed._ + + +# v1.9.15 - Changelog since v1.9.14 + +## Changes by Kind + +### Uncategorized + +- Bump golang.org/x/crypto from v0.14.0 to v0.17.0 to fix CVE-2023-48795 ([#1552](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1552), [@sunnylovestiramisu](https://github.com/sunnylovestiramisu)) + +## Dependencies + +### Added +_Nothing has changed._ + +### Changed +- golang.org/x/crypto: v0.14.0 → v0.17.0 +- golang.org/x/sys: v0.13.0 → v0.15.0 +- golang.org/x/term: v0.13.0 → v0.15.0 +- golang.org/x/text: v0.13.0 → v0.14.0 + +### Removed +_Nothing has changed._ + + +# v1.9.14 - Changelog since v1.9.13 + +## Changes by Kind + +### Uncategorized + +- Properly wrap error from GCE Images.Get() API call, to fix a potential nil-ptr dereference ([#1518](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1518), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) +- Update golang builder to 1.20.12 ([#1537](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1537), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) + +## Dependencies + +### Added +_Nothing has changed._ + +### Changed +_Nothing has changed._ + +### Removed +_Nothing has changed._ + + +# v1.9.13 - Changelog since v1.9.12 + +## Changes by Kind + +### Bug or Regression + +- Bump Golang Builder version to 1.20.11 ([#1505](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1505), [@uriel-guzman](https://github.com/uriel-guzman)) +- Bump google.golang.org/grpc from v1.53.0 to v1.56.3 to fix CVE-2023-44487. ([#1495](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1495), [@uriel-guzman](https://github.com/uriel-guzman)) + +## Dependencies + +### Added +- github.com/google/go-pkcs11: [v0.2.0](https://github.com/google/go-pkcs11/tree/v0.2.0) +- github.com/google/s2a-go: [v0.1.4](https://github.com/google/s2a-go/tree/v0.1.4) +- google.golang.org/genproto/googleapis/api: ccb25ca +- google.golang.org/genproto/googleapis/bytestream: 659f7aa +- google.golang.org/genproto/googleapis/rpc: 659f7aa + +### Changed +- cloud.google.com/go/accessapproval: v1.5.0 → v1.7.1 +- cloud.google.com/go/accesscontextmanager: v1.4.0 → v1.8.1 +- cloud.google.com/go/aiplatform: v1.27.0 → v1.45.0 +- cloud.google.com/go/analytics: v0.12.0 → v0.21.2 +- cloud.google.com/go/apigateway: v1.4.0 → v1.6.1 +- cloud.google.com/go/apigeeconnect: v1.4.0 → v1.6.1 +- cloud.google.com/go/apigeeregistry: v0.4.0 → v0.7.1 +- cloud.google.com/go/appengine: v1.5.0 → v1.8.1 +- cloud.google.com/go/area120: v0.6.0 → v0.8.1 +- cloud.google.com/go/artifactregistry: v1.9.0 → v1.14.1 +- cloud.google.com/go/asset: v1.10.0 → v1.14.1 +- cloud.google.com/go/assuredworkloads: v1.9.0 → v1.11.1 +- cloud.google.com/go/automl: v1.8.0 → v1.13.1 +- cloud.google.com/go/baremetalsolution: v0.4.0 → v0.5.0 +- cloud.google.com/go/batch: v0.4.0 → v0.7.0 +- cloud.google.com/go/beyondcorp: v0.3.0 → v0.6.1 +- cloud.google.com/go/bigquery: v1.44.0 → v1.52.0 +- cloud.google.com/go/billing: v1.7.0 → v1.16.0 +- cloud.google.com/go/binaryauthorization: v1.4.0 → v1.6.1 +- cloud.google.com/go/certificatemanager: v1.4.0 → v1.7.1 +- cloud.google.com/go/channel: v1.9.0 → v1.16.0 +- cloud.google.com/go/cloudbuild: v1.4.0 → v1.10.1 +- cloud.google.com/go/clouddms: v1.4.0 → v1.6.1 +- cloud.google.com/go/cloudtasks: v1.8.0 → v1.11.1 +- cloud.google.com/go/compute: v1.18.0 → v1.20.1 +- cloud.google.com/go/contactcenterinsights: v1.4.0 → v1.9.1 +- cloud.google.com/go/container: v1.7.0 → v1.22.1 +- cloud.google.com/go/containeranalysis: v0.6.0 → v0.10.1 +- cloud.google.com/go/datacatalog: v1.8.0 → v1.14.1 +- cloud.google.com/go/dataflow: v0.7.0 → v0.9.1 +- cloud.google.com/go/dataform: v0.5.0 → v0.8.1 +- cloud.google.com/go/datafusion: v1.5.0 → v1.7.1 +- cloud.google.com/go/datalabeling: v0.6.0 → v0.8.1 +- cloud.google.com/go/dataplex: v1.4.0 → v1.8.1 +- cloud.google.com/go/dataproc: v1.8.0 → v1.12.0 +- cloud.google.com/go/dataqna: v0.6.0 → v0.8.1 +- cloud.google.com/go/datastore: v1.10.0 → v1.12.0 +- cloud.google.com/go/datastream: v1.5.0 → v1.9.1 +- cloud.google.com/go/deploy: v1.5.0 → v1.11.0 +- cloud.google.com/go/dialogflow: v1.29.0 → v1.38.0 +- cloud.google.com/go/dlp: v1.7.0 → v1.10.1 +- cloud.google.com/go/documentai: v1.10.0 → v1.20.0 +- cloud.google.com/go/domains: v0.7.0 → v0.9.1 +- cloud.google.com/go/edgecontainer: v0.2.0 → v1.1.1 +- cloud.google.com/go/essentialcontacts: v1.4.0 → v1.6.2 +- cloud.google.com/go/eventarc: v1.8.0 → v1.12.1 +- cloud.google.com/go/filestore: v1.4.0 → v1.7.1 +- cloud.google.com/go/firestore: v1.9.0 → v1.11.0 +- cloud.google.com/go/functions: v1.9.0 → v1.15.1 +- cloud.google.com/go/gaming: v1.8.0 → v1.10.1 +- cloud.google.com/go/gkebackup: v0.3.0 → v0.4.0 +- cloud.google.com/go/gkeconnect: v0.6.0 → v0.8.1 +- cloud.google.com/go/gkehub: v0.10.0 → v0.14.1 +- cloud.google.com/go/gkemulticloud: v0.4.0 → v0.6.1 +- cloud.google.com/go/gsuiteaddons: v1.4.0 → v1.6.1 +- cloud.google.com/go/iam: v0.11.0 → v1.1.0 +- cloud.google.com/go/iap: v1.5.0 → v1.8.1 +- cloud.google.com/go/ids: v1.2.0 → v1.4.1 +- cloud.google.com/go/iot: v1.4.0 → v1.7.1 +- cloud.google.com/go/kms: v1.6.0 → v1.12.1 +- cloud.google.com/go/language: v1.8.0 → v1.10.1 +- cloud.google.com/go/lifesciences: v0.6.0 → v0.9.1 +- cloud.google.com/go/logging: v1.6.1 → v1.7.0 +- cloud.google.com/go/longrunning: v0.3.0 → v0.5.1 +- cloud.google.com/go/managedidentities: v1.4.0 → v1.6.1 +- cloud.google.com/go/maps: v0.1.0 → v0.7.0 +- cloud.google.com/go/mediatranslation: v0.6.0 → v0.8.1 +- cloud.google.com/go/memcache: v1.7.0 → v1.10.1 +- cloud.google.com/go/metastore: v1.8.0 → v1.11.1 +- cloud.google.com/go/monitoring: v1.8.0 → v1.15.1 +- cloud.google.com/go/networkconnectivity: v1.7.0 → v1.12.1 +- cloud.google.com/go/networkmanagement: v1.5.0 → v1.8.0 +- cloud.google.com/go/networksecurity: v0.6.0 → v0.9.1 +- cloud.google.com/go/notebooks: v1.5.0 → v1.9.1 +- cloud.google.com/go/optimization: v1.2.0 → v1.4.1 +- cloud.google.com/go/orchestration: v1.4.0 → v1.8.1 +- cloud.google.com/go/orgpolicy: v1.5.0 → v1.11.1 +- cloud.google.com/go/osconfig: v1.10.0 → v1.12.1 +- cloud.google.com/go/oslogin: v1.7.0 → v1.10.1 +- cloud.google.com/go/phishingprotection: v0.6.0 → v0.8.1 +- cloud.google.com/go/policytroubleshooter: v1.4.0 → v1.7.1 +- cloud.google.com/go/privatecatalog: v0.6.0 → v0.9.1 +- cloud.google.com/go/pubsub: v1.27.1 → v1.32.0 +- cloud.google.com/go/pubsublite: v1.5.0 → v1.8.1 +- cloud.google.com/go/recaptchaenterprise/v2: v2.5.0 → v2.7.2 +- cloud.google.com/go/recommendationengine: v0.6.0 → v0.8.1 +- cloud.google.com/go/recommender: v1.8.0 → v1.10.1 +- cloud.google.com/go/redis: v1.10.0 → v1.13.1 +- cloud.google.com/go/resourcemanager: v1.4.0 → v1.9.1 +- cloud.google.com/go/resourcesettings: v1.4.0 → v1.6.1 +- cloud.google.com/go/retail: v1.11.0 → v1.14.1 +- cloud.google.com/go/run: v0.3.0 → v0.9.0 +- cloud.google.com/go/scheduler: v1.7.0 → v1.10.1 +- cloud.google.com/go/secretmanager: v1.9.0 → v1.11.1 +- cloud.google.com/go/security: v1.10.0 → v1.15.1 +- cloud.google.com/go/securitycenter: v1.16.0 → v1.23.0 +- cloud.google.com/go/servicedirectory: v1.7.0 → v1.10.1 +- cloud.google.com/go/shell: v1.4.0 → v1.7.1 +- cloud.google.com/go/spanner: v1.41.0 → v1.47.0 +- cloud.google.com/go/speech: v1.9.0 → v1.17.1 +- cloud.google.com/go/storagetransfer: v1.6.0 → v1.10.0 +- cloud.google.com/go/talent: v1.4.0 → v1.6.2 +- cloud.google.com/go/texttospeech: v1.5.0 → v1.7.1 +- cloud.google.com/go/tpu: v1.4.0 → v1.6.1 +- cloud.google.com/go/trace: v1.4.0 → v1.10.1 +- cloud.google.com/go/translate: v1.4.0 → v1.8.1 +- cloud.google.com/go/video: v1.9.0 → v1.17.1 +- cloud.google.com/go/videointelligence: v1.9.0 → v1.11.1 +- cloud.google.com/go/vision/v2: v2.5.0 → v2.7.2 +- cloud.google.com/go/vmmigration: v1.3.0 → v1.7.1 +- cloud.google.com/go/vmwareengine: v0.1.0 → v0.4.1 +- cloud.google.com/go/vpcaccess: v1.5.0 → v1.7.1 +- cloud.google.com/go/webrisk: v1.7.0 → v1.9.1 +- cloud.google.com/go/websecurityscanner: v1.4.0 → v1.6.1 +- cloud.google.com/go/workflows: v1.9.0 → v1.11.1 +- cloud.google.com/go: v0.107.0 → v0.110.4 +- github.com/cncf/xds/go: [06c439d → e9ce688](https://github.com/cncf/xds/go/compare/06c439d...e9ce688) +- github.com/envoyproxy/go-control-plane: [v0.10.3 → 9239064](https://github.com/envoyproxy/go-control-plane/compare/v0.10.3...9239064) +- github.com/envoyproxy/protoc-gen-validate: [v0.9.1 → v0.10.1](https://github.com/envoyproxy/protoc-gen-validate/compare/v0.9.1...v0.10.1) +- github.com/golang/glog: [v1.0.0 → v1.1.0](https://github.com/golang/glog/compare/v1.0.0...v1.1.0) +- github.com/golang/protobuf: [v1.5.2 → v1.5.3](https://github.com/golang/protobuf/compare/v1.5.2...v1.5.3) +- github.com/googleapis/enterprise-certificate-proxy: [v0.2.3 → v0.2.5](https://github.com/googleapis/enterprise-certificate-proxy/compare/v0.2.3...v0.2.5) +- github.com/googleapis/gax-go/v2: [v2.7.0 → v2.12.0](https://github.com/googleapis/gax-go/v2/compare/v2.7.0...v2.12.0) +- github.com/yuin/goldmark: [v1.4.1 → v1.4.13](https://github.com/yuin/goldmark/compare/v1.4.1...v1.4.13) +- golang.org/x/oauth2: v0.5.0 → v0.10.0 +- golang.org/x/sync: v0.1.0 → v0.3.0 +- google.golang.org/api: v0.111.0 → v0.134.0 +- google.golang.org/genproto: 637eb22 → ccb25ca +- google.golang.org/grpc: v1.53.0 → v1.56.3 +- google.golang.org/protobuf: v1.28.1 → v1.31.0 + +### Removed +- cloud.google.com/go/apikeys: v0.4.0 +- cloud.google.com/go/servicecontrol: v1.5.0 +- cloud.google.com/go/servicemanagement: v1.5.0 +- cloud.google.com/go/serviceusage: v1.4.0 + +# v1.9.12 - Changelog since v1.9.10 + +## Changes by Kind + +### Bug or Regression + +- CVE fixes: CVE-2023-39323 ([#1412](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1412), [@dannawang0221](https://github.com/dannawang0221)) + +### Other (Cleanup or Flake) + +- Update go version to 1.20.10 ([#1453](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1453), [@tyuchn](https://github.com/tyuchn)) + +## Dependencies + +### Changed + +- golang.org/x/crypto: v0.11.0 → v0.14.0 +- golang.org/x/net: v0.12.0 → v0.17.0 +- golang.org/x/sys: v0.10.0 → v0.13.0 +- golang.org/x/term: v0.10.0 → v0.13.0 +- golang.org/x/text: v0.11.0 → v0.13.0 + +# v1.9.10 - Changelog since v1.9.9 + +## Changes by Kind + +### Bug or Regression + +- bump go version to 1.20.8 ([#1394](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1394), [@tyuchn](https://github.com/tyuchn)) +- Remove ARG BUILDPLATFORM from Dockerfile ([#1385](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1385), [@tyuchn](https://github.com/tyuchn)) +- Update test/run-e2e.sh to match PROW configuration ([#1360](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1360), [@pwschuurman](https://github.com/pwschuurman)) +- Always call LoggedError for errors returned from CloudProvider methods ([#1381](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1381), [@amacaskill](https://github.com/amacaskill)) + +# v1.9.9 - Changelog since v1.9.8 + +## Changes by Kind + +### Bug or Regression + +- Add option for serializing formatAndMount, including fsck as well as mkfs. ([#1352](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1352), [@mattcary](https://github.com/mattcary)) + +### Uncategorized + +- Update go version to 1.20.7 to fix CVE-2023-29409 CVE-2023-39533 ([#1349](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1349), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) + +# v1.9.8 - Changelog since v1.9.7 + +## Changes by Kind + +### Feature + +- Added support in PDCSI driver to create confidential hyperdisk storage on GCE. ([#1318](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1318), [@Sneha-at](https://github.com/Sneha-at)) + +### Bug or Regression + +- Update go version to 1.20.6 to fix CVE-2023-29406 ([#1330](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1330), [@pwschuurman](https://github.com/pwschuurman)) + +## Dependencies + +### Added +- cloud.google.com/go/accessapproval: v1.5.0 +- cloud.google.com/go/accesscontextmanager: v1.4.0 +- cloud.google.com/go/aiplatform: v1.27.0 +- cloud.google.com/go/analytics: v0.12.0 +- cloud.google.com/go/apigateway: v1.4.0 +- cloud.google.com/go/apigeeconnect: v1.4.0 +- cloud.google.com/go/apigeeregistry: v0.4.0 +- cloud.google.com/go/apikeys: v0.4.0 +- cloud.google.com/go/appengine: v1.5.0 +- cloud.google.com/go/area120: v0.6.0 +- cloud.google.com/go/artifactregistry: v1.9.0 +- cloud.google.com/go/asset: v1.10.0 +- cloud.google.com/go/assuredworkloads: v1.9.0 +- cloud.google.com/go/automl: v1.8.0 +- cloud.google.com/go/baremetalsolution: v0.4.0 +- cloud.google.com/go/batch: v0.4.0 +- cloud.google.com/go/beyondcorp: v0.3.0 +- cloud.google.com/go/billing: v1.7.0 +- cloud.google.com/go/binaryauthorization: v1.4.0 +- cloud.google.com/go/certificatemanager: v1.4.0 +- cloud.google.com/go/channel: v1.9.0 +- cloud.google.com/go/cloudbuild: v1.4.0 +- cloud.google.com/go/clouddms: v1.4.0 +- cloud.google.com/go/cloudtasks: v1.8.0 +- cloud.google.com/go/compute/metadata: v0.2.3 +- cloud.google.com/go/contactcenterinsights: v1.4.0 +- cloud.google.com/go/container: v1.7.0 +- cloud.google.com/go/containeranalysis: v0.6.0 +- cloud.google.com/go/datacatalog: v1.8.0 +- cloud.google.com/go/dataflow: v0.7.0 +- cloud.google.com/go/dataform: v0.5.0 +- cloud.google.com/go/datafusion: v1.5.0 +- cloud.google.com/go/datalabeling: v0.6.0 +- cloud.google.com/go/dataplex: v1.4.0 +- cloud.google.com/go/dataproc: v1.8.0 +- cloud.google.com/go/dataqna: v0.6.0 +- cloud.google.com/go/datastream: v1.5.0 +- cloud.google.com/go/deploy: v1.5.0 +- cloud.google.com/go/dialogflow: v1.29.0 +- cloud.google.com/go/dlp: v1.7.0 +- cloud.google.com/go/documentai: v1.10.0 +- cloud.google.com/go/domains: v0.7.0 +- cloud.google.com/go/edgecontainer: v0.2.0 +- cloud.google.com/go/errorreporting: v0.3.0 +- cloud.google.com/go/essentialcontacts: v1.4.0 +- cloud.google.com/go/eventarc: v1.8.0 +- cloud.google.com/go/filestore: v1.4.0 +- cloud.google.com/go/functions: v1.9.0 +- cloud.google.com/go/gaming: v1.8.0 +- cloud.google.com/go/gkebackup: v0.3.0 +- cloud.google.com/go/gkeconnect: v0.6.0 +- cloud.google.com/go/gkehub: v0.10.0 +- cloud.google.com/go/gkemulticloud: v0.4.0 +- cloud.google.com/go/gsuiteaddons: v1.4.0 +- cloud.google.com/go/iap: v1.5.0 +- cloud.google.com/go/ids: v1.2.0 +- cloud.google.com/go/iot: v1.4.0 +- cloud.google.com/go/language: v1.8.0 +- cloud.google.com/go/lifesciences: v0.6.0 +- cloud.google.com/go/longrunning: v0.3.0 +- cloud.google.com/go/managedidentities: v1.4.0 +- cloud.google.com/go/maps: v0.1.0 +- cloud.google.com/go/mediatranslation: v0.6.0 +- cloud.google.com/go/memcache: v1.7.0 +- cloud.google.com/go/metastore: v1.8.0 +- cloud.google.com/go/monitoring: v1.8.0 +- cloud.google.com/go/networkconnectivity: v1.7.0 +- cloud.google.com/go/networkmanagement: v1.5.0 +- cloud.google.com/go/networksecurity: v0.6.0 +- cloud.google.com/go/notebooks: v1.5.0 +- cloud.google.com/go/optimization: v1.2.0 +- cloud.google.com/go/orchestration: v1.4.0 +- cloud.google.com/go/orgpolicy: v1.5.0 +- cloud.google.com/go/osconfig: v1.10.0 +- cloud.google.com/go/oslogin: v1.7.0 +- cloud.google.com/go/phishingprotection: v0.6.0 +- cloud.google.com/go/policytroubleshooter: v1.4.0 +- cloud.google.com/go/privatecatalog: v0.6.0 +- cloud.google.com/go/pubsublite: v1.5.0 +- cloud.google.com/go/recaptchaenterprise/v2: v2.5.0 +- cloud.google.com/go/recommendationengine: v0.6.0 +- cloud.google.com/go/recommender: v1.8.0 +- cloud.google.com/go/redis: v1.10.0 +- cloud.google.com/go/resourcemanager: v1.4.0 +- cloud.google.com/go/resourcesettings: v1.4.0 +- cloud.google.com/go/retail: v1.11.0 +- cloud.google.com/go/run: v0.3.0 +- cloud.google.com/go/scheduler: v1.7.0 +- cloud.google.com/go/secretmanager: v1.9.0 +- cloud.google.com/go/security: v1.10.0 +- cloud.google.com/go/securitycenter: v1.16.0 +- cloud.google.com/go/servicecontrol: v1.5.0 +- cloud.google.com/go/servicedirectory: v1.7.0 +- cloud.google.com/go/servicemanagement: v1.5.0 +- cloud.google.com/go/serviceusage: v1.4.0 +- cloud.google.com/go/shell: v1.4.0 +- cloud.google.com/go/spanner: v1.41.0 +- cloud.google.com/go/speech: v1.9.0 +- cloud.google.com/go/storagetransfer: v1.6.0 +- cloud.google.com/go/talent: v1.4.0 +- cloud.google.com/go/texttospeech: v1.5.0 +- cloud.google.com/go/tpu: v1.4.0 +- cloud.google.com/go/trace: v1.4.0 +- cloud.google.com/go/translate: v1.4.0 +- cloud.google.com/go/video: v1.9.0 +- cloud.google.com/go/videointelligence: v1.9.0 +- cloud.google.com/go/vision/v2: v2.5.0 +- cloud.google.com/go/vmmigration: v1.3.0 +- cloud.google.com/go/vmwareengine: v0.1.0 +- cloud.google.com/go/vpcaccess: v1.5.0 +- cloud.google.com/go/webrisk: v1.7.0 +- cloud.google.com/go/websecurityscanner: v1.4.0 +- cloud.google.com/go/workflows: v1.9.0 + +### Changed +- cloud.google.com/go/bigquery: v1.8.0 → v1.44.0 +- cloud.google.com/go/compute: v1.7.0 → v1.18.0 +- cloud.google.com/go/datastore: v1.1.0 → v1.10.0 +- cloud.google.com/go/firestore: v1.1.0 → v1.9.0 +- cloud.google.com/go/iam: v0.3.0 → v0.11.0 +- cloud.google.com/go/kms: v1.4.0 → v1.6.0 +- cloud.google.com/go/logging: v1.0.0 → v1.6.1 +- cloud.google.com/go/pubsub: v1.4.0 → v1.27.1 +- cloud.google.com/go/storage: v1.23.0 → v1.12.0 +- cloud.google.com/go: v0.103.0 → v0.107.0 +- github.com/census-instrumentation/opencensus-proto: [v0.2.1 → v0.4.1](https://github.com/census-instrumentation/opencensus-proto/compare/v0.2.1...v0.4.1) +- github.com/cespare/xxhash/v2: [v2.1.2 → v2.2.0](https://github.com/cespare/xxhash/v2/compare/v2.1.2...v2.2.0) +- github.com/cncf/udpa/go: [04548b0 → c52dc94](https://github.com/cncf/udpa/go/compare/04548b0...c52dc94) +- github.com/cncf/xds/go: [cb28da3 → 06c439d](https://github.com/cncf/xds/go/compare/cb28da3...06c439d) +- github.com/envoyproxy/go-control-plane: [49ff273 → v0.10.3](https://github.com/envoyproxy/go-control-plane/compare/49ff273...v0.10.3) +- github.com/envoyproxy/protoc-gen-validate: [v0.1.0 → v0.9.1](https://github.com/envoyproxy/protoc-gen-validate/compare/v0.1.0...v0.9.1) +- github.com/googleapis/enterprise-certificate-proxy: [v0.1.0 → v0.2.3](https://github.com/googleapis/enterprise-certificate-proxy/compare/v0.1.0...v0.2.3) +- github.com/googleapis/gax-go/v2: [v2.4.0 → v2.7.0](https://github.com/googleapis/gax-go/v2/compare/v2.4.0...v2.7.0) +- github.com/stretchr/objx: [v0.2.0 → v0.5.0](https://github.com/stretchr/objx/compare/v0.2.0...v0.5.0) +- github.com/stretchr/testify: [v1.7.0 → v1.8.1](https://github.com/stretchr/testify/compare/v1.7.0...v1.8.1) +- go.opencensus.io: v0.23.0 → v0.24.0 +- golang.org/x/net: v0.5.0 → v0.7.0 +- golang.org/x/oauth2: 128564f → v0.5.0 +- golang.org/x/sync: 0de741c → v0.1.0 +- golang.org/x/sys: v0.4.0 → v0.5.0 +- golang.org/x/term: v0.4.0 → v0.5.0 +- golang.org/x/text: v0.6.0 → v0.7.0 +- golang.org/x/xerrors: 65e6541 → 5ec99f8 +- google.golang.org/api: v0.86.0 → v0.111.0 +- google.golang.org/genproto: 176da50 → 637eb22 +- google.golang.org/grpc: v1.48.0 → v1.53.0 +- google.golang.org/protobuf: v1.28.0 → v1.28.1 + +### Removed +- github.com/googleapis/go-type-adapters: [v1.0.0](https://github.com/googleapis/go-type-adapters/tree/v1.0.0) + +# v1.9.7 - Changelog since v1.9.6 + +## Changes by Kind + +### Bug or Regression + +- Fix resource parsing when the gcp project name ends with alpha, beta or v1 ([#1308](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1308), [@mattcary](https://github.com/mattcary)) + +### Uncategorized + +- Add disk type for all operations metrics. ([#1296](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1296), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) +- Use original error code when responding with a backoff error on publish or unpublish. ([#1312](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1312), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) + +# v1.9.6 - Changelog since v1.9.5 + +## Changes by Kind + +### Bug or Regression + +- Fix provisioned-iops-on-create passing logic([#1283](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1283)) +- Bugfix for empty disk type being registered in metric for Create volume function. ([#1268](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1268), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) + +### Cleanup + +- Automated cherry pick of #1150: satisfy volume cloning topology requirements when choosing zone for CreateVolume, #1232: Use errors.As so we can detect wrapped errors, #1227: Adding new metric pdcsi_operation_errors to fetch error ([#1240](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1240), [@sunnylovestiramisu](https://github.com/sunnylovestiramisu)) +- Update go version to 1.20.5 to address CVE fixes ([#1266](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1266), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) +- Updates error message to be more user friendly when PD CSI Driver encounters an disk type UNSUPPORTED_OPERATION on ControllerPublishVolume ([#1222](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1222), [@pwschuurman](https://github.com/pwschuurman)) +- [release-1.10] Update Docker.Windows to 1.20.5 ([#1274](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1274), [@k8s-infra-cherrypick-robot](https://github.com/k8s-infra-cherrypick-robot)) + +# v1.9.5 - Changelog since v1.9.4 + +### Bug or Regression + +- Add libraries needed for determining XFS volume expansion ([#1204](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1204), [@nberlee](https://github.com/nberlee)) + +### Cleanup + +- Updates error message to be more user friendly when PD CSI Driver encounters an disk type UNSUPPORTED_OPERATION on ControllerPublishVolume ([#1222](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1222), [@pwschuurman](https://github.com/pwschuurman)) + +# v1.9.4 - Changelog since v1.9.3 + +## Changes by Kind + +### Bug or Regression + +- Add missing libraries, libbsd and libmd, that are dependencies for XFS volume expansion. ([#1204](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1204), [@nberlee](https://github.com/nberlee)) + +# v1.9.3 - Changelog since v1.9.2 + +## Changes by Kind + +### Bug or Regression + +- Fix missing libedit.so.2 error ([#1177](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1177), [@sunnylovestiramisu](https://github.com/sunnylovestiramisu)) +- Update go version to 1.20.3 for k/k 1.27 ([#1180](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1180), [@sunnylovestiramisu](https://github.com/sunnylovestiramisu)) + +# v1.9.2 - Changelog since v1.9.1 + +## Changes by Kind + +### Bug or Regression + +- Revert feature to add PV, PVC and namespace name as labels to the PD [#1090](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1090) ([#1174](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1174), [@sunnylovestiramisu](https://github.com/sunnylovestiramisu)) + + +# v1.9.1 - Changelog since v1.9.0 + +## Changes by Kind + +### Feature + +- go version updates ([#1158](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1158), [@saikat-royc](https://github.com/saikat-royc)) + +- Fix for CVEs - update base image ([#1162](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1162), [@sunnylovestiramisu](https://github.com/sunnylovestiramisu)) + +- Fix multiarch build ([#1165](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1165), [@sunnylovestiramisu](https://github.com/sunnylovestiramisu)) + +# v1.9.0 - Changelog since v1.8.2 + +## Changes by Kind + +### Feature + +- Adding auto-stamped details like PV, PVC and namespace name from PV description as labels for the PVs/PDs ([#1090](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1090), [@Sneha-at](https://github.com/Sneha-at)) +- Support setting snapshot labels to Images ([#1066](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1066), [@jenting](https://github.com/jenting)) +- Pass in ProvisionedIOPSOnCreate as a parameter for CreateVolume ([#1079](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1079), [@sunnylovestiramisu](https://github.com/sunnylovestiramisu)) +- Add provisionedThroughput for hyperdisk ([#1101](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1101), [@sunnylovestiramisu](https://github.com/sunnylovestiramisu)) +- Change iops params directly convert string to int64 ([#1128](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1128), [@sunnylovestiramisu](https://github.com/sunnylovestiramisu)) + +### Bug or Regression + +- Fix the filesystem not being resized when restoring from a snapshot/clone to a larger size than the original ([#972](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/972), [@mattcary](https://github.com/mattcary)) +- Add udevadm binary in the container image. ([#1072](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1072), [@jenting](https://github.com/jenting)) +- Remove debug.PrintStack() ([#1135](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1135), [@sunnylovestiramisu](https://github.com/sunnylovestiramisu)) + +### Other (Cleanup or Flake) + +- Improve logging for device path verification ([#1142](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1142), [@saikat-royc](https://github.com/saikat-royc)) +- Update csi-attacher to v4.2.0 ([#1144](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1144), [@sunnylovestiramisu](https://github.com/sunnylovestiramisu)) +- Update sidecar based on internal versions ([#1154](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/1154), [@sunnylovestiramisu](https://github.com/sunnylovestiramisu)) + +## Dependencies + +### Changed +- github.com/go-logr/logr: [v1.2.0 → v1.2.3](https://github.com/go-logr/logr/compare/v1.2.0...v1.2.3) +- github.com/google/go-cmp: [v0.5.8 → v0.5.9](https://github.com/google/go-cmp/compare/v0.5.8...v0.5.9) +- github.com/onsi/ginkgo/v2: [v2.1.4 → v2.7.1](https://github.com/onsi/ginkgo/v2/compare/v2.1.4...v2.7.1) +- github.com/onsi/gomega: [v1.20.0 → v1.25.0](https://github.com/onsi/gomega/compare/v1.20.0...v1.25.0) +- golang.org/x/mod: 9b9b3d8 → 86c51ed +- golang.org/x/net: a158d28 → v0.5.0 +- golang.org/x/sys: 8c9f86f → v0.4.0 +- golang.org/x/term: 03fcf44 → v0.4.0 +- golang.org/x/text: v0.3.7 → v0.6.0 +- golang.org/x/tools: 897bd77 → v0.5.0 + diff --git a/CHANGELOG/README.md b/CHANGELOG/README.md new file mode 100644 index 000000000..229d9920a --- /dev/null +++ b/CHANGELOG/README.md @@ -0,0 +1,20 @@ +# CHANGELOGs +- [CHANGELOG v1.17.0](./CHANGELOG-1.17.md) +- [CHANGELOG v1.15.0](./CHANGELOG-1.15.md) +- [CHANGELOG v1.14.0](./CHANGELOG-1.14.md) +- [CHANGELOG v1.13.0](./CHANGELOG-1.13.md) +- [CHANGELOG v1.12.0](./CHANGELOG-1.12.md) +- [CHANGELOG v1.11.0](./CHANGELOG-1.11.md) +- [CHANGELOG v1.10.0](./CHANGELOG-1.10.md) +- [CHANGELOG v1.9.0](./CHANGELOG-1.9.md) +- [CHANGELOG v1.8.0](./CHANGELOG-1.8.md) +- [CHANGELOG v1.7.0](./CHANGELOG-1.7.md) +- [CHANGELOG v1.6.0](./CHANGELOG-1.6.md) +- [CHANGELOG v1.5.0](./CHANGELOG-1.5.md) +- [CHANGELOG v1.4.0](./CHANGELOG-1.4.md) +- [CHANGELOG v1.3.0](./CHANGELOG-1.3.md) +- [CHANGELOG v1.2.0](./CHANGELOG-1.2.md) +- [CHANGELOG v1.1.0](./CHANGELOG-1.1.md) +- [CHANGELOG v1.0.0](./CHANGELOG-1.0.md) +- [CHANGELOG v0.7.0](./CHANGELOG-0.7.md) +- [CHANGELOG v0.6.0](./CHANGELOG-0.6.md) diff --git a/Dockerfile b/Dockerfile index 8d6c0f9a0..1d8964ce5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -FROM --platform=$BUILDPLATFORM golang:1.24.6 AS builder +FROM --platform=$BUILDPLATFORM golang:1.26.0 AS builder ARG STAGINGVERSION ARG TARGETPLATFORM diff --git a/Dockerfile.Windows b/Dockerfile.Windows index 9b21ae862..f42b4d052 100644 --- a/Dockerfile.Windows +++ b/Dockerfile.Windows @@ -13,7 +13,7 @@ # limitations under the License. ARG BASE_IMAGE -FROM --platform=$BUILDPLATFORM golang:1.24.6 AS builder +FROM --platform=$BUILDPLATFORM golang:1.26.0 AS builder ARG TARGETPLATFORM ARG STAGINGVERSION diff --git a/Dockerfile.debug b/Dockerfile.debug index 843a7f152..f4ac238f2 100644 --- a/Dockerfile.debug +++ b/Dockerfile.debug @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -FROM golang:1.24.6 as builder +FROM golang:1.26.0 as builder WORKDIR /go/src/sigs.k8s.io/gcp-compute-persistent-disk-csi-driver ADD . . diff --git a/Dockerfile.node-labeler b/Dockerfile.node-labeler new file mode 100644 index 000000000..b49b0590f --- /dev/null +++ b/Dockerfile.node-labeler @@ -0,0 +1,29 @@ +# Copyright 2025 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. + +FROM --platform=$BUILDPLATFORM golang:1.26.0 AS builder + +ARG STAGINGVERSION +ARG TARGETPLATFORM + +WORKDIR /go/src/sigs.k8s.io/gcp-compute-persistent-disk-csi-driver +ADD . . +RUN GOARCH=$(echo $TARGETPLATFORM | cut -f2 -d '/') GCE_PD_CSI_STAGING_VERSION=$STAGINGVERSION make gce-pd-node-labeler + +FROM gcr.io/distroless/static:nonroot +WORKDIR / +COPY --from=builder /go/src/sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/bin/gce-pd-node-labeler . +USER 65532:65532 + +ENTRYPOINT ["/gce-pd-node-labeler"] diff --git a/Makefile b/Makefile index fa1ea91bb..454989c58 100644 --- a/Makefile +++ b/Makefile @@ -18,7 +18,9 @@ REV=$(shell git describe --long --tags --match='v*' --dirty 2>/dev/null || git r GCE_PD_CSI_STAGING_VERSION ?= ${REV} STAGINGVERSION=${GCE_PD_CSI_STAGING_VERSION} STAGINGIMAGE=${GCE_PD_CSI_STAGING_IMAGE} +LABELERSTAGINGIMAGE?=${STAGINGIMAGE}/gce-pd-node-labeler DRIVERBINARY=gce-pd-csi-driver +LABELERBINARY=gce-pd-node-labeler DRIVERWINDOWSBINARY=${DRIVERBINARY}.exe DOCKER=DOCKER_CLI_EXPERIMENTAL=enabled docker @@ -41,6 +43,10 @@ gce-pd-driver: require-GCE_PD_CSI_STAGING_VERSION # OpenShift carry: remove -extldflags=static to compile with FIPS OpenSSL CGO_ENABLED=0 go build -mod=vendor -gcflags=$(GCFLAGS) -ldflags "-X main.version=$(STAGINGVERSION)" -o bin/${DRIVERBINARY} ./cmd/gce-pd-csi-driver/ +gce-pd-node-labeler: require-GCE_PD_CSI_STAGING_VERSION + mkdir -p bin + CGO_ENABLED=0 go build -mod=vendor -gcflags=$(GCFLAGS) -ldflags "-extldflags=static -X main.version=$(STAGINGVERSION)" -o bin/${LABELERBINARY} ./cmd/gce-pd-node-labeler/ + gce-pd-driver-windows: require-GCE_PD_CSI_STAGING_VERSION ifeq (${GOARCH}, amd64) mkdir -p bin @@ -78,6 +84,10 @@ build-and-push-multi-arch-debug: build-and-push-container-linux-debug build-and- STAGINGIMAGE="$(STAGINGIMAGE)" STAGINGVERSION="$(STAGINGVERSION)" WINDOWS_IMAGE_TAGS="ltsc2019, ltsc2022" WINDOWS_BASE_IMAGES="$(BASE_IMAGE_LTSC2019), $(BASE_IMAGE_LTSC2022)" ./manifest_osversion.sh $(DOCKER) manifest push -p $(STAGINGIMAGE):$(STAGINGVERSION) +build-and-push-node-labeler-multi-arch: build-node-labeler-container-linux-amd64 build-node-labeler-container-linux-arm64 + $(DOCKER) manifest create $(LABELERSTAGINGIMAGE):$(STAGINGVERSION) $(LABELERSTAGINGIMAGE):$(STAGINGVERSION)_linux_amd64 $(LABELERSTAGINGIMAGE):$(STAGINGVERSION)_linux_arm64 + $(DOCKER) manifest push -p $(LABELERSTAGINGIMAGE):$(STAGINGVERSION) + push-container: build-container # Used by hack/verify-docker-deps.sh, not used for building artifacts @@ -112,6 +122,18 @@ build-and-push-container-linux-arm64: require-GCE_PD_CSI_STAGING_IMAGE init-buil --build-arg BUILDPLATFORM=linux \ --build-arg STAGINGVERSION=$(STAGINGVERSION) --push --provenance=false . +build-node-labeler-container-linux-amd64: require-GCE_PD_CSI_STAGING_IMAGE init-buildx + $(DOCKER) buildx build --file=Dockerfile.node-labeler --platform=linux/amd64 \ + -t $(LABELERSTAGINGIMAGE):$(STAGINGVERSION)_linux_amd64 \ + --build-arg BUILDPLATFORM=linux \ + --build-arg STAGINGVERSION=$(STAGINGVERSION) --push --provenance=false . + +build-node-labeler-container-linux-arm64: require-GCE_PD_CSI_STAGING_IMAGE init-buildx + $(DOCKER) buildx build --file=Dockerfile.node-labeler --platform=linux/arm64 \ + -t $(LABELERSTAGINGIMAGE):$(STAGINGVERSION)_linux_arm64 \ + --build-arg BUILDPLATFORM=linux \ + --build-arg STAGINGVERSION=$(STAGINGVERSION) --push --provenance=false . + build-and-push-container-linux-debug: require-GCE_PD_CSI_STAGING_IMAGE init-buildx $(DOCKER) buildx build --file=Dockerfile.debug --platform=linux \ -t $(STAGINGIMAGE):$(STAGINGVERSION)_linux \ diff --git a/README.md b/README.md index 1fde49d4d..d0c1035ea 100644 --- a/README.md +++ b/README.md @@ -99,12 +99,17 @@ Controller-level and node-level deployments will both have priorityClassName set As noted in [GCP PD documentation](https://cloud.google.com/kubernetes-engine/docs/how-to/persistent-volumes/gce-pd-csi-driver), `ext4` and `xfs` are officially supported. `btrfs` support is experimental: - As of writing, Ubuntu VM images support btrfs, but [COS does not](https://cloud.google.com/container-optimized-os/docs/concepts/supported-filesystems). -`btrfs` filesystem accepts two "special" mount options: +`btrfs` filesystem accepts the following "special" mount options and the sysfs paths they target: -- `btrfs-data-bg_reclaim_threshold` -- `btrfs-metadata-bg_reclaim_threshold` +| Setting | Sysfs path | Value | Default | Supported on Linux versions | Notes | +|--------------------------------------------------|-------------------------------------------------------------------|----------------|-------------------------|-----------------------------|-------| +| `btrfs-allocation-data-bg_reclaim_threshold` | `/sys/fs/btrfs/FS-UUID/allocation/data/bg_reclaim_threshold` | 0–99 (percent) | 0 (off) | v5.19+ | Triggers background reclaim for DATA block groups when usage drops to the threshold. | +| `btrfs-allocation-metadata-bg_reclaim_threshold` | `/sys/fs/btrfs/FS-UUID/allocation/metadata/bg_reclaim_threshold` | 0–99 (percent) | 0 (off) | v5.19+ | Same as above, for METADATA block groups. | +| `btrfs-allocation-data-dynamic_reclaim` | `/sys/fs/btrfs/FS-UUID/allocation/data/dynamic_reclaim` | `0` or `1` | 0 (off) | v6.11+ | Heuristic reclaim that addresses [some concerns](https://web.git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=f5ff64ccf7bb7274ed66b0d835b2f6ae10af5d7a) of `bg_reclaim_threshold`. | +| `btrfs-allocation-metadata-dynamic_reclaim` | `/sys/fs/btrfs/FS-UUID/allocation/metadata/dynamic_reclaim` | `0` or `1` | 0 (off) | v6.11+ | Same as above, for METADATA block groups. | +| `btrfs-bdi-read_ahead_kb` | `/sys/fs/btrfs/FS-UUID/bdi/read_ahead_kb` | integer kB ≥ 0 | kernel/device dependent | v5.9+ | Per-BDI readahead. Powers of two are commonly used. | -Which writes to `/sys/fs/btrfs/FS-UUID/allocation/{,meta}data/bg_reclaim_threshold`, as documented [in btrfs docs](https://btrfs.readthedocs.io/en/latest/ch-sysfs.html#uuid-allocations-data-metadata-system). +See more in the [in btrfs docs](https://btrfs.readthedocs.io/en/latest/ch-sysfs.html#uuid-allocations-data-metadata-system). ## Further Documentation diff --git a/cloudbuild.yaml b/cloudbuild.yaml index d45b73c62..24c18692a 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -6,7 +6,7 @@ options: substitution_option: ALLOW_LOOSE steps: - - name: 'gcr.io/k8s-staging-test-infra/gcb-docker-gcloud:v20221214-1b4dd4d69a' + - name: "gcr.io/k8s-staging-test-infra/gcb-docker-gcloud:v20250513-9264efb079" entrypoint: make env: - GCE_PD_CSI_STAGING_IMAGE=gcr.io/${_STAGING_PROJECT}/gcp-compute-persistent-disk-csi-driver @@ -16,11 +16,22 @@ steps: - HOME=/root args: - build-and-push-multi-arch + - name: "gcr.io/k8s-staging-test-infra/gcb-docker-gcloud:v20250513-9264efb079" + entrypoint: make + env: + - GCE_PD_CSI_STAGING_IMAGE=gcr.io/${_STAGING_PROJECT}/gce-pd-node-labeler + - GCE_PD_CSI_STAGING_VERSION=${_PULL_BASE_REF} + # default cloudbuild has HOME=/builder/home and docker buildx is in /root/.docker/cli-plugins/docker-buildx + # set the home to /root explicitly to if using docker buildx + - HOME=/root + args: + - build-and-push-node-labeler-multi-arch substitutions: - _STAGING_PROJECT: 'k8s-staging-cloud-provider-gcp' - _PULL_BASE_REF: 'master' + _STAGING_PROJECT: "k8s-staging-cloud-provider-gcp" + _PULL_BASE_REF: "master" tags: - - 'gcp-compute-persistent-disk-csi-driver' + - "gcp-compute-persistent-disk-csi-driver" + - "gce-pd-node-labeler" - ${_PULL_BASE_REF} diff --git a/cmd/gce-pd-csi-driver/main.go b/cmd/gce-pd-csi-driver/main.go index b1ac5757f..f470947c9 100644 --- a/cmd/gce-pd-csi-driver/main.go +++ b/cmd/gce-pd-csi-driver/main.go @@ -29,7 +29,8 @@ import ( "k8s.io/klog/v2" "k8s.io/utils/strings/slices" - "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/common" + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/constants" + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/convert" "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/deviceutils" gce "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/gce-cloud-provider/compute" metadataservice "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/gce-cloud-provider/metadata" @@ -175,6 +176,7 @@ func handle() { klog.Errorf("Failed to emit process start time: %v", err.Error()) } mm.RegisterMountMetric() + mm.RegisterUnexpectedDevicePathChangesMetric() } metricsManager = &mm } @@ -182,7 +184,7 @@ func handle() { if len(*extraVolumeLabelsStr) > 0 && !*runControllerService { klog.Fatalf("Extra volume labels provided but not running controller") } - extraVolumeLabels, err := common.ConvertLabelsStringToMap(*extraVolumeLabelsStr) + extraVolumeLabels, err := convert.ConvertLabelsStringToMap(*extraVolumeLabelsStr) if err != nil { klog.Fatalf("Bad extra volume labels: %v", err.Error()) } @@ -190,7 +192,7 @@ func handle() { if len(*extraTagsStr) > 0 && !*runControllerService { klog.Fatalf("Extra tags provided but not running controller") } - extraTags, err := common.ConvertTagsStringToMap(*extraTagsStr) + extraTags, err := convert.ConvertTagsStringToMap(*extraTagsStr) if err != nil { klog.Fatalf("Bad extra tags: %v", err.Error()) } @@ -284,7 +286,7 @@ func handle() { klog.Fatalf("Failed to get node info from API server: %v", err.Error()) } - deviceCache, err := linkcache.NewDeviceCacheForNode(ctx, *diskCacheSyncPeriod, *nodeName, driverName, deviceUtils) + deviceCache, err := linkcache.NewDeviceCacheForNode(ctx, *diskCacheSyncPeriod, *nodeName, driverName, deviceUtils, metricsManager) if err != nil { klog.Warningf("Failed to create device cache: %v", err.Error()) } else { @@ -442,8 +444,8 @@ func setupDataCache(ctx context.Context, nodeName string, nodeId string) error { return nil } - lssdCount := common.LocalSSDCountForDataCache - if nodeName != common.TestNode { + lssdCount := constants.LocalSSDCountForDataCache + if nodeName != constants.TestNode { var err error lssdCount, err = driver.GetDataCacheCountFromNodeLabel(ctx, nodeName) if err != nil { diff --git a/cmd/gce-pd-node-labeler/main.go b/cmd/gce-pd-node-labeler/main.go new file mode 100644 index 000000000..a67309c93 --- /dev/null +++ b/cmd/gce-pd-node-labeler/main.go @@ -0,0 +1,93 @@ +/* +Copyright 2025 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 main is the GCE PD Node Labeler entrypoint. +package main + +import ( + "flag" + + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/klog/v2" + "sigs.k8s.io/controller-runtime/pkg/builder" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/client/config" + "sigs.k8s.io/controller-runtime/pkg/handler" + "sigs.k8s.io/controller-runtime/pkg/healthz" + "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/manager" + "sigs.k8s.io/controller-runtime/pkg/manager/signals" + "sigs.k8s.io/controller-runtime/pkg/predicate" + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/nodelabeler" +) + +var ( + configmapName = flag.String("configmap-name", "machine-pd-compatibility", "Name of the ConfigMap to use for machine & PD compatibility information.") + configmapNamespace = flag.String("configmap-namespace", "gce-pd-csi-driver", "Namespace of the ConfigMap to use for machine & PD compatibility information.") + httpEndpoint = flag.String("http-endpoint", ":22015", "HTTP endpoint for health checks.") +) + +func main() { + klog.InitFlags(nil) + flag.Parse() + log.SetLogger(klog.NewKlogr()) + ctx := signals.SetupSignalHandler() + + mgr, err := manager.New(config.GetConfigOrDie(), manager.Options{ + HealthProbeBindAddress: *httpEndpoint, + }) + if err != nil { + klog.Fatalf("Failed to create manager: %v", err) + } + + if err := mgr.AddHealthzCheck("healthz/node-labeler", healthz.Ping); err != nil { + klog.Fatalf("Failed to set up health check: %v", err) + } + + reconciler := &nodelabeler.Reconciler{ + Client: mgr.GetClient(), + ConfigMapName: *configmapName, + ConfigMapNamespace: *configmapNamespace, + } + + eventHandler := &nodelabeler.ConfigMapEventHandler{ + Client: mgr.GetClient(), + Reconciler: reconciler, + } + + err = builder.ControllerManagedBy(mgr). + For(&corev1.Node{}). + Watches( + &corev1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: *configmapName, + Namespace: *configmapNamespace, + }, + }, + handler.EnqueueRequestsFromMapFunc(eventHandler.Map), + builder.WithPredicates(predicate.NewPredicateFuncs(func(obj client.Object) bool { + return obj.GetName() == *configmapName && obj.GetNamespace() == *configmapNamespace + })), + ). + Complete(reconciler) + if err != nil { + klog.Fatalf("Failed to build controller: %v", err) + } + + klog.Info("Starting manager") + if err := mgr.Start(ctx); err != nil { + klog.Fatalf("Failed to start manager: %v", err) + } +} diff --git a/deploy/common.sh b/deploy/common.sh index ad1705640..eab605fa5 100644 --- a/deploy/common.sh +++ b/deploy/common.sh @@ -4,6 +4,7 @@ readonly KUSTOMIZE_PATH="${PKGDIR}/bin/kustomize" readonly VERBOSITY="${GCE_PD_VERBOSITY:-2}" readonly KUBECTL="${GCE_PD_KUBECTL:-kubectl}" +readonly SA_USER_ROLE="roles/iam.serviceAccountUser" # Common functions @@ -17,9 +18,21 @@ function ensure_var(){ fi } +# Return true if scoping serviceAccountUser role to node service accounts +function use_scoped_sa_role() +{ + [ -n "${NODE_SERVICE_ACCOUNTS:-}" ] +} + function get_needed_roles() { - echo "roles/editor roles/compute.storageAdmin roles/iam.serviceAccountUser projects/${PROJECT}/roles/gcp_compute_persistent_disk_csi_driver_custom_role" + ROLES="roles/editor roles/compute.storageAdmin projects/${PROJECT}/roles/gcp_compute_persistent_disk_csi_driver_custom_role" + # Grant the role at the project level if no node service accounts are provided. + if ! use_scoped_sa_role; + then + ROLES+=" ${SA_USER_ROLE}" + fi + echo "${ROLES}" } # Installs kustomize in ${PKGDIR}/bin diff --git a/deploy/disk_type_labels.sh b/deploy/disk_type_labels.sh new file mode 100755 index 000000000..e5f070e93 --- /dev/null +++ b/deploy/disk_type_labels.sh @@ -0,0 +1,388 @@ +#!/bin/bash + +# Ensure we are running Bash 4.0 or higher for associative arrays +if ((BASH_VERSINFO[0] < 4)); then + echo "Error: This script requires Bash 4.0 or higher." >&2 + exit 1 +fi + +# ========================================== +# 0. Argument Parsing & Usage +# ========================================== + +usage() { + echo "Usage: $0 [OPTIONS]" + echo "" + echo "Options:" + echo " -m, --machine-type Required. The GCE machine type (e.g., n2d-standard-2)." + echo " -c, --confidential Optional. Set if GCE instance has confidential computing enabled." + echo " -h, --help Show this help message." + echo "" + echo "Script Examples:" + echo " $0 --machine-type n2d-standard-2 --confidential" + echo " $0 -m c3-standard-4" + echo "" + echo "Kubernetes Integration:" + echo " To apply generated labels directly to a node:" + echo " kubectl label nodes \$($0 -m )" + exit 1 +} + +MACHINE_TYPE="" +IS_CONFIDENTIAL="false" + +while [[ $# -gt 0 ]]; do + key="$1" + case $key in + -m|--machine-type) + MACHINE_TYPE="$2" + shift # past argument + shift # past value + ;; + -c|--confidential) + IS_CONFIDENTIAL="true" + shift # past argument + ;; + -h|--help) + usage + ;; + *) + echo "Error: Unknown option '$1'" + usage + ;; + esac +done + +# Validate required arguments +if [[ -z "$MACHINE_TYPE" ]]; then + echo "Error: --machine-type argument is required." + usage +fi + +# ========================================== +# 1. Define Constants (Disk Types) +# ========================================== +PD_STANDARD="pd-standard" +PD_BALANCED="pd-balanced" +PD_SSD="pd-ssd" +PD_EXTREME="pd-extreme" +HYPERDISK_BALANCED="hyperdisk-balanced" +HYPERDISK_EXTREME="hyperdisk-extreme" +HYPERDISK_THROUGHPUT="hyperdisk-throughput" +HYPERDISK_BALANCED_HA="hyperdisk-balanced-high-availability" +HYPERDISK_ML="hyperdisk-ml" + +# ========================================== +# 2. Define Modes (Confidential Enum) +# ========================================== +MODE_CONF_ONLY="ConfidentialOnly" +MODE_NON_CONF_ONLY="NonConfidentialOnly" +MODE_UNSPECIFIED="Unspecified" + +# ========================================== +# 3. Source of Truth (SOT) Data +# ========================================== +# We use an associative array with composite keys: "FAMILY:DISK_TYPE" +declare -A SOT + +# --- a2 --- +SOT["a2:$HYPERDISK_BALANCED"]=$MODE_CONF_ONLY +SOT["a2:$HYPERDISK_ML"]=$MODE_NON_CONF_ONLY +SOT["a2:$PD_BALANCED"]=$MODE_UNSPECIFIED +SOT["a2:$PD_EXTREME"]=$MODE_UNSPECIFIED +SOT["a2:$PD_SSD"]=$MODE_UNSPECIFIED +SOT["a2:$PD_STANDARD"]=$MODE_UNSPECIFIED + +# --- a3 --- +SOT["a3:$HYPERDISK_BALANCED"]=$MODE_NON_CONF_ONLY +SOT["a3:$HYPERDISK_BALANCED_HA"]=$MODE_NON_CONF_ONLY +SOT["a3:$HYPERDISK_EXTREME"]=$MODE_NON_CONF_ONLY +SOT["a3:$HYPERDISK_THROUGHPUT"]=$MODE_NON_CONF_ONLY +SOT["a3:$HYPERDISK_ML"]=$MODE_NON_CONF_ONLY +SOT["a3:$PD_BALANCED"]=$MODE_UNSPECIFIED +SOT["a3:$PD_SSD"]=$MODE_UNSPECIFIED + +# --- a4 --- +SOT["a4:$HYPERDISK_BALANCED"]=$MODE_NON_CONF_ONLY +SOT["a4:$HYPERDISK_EXTREME"]=$MODE_NON_CONF_ONLY +SOT["a4:$HYPERDISK_ML"]=$MODE_UNSPECIFIED + +# --- a4x --- +SOT["a4x:$HYPERDISK_BALANCED"]=$MODE_NON_CONF_ONLY +SOT["a4x:$HYPERDISK_EXTREME"]=$MODE_NON_CONF_ONLY +SOT["a4x:$HYPERDISK_ML"]=$MODE_UNSPECIFIED + +# --- c2 --- +SOT["c2:$PD_BALANCED"]=$MODE_UNSPECIFIED +SOT["c2:$PD_EXTREME"]=$MODE_UNSPECIFIED +SOT["c2:$PD_SSD"]=$MODE_UNSPECIFIED +SOT["c2:$PD_STANDARD"]=$MODE_UNSPECIFIED + +# --- c2d --- +SOT["c2d:$PD_BALANCED"]=$MODE_UNSPECIFIED +SOT["c2d:$PD_EXTREME"]=$MODE_UNSPECIFIED +SOT["c2d:$PD_SSD"]=$MODE_UNSPECIFIED +SOT["c2d:$PD_STANDARD"]=$MODE_UNSPECIFIED + +# --- c3 --- +SOT["c3:$HYPERDISK_BALANCED"]=$MODE_NON_CONF_ONLY +SOT["c3:$HYPERDISK_EXTREME"]=$MODE_NON_CONF_ONLY +SOT["c3:$HYPERDISK_THROUGHPUT"]=$MODE_NON_CONF_ONLY +SOT["c3:$HYPERDISK_ML"]=$MODE_NON_CONF_ONLY +SOT["c3:$HYPERDISK_BALANCED_HA"]=$MODE_NON_CONF_ONLY +SOT["c3:$PD_BALANCED"]=$MODE_UNSPECIFIED +SOT["c3:$PD_SSD"]=$MODE_UNSPECIFIED +SOT["c3:$PD_EXTREME"]=$MODE_UNSPECIFIED + +# --- c3d --- +SOT["c3d:$HYPERDISK_BALANCED"]=$MODE_NON_CONF_ONLY +SOT["c3d:$HYPERDISK_EXTREME"]=$MODE_NON_CONF_ONLY +SOT["c3d:$HYPERDISK_ML"]=$MODE_NON_CONF_ONLY +SOT["c3d:$HYPERDISK_THROUGHPUT"]=$MODE_NON_CONF_ONLY +SOT["c3d:$PD_BALANCED"]=$MODE_UNSPECIFIED +SOT["c3d:$PD_SSD"]=$MODE_UNSPECIFIED +SOT["c3d:$HYPERDISK_BALANCED_HA"]=$MODE_NON_CONF_ONLY + +# --- c4 --- +SOT["c4:$HYPERDISK_BALANCED"]=$MODE_NON_CONF_ONLY +SOT["c4:$HYPERDISK_BALANCED_HA"]=$MODE_NON_CONF_ONLY +SOT["c4:$HYPERDISK_EXTREME"]=$MODE_NON_CONF_ONLY +SOT["c4:$HYPERDISK_THROUGHPUT"]=$MODE_NON_CONF_ONLY + +# --- c4a --- +SOT["c4a:$HYPERDISK_BALANCED"]=$MODE_NON_CONF_ONLY +SOT["c4a:$HYPERDISK_EXTREME"]=$MODE_NON_CONF_ONLY +SOT["c4a:$HYPERDISK_BALANCED_HA"]=$MODE_NON_CONF_ONLY +SOT["c4a:$HYPERDISK_THROUGHPUT"]=$MODE_NON_CONF_ONLY +SOT["c4a:$HYPERDISK_ML"]=$MODE_UNSPECIFIED +SOT["c4a:$PD_BALANCED"]=$MODE_UNSPECIFIED +SOT["c4a:$PD_SSD"]=$MODE_UNSPECIFIED + +# --- c4d --- +SOT["c4d:$HYPERDISK_BALANCED"]=$MODE_NON_CONF_ONLY +SOT["c4d:$HYPERDISK_EXTREME"]=$MODE_NON_CONF_ONLY +SOT["c4d:$HYPERDISK_BALANCED_HA"]=$MODE_NON_CONF_ONLY + +# --- ct3 --- +SOT["ct3:$PD_BALANCED"]=$MODE_UNSPECIFIED +SOT["ct3:$PD_SSD"]=$MODE_UNSPECIFIED +SOT["ct3:$PD_STANDARD"]=$MODE_UNSPECIFIED + +# --- ct3p --- +SOT["ct3p:$PD_BALANCED"]=$MODE_UNSPECIFIED +SOT["ct3p:$PD_SSD"]=$MODE_UNSPECIFIED +SOT["ct3p:$PD_STANDARD"]=$MODE_UNSPECIFIED + +# --- ct4l --- +SOT["ct4l:$HYPERDISK_BALANCED"]=$MODE_CONF_ONLY +SOT["ct4l:$PD_BALANCED"]=$MODE_UNSPECIFIED +SOT["ct4l:$PD_EXTREME"]=$MODE_UNSPECIFIED +SOT["ct4l:$PD_SSD"]=$MODE_UNSPECIFIED +SOT["ct4l:$PD_STANDARD"]=$MODE_UNSPECIFIED + +# --- ct4p --- +SOT["ct4p:$HYPERDISK_BALANCED"]=$MODE_CONF_ONLY +SOT["ct4p:$PD_BALANCED"]=$MODE_UNSPECIFIED +SOT["ct4p:$PD_EXTREME"]=$MODE_UNSPECIFIED +SOT["ct4p:$PD_SSD"]=$MODE_UNSPECIFIED +SOT["ct4p:$PD_STANDARD"]=$MODE_UNSPECIFIED + +# --- ct5l --- +SOT["ct5l:$HYPERDISK_BALANCED"]=$MODE_CONF_ONLY +SOT["ct5l:$PD_BALANCED"]=$MODE_UNSPECIFIED +SOT["ct5l:$PD_SSD"]=$MODE_UNSPECIFIED + +# --- ct5lp --- +SOT["ct5lp:$HYPERDISK_BALANCED"]=$MODE_CONF_ONLY +SOT["ct5lp:$HYPERDISK_ML"]=$MODE_NON_CONF_ONLY +SOT["ct5lp:$PD_BALANCED"]=$MODE_UNSPECIFIED +SOT["ct5lp:$PD_SSD"]=$MODE_UNSPECIFIED + +# --- ct5p --- +SOT["ct5p:$HYPERDISK_BALANCED"]=$MODE_CONF_ONLY +SOT["ct5p:$HYPERDISK_ML"]=$MODE_NON_CONF_ONLY +SOT["ct5p:$PD_BALANCED"]=$MODE_UNSPECIFIED +SOT["ct5p:$PD_SSD"]=$MODE_UNSPECIFIED + +# --- ct6e --- +SOT["ct6e:$HYPERDISK_BALANCED"]=$MODE_NON_CONF_ONLY +SOT["ct6e:$HYPERDISK_ML"]=$MODE_NON_CONF_ONLY + +# --- e2 --- +SOT["e2:$PD_BALANCED"]=$MODE_UNSPECIFIED +SOT["e2:$PD_EXTREME"]=$MODE_UNSPECIFIED +SOT["e2:$PD_SSD"]=$MODE_UNSPECIFIED +SOT["e2:$PD_STANDARD"]=$MODE_UNSPECIFIED + +# --- ek --- +SOT["ek:$PD_BALANCED"]=$MODE_UNSPECIFIED +SOT["ek:$PD_SSD"]=$MODE_UNSPECIFIED +SOT["ek:$PD_STANDARD"]=$MODE_UNSPECIFIED +SOT["ek:$PD_EXTREME"]=$MODE_UNSPECIFIED + +# --- g2 --- +SOT["g2:$HYPERDISK_THROUGHPUT"]=$MODE_UNSPECIFIED +SOT["g2:$HYPERDISK_ML"]=$MODE_NON_CONF_ONLY +SOT["g2:$PD_BALANCED"]=$MODE_UNSPECIFIED +SOT["g2:$PD_SSD"]=$MODE_UNSPECIFIED +SOT["g2:$PD_STANDARD"]=$MODE_UNSPECIFIED + +# --- g4 --- +SOT["g4:$HYPERDISK_BALANCED"]=$MODE_UNSPECIFIED +SOT["g4:$HYPERDISK_BALANCED_HA"]=$MODE_UNSPECIFIED +SOT["g4:$HYPERDISK_EXTREME"]=$MODE_UNSPECIFIED +SOT["g4:$HYPERDISK_THROUGHPUT"]=$MODE_UNSPECIFIED +SOT["g4:$HYPERDISK_ML"]=$MODE_UNSPECIFIED + +# --- h3 --- +SOT["h3:$HYPERDISK_BALANCED"]=$MODE_NON_CONF_ONLY +SOT["h3:$HYPERDISK_THROUGHPUT"]=$MODE_UNSPECIFIED +SOT["h3:$PD_BALANCED"]=$MODE_UNSPECIFIED + +# --- h4d --- +SOT["h4d:$HYPERDISK_BALANCED"]=$MODE_NON_CONF_ONLY +SOT["h4d:$HYPERDISK_BALANCED_HA"]=$MODE_NON_CONF_ONLY + +# --- m1 --- +SOT["m1:$HYPERDISK_BALANCED"]=$MODE_NON_CONF_ONLY +SOT["m1:$HYPERDISK_EXTREME"]=$MODE_NON_CONF_ONLY +SOT["m1:$PD_BALANCED"]=$MODE_UNSPECIFIED +SOT["m1:$PD_EXTREME"]=$MODE_UNSPECIFIED +SOT["m1:$PD_SSD"]=$MODE_UNSPECIFIED +SOT["m1:$PD_STANDARD"]=$MODE_UNSPECIFIED + +# --- m2 --- +SOT["m2:$HYPERDISK_BALANCED"]=$MODE_NON_CONF_ONLY +SOT["m2:$HYPERDISK_EXTREME"]=$MODE_NON_CONF_ONLY +SOT["m2:$PD_BALANCED"]=$MODE_UNSPECIFIED +SOT["m2:$PD_EXTREME"]=$MODE_UNSPECIFIED +SOT["m2:$PD_SSD"]=$MODE_UNSPECIFIED +SOT["m2:$PD_STANDARD"]=$MODE_UNSPECIFIED + +# --- m3 --- +SOT["m3:$HYPERDISK_BALANCED"]=$MODE_NON_CONF_ONLY +SOT["m3:$HYPERDISK_EXTREME"]=$MODE_NON_CONF_ONLY +SOT["m3:$HYPERDISK_THROUGHPUT"]=$MODE_NON_CONF_ONLY +SOT["m3:$HYPERDISK_BALANCED_HA"]=$MODE_NON_CONF_ONLY +SOT["m3:$PD_BALANCED"]=$MODE_UNSPECIFIED +SOT["m3:$PD_EXTREME"]=$MODE_UNSPECIFIED +SOT["m3:$PD_SSD"]=$MODE_UNSPECIFIED +SOT["m3:$PD_STANDARD"]=$MODE_UNSPECIFIED + +# --- m4 --- +SOT["m4:$HYPERDISK_BALANCED"]=$MODE_CONF_ONLY +SOT["m4:$HYPERDISK_EXTREME"]=$MODE_NON_CONF_ONLY + +# --- n1 --- +SOT["n1:$PD_BALANCED"]=$MODE_UNSPECIFIED +SOT["n1:$PD_EXTREME"]=$MODE_UNSPECIFIED +SOT["n1:$PD_SSD"]=$MODE_UNSPECIFIED +SOT["n1:$PD_STANDARD"]=$MODE_UNSPECIFIED + +# --- n2 --- +SOT["n2:$HYPERDISK_BALANCED"]=$MODE_CONF_ONLY +SOT["n2:$HYPERDISK_EXTREME"]=$MODE_NON_CONF_ONLY +SOT["n2:$HYPERDISK_ML"]=$MODE_UNSPECIFIED +SOT["n2:$PD_BALANCED"]=$MODE_UNSPECIFIED +SOT["n2:$PD_EXTREME"]=$MODE_UNSPECIFIED +SOT["n2:$PD_SSD"]=$MODE_UNSPECIFIED +SOT["n2:$PD_STANDARD"]=$MODE_UNSPECIFIED + +# --- n2d --- +SOT["n2d:$HYPERDISK_BALANCED"]=$MODE_CONF_ONLY +SOT["n2d:$HYPERDISK_THROUGHPUT"]=$MODE_NON_CONF_ONLY +SOT["n2d:$PD_BALANCED"]=$MODE_UNSPECIFIED +SOT["n2d:$PD_EXTREME"]=$MODE_UNSPECIFIED +SOT["n2d:$PD_SSD"]=$MODE_UNSPECIFIED +SOT["n2d:$PD_STANDARD"]=$MODE_UNSPECIFIED + +# --- n4 --- +SOT["n4:$HYPERDISK_BALANCED"]=$MODE_NON_CONF_ONLY +SOT["n4:$HYPERDISK_THROUGHPUT"]=$MODE_NON_CONF_ONLY +SOT["n4:$HYPERDISK_BALANCED_HA"]=$MODE_NON_CONF_ONLY +SOT["n4:$PD_BALANCED"]=$MODE_UNSPECIFIED +SOT["n4:$PD_SSD"]=$MODE_UNSPECIFIED + +# --- t2a --- +SOT["t2a:$PD_BALANCED"]=$MODE_UNSPECIFIED +SOT["t2a:$PD_SSD"]=$MODE_UNSPECIFIED +SOT["t2a:$PD_STANDARD"]=$MODE_UNSPECIFIED +SOT["t2a:$PD_EXTREME"]=$MODE_UNSPECIFIED + +# --- t2d --- +SOT["t2d:$HYPERDISK_THROUGHPUT"]=$MODE_NON_CONF_ONLY +SOT["t2d:$PD_BALANCED"]=$MODE_UNSPECIFIED +SOT["t2d:$PD_SSD"]=$MODE_UNSPECIFIED +SOT["t2d:$PD_STANDARD"]=$MODE_UNSPECIFIED + +# --- tpu7x --- +SOT["tpu7x:$HYPERDISK_BALANCED"]=$MODE_NON_CONF_ONLY +SOT["tpu7x:$HYPERDISK_EXTREME"]=$MODE_NON_CONF_ONLY +SOT["tpu7x:$HYPERDISK_THROUGHPUT"]=$MODE_UNSPECIFIED +SOT["tpu7x:$HYPERDISK_ML"]=$MODE_UNSPECIFIED + +# --- z3 --- +SOT["z3:$HYPERDISK_EXTREME"]=$MODE_NON_CONF_ONLY +SOT["z3:$HYPERDISK_THROUGHPUT"]=$MODE_UNSPECIFIED +SOT["z3:$HYPERDISK_BALANCED"]=$MODE_NON_CONF_ONLY +SOT["z3:$HYPERDISK_BALANCED_HA"]=$MODE_NON_CONF_ONLY +SOT["z3:$PD_BALANCED"]=$MODE_UNSPECIFIED +SOT["z3:$PD_SSD"]=$MODE_UNSPECIFIED + +# ========================================== +# 4. Logic Function +# ========================================== + +# Usage: list_possible_attached_disks +list_possible_attached_disks() { + local family="$1" + local is_confidential="$2" + local family_found=false + local supported_disks=() + + # Iterate through all keys in SOT to find matches for the family. + # (Bash does not support direct nested map lookups nicely, so we filter keys) + for key in "${!SOT[@]}"; do + # Check if key starts with "family:" + if [[ "$key" == "$family":* ]]; then + family_found=true + + # Extract disk type and mode + local disk_type="${key#*:}" + local mode="${SOT[$key]}" + + # Logic: Filter based on confidentiality + if [[ "$mode" == "$MODE_NON_CONF_ONLY" && "$is_confidential" == "true" ]]; then + continue + elif [[ "$mode" == "$MODE_CONF_ONLY" && "$is_confidential" == "false" ]]; then + continue + else + supported_disks+=("$disk_type") + fi + fi + done + + if [[ "$family_found" == "false" ]]; then + echo "Error: family '$family' not found in SOT" >&2 + return 1 + fi + + # Output the list + echo "${supported_disks[@]}" +} + +# ========================================== +# 5. Main Execution +# ========================================== + +FAMILY_ARG="${MACHINE_TYPE%%-*}" +RESULT=$(list_possible_attached_disks "$FAMILY_ARG" "$IS_CONFIDENTIAL") + +if [[ $? -eq 0 ]]; then + for disk in $RESULT; do + echo "disk-type.gke.io/$disk=\"true\"" + done +else + # The error message is already printed to stderr by the function + exit 1 +fi \ No newline at end of file diff --git a/deploy/kubernetes/base/controller/controller.yaml b/deploy/kubernetes/base/controller/controller.yaml index 6048d7b1e..6d123116b 100644 --- a/deploy/kubernetes/base/controller/controller.yaml +++ b/deploy/kubernetes/base/controller/controller.yaml @@ -144,7 +144,6 @@ spec: - "--supports-dynamic-throughput-provisioning=hyperdisk-balanced,hyperdisk-throughput,hyperdisk-ml" - --enable-data-cache - --run-node-service=false - - --enable-multitenancy command: - /gce-pd-csi-driver env: diff --git a/deploy/kubernetes/base/node_linux/node.yaml b/deploy/kubernetes/base/node_linux/node.yaml index ef9e89bcf..7323c3739 100644 --- a/deploy/kubernetes/base/node_linux/node.yaml +++ b/deploy/kubernetes/base/node_linux/node.yaml @@ -47,7 +47,6 @@ spec: - "--endpoint=unix:/csi/csi.sock" - "--run-controller-service=false" - "--enable-data-cache" - - "--enable-multitenancy" - "--node-name=$(KUBE_NODE_NAME)" securityContext: privileged: true @@ -57,8 +56,11 @@ spec: fieldRef: fieldPath: spec.nodeName volumeMounts: - - name: kubelet-dir - mountPath: /var/lib/kubelet + - name: kubelet-plugin-dir + mountPath: /var/lib/kubelet/plugins/kubernetes.io/csi + mountPropagation: "Bidirectional" + - name: kubelet-pods + mountPath: /var/lib/kubelet/pods mountPropagation: "Bidirectional" - name: plugin-dir mountPath: /csi @@ -82,10 +84,13 @@ spec: hostPath: path: /var/lib/kubelet/plugins_registry/ type: Directory - - name: kubelet-dir + - name: kubelet-pods hostPath: - path: /var/lib/kubelet - type: Directory + path: /var/lib/kubelet/pods + - name: kubelet-plugin-dir + hostPath: + path: /var/lib/kubelet/plugins/kubernetes.io/csi + type: DirectoryOrCreate - name: plugin-dir hostPath: path: /var/lib/kubelet/plugins/pd.csi.storage.gke.io/ diff --git a/deploy/kubernetes/base/node_windows/node.yaml b/deploy/kubernetes/base/node_windows/node.yaml index 96ca272a7..0cb5be3a9 100644 --- a/deploy/kubernetes/base/node_windows/node.yaml +++ b/deploy/kubernetes/base/node_windows/node.yaml @@ -50,8 +50,11 @@ spec: command: - /gce-pd-csi-driver volumeMounts: - - name: kubelet-dir - mountPath: C:\var\lib\kubelet + - name: kubelet-plugin-dir + mountPath: C:\var\lib\kubelet\plugins\kubernetes.io\csi + mountPropagation: "None" + - name: kubelet-pods + mountPath: C:\var\lib\kubelet\pods mountPropagation: "None" - name: plugin-dir mountPath: C:\csi @@ -100,10 +103,13 @@ spec: hostPath: path: \var\lib\kubelet\plugins_registry type: Directory - - name: kubelet-dir + - name: kubelet-pods hostPath: - path: \var\lib\kubelet - type: Directory + path: \var\lib\kubelet\pods + - name: kubelet-plugin-dir + hostPath: + path: \var\lib\kubelet\plugins\kubernetes.io\csi + type: DirectoryOrCreate - name: plugin-dir hostPath: path: \var\lib\kubelet\plugins\pd.csi.storage.gke.io diff --git a/deploy/kubernetes/deploy-driver.sh b/deploy/kubernetes/deploy-driver.sh index 3c4a893cd..da231a0a0 100755 --- a/deploy/kubernetes/deploy-driver.sh +++ b/deploy/kubernetes/deploy-driver.sh @@ -12,6 +12,9 @@ # by setup-project.sh). Ignored if GCE_PD_DRIVER_VERSION == noauth. # GCE_PD_DRIVER_VERSION: The kustomize overlay to deploy. See # `deploy/kubernetes/overlays` for your choices. +# NODE_SERVICE_ACCOUNTS: (Optional) Comma-separated list of service accounts +# that the CSI driver should be allowed to impersonate. If not specified, +# defaults to project-level serviceAccountUser role. set -o nounset set -o errexit @@ -65,6 +68,23 @@ function check_service_account() MISSING_ROLES=true fi done + + # Check each node service account for serviceAccountUser role + if use_scoped_sa_role; + then + IFS=',' read -ra NODE_SA_ARRAY <<< "${NODE_SERVICE_ACCOUNTS}" + for node_sa in "${NODE_SA_ARRAY[@]}"; + do + node_sa=$(echo "${node_sa}" | xargs) # trim whitespace + SA_POLICY=$(gcloud iam service-accounts get-iam-policy "${node_sa}" --project="${PROJECT}" --flatten="bindings[].members" --format='table(bindings.role)' --filter="bindings.members:${IAM_NAME}") + if ! grep -q "${SA_USER_ROLE}" <<< "${SA_POLICY}"; + then + echo "Missing ${SA_USER_ROLE} for: ${node_sa}" + MISSING_ROLES=true + fi + done + fi + if [ "${MISSING_ROLES}" = true ]; then echo "Cannot deploy with missing roles in service account, please run setup-project.sh to setup Service Account" diff --git a/deploy/kubernetes/overlays/node-labeler/configmap.yaml b/deploy/kubernetes/overlays/node-labeler/configmap.yaml new file mode 100644 index 000000000..ebe1c7c4e --- /dev/null +++ b/deploy/kubernetes/overlays/node-labeler/configmap.yaml @@ -0,0 +1,258 @@ + +apiVersion: v1 +kind: ConfigMap +metadata: + name: machine-pd-compatibility + namespace: gce-pd-csi-driver +data: + machine-pd-compatibility.json: |- + { + "a2": { + "hyperdisk-balanced": true, + "hyperdisk-ml": true, + "pd-balanced": true, + "pd-extreme": true, + "pd-ssd": true, + "pd-standard": true + }, + "a3": { + "hyperdisk-balanced": true, + "hyperdisk-balanced-high-availability": true, + "hyperdisk-extreme": true, + "hyperdisk-ml": true, + "hyperdisk-throughput": true, + "pd-balanced": true, + "pd-ssd": true + }, + "a4": { + "hyperdisk-balanced": true, + "hyperdisk-extreme": true, + "hyperdisk-ml": true + }, + "a4x": { + "hyperdisk-balanced": true, + "hyperdisk-balanced-high-availability": true, + "hyperdisk-extreme": true, + "hyperdisk-ml": true, + "hyperdisk-throughput": true + }, + "c2": { + "pd-balanced": true, + "pd-extreme": true, + "pd-ssd": true, + "pd-standard": true + }, + "c2d": { + "pd-balanced": true, + "pd-extreme": true, + "pd-ssd": true, + "pd-standard": true + }, + "c3": { + "hyperdisk-balanced": true, + "hyperdisk-balanced-high-availability": true, + "hyperdisk-extreme": true, + "hyperdisk-ml": true, + "hyperdisk-throughput": true, + "pd-balanced": true, + "pd-extreme": true, + "pd-ssd": true + }, + "c3d": { + "hyperdisk-balanced": true, + "hyperdisk-balanced-high-availability": true, + "hyperdisk-extreme": true, + "hyperdisk-ml": true, + "hyperdisk-throughput": true, + "pd-balanced": true, + "pd-ssd": true + }, + "c4": { + "hyperdisk-balanced": true, + "hyperdisk-balanced-high-availability": true, + "hyperdisk-extreme": true, + "hyperdisk-throughput": true + }, + "c4a": { + "hyperdisk-balanced": true, + "hyperdisk-balanced-high-availability": true, + "hyperdisk-extreme": true, + "hyperdisk-ml": true, + "hyperdisk-throughput": true, + "pd-balanced": true, + "pd-ssd": true + }, + "c4d": { + "hyperdisk-balanced": true, + "hyperdisk-balanced-high-availability": true, + "hyperdisk-extreme": true, + "hyperdisk-throughput": true + }, + "ct3": { + "pd-balanced": true, + "pd-ssd": true, + "pd-standard": true + }, + "ct3p": { + "pd-balanced": true, + "pd-ssd": true, + "pd-standard": true + }, + "ct4p": { + "hyperdisk-balanced": true, + "pd-balanced": true, + "pd-extreme": true, + "pd-ssd": true, + "pd-standard": true + }, + "ct5l": { + "hyperdisk-balanced": true, + "pd-balanced": true, + "pd-ssd": true + }, + "ct5lp": { + "hyperdisk-balanced": true, + "hyperdisk-ml": true, + "pd-balanced": true, + "pd-ssd": true + }, + "ct5p": { + "hyperdisk-balanced": true, + "hyperdisk-ml": true, + "pd-balanced": true, + "pd-ssd": true + }, + "ct6e": { + "hyperdisk-balanced": true, + "hyperdisk-ml": true + }, + "e2": { + "pd-balanced": true, + "pd-extreme": true, + "pd-ssd": true, + "pd-standard": true + }, + "g2": { + "hyperdisk-ml": true, + "hyperdisk-throughput": true, + "pd-balanced": true, + "pd-ssd": true, + "pd-standard": true + }, + "g4": { + "hyperdisk-balanced": true, + "hyperdisk-balanced-high-availability": true, + "hyperdisk-extreme": true, + "hyperdisk-ml": true, + "hyperdisk-throughput": true + }, + "h3": { + "hyperdisk-balanced": true, + "hyperdisk-throughput": true, + "pd-balanced": true + }, + "h4d": { + "hyperdisk-balanced": true, + "hyperdisk-balanced-high-availability": true + }, + "m1": { + "hyperdisk-balanced": true, + "hyperdisk-extreme": true, + "pd-balanced": true, + "pd-extreme": true, + "pd-ssd": true, + "pd-standard": true + }, + "m2": { + "hyperdisk-balanced": true, + "hyperdisk-extreme": true, + "pd-balanced": true, + "pd-extreme": true, + "pd-ssd": true, + "pd-standard": true + }, + "m3": { + "hyperdisk-balanced": true, + "hyperdisk-balanced-high-availability": true, + "hyperdisk-extreme": true, + "hyperdisk-throughput": true, + "pd-balanced": true, + "pd-extreme": true, + "pd-ssd": true, + "pd-standard": true + }, + "m4": { + "hyperdisk-balanced": true, + "hyperdisk-extreme": true + }, + "n1": { + "pd-balanced": true, + "pd-extreme": true, + "pd-ssd": true, + "pd-standard": true + }, + "n2": { + "hyperdisk-balanced": true, + "hyperdisk-extreme": true, + "hyperdisk-throughput": true, + "pd-balanced": true, + "pd-extreme": true, + "pd-ssd": true, + "pd-standard": true + }, + "n2d": { + "hyperdisk-throughput": true, + "pd-balanced": true, + "pd-extreme": true, + "pd-ssd": true, + "pd-standard": true + }, + "n4": { + "hyperdisk-balanced": true, + "hyperdisk-balanced-high-availability": true, + "hyperdisk-throughput": true, + "pd-balanced": true, + "pd-ssd": true + }, + "n4a": { + "hyperdisk-balanced": true, + "hyperdisk-balanced-high-availability": true, + "hyperdisk-ml": true, + "hyperdisk-throughput": true + }, + "n4d": { + "hyperdisk-balanced": true, + "hyperdisk-balanced-high-availability": true, + "hyperdisk-throughput": true + }, + "t2a": { + "pd-balanced": true, + "pd-extreme": true, + "pd-ssd": true, + "pd-standard": true + }, + "t2d": { + "hyperdisk-throughput": true, + "pd-balanced": true, + "pd-ssd": true, + "pd-standard": true + }, + "tpu7x": { + "hyperdisk-balanced": true, + "hyperdisk-extreme": true, + "hyperdisk-ml": true, + "hyperdisk-throughput": true + }, + "x4": { + "hyperdisk-balanced": true, + "hyperdisk-extreme": true + }, + "z3": { + "hyperdisk-balanced": true, + "hyperdisk-balanced-high-availability": true, + "hyperdisk-extreme": true, + "hyperdisk-throughput": true, + "pd-balanced": true, + "pd-ssd": true + } + } diff --git a/deploy/kubernetes/overlays/node-labeler/image.yaml b/deploy/kubernetes/overlays/node-labeler/image.yaml new file mode 100644 index 000000000..f4a2f2577 --- /dev/null +++ b/deploy/kubernetes/overlays/node-labeler/image.yaml @@ -0,0 +1,9 @@ +apiVersion: builtin +kind: ImageTagTransformer +metadata: + name: imagetag-gce-pd-node-labeler +imageTag: + name: cloud-provider-gcp/gce-pd-node-labeler + # TODO: Update this to the correct image tag when available. + newName: registry.k8s.io/cloud-provider-gcp/gce-pd-node-labeler + newTag: "v0.1.0" diff --git a/deploy/kubernetes/overlays/node-labeler/kustomization.yaml b/deploy/kubernetes/overlays/node-labeler/kustomization.yaml new file mode 100644 index 000000000..b21e56a76 --- /dev/null +++ b/deploy/kubernetes/overlays/node-labeler/kustomization.yaml @@ -0,0 +1,8 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +resources: +- configmap.yaml +- rbac.yaml +- image.yaml +patchesStrategicMerge: +- patch.yaml diff --git a/deploy/kubernetes/overlays/node-labeler/patch.yaml b/deploy/kubernetes/overlays/node-labeler/patch.yaml new file mode 100644 index 000000000..c962c00c4 --- /dev/null +++ b/deploy/kubernetes/overlays/node-labeler/patch.yaml @@ -0,0 +1,34 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: csi-gce-pd-controller +spec: + template: + spec: + containers: + - name: gce-pd-node-labeler + image: cloud-provider-gcp/gce-pd-node-labeler + args: + - "--v=5" + - "--configmap-name=machine-pd-compatibility" + - "--configmap-namespace=gce-pd-csi-driver" + - "--http-endpoint=:22015" + ports: + - containerPort: 22015 + name: http-endpoint + protocol: TCP + livenessProbe: + failureThreshold: 1 + httpGet: + path: /healthz/node-labeler + port: http-endpoint + initialDelaySeconds: 10 + timeoutSeconds: 10 + periodSeconds: 20 + resources: + requests: + cpu: 20m + memory: 50Mi + limits: + cpu: 50m + memory: 100Mi diff --git a/deploy/kubernetes/overlays/node-labeler/rbac.yaml b/deploy/kubernetes/overlays/node-labeler/rbac.yaml new file mode 100644 index 000000000..7c022ae20 --- /dev/null +++ b/deploy/kubernetes/overlays/node-labeler/rbac.yaml @@ -0,0 +1,45 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: gce-pd-node-labeler-role + namespace: gce-pd-csi-driver +rules: +- apiGroups: [""] + resources: ["configmaps"] + verbs: ["get", "list", "watch"] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: gce-pd-node-labeler-binding + namespace: gce-pd-csi-driver +subjects: +- kind: ServiceAccount + name: csi-gce-pd-controller-sa + namespace: gce-pd-csi-driver +roleRef: + kind: Role + name: gce-pd-node-labeler-role + apiGroup: rbac.authorization.k8s.io +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: gce-pd-node-labeler-clusterrole +rules: +- apiGroups: [""] + resources: ["nodes"] + verbs: ["get", "list", "watch", "patch"] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: gce-pd-node-labeler-clusterrolebinding +subjects: +- kind: ServiceAccount + name: csi-gce-pd-controller-sa + namespace: gce-pd-csi-driver +roleRef: + kind: ClusterRole + name: gce-pd-node-labeler-clusterrole + apiGroup: rbac.authorization.k8s.io diff --git a/deploy/setup-project.sh b/deploy/setup-project.sh index c992dc1d1..dd1e87e37 100755 --- a/deploy/setup-project.sh +++ b/deploy/setup-project.sh @@ -17,6 +17,9 @@ # ENABLE_KMS_ADMIN: Add service account permissions to destroy Cloud KMS keys. # CREATE_SA_KEY: (Optional) If true, creates a new service account key and # exports it if creating a new service account +# NODE_SERVICE_ACCOUNTS: (Optional) Comma-separated list of service accounts +# that the CSI driver should be allowed to impersonate. If not specified, +# defaults to project-level serviceAccountUser role. set -o nounset set -o errexit @@ -102,22 +105,36 @@ gcloud iam roles $action gcp_compute_persistent_disk_csi_driver_custom_role --qu # Bind service account to roles for role in ${BIND_ROLES} do - gcloud projects add-iam-policy-binding "${PROJECT}" --member serviceAccount:"${IAM_NAME}" --role "${role}" + gcloud projects add-iam-policy-binding "${PROJECT}" --member serviceAccount:"${IAM_NAME}" --role "${role}" --condition=None done +# Grant scoped serviceAccountUser role for node service accounts +if use_scoped_sa_role; +then + IFS=',' read -ra NODE_SA_ARRAY <<< "${NODE_SERVICE_ACCOUNTS}" + for node_sa in "${NODE_SA_ARRAY[@]}"; + do + node_sa=$(echo "${node_sa}" | xargs) # trim whitespace + echo "Granting ${SA_USER_ROLE} for ${node_sa} to serviceAccount:${IAM_NAME}" + gcloud iam service-accounts add-iam-policy-binding "${node_sa}" \ + --member="serviceAccount:${IAM_NAME}" --condition=None \ + --role="${SA_USER_ROLE}" --project="${PROJECT}" + done +fi + # Authorize GCE to encrypt/decrypt using Cloud KMS encryption keys. # https://cloud.google.com/compute/docs/disks/customer-managed-encryption#before_you_begin if [ "${ENABLE_KMS}" = true ]; then gcloud services enable cloudkms.googleapis.com --project="${PROJECT}" - gcloud projects add-iam-policy-binding "${PROJECT}" --member serviceAccount:"service-${PROJECT_NUMBER}@compute-system.iam.gserviceaccount.com" --role "roles/cloudkms.cryptoKeyEncrypterDecrypter" + gcloud projects add-iam-policy-binding "${PROJECT}" --member serviceAccount:"service-${PROJECT_NUMBER}@compute-system.iam.gserviceaccount.com" --role "roles/cloudkms.cryptoKeyEncrypterDecrypter" --condition=None fi # Authorize SA to destroy Cloud KMS encryption keys. if [ "${ENABLE_KMS_ADMIN}" = true ]; then gcloud services enable cloudkms.googleapis.com --project="${PROJECT}" - gcloud projects add-iam-policy-binding "${PROJECT}" --member serviceAccount:"${IAM_NAME}" --role "roles/cloudkms.admin" + gcloud projects add-iam-policy-binding "${PROJECT}" --member serviceAccount:"${IAM_NAME}" --role "roles/cloudkms.admin" --condition=None fi # Export key if needed diff --git a/docs/kubernetes/user-guides/driver-install.md b/docs/kubernetes/user-guides/driver-install.md index 727a9787b..40884c48c 100644 --- a/docs/kubernetes/user-guides/driver-install.md +++ b/docs/kubernetes/user-guides/driver-install.md @@ -2,13 +2,13 @@ ## Install Driver -1. Clone the driver to your local machine +### 1. Clone the driver to your local machine ```console $ git clone https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver $GOPATH/src/sigs.k8s.io/gcp-compute-persistent-disk-csi-driver ``` -2. [One-time per project] Set up or use an existing service account: +### 2. [One-time per project] Set up or use an existing service account: The driver requires a service account that has the following permissions and roles to function properly: @@ -18,7 +18,7 @@ compute.instances.get compute.instances.attachDisk compute.instances.detachDisk roles/compute.storageAdmin -roles/iam.serviceAccountUser +roles/iam.serviceAccountUser (see security note below) ``` If there is a pre-existing service account with these roles for use then the @@ -33,7 +33,24 @@ $ GCE_PD_SA_DIR=/my/safe/credentials/directory **Note**: The service account key *must* be named `cloud-sa.json` at driver deploy time However, if there is no pre-existing service account for use the provided script -can be used to create a new service account with all the required permissions: +can be used to create a new service account with all the required permissions. + +#### Security Note: Service Account Impersonation + +The CSI driver requires the `roles/iam.serviceAccountUser` role to impersonate node service accounts when attaching and detaching disks. This role can be configured in two ways: + +* **Recommended (Scoped)**: Grant the role only for specific node service accounts +* **Default (Project-wide)**: Allow project-wide service account impersonation (less secure) + +For improved security, specify the node service accounts that the CSI driver needs to impersonate using the `NODE_SERVICE_ACCOUNTS` environment variable. This limits the role to only the specified accounts. Without `NODE_SERVICE_ACCOUNTS`, the CSI driver can impersonate any service account in the project. + +```console +$ NODE_SERVICE_ACCOUNTS="master-sa@project.iam.gserviceaccount.com,worker-sa@project.iam.gserviceaccount.com" # Comma-separated list of node service accounts +``` + +For more details, see [How to remediate over privileged service account users](https://cloud.google.com/security-command-center/docs/how-to-remediate-security-health-analytics-findings#over_privileged_service_account_user). + +#### Create service account for the CSI driver ```console $ PROJECT=your-project-here # GCP project @@ -46,9 +63,10 @@ $ ./deploy/setup-project.sh deployment, all actions performed by the driver will be performed as the specified service account -3. Deploy driver to Kubernetes Cluster +### 3. Deploy driver to Kubernetes Cluster ```console +$ NODE_SERVICE_ACCOUNTS="master-sa@project.iam.gserviceaccount.com,worker-sa@project.iam.gserviceaccount.com" # Same as the setup-project.sh step $ GCE_PD_SA_DIR=/my/safe/credentials/directory # Directory to get the service account key $ GCE_PD_DRIVER_VERSION=stable-master # Driver version to deploy $ ./deploy/kubernetes/deploy-driver.sh @@ -74,6 +92,8 @@ additional permissions are required in order to create the new service account: ``` resourcemanager.projects.getIamPolicy resourcemanager.projects.setIamPolicy +iam.serviceAccounts.getIamPolicy +iam.serviceAccounts.setIamPolicy iam.serviceAccounts.create iam.serviceAccounts.delete ``` diff --git a/docs/kubernetes/user-guides/dynamic-volumes.md b/docs/kubernetes/user-guides/dynamic-volumes.md new file mode 100644 index 000000000..9d4f9518b --- /dev/null +++ b/docs/kubernetes/user-guides/dynamic-volumes.md @@ -0,0 +1,65 @@ +# Dynamic Volumes User Guide + +Dynamic Volumes allow GKE storage definitions to adapt seamlessly across different machine type generations. This feature enables you to define a single disk configuration that dynamically selects the appropriate disk type based on node availability and machine type compatibility. This is essential for clusters that mix VM generations (e.g., N2, N3, and N4 VMs) where disk support varies. + +> **Important:** Support for GKE Standard and Autopilot clusters is planned for Q1 2026. It is available for [`manual deployments`](./driver-install.md) of the GCE PD CSI Driver. See details below on how to enable and use this feature. + +--- + +## Enabling Dynamic Volumes + +To use Dynamic Volumes, you must enable the feature flag on the driver and ensure your nodes are properly labeled. + +> **Note:** Dynamic Volumes are only available in driver version [v1.23.0+](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/releases/tag/v1.23.0). + +### 1. Update Command Line Flags +You must add the `--dynamic-volumes=true` flag to both the PD CSI **Controller** and **Node** instances. + +In addition to the feature flag, it is highly recommended to add the `--disk-topology=true` flag to the PD CSI **Controller** to ensure the scheduler respects disk type constraints. + +### 2. Apply Disk Support Labels +For the PD CSI driver to accurately determine the appropriate disk type for a node, you must apply support labels to every Node object in the cluster. + +The label format is: `"disk-type.gke.io/{DISK_TYPE}": "true"`. For example, a Node that supports hyperdisk-balanced should have the following label: `"disk-type.gke.io/hyperdisk-balanced": "true"`. + +> **Tip:** You can use the helper script located at [`deploy/disk_type_labels.sh`](../../../deploy/disk_type_labels.sh) to generate the correct labels for a specific machine type. + +> **Recommendation**: Use these labels with the `disk-topology` feature enabled and [use-allowed-disk-topology](https://docs.cloud.google.com/kubernetes-engine/docs/concepts/hyperdisk#supported_node_scheduling) parameter to improve stateful workload placement. + +--- + +## Provisioning Dynamic Volumes + +To provision a volume using this feature, create a `StorageClass` with the parameter `type: dynamic`. You can further configure the disk type selection with the parameters described below. + +### Dynamic StorageClass Parameters + +| Parameter | Description | Default | +| :--- | :--- | :--- | +| `type` | Set to `dynamic` to enable the feature. | N/A | +| `use-allowed-disk-topology` | (Recommended) If `true`, schedules pods only on nodes that support the provisioned disk type. See [Apply Support Labels](#applying-disk-support-labels) for more information. | `false` | +| `pd-type` | (Optional) The specific PD disk type to use. | `pd-balanced` | +| `hyperdisk-type` | (Optional) The specific Hyperdisk type to use. | `hyperdisk-balanced` | +| `disk-type-preference`| (Optional) Overrides the default preference for `hyperdisk-type` when a node supports both options. | `hyperdisk-type` | + +> **Note:** Parameters not applicable to the selected disk type will be ignored during provisioning. + +### Example Configuration + +Below is a `StorageClass` configured for dynamic volumes. It attempts to use Hyperdisk Balanced where available, falling back to PD Balanced otherwise. + +```yaml +apiVersion: storage.k8s.io/v1 +kind: StorageClass +metadata: + name: dynamic-volume +provisioner: pd.csi.storage.gke.io +volumeBindingMode: WaitForFirstConsumer +allowVolumeExpansion: true +parameters: + type: dynamic + pd-type: pd-balanced + hyperdisk-type: hyperdisk-balanced + use-allowed-disk-topology: "true" + provisioned-throughput-on-create: "250Mi" + provisioned-iops-on-create: "3000" \ No newline at end of file diff --git a/go.mod b/go.mod index 9f2230a5d..a3dfbf1ae 100644 --- a/go.mod +++ b/go.mod @@ -1,46 +1,45 @@ module sigs.k8s.io/gcp-compute-persistent-disk-csi-driver -go 1.24.0 - -toolchain go1.24.1 +go 1.25.0 require ( cloud.google.com/go/compute/metadata v0.6.0 cloud.google.com/go/kms v1.18.0 cloud.google.com/go/resourcemanager v1.9.7 github.com/GoogleCloudPlatform/k8s-cloud-provider v1.33.0 - github.com/container-storage-interface/spec v1.11.0 + github.com/container-storage-interface/spec v1.12.0 github.com/fsnotify/fsnotify v1.9.0 github.com/google/go-cmp v0.7.0 github.com/google/uuid v1.6.0 github.com/googleapis/gax-go/v2 v2.12.5 github.com/hashicorp/golang-lru/v2 v2.0.7 - github.com/kubernetes-csi/csi-proxy/client v1.2.1 - github.com/kubernetes-csi/csi-test/v5 v5.3.1 - github.com/onsi/ginkgo/v2 v2.22.2 - github.com/onsi/gomega v1.36.2 + github.com/kubernetes-csi/csi-proxy/client v1.3.0 + github.com/kubernetes-csi/csi-test/v5 v5.4.0 + github.com/onsi/ginkgo/v2 v2.27.4 + github.com/onsi/gomega v1.39.0 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 - go.opentelemetry.io/otel v1.35.0 + go.opentelemetry.io/otel v1.36.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.35.0 - go.opentelemetry.io/otel/sdk v1.35.0 - golang.org/x/oauth2 v0.30.0 - golang.org/x/sys v0.35.0 - golang.org/x/time v0.12.0 + go.opentelemetry.io/otel/sdk v1.36.0 + golang.org/x/oauth2 v0.33.0 + golang.org/x/sys v0.38.0 + golang.org/x/time v0.14.0 google.golang.org/api v0.187.0 google.golang.org/genproto v0.0.0-20240624140628-dc46fd24d27d - google.golang.org/grpc v1.71.0 - google.golang.org/protobuf v1.36.6 + google.golang.org/grpc v1.72.2 + google.golang.org/protobuf v1.36.8 gopkg.in/gcfg.v1 v1.2.3 - k8s.io/api v0.33.3 - k8s.io/apimachinery v0.33.3 - k8s.io/client-go v11.0.1-0.20190805182717-6502b5e7b1b5+incompatible - k8s.io/cloud-provider v0.33.3 - k8s.io/component-base v0.33.3 + k8s.io/api v0.35.1 + k8s.io/apimachinery v0.35.1 + k8s.io/client-go v0.35.1 + k8s.io/cloud-provider v0.35.1 + k8s.io/component-base v0.35.1 k8s.io/klog/v2 v2.130.1 - k8s.io/mount-utils v0.33.3 - k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 - sigs.k8s.io/boskos v0.0.0-20220711194915-6cb8a6fb2dd1 + k8s.io/mount-utils v0.35.1 + k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 + sigs.k8s.io/boskos v0.0.0-20250908171729-5e4ab7284e90 + sigs.k8s.io/controller-runtime v0.23.1 sigs.k8s.io/yaml v1.6.0 ) @@ -50,73 +49,89 @@ require ( cloud.google.com/go/auth/oauth2adapt v0.2.2 // indirect cloud.google.com/go/iam v1.1.8 // indirect cloud.google.com/go/longrunning v0.5.7 // indirect + github.com/Masterminds/semver/v3 v3.4.0 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect + github.com/bombsimon/logrusr/v4 v4.1.0 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/emicklei/go-restful/v3 v3.12.2 // indirect + github.com/evanphx/json-patch/v5 v5.9.11 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fxamacker/cbor/v2 v2.8.0 // indirect - github.com/go-logr/logr v1.4.2 // indirect + github.com/fxamacker/cbor/v2 v2.9.0 // indirect + github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/jsonpointer v0.21.1 // indirect github.com/go-openapi/jsonreference v0.21.0 // indirect github.com/go-openapi/swag v0.23.1 // indirect github.com/go-task/slim-sprig/v3 v3.0.0 // indirect - github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/mock v1.6.0 // indirect + github.com/golang/mock v1.7.0-rc.1 // indirect github.com/golang/protobuf v1.5.4 // indirect - github.com/google/gnostic-models v0.6.9 // indirect - github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad // indirect + github.com/google/btree v1.1.3 // indirect + github.com/google/gnostic-models v0.7.0 // indirect + github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 // indirect github.com/google/s2a-go v0.1.9 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/mailru/easyjson v0.9.0 // indirect + github.com/magiconair/properties v1.8.5 // indirect + github.com/mailru/easyjson v0.9.1 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/moby/sys/mountinfo v0.7.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/pelletier/go-toml v1.9.3 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/prometheus/client_golang v1.22.0 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/prometheus/client_golang v1.23.2 // indirect github.com/prometheus/client_model v0.6.2 // indirect - github.com/prometheus/common v0.62.0 // indirect + github.com/prometheus/common v0.66.1 // indirect github.com/prometheus/procfs v0.16.1 // indirect github.com/sirupsen/logrus v1.9.3 // indirect - github.com/spf13/pflag v1.0.6 // indirect + github.com/spf13/afero v1.6.0 // indirect + github.com/spf13/cast v1.3.1 // indirect + github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/spf13/pflag v1.0.9 // indirect + github.com/spf13/viper v1.8.1 // indirect + github.com/subosito/gotenv v1.2.0 // indirect github.com/x448/float16 v0.8.4 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 // indirect - go.opentelemetry.io/otel/metric v1.35.0 // indirect - go.opentelemetry.io/otel/trace v1.35.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 // indirect + go.opentelemetry.io/otel/metric v1.36.0 // indirect + go.opentelemetry.io/otel/trace v1.36.0 // indirect go.opentelemetry.io/proto/otlp v1.5.0 // indirect - go.yaml.in/yaml/v2 v2.4.2 // indirect + go.yaml.in/yaml/v2 v2.4.3 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect go4.org v0.0.0-20201209231011-d4a079459e60 // indirect - golang.org/x/crypto v0.41.0 // indirect - golang.org/x/net v0.42.0 // indirect - golang.org/x/sync v0.16.0 // indirect - golang.org/x/term v0.34.0 // indirect - golang.org/x/text v0.28.0 // indirect - golang.org/x/tools v0.35.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20250218202821-56aae31c358a // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250218202821-56aae31c358a // indirect - gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect + golang.org/x/crypto v0.45.0 // indirect + golang.org/x/mod v0.30.0 // indirect + golang.org/x/net v0.47.0 // indirect + golang.org/x/sync v0.18.0 // indirect + golang.org/x/term v0.37.0 // indirect + golang.org/x/text v0.31.0 // indirect + golang.org/x/tools v0.39.0 // indirect + gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250528174236-200df99c418a // indirect + gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/ini.v1 v1.67.1 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff // indirect - k8s.io/test-infra v0.0.0-20210730160938-8ad9b8c53bd8 // indirect - sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect + k8s.io/apiextensions-apiserver v0.35.1 // indirect + k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912 // indirect + sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect + sigs.k8s.io/prow v0.0.0-20240619181241-cfb8754e0459 // indirect sigs.k8s.io/randfill v1.0.0 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.7.0 // indirect + sigs.k8s.io/structured-merge-diff/v6 v6.3.2 // indirect ) - -replace k8s.io/client-go => k8s.io/client-go v0.32.2 diff --git a/go.sum b/go.sum index 0f0f5c955..cd429b5d7 100644 --- a/go.sum +++ b/go.sum @@ -1,30 +1,18 @@ -bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= -bazil.org/fuse v0.0.0-20180421153158-65cc252bf669/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= -cloud.google.com/go v0.25.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.30.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.39.0/go.mod h1:rVLT6fkc8chs9sfPtFc1SBH6em7n+ZoXaG+87tDISts= -cloud.google.com/go v0.40.0/go.mod h1:Tk58MuI9rbLMKlAjeO/bDnteAx7tX2gJIXw4T5Jwlro= -cloud.google.com/go v0.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.47.0/go.mod h1:5p3Ky/7f3N10VBkhuR5LFtddroTiMyjZV/Kj5qOQFxU= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.55.0/go.mod h1:ZHmoY+/lIMNkN2+fBmuTiqZ4inFhvQad8ft7MT8IV5Y= cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.60.0/go.mod h1:yw2G51M9IfRboUH61Us8GqCeF1PzPblB823Mn2q2eAU= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.66.0/go.mod h1:dgqGAjKCDxyhGTtC9dAREQGUJpkceNm1yt590Qno0Ko= cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= @@ -42,7 +30,6 @@ cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvf cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/compute/metadata v0.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I= cloud.google.com/go/compute/metadata v0.6.0/go.mod h1:FjyFAW1MW0C203CEOMDTu3Dk1FlqW3Rga40jzHL4hfg= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= @@ -52,357 +39,63 @@ cloud.google.com/go/iam v1.1.8 h1:r7umDwhj+BQyz0ScZMp4QrGXjSTI3ZINnpgU2nlB/K0= cloud.google.com/go/iam v1.1.8/go.mod h1:GvE6lyMmfxXauzNq8NbgJbeVQNspG+tcdL/W8QO1+zE= cloud.google.com/go/kms v1.18.0 h1:pqNdaVmZJFP+i8OVLocjfpdTWETTYa20FWOegSCdrRo= cloud.google.com/go/kms v1.18.0/go.mod h1:DyRBeWD/pYBMeyiaXFa/DGNyxMDL3TslIKb8o/JkLkw= -cloud.google.com/go/logging v1.0.0/go.mod h1:V1cc3ogwobYzQq5f2R7DS/GvRIrI4FKj01Gs5glwAls= cloud.google.com/go/longrunning v0.5.7 h1:WLbHekDbjK1fVFD3ibpFFVoyizlLRl73I7YKuAKilhU= cloud.google.com/go/longrunning v0.5.7/go.mod h1:8GClkudohy1Fxm3owmBGid8W0pSgodEMwEAztp38Xng= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/pubsub v1.4.0/go.mod h1:LFrqilwgdw4X2cJS9ALgzYmMu+ULyrUN6IHV3CPK4TM= cloud.google.com/go/resourcemanager v1.9.7 h1:SdvD0PaPX60+yeKoSe16mawFpM0EPuiPPihTIVlhRsY= cloud.google.com/go/resourcemanager v1.9.7/go.mod h1:cQH6lJwESufxEu6KepsoNAsjrUtYYNXRwxm4QFE5g8A= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.9.0/go.mod h1:m+/etGaqZbylxaNT876QGXqEHp4PR2Rq5GMqICWb9bU= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.10.1-0.20200805182106-fcd132957b02/go.mod h1:bdhVveip9CJX75wUu7ALOTnCSKjv6PHRY0bCeBmePnw= -cloud.google.com/go/storage v1.12.0/go.mod h1:fFLk2dp2oAhDz8QFKwqrjdJvxSp/W2g7nillojlL5Ho= -code.gitea.io/sdk/gitea v0.12.0/go.mod h1:z3uwDV/b9Ls47NGukYM9XhnHtqPh/J+t40lsUrR6JDY= -contrib.go.opencensus.io/exporter/aws v0.0.0-20181029163544-2befc13012d0/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= -contrib.go.opencensus.io/exporter/ocagent v0.4.12/go.mod h1:450APlNTSR6FrvC3CTRqYosuDstRB9un7SOx2k/9ckA= -contrib.go.opencensus.io/exporter/ocagent v0.5.0/go.mod h1:ImxhfLRpxoYiSq891pBrLVhN+qmP8BTVvdH2YLs7Gl0= -contrib.go.opencensus.io/exporter/ocagent v0.6.0/go.mod h1:zmKjrJcdo0aYcVS7bmEeSEBLPA9YJp5bjrofdU3pIXs= -contrib.go.opencensus.io/exporter/prometheus v0.1.0/go.mod h1:cGFniUXGZlKRjzOyuZJ6mgB+PgBcCIa79kEKR8YCW+A= -contrib.go.opencensus.io/exporter/stackdriver v0.12.1/go.mod h1:iwB6wGarfphGGe/e5CWqyUk/cLzKnWsOKPVW3no6OTw= -contrib.go.opencensus.io/exporter/stackdriver v0.12.8/go.mod h1:XyyafDnFOsqoxHJgTFycKZMrRUrPThLh2iYTJF6uoO0= -contrib.go.opencensus.io/exporter/stackdriver v0.12.9-0.20191108183826-59d068f8d8ff/go.mod h1:XyyafDnFOsqoxHJgTFycKZMrRUrPThLh2iYTJF6uoO0= -contrib.go.opencensus.io/exporter/stackdriver v0.13.1/go.mod h1:z2tyTZtPmQ2HvWH4cOmVDgtY+1lomfKdbLnkJvZdc8c= -contrib.go.opencensus.io/exporter/zipkin v0.1.1/go.mod h1:GMvdSl3eJ2gapOaLKzTKE3qDgUkJ86k9k3yY2eqwkzc= -contrib.go.opencensus.io/integrations/ocsql v0.1.4/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= -contrib.go.opencensus.io/resource v0.1.1/go.mod h1:F361eGI91LCmW1I/Saf+rX0+OFcigGlFvXwEGEnkRLA= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= -git.apache.org/thrift.git v0.12.0/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= -github.com/Azure/azure-amqp-common-go/v2 v2.1.0/go.mod h1:R8rea+gJRuJR6QxTir/XuEd+YuKoUiazDC/N96FiDEU= -github.com/Azure/azure-pipeline-go v0.1.8/go.mod h1:XA1kFWRVhSK+KNFiOhfv83Fv8L9achrP7OxIzeTn1Yg= -github.com/Azure/azure-pipeline-go v0.1.9/go.mod h1:XA1kFWRVhSK+KNFiOhfv83Fv8L9achrP7OxIzeTn1Yg= -github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= -github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= -github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v19.1.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v21.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v28.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v29.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v30.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v35.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v38.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v42.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-service-bus-go v0.9.1/go.mod h1:yzBx6/BUGfjfeqbRZny9AQIbIe3AcV9WZbAdpkoXOa0= -github.com/Azure/azure-storage-blob-go v0.0.0-20190123011202-457680cc0804/go.mod h1:oGfmITT1V6x//CswqY2gtAHND+xIP64/qL7a5QJix0Y= -github.com/Azure/azure-storage-blob-go v0.8.0/go.mod h1:lPI3aLPpuLTeUwh1sViKXFxwl2B6teiRqI0deQUvsw0= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest v10.15.5+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest v11.1.2+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest v12.0.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest v14.1.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.1.0/go.mod h1:AKyIcETwSUFxIcs/Wnq/C+kwCtlEYGUVd7FPNb2slmg= -github.com/Azure/go-autorest/autorest v0.2.0/go.mod h1:AKyIcETwSUFxIcs/Wnq/C+kwCtlEYGUVd7FPNb2slmg= -github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest v0.9.3/go.mod h1:GsRuLYvwzLjjjRoWEIyMUaYq8GNUx2nRB378IPt/1p0= -github.com/Azure/go-autorest/autorest v0.9.6/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= -github.com/Azure/go-autorest/autorest v0.10.2/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= -github.com/Azure/go-autorest/autorest v0.11.12/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= -github.com/Azure/go-autorest/autorest/adal v0.1.0/go.mod h1:MeS4XhScH55IST095THyTxElntu7WqB7pNbZo8Q5G3E= -github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= -github.com/Azure/go-autorest/autorest/adal v0.8.1/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= -github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= -github.com/Azure/go-autorest/autorest/adal v0.8.3/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/azure/auth v0.4.2/go.mod h1:90gmfKdlmKgfjUpnCEpOJzsUEjrWDSLwHIG73tSXddM= -github.com/Azure/go-autorest/autorest/azure/cli v0.3.1/go.mod h1:ZG5p860J94/0kI9mNJVoIoLgXcirM2gF5i2kWloofxw= -github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= -github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/to v0.1.0/go.mod h1:GunWKJp1AEqgMaGLV+iocmRAJWqST1wQYhyyjXJ3SJc= -github.com/Azure/go-autorest/autorest/to v0.2.0/go.mod h1:GunWKJp1AEqgMaGLV+iocmRAJWqST1wQYhyyjXJ3SJc= -github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= -github.com/Azure/go-autorest/autorest/validation v0.1.0/go.mod h1:Ha3z/SqBeaalWQvokg3NZAlQTalVMtOIAs1aGK7G6u8= -github.com/Azure/go-autorest/autorest/validation v0.2.0/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI= -github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= -github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.1.0/go.mod h1:ROEEAFwXycQw7Sn3DXNtEedEvdeRAgDr0izn4z5Ij88= -github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/BurntSushi/toml v0.3.0/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/DataDog/zstd v1.3.6-0.20190409195224-796139022798/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= -github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= -github.com/Djarvur/go-err113 v0.0.0-20200410182137-af658d038157/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= -github.com/Djarvur/go-err113 v0.1.0/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= -github.com/GoogleCloudPlatform/cloud-builders/gcs-fetcher v0.0.0-20191203181535-308b93ad1f39/go.mod h1:yfGmCjKuUzk9WzubMlW2zwjhCraIc/J+M40cufdemRM= -github.com/GoogleCloudPlatform/cloudsql-proxy v0.0.0-20191009163259-e802c2cb94ae/go.mod h1:mjwGPas4yKduTyubHvD1Atl9r1rUq8DfVy+gkVvZ+oo= -github.com/GoogleCloudPlatform/k8s-cloud-provider v0.0.0-20190822182118-27a4ced34534/go.mod h1:iroGtC8B3tQiqtds1l+mgk/BBOrxbqjH+eUfFQYRc14= github.com/GoogleCloudPlatform/k8s-cloud-provider v1.33.0 h1:eOjh0y9dIIZbCc1Ycf338dcML4c/5kTHIqqLb3vjDWw= github.com/GoogleCloudPlatform/k8s-cloud-provider v1.33.0/go.mod h1:o5jNXLZ3JSgVv+mR2PFp7syFS3DGi6DlzMDwi928YJA= -github.com/GoogleCloudPlatform/testgrid v0.0.1-alpha.3/go.mod h1:f96W2HYy3tiBNV5zbbRc+NczwYHgG1PHXMQfoEWv680= -github.com/GoogleCloudPlatform/testgrid v0.0.7/go.mod h1:lmtHGBL0M/MLbu1tR9BWV7FGZ1FEFIdPqmJiHNCL7y8= -github.com/GoogleCloudPlatform/testgrid v0.0.68/go.mod h1:SIRhudHYGiAUqMwKorBp2Kb5yJKhMq/nEMzFpYlKHVk= -github.com/IBM-Cloud/power-go-client v1.1.4/go.mod h1:YcAHrWuTvckGQYPLLReJ9ijcO/tQuRxAp2kCZ7fnnVk= -github.com/IBM/go-sdk-core/v5 v5.6.3/go.mod h1:tt/B9rxLkRtglE7pvqLuYikgCXaZFL3btdruJaoUeek= -github.com/IBM/go-sdk-core/v5 v5.9.1/go.mod h1:axE2JrRq79gIJTjKPBwV6gWHswvVptBjbcvvCPIxARM= -github.com/IBM/go-sdk-core/v5 v5.9.3/go.mod h1:YlOwV9LeuclmT/qi/LAK2AsobbAP42veV0j68/rlZsE= -github.com/IBM/platform-services-go-sdk v0.19.4/go.mod h1:mKtwiSvf5s2nyaSvcG+GNphun5pmiABcnsPjXzkC0OE= -github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= -github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/semver/v3 v3.0.3/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/Masterminds/semver/v3 v3.1.0/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/Masterminds/sprig/v3 v3.0.2/go.mod h1:oesJ8kPONMONaZgtiHNzUShJbksypC5kWczhZAf6+aU= -github.com/Masterminds/vcs v1.13.1/go.mod h1:N09YCmOQr6RLxC6UNHzuVwAdodYbbnycGHSmwVJjcKA= -github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= -github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= +github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0= +github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= -github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM= -github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= -github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= -github.com/Shopify/sarama v1.23.1/go.mod h1:XLH1GYJnLVE0XCr6KdJGVJRTwY30moWNJ4sERjXX6fs= -github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= -github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= -github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= -github.com/alecthomas/kingpin v2.2.6+incompatible/go.mod h1:59OFYbFVLKQKq+mqrL6Rw5bR0c3ACQaawgXx0QYndlE= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= -github.com/andybalholm/brotli v0.0.0-20190621154722-5f990b63d2d6/go.mod h1:+lx6/Aqd1kLJ1GQfkvOnaZ1WGmLpMpbprPuIOOZX30U= -github.com/andygrunwald/go-gerrit v0.0.0-20190120104749-174420ebee6c/go.mod h1:0iuRQp6WJ44ts+iihy5E/WlPqfg5RNeQxOmzRkxCdtk= -github.com/andygrunwald/go-gerrit v0.0.0-20210709065208-9d38b0be0268/go.mod h1:aqcjwEnmLLSalFNYR0p2ttnEXOVVRctIzsUMHbEcruU= -github.com/andygrunwald/go-jira v1.13.0/go.mod h1:jYi4kFDbRPZTJdJOVJO4mpMMIwdB+rcZwSO58DzPd2I= -github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= -github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apex/log v1.1.4/go.mod h1:AlpoD9aScyQfJDVHmLMEcx4oU6LqzkWp4Mg9GdAcEvQ= -github.com/apex/log v1.3.0/go.mod h1:jd8Vpsr46WAe3EZSQ/IUMs2qQD/GOycT5rPWCO1yGcs= -github.com/apex/logs v0.0.4/go.mod h1:XzxuLZ5myVHDy9SAmYpamKKRNApGj54PfYLcFrXqDwo= -github.com/aphistic/golf v0.0.0-20180712155816-02c07f170c5a/go.mod h1:3NqKYiepwy8kCu4PNA+aP7WUV72eXWJeP9/r3/K9aLE= -github.com/aphistic/sweet v0.2.0/go.mod h1:fWDlIh/isSE9n6EPsRmC0det+whmX6dJid3stzu0Xys= -github.com/apparentlymart/go-cidr v1.1.0/go.mod h1:EBcsNrHc3zQeuaeCeCtQruQm+n9/YjEn/vI25Lg7Gwc= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= -github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= -github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= -github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= -github.com/aws/aws-k8s-tester v0.0.0-20190114231546-b411acf57dfe/go.mod h1:1ADF5tAtU1/mVtfMcHAYSm2fPw71DA7fFk0yed64/0I= -github.com/aws/aws-k8s-tester v0.9.3/go.mod h1:nsh1f7joi8ZI1lvR+Ron6kJM2QdCYPU/vFePghSSuTc= -github.com/aws/aws-k8s-tester v1.0.0/go.mod h1:NUNd9k43+h9O5tvwL+4N1Ctb//SapmeeFX1G0/2/0Qc= -github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= -github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= -github.com/aws/aws-sdk-go v1.15.90/go.mod h1:es1KtYUFs7le0xQ3rOihkuoVD90z7D0fR2Qm4S00/gU= -github.com/aws/aws-sdk-go v1.16.18/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.16.26/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.19.18/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.19.45/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.20.6/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.23.20/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.23.22/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.25.11/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.27.1/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.29.32/go.mod h1:1KvfttTE3SPKMpo8g2c6jL3ZKfXtFvKscTgahTma5Xg= -github.com/aws/aws-sdk-go v1.29.34/go.mod h1:1KvfttTE3SPKMpo8g2c6jL3ZKfXtFvKscTgahTma5Xg= -github.com/aws/aws-sdk-go v1.30.4/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= -github.com/aws/aws-sdk-go v1.30.5/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= -github.com/aws/aws-sdk-go v1.30.16/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= -github.com/aws/aws-sdk-go v1.31.6/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= -github.com/aws/aws-sdk-go v1.31.12/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= -github.com/aws/aws-sdk-go v1.34.28/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48= -github.com/aws/aws-sdk-go v1.37.22/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59/go.mod h1:q/89r3U2H7sSsE2t6Kca0lfwTK8JdoNGS/yzM/4iH5I= -github.com/bazelbuild/buildtools v0.0.0-20190917191645-69366ca98f89/go.mod h1:5JP0TXzWDHXv8qvxRC4InIazwdyDseBDbzESUMKk1yU= -github.com/bazelbuild/buildtools v0.0.0-20200922170545-10384511ce98/go.mod h1:5JP0TXzWDHXv8qvxRC4InIazwdyDseBDbzESUMKk1yU= -github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= -github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb/go.mod h1:PkYb9DJNAwrSvRx5DYA+gUcOIgTGVMNkfSCbZM8cWpI= -github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= -github.com/bmizerany/perks v0.0.0-20141205001514-d9a9656a3a4b/go.mod h1:ac9efd0D1fsDb3EJvhqgXRbFx7bs2wqZ10HQPeU8U/Q= -github.com/bombsimon/wsl/v2 v2.0.0/go.mod h1:mf25kr/SqFEPhhcxW1+7pxzGlW+hIl/hYTKY95VwV8U= -github.com/bombsimon/wsl/v2 v2.2.0/go.mod h1:Azh8c3XGEJl9LyX0/sFC+CKMc7Ssgua0g+6abzXN4Pg= -github.com/bombsimon/wsl/v3 v3.0.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= -github.com/bombsimon/wsl/v3 v3.1.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= -github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= -github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= -github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= -github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= -github.com/bwmarrin/snowflake v0.0.0/go.mod h1:NdZxfVWX+oR6y2K0o6qAYv6gIOP9rjG0/E9WsDpxqwE= -github.com/caarlos0/ctrlc v1.0.0/go.mod h1:CdXpj4rmq0q/1Eb44M9zi2nKB0QraNKuRGYGrrHhcQw= -github.com/campoy/unique v0.0.0-20180121183637-88950e537e7e/go.mod h1:9IOqJGCPMSc6E5ydlp5NIonxObaeu/Iub/X03EKPVYo= -github.com/cavaliercoder/go-cpio v0.0.0-20180626203310-925f9528c45e/go.mod h1:oDpT4efm8tSYHXV5tHSdRvBet/b/QzxZ+XyyPehvm3A= +github.com/bombsimon/logrusr/v4 v4.1.0 h1:uZNPbwusB0eUXlO8hIUwStE6Lr5bLN6IgYgG+75kuh4= +github.com/bombsimon/logrusr/v4 v4.1.0/go.mod h1:pjfHC5e59CvjTBIU3V3sGhFWFAnsnhOR03TRc6im0l8= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= -github.com/chromedp/cdproto v0.0.0-20230802225258-3cf4e6d46a89/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs= -github.com/chromedp/chromedp v0.9.2/go.mod h1:LkSXJKONWTCHAfQasKFUZI+mxqS4tZqhmtGzzhLsnLs= -github.com/chromedp/sysutil v1.0.0/go.mod h1:kgWmDdq8fTzXYcKIBqIYvRRTnYb9aNS9moAV0xufSww= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= -github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= -github.com/clarketm/json v1.13.4/go.mod h1:ynr2LRfb0fQU34l07csRNBTcivjySLLiY1YzQqKVfdo= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudevents/sdk-go v0.0.0-20190509003705-56931988abe3/go.mod h1:j1nZWMLGg3om8SswStBoY6/SHvcLM19MuZqwDtMtmzs= -github.com/cloudevents/sdk-go v1.0.0/go.mod h1:3TkmM0cFqkhCHOq5JzzRU/RxRkwzoS8TZ+G448qVTog= -github.com/cloudevents/sdk-go/v2 v2.0.0/go.mod h1:3CTrpB4+u7Iaj6fd7E2Xvm5IxMdRoaAhqaRVnOr2rCU= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/container-storage-interface/spec v1.11.0 h1:H/YKTOeUZwHtyPOr9raR+HgFmGluGCklulxDYxSdVNM= -github.com/container-storage-interface/spec v1.11.0/go.mod h1:DtUvaQszPml1YJfIK7c00mlv6/g4wNMLanLgiUbKFRI= -github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= -github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= -github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20200107194136-26c1120b8d41/go.mod h1:Dq467ZllaHgAtVp4p1xUQWBrFXR9s/wyoTpG8zOJGkY= -github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= -github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= -github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= -github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= -github.com/coreos/bbolt v1.3.1-coreos.6/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/bbolt v1.3.3/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.17+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-oidc v0.0.0-20180117170138-065b426bd416/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.0.0-20180108230905-e214231b295a/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/container-storage-interface/spec v1.12.0 h1:zrFOEqpR5AghNaaDG4qyedwPBqU2fU0dWjLQMP/azK0= +github.com/container-storage-interface/spec v1.12.0/go.mod h1:txsm+MA2B2WDa5kW69jNbqPnvTtfvZma7T/zsAZ9qX8= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= -github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE= -github.com/deislabs/oras v0.8.1/go.mod h1:Mx0rMSbBNaNfY9hjpccEnxkOqJL6KGjtxNHPLC4G4As= -github.com/denisenkom/go-mssqldb v0.0.0-20190111225525-2fea367d496d/go.mod h1:xN/JuLBIz4bjkxNmByTiV1IbhfnYb6oo99phBn4Eqhc= -github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= -github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= -github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= -github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgrijalva/jwt-go/v4 v4.0.0-preview1/go.mod h1:+hnT3ywWDTAFrW5aE+u2Sa/wT555ZqwoCS+pk3p6ry4= -github.com/dgryski/go-gk v0.0.0-20200319235926-a69029f61654/go.mod h1:qm+vckxRlDt0aOla0RYJJVeqHZlWfOm2UIxHaqPB46E= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= -github.com/djherbis/atime v1.0.0/go.mod h1:5W+KBIuTwVGcqjIfaTwt+KSYX1o6uep8dtevevQP/f8= -github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= -github.com/docker/cli v0.0.0-20190925022749-754388324470/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/cli v0.0.0-20200130152716-5d0cf8839492/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/cli v0.0.0-20200210162036-a4bedce16568/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/distribution v0.0.0-20191216044856-a8371794149d/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= -github.com/docker/distribution v2.6.0-rc.1.0.20180327202408-83389a148052+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v1.4.2-0.20180531152204-71cd53e4a197/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v1.4.2-0.20200203170920-46ec8731fbce/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v1.13.1/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= -github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dsnet/compress v0.0.1/go.mod h1:Aw8dCMJ7RioblQeTqt88akK31OvO8Dhf5JflhBbQEHo= -github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= -github.com/eapache/go-resiliency v1.2.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= -github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= -github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/emicklei/go-restful/v3 v3.12.2 h1:DhwDP0vY3k8ZzE0RunuJy8GhNpPL6zqLkDf9B/a0/xU= github.com/emicklei/go-restful/v3 v3.12.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= -github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -410,289 +103,53 @@ github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5y 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/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= -github.com/evanphx/json-patch v0.0.0-20190203023257-5858425f7550/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= -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.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4= -github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= +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.9.11 h1:/8HVnzMq13/3x9TPvjG08wUGqBTmZBsCWzjTM0wiaDU= +github.com/evanphx/json-patch/v5 v5.9.11/go.mod h1:3j+LviiESTElxA4p3EMKAB9HXj3/XEtnUf6OZxqIQTM= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/structs v1.0.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= -github.com/felixge/fgprof v0.9.1/go.mod h1:7/HK6JFtFaARhIljgP2IV8rJLIoHDoOYoUphsnGvqxE= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/fortytw2/leaktest v1.2.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/frankban/quicktest v1.8.1/go.mod h1:ui7WezCLWMWxVWr1GETZY3smRy0G4KWq9vcPtJmFl7Y= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= -github.com/fsouza/fake-gcs-server v0.0.0-20180612165233-e85be23bdaa8/go.mod h1:1/HufuJ+eaDf4KTnYdS6HJMGvMRU8d4cYTuu/1QaBbI= -github.com/fsouza/fake-gcs-server v1.19.4/go.mod h1:I0/88nHCASqJJ5M7zVF0zKODkYTcuXFW5J5yajsNJnE= -github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= -github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= -github.com/fxamacker/cbor/v2 v2.8.0 h1:fFtUGXUzXPHTIUdne5+zzMPTfffl3RD5qYnkY40vtxU= -github.com/fxamacker/cbor/v2 v2.8.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= -github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v0.0.0-20180820084758-c7ce16629ff4/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM= +github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= -github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= -github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= -github.com/go-bindata/go-bindata/v3 v3.1.3/go.mod h1:1/zrpXsLD8YDIbhZRqXzm1Ghc7NhEvIN9+Z6R5/xH4I= -github.com/go-critic/go-critic v0.4.1/go.mod h1:7/14rZGnZbY6E38VEGk2kVhoq6itzc1E68facVDK23g= -github.com/go-critic/go-critic v0.4.3/go.mod h1:j4O3D4RoIwRqlZw5jJpx0BNfXWWbpcJoKu5cYSe4YmQ= +github.com/gkampitakis/ciinfo v0.3.2 h1:JcuOPk8ZU7nZQjdUhctuhQofk7BGHuIy0c9Ez8BNhXs= +github.com/gkampitakis/ciinfo v0.3.2/go.mod h1:1NIwaOcFChN4fa/B0hEBdAb6npDlFL8Bwx4dfRLRqAo= +github.com/gkampitakis/go-diff v1.3.2 h1:Qyn0J9XJSDTgnsgHRdz9Zp24RaJeKMUHg2+PDZZdC4M= +github.com/gkampitakis/go-diff v1.3.2/go.mod h1:LLgOrpqleQe26cte8s36HTWcTmMEur6OPYerdAAS9tk= +github.com/gkampitakis/go-snaps v0.5.15 h1:amyJrvM1D33cPHwVrjo9jQxX8g/7E2wYdZ+01KS3zGE= +github.com/gkampitakis/go-snaps v0.5.15/go.mod h1:HNpx/9GoKisdhw9AFOBT1N7DBs9DiHo/hGheFGBZ+mc= 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= -github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= -github.com/go-ini/ini v1.46.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= -github.com/go-ini/ini v1.55.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-lintpack/lintpack v0.5.2/go.mod h1:NwZuYi2nUHho8XEIZ6SIxihrnPoqBTDqfpXvXAN0sXM= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -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/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= -github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-logr/zapr v0.1.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= -github.com/go-logr/zapr v0.1.1/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= -github.com/go-logr/zapr v0.4.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= -github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= -github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= -github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= -github.com/go-openapi/analysis v0.17.2/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= -github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= -github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= -github.com/go-openapi/analysis v0.19.4/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= -github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= -github.com/go-openapi/analysis v0.19.10/go.mod h1:qmhS3VNFxBlquFJ0RGoDtylO9y4pgTAUNE9AEEMdlJQ= -github.com/go-openapi/analysis v0.19.16/go.mod h1:GLInF007N83Ad3m8a/CbQ5TPzdnGT7workfHwuVjNVk= -github.com/go-openapi/analysis v0.20.0/go.mod h1:BMchjvaHDykmRMsK40iPtvyOfFdMMxlOmQr9FBZk+Og= -github.com/go-openapi/analysis v0.20.1/go.mod h1:BMchjvaHDykmRMsK40iPtvyOfFdMMxlOmQr9FBZk+Og= -github.com/go-openapi/analysis v0.21.2/go.mod h1:HZwRk4RRisyG8vx2Oe6aqeSQcoxRp47Xkp3+K6q+LdY= -github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= -github.com/go-openapi/errors v0.17.2/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= -github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= -github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= -github.com/go-openapi/errors v0.19.3/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= -github.com/go-openapi/errors v0.19.6/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= -github.com/go-openapi/errors v0.19.7/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= -github.com/go-openapi/errors v0.19.8/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= -github.com/go-openapi/errors v0.19.9/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= -github.com/go-openapi/errors v0.20.1/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= -github.com/go-openapi/errors v0.20.2/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= -github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= -github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= -github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= -github.com/go-openapi/jsonpointer v0.19.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= -github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= +github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= +github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= github.com/go-openapi/jsonpointer v0.21.1 h1:whnzv/pNXtK2FbX/W9yJfRmE2gsmkfahjMKB0fZvcic= github.com/go-openapi/jsonpointer v0.21.1/go.mod h1:50I1STOfbY1ycR8jGz8DaMeLCdXiI6aDteEdRNNzpdk= -github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= -github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.19.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= -github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= -github.com/go-openapi/jsonreference v0.20.1/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= -github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= -github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.17.2/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= -github.com/go-openapi/loads v0.19.3/go.mod h1:YVfqhUCdahYwR3f3iiwQLhicVRvLlU/WO5WPaZvcvSI= -github.com/go-openapi/loads v0.19.4/go.mod h1:zZVHonKd8DXyxyw4yfnVjPzBjIQcLt0CCsn0N0ZrQsk= -github.com/go-openapi/loads v0.19.5/go.mod h1:dswLCAdonkRufe/gSUC3gN8nTSaB9uaS2es0x5/IbjY= -github.com/go-openapi/loads v0.19.6/go.mod h1:brCsvE6j8mnbmGBh103PT/QLHfbyDxA4hsKvYBNEGVc= -github.com/go-openapi/loads v0.19.7/go.mod h1:brCsvE6j8mnbmGBh103PT/QLHfbyDxA4hsKvYBNEGVc= -github.com/go-openapi/loads v0.20.0/go.mod h1:2LhKquiE513rN5xC6Aan6lYOSddlL8Mp20AW9kpviM4= -github.com/go-openapi/loads v0.20.2/go.mod h1:hTVUotJ+UonAMMZsvakEgmWKgtulweO9vYP2bQYKA/o= -github.com/go-openapi/loads v0.21.0/go.mod h1:rHYve9nZrQ4CJhyeIIFJINGCg1tQpx2yJrrNo8sf1ws= -github.com/go-openapi/loads v0.21.1/go.mod h1:/DtAMXXneXFjbQMGEtbamCZb+4x7eGwkvZCvBmwUG+g= -github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= -github.com/go-openapi/runtime v0.17.2/go.mod h1:QO936ZXeisByFmZEO1IS1Dqhtf4QV1sYYFtIq6Ld86Q= -github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= -github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= -github.com/go-openapi/runtime v0.19.15/go.mod h1:dhGWCTKRXlAfGnQG0ONViOZpjfg0m2gUt9nTQPQZuoo= -github.com/go-openapi/runtime v0.19.16/go.mod h1:5P9104EJgYcizotuXhEuUrzVc+j1RiSjahULvYmlv98= -github.com/go-openapi/runtime v0.19.24/go.mod h1:Lm9YGCeecBnUUkFTxPC4s1+lwrkJ0pthx8YvyjCfkgk= -github.com/go-openapi/runtime v0.23.0/go.mod h1:aQg+kaIQEn+A2CRSY1TxbM8+sT9g2V3aLc1FbIAnbbs= -github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= -github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= -github.com/go-openapi/spec v0.17.2/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= -github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= -github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/spec v0.19.4/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/spec v0.19.5/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= -github.com/go-openapi/spec v0.19.6/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= -github.com/go-openapi/spec v0.19.8/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= -github.com/go-openapi/spec v0.19.15/go.mod h1:+81FIL1JwC5P3/Iuuozq3pPE9dXdIEGxFutcFKaVbmU= -github.com/go-openapi/spec v0.20.0/go.mod h1:+81FIL1JwC5P3/Iuuozq3pPE9dXdIEGxFutcFKaVbmU= -github.com/go-openapi/spec v0.20.1/go.mod h1:93x7oh+d+FQsmsieroS4cmR3u0p/ywH649a3qwC9OsQ= -github.com/go-openapi/spec v0.20.3/go.mod h1:gG4F8wdEDN+YPBMVnzE85Rbhf+Th2DTvA9nFPQ5AYEg= -github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I= -github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= -github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= -github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= -github.com/go-openapi/strfmt v0.19.2/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= -github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= -github.com/go-openapi/strfmt v0.19.4/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= -github.com/go-openapi/strfmt v0.19.5/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= -github.com/go-openapi/strfmt v0.19.11/go.mod h1:UukAYgTaQfqJuAFlNxxMWNvMYiwiXtLsF2VwmoFtbtc= -github.com/go-openapi/strfmt v0.20.0/go.mod h1:UukAYgTaQfqJuAFlNxxMWNvMYiwiXtLsF2VwmoFtbtc= -github.com/go-openapi/strfmt v0.20.1/go.mod h1:43urheQI9dNtE5lTZQfuFJvjYJKPrxicATpEfZwHUNk= -github.com/go-openapi/strfmt v0.20.2/go.mod h1:43urheQI9dNtE5lTZQfuFJvjYJKPrxicATpEfZwHUNk= -github.com/go-openapi/strfmt v0.21.0/go.mod h1:ZRQ409bWMj+SOgXofQAGTIo2Ebu72Gs+WaRADcS5iNg= -github.com/go-openapi/strfmt v0.21.1/go.mod h1:I/XVKeLc5+MM5oPNN7P6urMOpuLXEcNrCX/rPGuWb0k= -github.com/go-openapi/strfmt v0.21.2/go.mod h1:I/XVKeLc5+MM5oPNN7P6urMOpuLXEcNrCX/rPGuWb0k= -github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= -github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= -github.com/go-openapi/swag v0.17.2/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= -github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.7/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= -github.com/go-openapi/swag v0.19.9/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= -github.com/go-openapi/swag v0.19.12/go.mod h1:eFdyEBkTdoAf/9RXBvj4cr1nH7GD8Kzo5HTt47gr72M= -github.com/go-openapi/swag v0.19.13/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= github.com/go-openapi/swag v0.23.1 h1:lpsStH0n2ittzTnbaSloVZLuB5+fvSY/+hnagBjSNZU= github.com/go-openapi/swag v0.23.1/go.mod h1:STZs8TbRvEQQKUA+JZNAm3EWlgaOBGpyFDqQnDHMef0= -github.com/go-openapi/validate v0.17.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= -github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= -github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= -github.com/go-openapi/validate v0.19.3/go.mod h1:90Vh6jjkTn+OT1Eefm0ZixWNFjhtOH7vS9k0lo6zwJo= -github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= -github.com/go-openapi/validate v0.19.10/go.mod h1:RKEZTUWDkxKQxN2jDT7ZnZi2bhZlbNMAuKvKB+IaGx8= -github.com/go-openapi/validate v0.19.12/go.mod h1:Rzou8hA/CBw8donlS6WNEUQupNvUZ0waH08tGe6kAQ4= -github.com/go-openapi/validate v0.19.15/go.mod h1:tbn/fdOwYHgrhPBzidZfJC2MIVvs9GA7monOmWBbeCI= -github.com/go-openapi/validate v0.20.1/go.mod h1:b60iJT+xNNLfaQJUqLI7946tYiFEOuE9E4k54HpKcJ0= -github.com/go-openapi/validate v0.20.3/go.mod h1:goDdqVGiigM3jChcrYJxD2joalke3ZXeftD16byIjA4= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= -github.com/go-sql-driver/mysql v0.0.0-20160411075031-7ebe0a500653/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= -github.com/go-test/deep v1.0.4/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= -github.com/go-test/deep v1.0.7/go.mod h1:QV8Hv/iy04NyLBxAdO9njL0iVPN1S4d/A3NVv1V36o8= -github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= -github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ= -github.com/go-toolsmith/astequal v0.0.0-20180903214952-dcb477bfacd6/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= -github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= -github.com/go-toolsmith/astfmt v0.0.0-20180903215011-8f8ee99c3086/go.mod h1:mP93XdblcopXwlyN4X4uodxXQhldPGZbcEJIimQHrkg= -github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= -github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU= -github.com/go-toolsmith/astp v0.0.0-20180903215135-0af7e3c24f30/go.mod h1:SV2ur98SGypH1UjcPpCatrV5hPazG6+IfNHbkDXBRrk= -github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= -github.com/go-toolsmith/pkgload v0.0.0-20181119091011-e9e65178eee8/go.mod h1:WoMrjiy4zvdS+Bg6z9jZH82QXwkcgCBX6nOfnmdaHks= -github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc= -github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= -github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= -github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= -github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= -github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0= -github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= -github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= -github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= -github.com/gobuffalo/envy v1.6.5/go.mod h1:N+GkhhZ/93bGZc6ZKhJLP6+m+tCNPKwgSpH9kaifseQ= -github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= -github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= -github.com/gobuffalo/envy v1.7.1/go.mod h1:FurDp9+EDPE4aIUS3ZLyD+7/9fpx7YRt/ukY6jIHf0w= -github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs= -github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= -github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= -github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk= -github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28= -github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo= -github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk= -github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw= -github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= -github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg= -github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= -github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8= -github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= -github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= -github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= -github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= -github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= -github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= -github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= -github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= -github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.2.1/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY= -github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= +github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw= +github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/flock v0.0.0-20190320160742-5135e617513b/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gofrs/flock v0.7.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -github.com/gogo/protobuf v0.0.0-20171007142547-342cbe0a0415/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.0.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.2.2-0.20190730201129-28a6bbf47e48/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= -github.com/golang/gddo v0.0.0-20190419222130-af0f2af80721/go.mod h1:xEhNfoBDX1hzLm2Nf80qUvZ2sVwoMZ8d6IE2SrsQfh4= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20180513044358-24b0969c4cb7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= @@ -701,9 +158,8 @@ github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -721,42 +177,14 @@ github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= -github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= -github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6/go.mod h1:DbHgvLiFKX1Sh2T1w8Q/h4NAI8MHIpzCdnBUDTXU3I0= -github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8= -github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3/go.mod h1:JXrF4TWy4tXYn62/9x8Wm/K/dm06p8tCKwFRDPZG/1o= -github.com/golangci/gocyclo v0.0.0-20180528134321-2becd97e67ee/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU= -github.com/golangci/gocyclo v0.0.0-20180528144436-0a533e8fa43d/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU= -github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= -github.com/golangci/golangci-lint v1.23.7/go.mod h1:g/38bxfhp4rI7zeWSxcdIeHTQGS58TCak8FYcyCmavQ= -github.com/golangci/golangci-lint v1.27.0/go.mod h1:+eZALfxIuthdrHPtfM7w/R3POJLjHDfJJw8XZl9xOng= -github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc/go.mod h1:e5tpTHCfVze+7EpLEozzMB3eafxo2KT5veNg1k6byQU= -github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= -github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= -github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= -github.com/golangci/misspell v0.3.5/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= -github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21/go.mod h1:tf5+bzsHdTM0bsB7+8mt0GUMvjCgwLpTapNZHU8AajI= -github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4= -github.com/golangci/revgrep v0.0.0-20180812185044-276a5c0a1039/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4= -github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= -github.com/golangplus/bytes v0.0.0-20160111154220-45c989fe5450/go.mod h1:Bk6SMAONeMXrxql8uvOKuAZSu8aM5RUGv+1C6IJaEho= -github.com/golangplus/fmt v0.0.0-20150411045040-2a5d6d7d2995/go.mod h1:lJgMEyOkYFkPcDKwRXegd+iM6E7matEszMG5HhwytU8= -github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= -github.com/gomodule/redigo v1.7.0/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= -github.com/gomodule/redigo v1.8.5/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0= -github.com/google/btree v0.0.0-20180124185431-e89373fe6b4a/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= -github.com/google/gnostic-models v0.6.9 h1:MU/8wDLif2qCXZmzncUQ/BOfxWfthHi63KqpoNbWqVw= -github.com/google/gnostic-models v0.6.9/go.mod h1:CiWsm0s6BSQd1hRn8/QmxqB6BesYcbSZxsz9b0KuDBw= +github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= +github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/gnostic-models v0.7.0 h1:qwTtogB15McXDaNqTZdzPJRHvaVJlAl+HVQnLmJEJxo= +github.com/google/gnostic-models v0.7.0/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -768,704 +196,186 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= -github.com/google/go-containerregistry v0.0.0-20191010200024-a3d713f9b7f8/go.mod h1:KyKXa9ciM8+lgMXwOVsXi7UxGrsf9mM61Mzs+xKUrKE= -github.com/google/go-containerregistry v0.0.0-20200115214256-379933c9c22b/go.mod h1:Wtl/v6YdQxv397EREtzwgd9+Ud7Q5D8XMbi3Zazgkrs= -github.com/google/go-containerregistry v0.0.0-20200123184029-53ce695e4179/go.mod h1:Wtl/v6YdQxv397EREtzwgd9+Ud7Q5D8XMbi3Zazgkrs= -github.com/google/go-containerregistry v0.0.0-20200331213917-3d03ed9b1ca2/go.mod h1:pD1UFYs7MCAx+ZLShBdttcaOSbyc8F9Na/9IZLNwJeA= -github.com/google/go-containerregistry v0.1.1/go.mod h1:npTSyywOeILcgWqd+rvtzGWflIPPcBQhYoOONaY4ltM= -github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= -github.com/google/go-github/v27 v27.0.6/go.mod h1:/0Gr8pJ55COkmv+S/yPKCczSkUPIM/LnFyubufRNIS0= -github.com/google/go-github/v28 v28.1.1/go.mod h1:bsqJWQX05omyWVmc00nEUql9mhQyv38lDZ8kPZcQVoM= -github.com/google/go-github/v29 v29.0.3/go.mod h1:CHKiKKPHJ0REzfwc14QMklvtHwCveD0PxlMjLlzAM5E= -github.com/google/go-licenses v0.0.0-20191112164736-212ea350c932/go.mod h1:16wa6pRqNDUIhOtwF0GcROVqMeXHZJ7H6eGDFUh5Pfk= -github.com/google/go-licenses v0.0.0-20200227160636-0fa8c766a591/go.mod h1:JWeTIGPLQ9gF618ZOdlUitd1gRR/l99WOkHOlmR/UVA= -github.com/google/go-querystring v0.0.0-20170111101155-53e6ce116135/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= -github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= -github.com/google/go-replayers/grpcreplay v0.1.0/go.mod h1:8Ig2Idjpr6gifRd6pNVggX6TC1Zw6Jx74AKp7QNH2QE= -github.com/google/go-replayers/httpreplay v0.1.0/go.mod h1:YKZViNhiGgqdBlUbI2MwGpq4pXxNmhJLPHQ7cv2b5no= -github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= -github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.1-0.20210504230335-f78f29fc09ea h1:VcIYpAGBae3Z6BVncE0OnTE/ZjlDXqtYhOZky88neLM= github.com/google/gofuzz v1.2.1-0.20210504230335-f78f29fc09ea/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/licenseclassifier v0.0.0-20190926221455-842c0d70d702/go.mod h1:qsqn2hxC+vURpyBRygGUuinTO42MFRLcsmQ/P8v94+M= -github.com/google/licenseclassifier v0.0.0-20200402202327-879cb1424de0/go.mod h1:qsqn2hxC+vURpyBRygGUuinTO42MFRLcsmQ/P8v94+M= -github.com/google/mako v0.0.0-20190821191249-122f8dcef9e3/go.mod h1:YzLcVlL+NqWnmUEPuhS1LxDDwGO9WNbVlEXaF4IH35g= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190723021845-34ac40c74b70/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200507031123-427632fa3b1c/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200615235658-03e1cf38a040/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200905233945-acf8798be1f7/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= -github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= -github.com/google/pprof v0.0.0-20240827171923-fa2c70bbbfe5/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= -github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= -github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/ZoQgRgVIWFJljSWa/zetS2WTvg= -github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 h1:BHT72Gu3keYf3ZEu2J0b1vyeLSOYI8bm5wbJM/8yDe8= +github.com/google/pprof v0.0.0-20250403155104-27863c87afa6/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/rpmpack v0.0.0-20191226140753-aa36bfddb3a0/go.mod h1:RaTPr0KUf2K7fnZYLNDrr8rxAamWs3iNywJLtQ2AzBg= github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= -github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/wire v0.3.0/go.mod h1:i1DMg/Lu8Sz5yYl25iOdmc5CT5qusaa+zmRWs16741s= -github.com/google/wire v0.4.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU= github.com/googleapis/enterprise-certificate-proxy v0.3.6 h1:GW/XbdyBFQ8Qe+YAmFU9uHLo7OnF5tL52HFAgMmyrf4= github.com/googleapis/enterprise-certificate-proxy v0.3.6/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA= -github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= -github.com/googleapis/gax-go v2.0.2+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.12.5 h1:8gw9KZK8TiVKB6q3zHY3SBzLnrGp6HQjyfYBYGmXdxA= github.com/googleapis/gax-go/v2 v2.12.5/go.mod h1:BUDKcWo+RaKq5SC9vVYL0wLADa3VcfswbOMMRmB9H3E= -github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.2.2/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU= -github.com/googleapis/gnostic v0.4.0/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= -github.com/gookit/color v1.2.4/go.mod h1:AhIE+pS6D4Ql0SQWbBeXPHw7gY0/sjHoA4s/n1KB7xg= -github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/goreleaser/goreleaser v0.136.0/go.mod h1:wiKrPUeSNh6Wu8nUHxZydSOVQ/OZvOaO7DTtFqie904= -github.com/goreleaser/nfpm v1.2.1/go.mod h1:TtWrABZozuLOttX2uDlYyECfQX7x5XYkVxhjYcR6G9w= -github.com/goreleaser/nfpm v1.3.0/go.mod h1:w0p7Kc9TAUgWMyrub63ex3M2Mgw88M4GZXoTq5UCb40= -github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= -github.com/gorilla/csrf v1.6.2/go.mod h1:7tSf8kmjNYr7IWDCYhd3U8Ck34iQ/Yw5CJu7bAkHEGI= -github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= -github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= -github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= -github.com/gorilla/sessions v1.1.3/go.mod h1:8KCfur6+4Mqcc6S0FEfKuN15Vl5MgXW92AE8ovaJD0w= -github.com/gorilla/sessions v1.2.0/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= -github.com/gostaticanalysis/analysisutil v0.0.3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= -github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo= -github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/gregjones/httpcache v0.0.0-20190212212710-3befbb6ad0cc/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v0.0.0-20190222133341-cfaf5686ec79/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-prometheus v0.0.0-20170330212424-2500245aa611/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.3.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= -github.com/grpc-ecosystem/grpc-gateway v1.4.1/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= -github.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.2/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.4/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= -github.com/grpc-ecosystem/grpc-gateway v1.12.2/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 h1:e9Rjr40Z98/clHv5Yg79Is0NtosR5LXRvdr7o/6NwbA= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1/go.mod h1:tIxuGz/9mpox++sgp9fJjHO0+q1X9/UOWd798aAm22M= -github.com/h2non/gock v1.0.9/go.mod h1:CZMcB0Lg5IWnr9bF79pPMg9WeV6WumxQiUJ1UvdO1iE= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 h1:5ZPtiqj0JL5oKWmcsq4VMaAW5ukBEgSGXEN89zeH1Jo= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3/go.mod h1:ndYquD05frm2vACXE1nsccT4oJzjhw2arTS2cpUD1PI= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= -github.com/hashicorp/go-multierror v0.0.0-20171204182908-b7773ae21874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-retryablehttp v0.6.4/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= -github.com/hashicorp/go-retryablehttp v0.6.6/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= -github.com/hashicorp/go-retryablehttp v0.7.0/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20240312041847-bd984b5ce465/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw= -github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.7/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/influxdata/influxdb v0.0.0-20161215172503-049f9b42e9a5/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY= -github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mqiSBE6Ffsg94weZZ2c+v/ciT8QRHFOap7EKDrR0= -github.com/jarcoal/httpmock v1.0.5/go.mod h1:ATjnClrvW/3tijVmpL/va5Z3aAyGvqU3gCT8nX0Txik= -github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= -github.com/jcmturner/gofork v0.0.0-20190328161633-dc7c13fece03/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= -github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= -github.com/jenkins-x/go-scm v1.5.65/go.mod h1:MgGRkJScE/rJ30J/bXYqduN5sDPZqZFITJopsnZmTOw= -github.com/jenkins-x/go-scm v1.5.79/go.mod h1:PCT338UhP/pQ0IeEeMEf/hoLTYKcH7qjGEKd7jPkeYg= -github.com/jenkins-x/go-scm v1.5.117/go.mod h1:PCT338UhP/pQ0IeEeMEf/hoLTYKcH7qjGEKd7jPkeYg= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jingyugao/rowserrcheck v0.0.0-20191204022205-72ab7603b68a/go.mod h1:xRskid8CManxVta/ALEhJha/pweKBaVG6fWgc0yH25s= -github.com/jinzhu/gorm v0.0.0-20170316141641-572d0a0ab1eb/go.mod h1:Vla75njaFJ8clLU1W44h34PjIkijhjHIYnZxMqCdxqo= -github.com/jinzhu/gorm v1.9.12/go.mod h1:vhTjlKSJUTWNtcbQtrMBFCxy7eXTzeCAzfL5fBZT/Qs= -github.com/jinzhu/inflection v0.0.0-20190603042836-f5c5f50e6090/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= -github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= -github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/jirfag/go-printf-func-name v0.0.0-20191110105641-45db9963cdd3/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= -github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= -github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/jmoiron/sqlx v1.2.1-0.20190826204134-d7d95172beb5/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= -github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= -github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= -github.com/jonboulle/clockwork v0.0.0-20141017032234-72f9bd7c4e0c/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= 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/jpillora/backoff v0.0.0-20180909062703-3050d21c67d7/go.mod h1:2iMrUgbbvHEiQClaW2NsSzMyGHqN+rDFqY705q49KG0= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v0.0.0-20180701071628-ab8a2e0c74be/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/joshdk/go-junit v1.0.0 h1:S86cUKIdwBHWwA6xCmFlf3RTLfVXYQfvanM5Uh+K6GE= +github.com/joshdk/go-junit v1.0.0/go.mod h1:TiiV0PqkaNfFXjEiyjWM3XXrhVyCa1K4Zfga6W52ung= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= 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/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= -github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= -github.com/kelseyhightower/envconfig v1.3.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= -github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= -github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= 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/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.9.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.10.2/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= -github.com/klauspost/cpuid v0.0.0-20180405133222-e7e905edc00e/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/cpuid v1.2.2/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/pgzip v1.2.1/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= -github.com/knative/build v0.1.2/go.mod h1:/sU74ZQkwlYA5FwYDJhYTy61i/Kn+5eWfln2jDbw3Qo= -github.com/konsorten/go-windows-terminal-sequences v0.0.0-20180402223658-b729f2633dfe/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -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.0.0/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= 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/kubernetes-csi/csi-proxy/client v1.2.1 h1:6ApXTKp5Rhb+2PrPfnk6C+TDG7XwnWJ9/xmmq7iN5cw= -github.com/kubernetes-csi/csi-proxy/client v1.2.1/go.mod h1:SfK4HVKQdMH5KrffivddAWgX5hl3P5KmnuOTBbDNboU= -github.com/kubernetes-csi/csi-test/v5 v5.3.1 h1:Wiukp1In+kif+BFo6q2ExjgB+MbrAz4jZWzGfijypuY= -github.com/kubernetes-csi/csi-test/v5 v5.3.1/go.mod h1:7hA2cSYJ6T8CraEZPA6zqkLZwemjBD54XAnPsPC3VpA= +github.com/kubernetes-csi/csi-proxy/client v1.3.0 h1:c8JAHmspuI5w+/IBuspdartuFIZ0LcKOvz6lbHyi7WQ= +github.com/kubernetes-csi/csi-proxy/client v1.3.0/go.mod h1:SfK4HVKQdMH5KrffivddAWgX5hl3P5KmnuOTBbDNboU= +github.com/kubernetes-csi/csi-test/v5 v5.4.0 h1:u5DgYNIreSNO2+u4Nq2Wpl+bbakRSjNyxZHmDTAqnYA= +github.com/kubernetes-csi/csi-test/v5 v5.4.0/go.mod h1:anAJKFUb/SdHhIHECgSKxC5LSiLzib+1I6mrWF5Hve8= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80/go.mod h1:imJHygn/1yfhB7XSJJKlFZKl/J+dCPAknuiaGOshXAs= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= -github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= -github.com/lightstep/tracecontext.go v0.0.0-20181129014701-1757c391b1ac/go.mod h1:Frd2bnT3w5FB5q49ENTfVlztJES+1k/7lyWX2+9gq/M= -github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= -github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= -github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/mailru/easyjson v0.7.1-0.20191009090205-6c0755d89d1e/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4= -github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= -github.com/maratori/testpackage v1.0.1/go.mod h1:ddKdw+XG0Phzhx8BFDTKgpWP4i7MpApTE5fXSKAqwDU= -github.com/markbates/inflect v1.0.4/go.mod h1:1fR9+pO2KHEO9ZRtto13gDwwZaAKstQzferVeWqbgNs= -github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= -github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= -github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= -github.com/matoous/godox v0.0.0-20190911065817-5d6d842e92eb/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= -github.com/mattbaird/jsonpatch v0.0.0-20171005235357-81af80346b1a/go.mod h1:M1qoD/MqPgTZIk0EWKB38wE28ACRfVcn+cU08jyArI0= +github.com/mailru/easyjson v0.9.1 h1:LbtsOm5WAswyWbvTEOqhypdPeZzHavpZx96/n553mR8= +github.com/mailru/easyjson v0.9.1/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= +github.com/maruel/natural v1.1.1 h1:Hja7XhhmvEFhcByqDoHz9QZbkWey+COd9xWfCfn1ioo= +github.com/maruel/natural v1.1.1/go.mod h1:v+Rfd79xlw1AgVBjbO0BEQmptqb5HvL/k9GRHB7ZKEg= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= -github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= -github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.8/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-shellwords v1.0.9/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= -github.com/mattn/go-shellwords v1.0.10/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= -github.com/mattn/go-sqlite3 v0.0.0-20160514122348-38ee283dabf1/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/go-sqlite3 v2.0.1+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/go-zglob v0.0.1/go.mod h1:9fxibJccNxU2cnpIKLRRFA7zX7qhkJIQWBb449FYHOo= -github.com/mattn/go-zglob v0.0.2/go.mod h1:9fxibJccNxU2cnpIKLRRFA7zX7qhkJIQWBb449FYHOo= -github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= -github.com/matttproud/golang_protobuf_extensions v1.0.0/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= -github.com/mholt/archiver/v3 v3.3.0/go.mod h1:YnQtqsp+94Rwd0D/rk5cnLrxusUBUXg+08Ebtr1Mqao= +github.com/mfridman/tparse v0.18.0 h1:wh6dzOKaIwkUGyKgOntDW4liXSo37qg5AXbIhkMV3vE= +github.com/mfridman/tparse v0.18.0/go.mod h1:gEvqZTuCgEhPbYk/2lS3Kcxg1GmTxxU7kTC8DvP0i/A= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-ps v0.0.0-20190716172923-621e5597135b/go.mod h1:r1VsdOzOPt1ZSrGZWFoNhsAedKnEd6r9Np1+5blZCWk= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/ioprogress v0.0.0-20180201004757-6a23b12fa88e/go.mod h1:waEya8ee1Ro/lgxpVhkJI4BVASzkm3UZqkx/cFJiYHM= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.3.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= -github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/spdystream v0.5.0/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/moby/sys/mountinfo v0.7.2 h1:1shs6aH5s4o5H2zQLn796ADW1wMrIwHsyJ2v9KouLrg= github.com/moby/sys/mountinfo v0.7.2/go.mod h1:1YOa8w8Ih7uW0wALDUgT1dTTSBrZ+HiBLGws92L2RU4= -github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -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/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= -github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/mozilla/tls-observatory v0.0.0-20190404164649-a3c1b6cfecfd/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= -github.com/mozilla/tls-observatory v0.0.0-20200317151703-4fa42e1c2dee/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/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/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/nakabonne/nestif v0.3.0/go.mod h1:dI314BppzXjJ4HsCnbo7XzrJHPszZsjnk5wEBSYHI2c= -github.com/natefinch/lumberjack v2.0.0+incompatible/go.mod h1:Wi9p2TTF5DG5oU+6YfsmYQpsTIOm0B1VNzQg9Mw6nPk= -github.com/nats-io/gnatsd v1.4.1/go.mod h1:nqco77VO78hLCJpIcVfygDP2rPGfsEHkGTUk94uh5DQ= -github.com/nats-io/go-nats v1.7.0/go.mod h1:+t7RHT5ApZebkrQdnn6AhQJmhJJiKAvJUio1PiiCtj0= -github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= -github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= -github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nkeys v0.0.2/go.mod h1:dab7URMsZm6Z/jp9Z5UGa87Uutgc2mVpXLC4B7TDb/4= -github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nuid v1.0.0/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32/go.mod h1:9wM+0iRr9ahx58uYLpLIr5fm8diHn0JbqRycJi6w0Ms= -github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU= -github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nwaples/rardecode v1.0.0/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/octago/sflags v0.2.0/go.mod h1:G0bjdxh4qPRycF74a2B8pU36iTp9QHGx0w0dFZXPt80= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.2/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= -github.com/onsi/ginkgo/v2 v2.1.4/go.mod h1:um6tUpWM/cxCK3/FK8BXqEiUMUwRgSM4JXG47RKZmLU= -github.com/onsi/ginkgo/v2 v2.1.6/go.mod h1:MEH45j8TBi6u9BMogfbp0stKC5cdGjumZj5Y7AG4VIk= -github.com/onsi/ginkgo/v2 v2.3.0/go.mod h1:Eew0uilEqZmIEZr8JrvYlvOM7Rr6xzTmMV8AyFNU9d0= -github.com/onsi/ginkgo/v2 v2.4.0/go.mod h1:iHkDK1fKGcBoEHT5W7YBq4RFWaQulw+caOMkAt4OrFo= -github.com/onsi/ginkgo/v2 v2.5.0/go.mod h1:Luc4sArBICYCS8THh8v3i3i5CuSZO+RaQRaJoeNwomw= -github.com/onsi/ginkgo/v2 v2.7.0/go.mod h1:yjiuMwPokqY1XauOgju45q3sJt6VzQ/Fict1LFVcsAo= -github.com/onsi/ginkgo/v2 v2.8.1/go.mod h1:N1/NbDngAFcSLdyZ+/aYTYGSlq9qMCS/cNKGJjy+csc= -github.com/onsi/ginkgo/v2 v2.9.0/go.mod h1:4xkjoL/tZv4SMWeww56BU5kAt19mVB47gTWxmrTcxyk= -github.com/onsi/ginkgo/v2 v2.9.1/go.mod h1:FEcmzVcCHl+4o9bQZVab+4dC9+j+91t2FHSzmGAPfuo= -github.com/onsi/ginkgo/v2 v2.9.2/go.mod h1:WHcJJG2dIlcCqVfBAwUCrJxSPFb6v4azBwgxeMeDuts= -github.com/onsi/ginkgo/v2 v2.9.5/go.mod h1:tvAoo1QUJwNEU2ITftXTpR7R1RbCzoZUOs3RonqW57k= -github.com/onsi/ginkgo/v2 v2.9.7/go.mod h1:cxrmXWykAwTwhQsJOPfdIDiJ+l2RYq7U8hFU+M/1uw0= -github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= -github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= -github.com/onsi/ginkgo/v2 v2.17.1/go.mod h1:llBI3WDLL9Z6taip6f33H76YcWtJv+7R3HigUjbIBOs= -github.com/onsi/ginkgo/v2 v2.17.2/go.mod h1:nP2DPOQoNsQmsVyv5rDA8JkXQoCs6goXIvr/PRJ1eCc= -github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To= -github.com/onsi/ginkgo/v2 v2.20.1/go.mod h1:lG9ey2Z29hR41WMVthyJBGUBcBhGOtoPF2VFMvBXFCI= -github.com/onsi/ginkgo/v2 v2.21.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo= -github.com/onsi/ginkgo/v2 v2.22.2 h1:/3X8Panh8/WwhU/3Ssa6rCKqPLuAkVY2I0RoyDLySlU= -github.com/onsi/ginkgo/v2 v2.22.2/go.mod h1:oeMosUL+8LtarXBHu/c0bx2D/K9zyQ6uX3cTyztHwsk= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v0.0.0-20190113212917-5533ce8a0da3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= -github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= -github.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48= -github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= -github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= -github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/onsi/gomega v1.20.1/go.mod h1:DtrZpjmvpn2mPm4YWQa0/ALMDj9v4YxLgojwPeREyVo= -github.com/onsi/gomega v1.21.1/go.mod h1:iYAIXgPSaDHak0LCMA+AWBpIKBr8WZicMxnE8luStNc= -github.com/onsi/gomega v1.22.1/go.mod h1:x6n7VNe4hw0vkyYUM4mjIXx3JbLiPaBPNgB7PRQ1tuM= -github.com/onsi/gomega v1.24.0/go.mod h1:Z/NWtiqwBrwUt4/2loMmHL63EDLnYHmVbuBpDr2vQAg= -github.com/onsi/gomega v1.24.1/go.mod h1:3AOiACssS3/MajrniINInwbfOOtfZvplPzuRSmvt1jM= -github.com/onsi/gomega v1.26.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM= -github.com/onsi/gomega v1.27.1/go.mod h1:aHX5xOykVYzWOV4WqQy0sy8BQptgukenXpCXfadcIAw= -github.com/onsi/gomega v1.27.3/go.mod h1:5vG284IBtfDAmDyrK+eGyZmUgUlmi+Wngqo557cZ6Gw= -github.com/onsi/gomega v1.27.4/go.mod h1:riYq/GJKh8hhoM01HN6Vmuy93AarCXCBGpvFDK3q3fQ= -github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg= -github.com/onsi/gomega v1.27.7/go.mod h1:1p8OOlwo2iUUDsHnOrjE5UKYJ+e3W8eQ3qSlRahPmr4= -github.com/onsi/gomega v1.27.8/go.mod h1:2J8vzI/s+2shY9XHRApDkdgPo1TKT7P2u6fXeJKFnNQ= -github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= -github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= -github.com/onsi/gomega v1.33.0/go.mod h1:+925n5YtiFsLzzafLUHzVMBpvvRAzrydIBiSIxjX3wY= -github.com/onsi/gomega v1.33.1/go.mod h1:U4R44UsT+9eLIaYRB2a5qajjtQYn0hauxvRm16AVYg0= -github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY= -github.com/onsi/gomega v1.34.2/go.mod h1:v1xfxRgk0KIsG+QOdm7p8UosrOzPYRo60fd3B/1Dukc= -github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= -github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8= -github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY= -github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= -github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= -github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= -github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= -github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= -github.com/openzipkin/zipkin-go v0.2.0/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/orisano/pixelmatch v0.0.0-20220722002657-fb0b55479cde/go.mod h1:nZgzbfBr3hhjoZnS66nKrHmduYNpc34ny7RK4z5/HM0= -github.com/otiai10/copy v1.0.2/go.mod h1:c7RpqBkwMom4bYTSkLSym4VSJz/XtncWRAj/J4PEIMY= -github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= -github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= +github.com/onsi/ginkgo/v2 v2.27.4 h1:fcEcQW/A++6aZAZQNUmNjvA9PSOzefMJBerHJ4t8v8Y= +github.com/onsi/ginkgo/v2 v2.27.4/go.mod h1:ArE1D/XhNXBXCBkKOLkbsb2c81dQHCRcF5zwn/ykDRo= +github.com/onsi/gomega v1.39.0 h1:y2ROC3hKFmQZJNFeGAMeHZKkjBL65mIZcvrLQBF9k6Q= +github.com/onsi/gomega v1.39.0/go.mod h1:ZCU1pkQcXDO5Sl9/VVEGlDyp+zm0m1cmeG5TOzLgdh4= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.3.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= -github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= -github.com/pelletier/go-toml v1.6.0/go.mod h1:5N711Q9dKgbdkxHL+MEfF31hpT7l0S0s/t2kKREewys= -github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= -github.com/pelletier/go-toml v1.8.0/go.mod h1:D6yutnOGMveHEPV7VQOuvI/gXY61bv+9bAOTRnLElKs= +github.com/pelletier/go-toml v1.9.3 h1:zeC5b1GviRUyKYd6OJPvBU/mcVDVoL1OhT17FCt5dSQ= github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= -github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= -github.com/pierrec/lz4 v0.0.0-20190327172049-315a67e90e41/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= -github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pierrec/lz4 v2.2.6+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= -github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= -github.com/prometheus/client_golang v1.5.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= -github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= -github.com/prometheus/client_model v0.0.0-20170216185247-6f3806018612/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= +github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= -github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.0.0-20180518154759-7600349dcfe1/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.0.0-20181020173914-7e9e6cabbd39/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= -github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= -github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io= -github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= -github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20180612222113-7d6f385de8be/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.0.10/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/common v0.66.1 h1:h5E0h5/Y8niHc5DlaLlWLArTQI7tMrsfQjHV+d9ZoGs= +github.com/prometheus/common v0.66.1/go.mod h1:gcaUsgf3KfRSwHY4dIMXLPV0K/Wg1oZ8+SbZk/HH/dA= github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= -github.com/quasilyte/go-ruleguard v0.1.2-0.20200318202121-b00d7a75d3d8/go.mod h1:CGFX09Ci3pq9QZdj86B+VGIdNj4VyCo2iPOGS9esB/k= -github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/rcrowley/go-metrics v0.0.0-20190706150252-9beb055b7962/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.1.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.3.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= -github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= -github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= -github.com/rubiojr/go-vhd v0.0.0-20160810183302-0bfd3b39853c/go.mod h1:DM5xW0nvfNNm2uytzsvhI3OnX8uzaRAg8UX/CnDqbto= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:hPqNNc0+uJM6H+SuU8sEs5K5IQeKccPqeSjfgcKGgPk= -github.com/ryancurrah/gomodguard v1.0.4/go.mod h1:9T/Cfuxs5StfsocWr4WzDL36HqnX0fVb9d5fSEaLhoE= -github.com/ryancurrah/gomodguard v1.1.0/go.mod h1:4O8tr7hBODaGE6VIhfJDHcwzh5GUccKSJBU0UMXJFVM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sassoftware/go-rpmutils v0.0.0-20190420191620-a8f1baeba37b/go.mod h1:am+Fp8Bt506lA3Rk3QCmSqmYmLMnPDhdDUcosQCAx+I= -github.com/satori/go.uuid v0.0.0-20160713180306-0aa62d5ddceb/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/securego/gosec v0.0.0-20200103095621-79fbf3af8d83/go.mod h1:vvbZ2Ae7AzSq3/kywjUDxSNq2SJ27RxCz2un0H3ePqE= -github.com/securego/gosec v0.0.0-20200401082031-e946c8c39989/go.mod h1:i9l/TNj+yDFh9SZXUTvspXTjbFXgZGP/UvhU1S65A4A= -github.com/securego/gosec/v2 v2.3.0/go.mod h1:UzeVyUXbxukhLeHKV3VVqo7HdoQR9MrRfFmZYotn8ME= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/shirou/gopsutil v0.0.0-20190901111213-e4ec7b275ada/go.mod h1:WWnYX4lzhCH5h/3YBfyVA3VbLYjlMZZAQcW9ojMexNc= -github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= -github.com/shurcooL/githubv4 v0.0.0-20180925043049-51d7b505e2e9/go.mod h1:hAF0iLZy4td2EX+/8Tw+4nodhlMrwN3HupfaXj3zkGo= -github.com/shurcooL/githubv4 v0.0.0-20190718010115-4ba037080260/go.mod h1:hAF0iLZy4td2EX+/8Tw+4nodhlMrwN3HupfaXj3zkGo= -github.com/shurcooL/githubv4 v0.0.0-20191102174205-af46314aec7b/go.mod h1:hAF0iLZy4td2EX+/8Tw+4nodhlMrwN3HupfaXj3zkGo= -github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= -github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= -github.com/shurcooL/graphql v0.0.0-20180924043259-e4a3a37e6d42/go.mod h1:AuYgA5Kyo4c7HfUmvRGs/6rGlMMV/6B1bVnB9JxJEEg= -github.com/shurcooL/graphql v0.0.0-20181231061246-d48a9a75455f/go.mod h1:AuYgA5Kyo4c7HfUmvRGs/6rGlMMV/6B1bVnB9JxJEEg= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= -github.com/sirupsen/logrus v1.0.5/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= -github.com/sirupsen/logrus v1.1.1/go.mod h1:zrgwTnHtNr00buQ1vSptGe8m1f/BbgsPukg8qsT7A+A= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= -github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM= -github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/smartystreets/gunit v1.0.0/go.mod h1:qwPWnhz6pn0NnRBP++URONOVyNkPyr4SauJk4cUOwJs= -github.com/soheilhy/cmux v0.1.3/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/sourcegraph/go-diff v0.5.1/go.mod h1:j2dHj3m8aZgQO8lMTcTnBcXkRRRqi34cd2MNlA9u1mE= -github.com/sourcegraph/go-diff v0.5.3/go.mod h1:v9JDtjCE4HHHCZGId75rg8gkKKa98RVjBcBGsVmMmak= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/afero v1.6.0 h1:xoax2sJ2DT8S8xA2paPFjDCScCNeWsg75VG0DLRreiY= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.0-20180319062004-c439c4fa0937/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/cobra v0.0.6/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= -github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= -github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.6.1/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k= -github.com/spf13/viper v1.6.2/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/spf13/pflag v1.0.9 h1:9exaQaMOCwffKiiiYk6/BndUBv+iRViNW+4lEMi0PvY= +github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.8.1 h1:Kq1fyeebqsBfbjZj4EL7gj2IO0mMaiyjYUWcUsl2O44= github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= -github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= -github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/quantile v0.0.0-20150917103942-b0c588724d25/go.mod h1:lbP8tGiBjZ5YWIc2fzuRpTaz0b/53vT6PEs3QuAWzuU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= -github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -1476,116 +386,31 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/tdakkota/asciicheck v0.0.0-20200416190851-d7f85be797a2/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= -github.com/tdakkota/asciicheck v0.0.0-20200416200610-e657995f937b/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= -github.com/tektoncd/pipeline v0.8.0/go.mod h1:IZzJdiX9EqEMuUcgdnElozdYYRh0/ZRC+NKMLj1K3Yw= -github.com/tektoncd/pipeline v0.10.1/go.mod h1:D2X0exT46zYx95BU7ByM8+erpjoN7thmUBvlKThOszU= -github.com/tektoncd/pipeline v0.11.0/go.mod h1:hlkH32S92+/UODROH0dmxzyuMxfRFp/Nc3e29MewLn8= -github.com/tektoncd/pipeline v0.13.1-0.20200625065359-44f22a067b75/go.mod h1:R5AlT46x/F8n/pFJFjZ1U1q71GWtVXgG7RZkkoRL554= -github.com/tektoncd/plumbing v0.0.0-20191216083742-847dcf196de9/go.mod h1:QZHgU07PRBTRF6N57w4+ApRu8OgfYLFNqCDlfEZaD9Y= -github.com/tektoncd/plumbing v0.0.0-20200217163359-cd0db6e567d2/go.mod h1:QZHgU07PRBTRF6N57w4+ApRu8OgfYLFNqCDlfEZaD9Y= -github.com/tektoncd/plumbing v0.0.0-20200430135134-e53521e1d887/go.mod h1:cZPJIeTIoP7UPTxQyTQLs7VE1TiXJSNj0te+If4Q+jI= -github.com/tektoncd/plumbing/pipelinerun-logs v0.0.0-20191206114338-712d544c2c21/go.mod h1:S62EUWtqmejjJgUMOGB1CCCHRp6C706laH06BoALkzU= -github.com/tetafro/godot v0.3.7/go.mod h1:/7NLHhv08H1+8DNj0MElpAACw1ajsCuf3TKNQxA5S+0= -github.com/tetafro/godot v0.4.2/go.mod h1:/7NLHhv08H1+8DNj0MElpAACw1ajsCuf3TKNQxA5S+0= -github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/timakin/bodyclose v0.0.0-20190930140734-f7f2e9bca95e/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= -github.com/timakin/bodyclose v0.0.0-20200424151742-cb6215831a94/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= -github.com/tj/assert v0.0.0-20171129193455-018094318fb0/go.mod h1:mZ9/Rh9oLWpLLDRpvE+3b7gP/C2YyLFYxNmcLnPTMe0= -github.com/tj/go-elastic v0.0.0-20171221160941-36157cbbebc2/go.mod h1:WjeM0Oo1eNAjXGDx2yma7uG2XoyRZTq1uv3M/o7imD0= -github.com/tj/go-kinesis v0.0.0-20171128231115-08b17f58cb1b/go.mod h1:/yhzCV0xPfx6jb1bBgRFjl5lytqVqZXEaeqWP8lTEao= -github.com/tj/go-spin v1.1.0/go.mod h1:Mg1mzmePZm4dva8Qz60H2lHwmJ2loum4VIrLgVnKwh4= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tommy-muehle/go-mnd v1.1.1/go.mod h1:dSUh0FtTP8VhvkL1S+gUR1OKd9ZnSaozuI6r3m6wOig= -github.com/tommy-muehle/go-mnd v1.3.1-0.20200224220436-e6f9a994e8fa/go.mod h1:dSUh0FtTP8VhvkL1S+gUR1OKd9ZnSaozuI6r3m6wOig= -github.com/trivago/tgo v1.0.1/go.mod h1:w4dpD+3tzNIIiIfkWWa85w5/B77tlvdZckQ+6PkFnhc= -github.com/tsenart/vegeta v12.7.1-0.20190725001342-b5f4fca92137+incompatible/go.mod h1:Smz/ZWfhKRcyDDChZkG3CyTHdj87lHzio/HOCkbndXM= -github.com/ugorji/go v1.1.1/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8= -github.com/ulikunitz/xz v0.5.7/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= -github.com/ultraware/funlen v0.0.2/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= -github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= -github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.18.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/uudashr/gocognit v1.0.1/go.mod h1:j44Ayx2KW4+oB6SWMv8KsmHzZrOInQav7D3cQMJ5JUM= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.2.0/go.mod h1:4vX61m6KN+xDduDNwXrhIAVZaZaZiQ1luJk8LWSxF3s= -github.com/valyala/quicktemplate v1.2.0/go.mod h1:EH+4AkTd43SvgIbQHYu59/cJyxDoOVRUAfrukLPuGJ4= -github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= -github.com/vdemeester/k8s-pkg-credentialprovider v0.0.0-20200107171650-7c61ffa44238/go.mod h1:JwQJCMWpUDqjZrB5jpw0f5VbN7U95zxFy1ZDpoEarGo= -github.com/vdemeester/k8s-pkg-credentialprovider v1.13.12-1/go.mod h1:Fko0rTxEtDW2kju5Ky7yFJNS3IcNvW8IPsp4/e9oev0= -github.com/vdemeester/k8s-pkg-credentialprovider v1.17.4/go.mod h1:inCTmtUdr5KJbreVojo06krnTgaeAz/Z7lynpPk/Q2c= -github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= -github.com/vmware/govmomi v0.20.3/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= +github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= +github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= +github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= +github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= -github.com/xanzy/go-gitlab v0.31.0/go.mod h1:sPLojNBn68fMUWSxIJtdVVIP8uSBYqesTfDUseX11Ug= -github.com/xanzy/go-gitlab v0.32.0/go.mod h1:sPLojNBn68fMUWSxIJtdVVIP8uSBYqesTfDUseX11Ug= -github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4= -github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= -github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= -github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= -github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= -github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= -github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= -github.com/xeipuuv/gojsonschema v1.1.0/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= -github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= -github.com/xiang90/probing v0.0.0-20160813154853-07dd2e8dfe18/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xlab/handysort v0.0.0-20150421192137-fb3537ed64a1/go.mod h1:QcJo0QPSfTONNIgpN5RA8prR7fF8nkF6cTWTcNerRO8= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= -github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= -github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= -go.etcd.io/bbolt v1.3.1-etcd.7/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/etcd v0.0.0-20181031231232-83304cfc808c/go.mod h1:weASp41xM3dk0YHg1s/W8ecdGP5G4teSTMBPpYAaUgA= -go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.3.0/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= -go.mongodb.org/mongo-driver v1.3.4/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= -go.mongodb.org/mongo-driver v1.4.3/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4SoGjYphSc= -go.mongodb.org/mongo-driver v1.4.4/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4SoGjYphSc= -go.mongodb.org/mongo-driver v1.4.6/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4SoGjYphSc= -go.mongodb.org/mongo-driver v1.5.1/go.mod h1:gRXCHX4Jo7J0IJ1oDQyUxF7jfy19UfxniMS4xxMmUqw= -go.mongodb.org/mongo-driver v1.7.3/go.mod h1:NqaYOwnXWr5Pm7AOpO5QFxKJ503nbMse/R79oO62zWg= -go.mongodb.org/mongo-driver v1.7.5/go.mod h1:VXEWRZ6URJIkUq2SCAyapmhH0ZLRBP+FT4xhp5Zvxng= -go.mongodb.org/mongo-driver v1.8.3/go.mod h1:0sQWfOeY63QTntERDJJ/0SuKK0T1uVSgKCuAROlKEPY= -go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= -go.opencensus.io v0.17.0/go.mod h1:mp1VrMQxhlqqDpKvH4UcQUa4YwlzNmymAjPrDdfxNpI= -go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -1597,130 +422,60 @@ go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJyS go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 h1:x7wzEgXfnzJcHDwStJT+mxOz4etr2EcexjqhBvmoakw= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0/go.mod h1:rg+RlpR5dKwaS95IyyZqj5Wd4E13lk/msnTS0Xl9lJM= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 h1:sbiXRNDSWJOTobXh5HyQKjq6wUC5tNybqjIqDpAY4CU= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0/go.mod h1:69uWxva0WgAA/4bu2Yy70SLDBwZXuQ6PbBpbsa5iZrQ= -go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ= -go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q= +go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg= +go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0 h1:1fTNlAIJZGWLP5FVu0fikVry1IsiUnXjf7QFvoNN3Xw= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0/go.mod h1:zjPK58DtkqQFn+YUMbx0M2XV3QgKU0gS9LeGohREyK4= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.35.0 h1:m639+BofXTvcY1q8CGs4ItwQarYtJPOWmVobfM1HpVI= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.35.0/go.mod h1:LjReUci/F4BUyv+y4dwnq3h/26iNOeC3wAIqgvTIZVo= -go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M= -go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE= -go.opentelemetry.io/otel/sdk v1.35.0 h1:iPctf8iprVySXSKJffSS79eOjl9pvxV9ZqOWT0QejKY= -go.opentelemetry.io/otel/sdk v1.35.0/go.mod h1:+ga1bZliga3DxJ3CQGg3updiaAJoNECOgJREo9KHGQg= -go.opentelemetry.io/otel/sdk/metric v1.35.0 h1:1RriWBmCKgkeHEhM7a2uMjMUfP7MsOF5JpUCaEqEI9o= -go.opentelemetry.io/otel/sdk/metric v1.35.0/go.mod h1:is6XYCUMpcKi+ZsOvfluY5YstFnhW0BidkR+gL+qN+w= -go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs= -go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc= +go.opentelemetry.io/otel/metric v1.36.0 h1:MoWPKVhQvJ+eeXWHFBOPoBOi20jh6Iq2CcCREuTYufE= +go.opentelemetry.io/otel/metric v1.36.0/go.mod h1:zC7Ks+yeyJt4xig9DEw9kuUFe5C3zLbVjV2PzT6qzbs= +go.opentelemetry.io/otel/sdk v1.36.0 h1:b6SYIuLRs88ztox4EyrvRti80uXIFy+Sqzoh9kFULbs= +go.opentelemetry.io/otel/sdk v1.36.0/go.mod h1:+lC+mTgD+MUWfjJubi2vvXWcVxyr9rmlshZni72pXeY= +go.opentelemetry.io/otel/sdk/metric v1.36.0 h1:r0ntwwGosWGaa0CrSt8cuNuTcccMXERFwHX4dThiPis= +go.opentelemetry.io/otel/sdk/metric v1.36.0/go.mod h1:qTNOhFDfKRwX0yXOqJYegL5WRaW376QbB7P4Pb0qva4= +go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKrsNd4w= +go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA= go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4= go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4= -go.uber.org/atomic v0.0.0-20181018215023-8dc6146f7569/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.5.1/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -go.uber.org/multierr v0.0.0-20180122172545-ddea229ff1df/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v0.0.0-20180814183419-67bc79d13d15/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.9.2-0.20180814183419-67bc79d13d15/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= -go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI= -go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU= -go.yaml.in/yaml/v3 v3.0.3 h1:bXOww4E/J3f66rav3pX3m8w6jDE4knZjGOw8b5Y6iNE= -go.yaml.in/yaml/v3 v3.0.3/go.mod h1:tBHosrYAkRZjRAOREWbDnBXUf08JOwYq++0QNwQiWzI= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0= +go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= go4.org v0.0.0-20201209231011-d4a079459e60 h1:iqAGo78tVOJXELHQFRjR6TMwItrvXH4hrGJ32I/NFF8= go4.org v0.0.0-20201209231011-d4a079459e60/go.mod h1:CIiUVy99QCPfoE13bO4EZaz5GZMZXMSBGhxRdsvzbkg= -gocloud.dev v0.19.0/go.mod h1:SmKwiR8YwIMMJvQBKLsC3fHNyMwXLw3PMDO+VVteJMI= -golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180608092829-8ac0e0d97ce4/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181015023909-0c41d7ab0a0e/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181025213731-e84da0312774/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190404164418-38d8ce5564a5/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= -golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= -golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191117063200-497ca9f6d64f/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= -golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= -golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= -golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= -golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= -golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= -golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= -golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= -golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4= -golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc= -golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= +golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= -golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1735,66 +490,32 @@ golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPI golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mobile v0.0.0-20190806162312-597adff16ade/go.mod h1:AlhUtkH4DA4asiFC5RgK7ZKmauvtkAVcy9L0epCzlWo= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= 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/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= -golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.19.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= -golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.30.0 h1:fDEXFVZ/fmCKProc/yAXXUijritrDzahmwwefnjoPFk= +golang.org/x/mod v0.30.0/go.mod h1:lAsf5O2EvJeSFMiBxXDki7sCgAxEUcZHXoXMKT4GJKc= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180911220305-26e67e76b6c3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181108082009-03003ca0c849/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190812203447-cdfb69ac37fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190912160710-24e19bdeb0f2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191119073136-fc4aabc6c914/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1805,61 +526,23 @@ golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -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.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= -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/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= -golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= -golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= -golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= -golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= -golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs= -golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8= -golang.org/x/oauth2 v0.0.0-20180724155351-3d292e4d0cdc/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= +golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1870,14 +553,12 @@ golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= -golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= -golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= +golang.org/x/oauth2 v0.33.0 h1:4Q+qn+E5z8gPRJfmRy7C2gGG3T4jIprK6aSYgTXGRpo= +golang.org/x/oauth2 v0.33.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 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-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1885,362 +566,139 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= -golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= -golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= +golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190219203350-90b0e4468f99/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190620070143-6f217b454f45/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190912141932-bc967efca4b8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191112214154-59a1497f0cea/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191119060738-e882bf8e40c2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200317113312-5766fd39f98d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200327173247-9dae0f8f5775/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200610111108-226ff32320da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200828194041-157a740278f4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.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/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= -golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= -golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= +golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.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/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= -golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= -golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= -golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= -golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= -golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= -golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= -golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= -golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4= -golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk= -golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M= -golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4= -golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw= -golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU= +golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= 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.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 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.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -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.12.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/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= -golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= -golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= -golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= -golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= +golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= -golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= -golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= +golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181117154741-2ddaf7f79a09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190221204921-83362c3779f5/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190422233926-fe54fb35175b/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190521203540-521d6ed310dd/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= -golang.org/x/tools v0.0.0-20190719005602-e377ae9d6386/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= -golang.org/x/tools v0.0.0-20190729092621-ff9f1409240a/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= -golang.org/x/tools v0.0.0-20190807223507-b346f7fd45de/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191010075000-0337d82405ff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191010171213-8abd42400456/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112005509-a3f652f18032/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113232020-e2727e816f5a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191118222007-07fc4c7f2b98/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200102140908-9497f49d5709/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200115165105-de0b1760071a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204192400-7124308813f3/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200210192313-1ace956b0e17/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200214144324-88be01311a71/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200303214625-2b0b585e22fe/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200317043434-63da46f3035e/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200331202046-9d5940d49312/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200414032229-332987a829c3/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200422022333-3d57cf2e726e/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200426102838-f3a5411a4c3b/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200502202811-ed308ab3e770/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200527183253-8e7acdbce89d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200601175630-2caf76543d99/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200626171337-aa94e735be7f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200701000337-a32c0cb1d5b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200828161849-5deb26317202/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20200915173823-2db8f0ff891c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20200918232735-d647fc253266/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= -golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= -golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= -golang.org/x/tools v0.9.3/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= -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/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= -golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= -golang.org/x/tools v0.20.0/go.mod h1:WvitBU7JJf6A4jOdg4S1tviW9bhUxkgeCui/0JHctQg= -golang.org/x/tools v0.21.0/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= -golang.org/x/tools v0.23.0/go.mod h1:pnu6ufv6vQkll6szChhK3C3L/ruaIv5eBeztNG8wtsI= -golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ= -golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0= -golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0= -golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw= +golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.39.0 h1:ik4ho21kwuQln40uelmciQPp9SipgNDdrafrYA4TmQQ= +golang.org/x/tools v0.39.0/go.mod h1:JnefbkDPyD8UU2kI5fuf8ZX4/yUeh9W877ZeBONxUqQ= 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= -gomodules.xyz/jsonpatch/v2 v2.0.1/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= -gomodules.xyz/jsonpatch/v2 v2.1.0/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= -gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= -gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0= -gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e/go.mod h1:kS+toOQn6AQKjmKJ7gzohV1XkqsFehRA2FbsbkopSuQ= -google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.0.0-20181021000519-a2651947f503/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= +gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= +gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.5.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.6.0/go.mod h1:btoxGiFvQNVUZQ8W08zLtrVS08CNpINPEfxXxgJL1Q4= -google.golang.org/api v0.6.1-0.20190607001116-5213b8090861/go.mod h1:btoxGiFvQNVUZQ8W08zLtrVS08CNpINPEfxXxgJL1Q4= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.10.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= @@ -2250,13 +708,9 @@ google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/ google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.25.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.26.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.31.0/go.mod h1:CL+9IBCa2WWU6gRuBWaKqGWLFFwbEUXkfeMkHLQWYWo= -google.golang.org/api v0.32.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= @@ -2266,35 +720,20 @@ google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1Avk google.golang.org/api v0.187.0 h1:Mxs7VATVC2v7CY+7Xwm4ndkX71hpElcvx0D1Ji/p1eo= google.golang.org/api v0.187.0/go.mod h1:KIHlTc4x7N7gKKuVsdmfBXN13yEEWXWFURWY6SBp2gk= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= -google.golang.org/genproto v0.0.0-20170731182057-09f6ed296fc6/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20180608181217-32ee49c4dd80/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20181016170114-94acd270e44e/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190508193815-b515fa19cec8/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190620144150-6af8c5fc6601/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190708153700-3bdd9d9f5532/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190716160619-c506a9f90610/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191009194640-548a555dbc03/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= @@ -2307,31 +746,18 @@ google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200317114155-1f3552e48f24/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200326112834-f447254575fd/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200527145253-8367513e4ece/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200528110217-3d3490e7e671/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200603110839-e855014d5736/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200626011028-ee7919e894b5/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200701001935-0939c5918c31/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804151602-45615f50871c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200831141814-d751682dd103/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200914193844-75d14daec038/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200921151605-7abf4a1a14d5/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -2343,26 +769,14 @@ google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaE google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20240624140628-dc46fd24d27d h1:PksQg4dV6Sem3/HkBX+Ltq8T0ke0PKIRBNBatoDTVls= google.golang.org/genproto v0.0.0-20240624140628-dc46fd24d27d/go.mod h1:s7iA721uChleev562UJO2OYB0PPT9CMFjV+Ce7VJH5M= -google.golang.org/genproto/googleapis/api v0.0.0-20250218202821-56aae31c358a h1:nwKuGPlUAt+aR+pcrkfFRrTU1BVrSmYyYMxYbUIVHr0= -google.golang.org/genproto/googleapis/api v0.0.0-20250218202821-56aae31c358a/go.mod h1:3kWAYMk1I75K4vykHtKt2ycnOgpA6974V7bREqbsenU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250218202821-56aae31c358a h1:51aaUVRocpvUOSQKM6Q7VuoaktNIaMCLuhZB6DKksq4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250218202821-56aae31c358a/go.mod h1:uRxBH1mhmO8PGhU89cMcHaXKZqO+OfakD8QQO0oYwlQ= -google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.13.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.15.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= -google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb h1:p31xT4yrYrSM/G4Sn2+TNUkVhFCbG9y8itM2S6Th950= +google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:jbe3Bkdp+Dh2IrslsFCklNhweNTBgSYanP1UXhJDhKg= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250528174236-200df99c418a h1:v2PbRU4K3llS09c7zodFpNePeamkAwG3mPrAery9VeE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250528174236-200df99c418a/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= @@ -2372,7 +786,6 @@ google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3Iji google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= 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.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= @@ -2380,8 +793,8 @@ google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.71.0 h1:kF77BGdPTQ4/JZWMlb9VpJ5pa25aqvVqogsxNHHdeBg= -google.golang.org/grpc v1.71.0/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec= +google.golang.org/grpc v1.72.2 h1:TdbGzwb82ty4OusHWepvFWGLgIbNo1/SUynEN0ssqv8= +google.golang.org/grpc v1.72.2/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -2394,298 +807,74 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= 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.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= -google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= -google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= -google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= -gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc= +google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/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/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4= -gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gcfg.v1 v1.2.0/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= +gopkg.in/evanphx/json-patch.v4 v4.13.0 h1:czT3CmqEaQ1aanPc5SdlgQrrEIb8w/wwCvWWnfEbYzo= +gopkg.in/evanphx/json-patch.v4 v4.13.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= gopkg.in/gcfg.v1 v1.2.3 h1:m8OOJ4ccYHnx2f4gQwpno8nAX5OGOh7RLaaz0pj3Ogs= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= -gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= -gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= -gopkg.in/go-playground/validator.v9 v9.31.0/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ= -gopkg.in/inf.v0 v0.9.0/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.46.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.52.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.56.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= -gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= -gopkg.in/jcmturner/gokrb5.v7 v7.2.3/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= -gopkg.in/jcmturner/gokrb5.v7 v7.3.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= -gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= -gopkg.in/natefinch/lumberjack.v2 v2.0.0-20150622162204-20b71e5b60d7/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/robfig/cron.v2 v2.0.0-20150107220207-be2e0b0deed5/go.mod h1:hiOFpYm0ZJbusNj2ywpbrXowU3G8U6GIQzqn2mw1UIE= -gopkg.in/square/go-jose.v2 v2.0.0-20180411045311-89060dee6a84/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= -gopkg.in/src-d/go-git-fixtures.v3 v3.5.0/go.mod h1:dLBcvytrw/TYZsNTWCnkNF2DSIlzWYqTe3rJR56Ac7g= -gopkg.in/src-d/go-git.v4 v4.13.1/go.mod h1:nx5NYcxdKxq5fpltdHnPa2Exj4Sx0EclMWZQbYDu2z8= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/warnings.v0 v0.1.1/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/ini.v1 v1.67.1 h1:tVBILHy0R6e4wkYOn3XmiITt/hEVH4TFMYvAX2Ytz6k= +gopkg.in/ini.v1 v1.67.1/go.mod h1:x/cyOwCgZqOkJoDIJ3c1KNHMo10+nLGAhh+kn3Zizss= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0/go.mod h1:WDnlLJ4WF5VGsH/HVa3CI79GS0ol3YnhVnKP89i0kNg= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -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.3/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.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.7/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-20190709130402-674ba3eaed22/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/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= -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -helm.sh/helm/v3 v3.1.1/go.mod h1:WYsFJuMASa/4XUqLyv54s0U/f3mlAaRErGmyy4z921g= -honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.2/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= 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.0.0-20180904230853-4e7be11eab3f/go.mod h1:iuAfoD4hCxJ8Onx9kaTIt30j7jUFS00AXQi6QMi99vA= -k8s.io/api v0.0.0-20181018013834-843ad2d9b9ae/go.mod h1:iuAfoD4hCxJ8Onx9kaTIt30j7jUFS00AXQi6QMi99vA= -k8s.io/api v0.0.0-20190918195907-bd6ac527cfd2/go.mod h1:AOxZTnaXR/xiarlQL0JUfwQPxjmKDvVYoRp58cA7lUo= -k8s.io/api v0.16.4/go.mod h1:AtzMnsR45tccQss5q8RnF+W8L81DH6XwXwo/joEx9u0= -k8s.io/api v0.16.13/go.mod h1:QWu8UWSTiuQZMMeYjwLs6ILu5O74qKSJ0c+4vrchDxs= -k8s.io/api v0.17.0/go.mod h1:npsyOePkeP0CPwyGfXDHxvypiYMJxBWAMpQxCaJ4ZxI= -k8s.io/api v0.17.2/go.mod h1:BS9fjjLc4CMuqfSO8vgbHPKMt5+SF0ET6u/RVDihTo4= -k8s.io/api v0.17.3/go.mod h1:YZ0OTkuw7ipbe305fMpIdf3GLXZKRigjtZaV5gzC2J0= -k8s.io/api v0.17.4/go.mod h1:5qxx6vjmwUVG2nHQTKGlLts8Tbok8PzHl4vHtVFuZCA= -k8s.io/api v0.17.6/go.mod h1:1jKVwkj0UZ4huak/yRt3MFfU5wc32+B41SkNN5HhyFg= -k8s.io/api v0.21.1/go.mod h1:FstGROTmsSHBarKc8bylzXih8BLNYTiS3TZcsoEDg2s= -k8s.io/api v0.32.2/go.mod h1:hKlhk4x1sJyYnHENsrdCWw31FEmCijNGPJO5WzHiJ6Y= -k8s.io/api v0.33.3 h1:SRd5t//hhkI1buzxb288fy2xvjubstenEKL9K51KBI8= -k8s.io/api v0.33.3/go.mod h1:01Y/iLUjNBM3TAvypct7DIj0M0NIZc+PzAHCIo0CYGE= -k8s.io/apiextensions-apiserver v0.0.0-20190918201827-3de75813f604/go.mod h1:7H8sjDlWQu89yWB3FhZfsLyRCRLuoXoCoY5qtwW1q6I= -k8s.io/apiextensions-apiserver v0.16.4/go.mod h1:HYQwjujEkXmQNhap2C9YDdIVOSskGZ3et0Mvjcyjbto= -k8s.io/apiextensions-apiserver v0.17.2/go.mod h1:4KdMpjkEjjDI2pPfBA15OscyNldHWdBCfsWMDWAmSTs= -k8s.io/apiextensions-apiserver v0.17.6/go.mod h1:Z3CHLP3Tha+Rbav7JR3S+ye427UaJkHBomK2c4XtZ3A= -k8s.io/apiextensions-apiserver v0.21.1/go.mod h1:KESQFCGjqVcVsZ9g0xX5bacMjyX5emuWcS2arzdEouA= -k8s.io/apimachinery v0.0.0-20180904193909-def12e63c512/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= -k8s.io/apimachinery v0.0.0-20181015213631-60666be32c5d/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= -k8s.io/apimachinery v0.0.0-20190703205208-4cfb76a8bf76/go.mod h1:M2fZgZL9DbLfeJaPBCDqSqNsdsmLN+V29knYJnIXlMA= -k8s.io/apimachinery v0.0.0-20190816221834-a9f1d8a9c101/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0= -k8s.io/apimachinery v0.0.0-20190817020851-f2f3a405f61d/go.mod h1:3jediapYqJ2w1BFw7lAZPCx7scubsTfosqHkhXCWJKw= -k8s.io/apimachinery v0.16.4/go.mod h1:llRdnznGEAqC3DcNm6yEj472xaFVfLM7hnYofMb12tQ= -k8s.io/apimachinery v0.16.5-beta.1/go.mod h1:llRdnznGEAqC3DcNm6yEj472xaFVfLM7hnYofMb12tQ= -k8s.io/apimachinery v0.16.13/go.mod h1:4HMHS3mDHtVttspuuhrJ1GGr/0S9B6iWYWZ57KnnZqQ= -k8s.io/apimachinery v0.17.0/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZg= -k8s.io/apimachinery v0.17.1/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZg= -k8s.io/apimachinery v0.17.2/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZg= -k8s.io/apimachinery v0.17.3/go.mod h1:gxLnyZcGNdZTCLnq3fgzyg2A5BVCHTNDFrw8AmuJ+0g= -k8s.io/apimachinery v0.17.4/go.mod h1:gxLnyZcGNdZTCLnq3fgzyg2A5BVCHTNDFrw8AmuJ+0g= -k8s.io/apimachinery v0.17.6/go.mod h1:Lg8zZ5iC/O8UjCqW6DNhcQG2m4TdjF9kwG3891OWbbA= -k8s.io/apimachinery v0.18.5/go.mod h1:OaXp26zu/5J7p0f92ASynJa1pZo06YlV9fG7BoWbCko= -k8s.io/apimachinery v0.21.1/go.mod h1:jbreFvJo3ov9rj7eWT7+sYiRx+qZuCYXwWT1bcDswPY= -k8s.io/apimachinery v0.32.2/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= -k8s.io/apimachinery v0.33.3 h1:4ZSrmNa0c/ZpZJhAgRdcsFcZOw1PQU1bALVQ0B3I5LA= -k8s.io/apimachinery v0.33.3/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM= -k8s.io/apiserver v0.0.0-20190918200908-1e17798da8c1/go.mod h1:4FuDU+iKPjdsdQSN3GsEKZLB/feQsj1y9dhhBDVV2Ns= -k8s.io/apiserver v0.16.4/go.mod h1:kbLJOak655g6W7C+muqu1F76u9wnEycfKMqbVaXIdAc= -k8s.io/apiserver v0.17.0/go.mod h1:ABM+9x/prjINN6iiffRVNCBR2Wk7uY4z+EtEGZD48cg= -k8s.io/apiserver v0.17.2/go.mod h1:lBmw/TtQdtxvrTk0e2cgtOxHizXI+d0mmGQURIHQZlo= -k8s.io/apiserver v0.17.4/go.mod h1:5ZDQ6Xr5MNBxyi3iUZXS84QOhZl+W7Oq2us/29c0j9I= -k8s.io/apiserver v0.17.6/go.mod h1:sAYqm8hUDNA9aj/TzqwsJoExWrxprKv0tqs/z88qym0= -k8s.io/apiserver v0.21.1/go.mod h1:nLLYZvMWn35glJ4/FZRhzLG/3MPxAaZTgV4FJZdr+tY= -k8s.io/cli-runtime v0.17.2/go.mod h1:aa8t9ziyQdbkuizkNLAw3qe3srSyWh9zlSB7zTqRNPI= -k8s.io/cli-runtime v0.17.3/go.mod h1:X7idckYphH4SZflgNpOOViSxetiMj6xI0viMAjM81TA= -k8s.io/client-go v0.32.2 h1:4dYCD4Nz+9RApM2b/3BtVvBHw54QjMFUl1OLcJG5yOA= -k8s.io/client-go v0.32.2/go.mod h1:fpZ4oJXclZ3r2nDOv+Ux3XcJutfrwjKTCHz2H3sww94= -k8s.io/cloud-provider v0.17.0/go.mod h1:Ze4c3w2C0bRsjkBUoHpFi+qWe3ob1wI2/7cUn+YQIDE= -k8s.io/cloud-provider v0.17.4/go.mod h1:XEjKDzfD+b9MTLXQFlDGkk6Ho8SGMpaU8Uugx/KNK9U= -k8s.io/cloud-provider v0.33.3 h1:HzpZh0W0MJoLkMGYrMjkHbwcGFIZxitgMf4utAwfPEY= -k8s.io/cloud-provider v0.33.3/go.mod h1:KcXaoYCJtTTiP+8IIEHcJDpvg0QzW67+FGWpgkOteDU= -k8s.io/code-generator v0.0.0-20190612205613-18da4a14b22b/go.mod h1:G8bQwmHm2eafm5bgtX67XDZQ8CWKSGu9DekI+yN4Y5I= -k8s.io/code-generator v0.0.0-20190831074504-732c9ca86353/go.mod h1:V5BD6M4CyaN5m+VthcclXWsVcT1Hu+glwa1bi3MIsyE= -k8s.io/code-generator v0.16.4/go.mod h1:mJUgkl06XV4kstAnLHAIzJPVCOzVR+ZcfPIv4fUsFCY= -k8s.io/code-generator v0.17.1/go.mod h1:DVmfPQgxQENqDIzVR2ddLXMH34qeszkKSdH/N+s+38s= -k8s.io/code-generator v0.17.2/go.mod h1:DVmfPQgxQENqDIzVR2ddLXMH34qeszkKSdH/N+s+38s= -k8s.io/code-generator v0.17.3/go.mod h1:l8BLVwASXQZTo2xamW5mQNFCe1XPiAesVq7Y1t7PiQQ= -k8s.io/code-generator v0.17.6/go.mod h1:iiHz51+oTx+Z9D0vB3CH3O4HDDPWrvZyUgUYaIE9h9M= -k8s.io/code-generator v0.18.0/go.mod h1:+UHX5rSbxmR8kzS+FAv7um6dtYrZokQvjHpDSYRVkTc= -k8s.io/code-generator v0.21.1/go.mod h1:hUlps5+9QaTrKx+jiM4rmq7YmH8wPOIko64uZCHDh6Q= -k8s.io/component-base v0.0.0-20190918200425-ed2f0867c778/go.mod h1:DFWQCXgXVLiWtzFaS17KxHdlUeUymP7FLxZSkmL9/jU= -k8s.io/component-base v0.16.4/go.mod h1:GYQ+4hlkEwdlpAp59Ztc4gYuFhdoZqiAJD1unYDJ3FM= -k8s.io/component-base v0.17.0/go.mod h1:rKuRAokNMY2nn2A6LP/MiwpoaMRHpfRnrPaUJJj1Yoc= -k8s.io/component-base v0.17.2/go.mod h1:zMPW3g5aH7cHJpKYQ/ZsGMcgbsA/VyhEugF3QT1awLs= -k8s.io/component-base v0.17.4/go.mod h1:5BRqHMbbQPm2kKu35v3G+CpVq4K0RJKC7TRioF0I9lE= -k8s.io/component-base v0.17.6/go.mod h1:jgRLWl0B0rOzFNtxQ9E4BphPmDqoMafujdau6AdG2Xo= -k8s.io/component-base v0.21.1/go.mod h1:NgzFZ2qu4m1juby4TnrmpR8adRk6ka62YdH5DkIIyKA= -k8s.io/component-base v0.33.3 h1:mlAuyJqyPlKZM7FyaoM/LcunZaaY353RXiOd2+B5tGA= -k8s.io/component-base v0.33.3/go.mod h1:ktBVsBzkI3imDuxYXmVxZ2zxJnYTZ4HAsVj9iF09qp4= -k8s.io/csi-translation-lib v0.17.0/go.mod h1:HEF7MEz7pOLJCnxabi45IPkhSsE/KmxPQksuCrHKWls= -k8s.io/csi-translation-lib v0.17.4/go.mod h1:CsxmjwxEI0tTNMzffIAcgR9lX4wOh6AKHdxQrT7L0oo= -k8s.io/gengo v0.0.0-20190116091435-f8a0810f38af/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20190306031000-7a1b7fb0289f/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20190822140433-26a664648505/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20191108084044-e500ee069b5c/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200205140755-e0e292d8aa12/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo/v2 v2.0.0-20240826214909-a7b603a56eb7/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU= -k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v0.3.1/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v0.3.3/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/api v0.35.1 h1:0PO/1FhlK/EQNVK5+txc4FuhQibV25VLSdLMmGpDE/Q= +k8s.io/api v0.35.1/go.mod h1:28uR9xlXWml9eT0uaGo6y71xK86JBELShLy4wR1XtxM= +k8s.io/apiextensions-apiserver v0.35.1 h1:p5vvALkknlOcAqARwjS20kJffgzHqwyQRM8vHLwgU7w= +k8s.io/apiextensions-apiserver v0.35.1/go.mod h1:2CN4fe1GZ3HMe4wBr25qXyJnJyZaquy4nNlNmb3R7AQ= +k8s.io/apimachinery v0.35.1 h1:yxO6gV555P1YV0SANtnTjXYfiivaTPvCTKX6w6qdDsU= +k8s.io/apimachinery v0.35.1/go.mod h1:jQCgFZFR1F4Ik7hvr2g84RTJSZegBc8yHgFWKn//hns= +k8s.io/client-go v0.35.1 h1:+eSfZHwuo/I19PaSxqumjqZ9l5XiTEKbIaJ+j1wLcLM= +k8s.io/client-go v0.35.1/go.mod h1:1p1KxDt3a0ruRfc/pG4qT/3oHmUj1AhSHEcxNSGg+OA= +k8s.io/cloud-provider v0.35.1 h1:ToV1sqvKzoLJp6H+NuGt3bvTCOOY0L1MZzHAHU0/bRs= +k8s.io/cloud-provider v0.35.1/go.mod h1:zGF/i9YuBODKxj7szGMMIz4DRnjsDy5mg2JU+XbbULA= +k8s.io/component-base v0.35.1 h1:XgvpRf4srp037QWfGBLFsYMUQJkE5yMa94UsJU7pmcE= +k8s.io/component-base v0.35.1/go.mod h1:HI/6jXlwkiOL5zL9bqA3en1Ygv60F03oEpnuU1G56Bs= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kube-openapi v0.0.0-20180731170545-e3762e86a74c/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= -k8s.io/kube-openapi v0.0.0-20190228160746-b3a7cee44a30/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= -k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= -k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= -k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= -k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= -k8s.io/kube-openapi v0.0.0-20200410145947-bcb3869e6f29/go.mod h1:F+5wygcW0wmRTnM3cOgIqGivxkwSWIWT5YdsDbeAOaU= -k8s.io/kube-openapi v0.0.0-20200410163147-594e756bea31/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= -k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE= -k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f/go.mod h1:R/HEjbvWI0qdfb8viZUeVZm0X6IZnxAydC7YU42CMw4= -k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff h1:/usPimJzUKKu+m+TE36gUyGcf03XZEP0ZIKgKj35LS4= -k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff/go.mod h1:5jIi+8yX4RIb8wk3XwBo5Pq2ccx4FP10ohkbSKCZoK8= -k8s.io/kubectl v0.17.2/go.mod h1:y4rfLV0n6aPmvbRCqZQjvOp3ezxsFgpqL+zF5jH/lxk= -k8s.io/kubernetes v1.11.10/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= -k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= -k8s.io/kubernetes v1.14.7/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= -k8s.io/legacy-cloud-providers v0.17.0/go.mod h1:DdzaepJ3RtRy+e5YhNtrCYwlgyK87j/5+Yfp0L9Syp8= -k8s.io/legacy-cloud-providers v0.17.4/go.mod h1:FikRNoD64ECjkxO36gkDgJeiQWwyZTuBkhu+yxOc1Js= -k8s.io/metrics v0.17.2/go.mod h1:3TkNHET4ROd+NfzNxkjoVfQ0Ob4iZnaHmSEA4vYpwLw= -k8s.io/mount-utils v0.33.3 h1:Q1jsnqdS4LdtJSYSXgiQv/XNrRHQncLk3gMYjKNSZrE= -k8s.io/mount-utils v0.33.3/go.mod h1:1JR4rKymg8B8bCPo618hpSAdrpO6XLh0Acqok/xVwPE= -k8s.io/test-infra v0.0.0-20181019233642-2e10a0bbe9b3/go.mod h1:2NzXB13Ji0nqpyublHeiPC4FZwU0TknfvyaaNfl/BTA= -k8s.io/test-infra v0.0.0-20191212060232-70b0b49fe247/go.mod h1:d8SKryJBXAwfCFVL4wieRez47J2NOOAb9d029sWLseQ= -k8s.io/test-infra v0.0.0-20200407001919-bc7f71ef65b8/go.mod h1:/WpJWcaDvuykB322WXP4kJbX8IpalOzuPxA62GpwkJk= -k8s.io/test-infra v0.0.0-20200514184223-ba32c8aae783/go.mod h1:bW6thaPZfL2hW7ecjx2WYwlP9KQLM47/xIJyttkVk5s= -k8s.io/test-infra v0.0.0-20200617221206-ea73eaeab7ff/go.mod h1:L3+cRvwftUq8IW1TrHji5m3msnc4uck/7LsE/GR/aZk= -k8s.io/test-infra v0.0.0-20200630233406-1dca6122872e/go.mod h1:L3+cRvwftUq8IW1TrHji5m3msnc4uck/7LsE/GR/aZk= -k8s.io/test-infra v0.0.0-20210730160938-8ad9b8c53bd8 h1:pTVP23RROkJO3egAdVkF4kcAhY1ODTorTwhOcWk7c7s= -k8s.io/test-infra v0.0.0-20210730160938-8ad9b8c53bd8/go.mod h1:RXgSaKbQA0upN4GGyH38yRkotDJr3myiKWkvdfB5yP4= -k8s.io/utils v0.0.0-20181019225348-5e321f9a457c/go.mod h1:8k8uAuAQ0rXslZKaEWd0c3oVhZz7sSzSiPnVZayjIX0= -k8s.io/utils v0.0.0-20190221042446-c2654d5206da/go.mod h1:8k8uAuAQ0rXslZKaEWd0c3oVhZz7sSzSiPnVZayjIX0= -k8s.io/utils v0.0.0-20190506122338-8fab8cb257d5/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= -k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= -k8s.io/utils v0.0.0-20190907131718-3d4f5b7dea0b/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= -k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= -k8s.io/utils v0.0.0-20200124190032-861946025e34/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= -k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210527160623-6fdb442a123b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro= -k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -knative.dev/caching v0.0.0-20190719140829-2032732871ff/go.mod h1:dHXFU6CGlLlbzaWc32g80cR92iuBSpsslDNBWI8C7eg= -knative.dev/caching v0.0.0-20200116200605-67bca2c83dfa/go.mod h1:dHXFU6CGlLlbzaWc32g80cR92iuBSpsslDNBWI8C7eg= -knative.dev/eventing-contrib v0.6.1-0.20190723221543-5ce18048c08b/go.mod h1:SnXZgSGgMSMLNFTwTnpaOH7hXDzTFtw0J8OmHflNx3g= -knative.dev/eventing-contrib v0.11.2/go.mod h1:SnXZgSGgMSMLNFTwTnpaOH7hXDzTFtw0J8OmHflNx3g= -knative.dev/pkg v0.0.0-20191101194912-56c2594e4f11/go.mod h1:pgODObA1dTyhNoFxPZTTjNWfx6F0aKsKzn+vaT9XO/Q= -knative.dev/pkg v0.0.0-20191111150521-6d806b998379/go.mod h1:pgODObA1dTyhNoFxPZTTjNWfx6F0aKsKzn+vaT9XO/Q= -knative.dev/pkg v0.0.0-20200207155214-fef852970f43/go.mod h1:pgODObA1dTyhNoFxPZTTjNWfx6F0aKsKzn+vaT9XO/Q= -knative.dev/pkg v0.0.0-20200428194351-90fc61bae7f7/go.mod h1:o+e8OVEJKIuvXPsGVPIautjXgs05xbos7G+QMRjuUps= -knative.dev/pkg v0.0.0-20200505191044-3da93ebb24c2/go.mod h1:Q6sL35DdGs8hIQZKdaCXJGgY8f90BmNBKSb8z6d/BTM= -knative.dev/pkg v0.0.0-20200515002500-16d7b963416f/go.mod h1:tMOHGbxtRz8zYFGEGpV/bpoTEM1o89MwYFC4YJXl3GY= -knative.dev/pkg v0.0.0-20200528142800-1c6815d7e4c9/go.mod h1:QgNZTxnwpB/oSpNcfnLVlw+WpEwwyKAvJlvR3hgeltA= -knative.dev/pkg v0.0.0-20200711004937-22502028e31a/go.mod h1:AqAJV6rYi8IGikDjJ/9ZQd9qKdkXVlesVnVjwx62YB8= -knative.dev/test-infra v0.0.0-20200407185800-1b88cb3b45a5/go.mod h1:xcdUkMJrLlBswIZqL5zCuBFOC22WIPMQoVX1L35i0vQ= -knative.dev/test-infra v0.0.0-20200505052144-5ea2f705bb55/go.mod h1:WqF1Azka+FxPZ20keR2zCNtiQA1MP9ZB4BH4HuI+SIU= -knative.dev/test-infra v0.0.0-20200513011557-d03429a76034/go.mod h1:aMif0KXL4g19YCYwsy4Ocjjz5xgPlseYV+B95Oo4JGE= -knative.dev/test-infra v0.0.0-20200519015156-82551620b0a9/go.mod h1:A5b2OAXTOeHT3hHhVQm3dmtbuWvIDP7qzgtqxA3/2pE= -knative.dev/test-infra v0.0.0-20200707183444-aed09e56ddc7/go.mod h1:RjYAhXnZqeHw9+B0zsbqSPlae0lCvjekO/nw5ZMpLCs= -modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= -modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= -modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= -modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= -modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= -mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= -mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= -mvdan.cc/unparam v0.0.0-20190720180237-d51796306d8f/go.mod h1:4G1h5nDURzA3bwVMZIVpwbkw+04kSxk3rAtzlimaUJw= -mvdan.cc/unparam v0.0.0-20200501210554-b37ab49443f7/go.mod h1:HGC5lll35J70Y5v7vCGb9oLhHoScFwkHDJm/05RdSTc= -mvdan.cc/xurls/v2 v2.0.0/go.mod h1:2/webFPYOXN9jp/lzuj0zuAVlF+9g4KPFJANH1oJhRU= -pack.ag/amqp v0.11.0/go.mod h1:4/cbmt4EJXSKlG6LCfWHoqmN0uFdy5i/+YFz+fTfhV4= -pack.ag/amqp v0.11.2/go.mod h1:4/cbmt4EJXSKlG6LCfWHoqmN0uFdy5i/+YFz+fTfhV4= +k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912 h1:Y3gxNAuB0OBLImH611+UDZcmKS3g6CthxToOb37KgwE= +k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912/go.mod h1:kdmbQkyfwUagLfXIad1y2TdrjPFWp2Q89B3qkRwf/pQ= +k8s.io/mount-utils v0.35.1 h1:285K46AH//KVG2xUFzGQUfA1vDsmFRYm4F5Qw4gZDBg= +k8s.io/mount-utils v0.35.1/go.mod h1:ppC4d+mUpfbAJr/V2E8vvxeCEckNM+S5b0kQBQjd3Pw= +k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 h1:SjGebBtkBqHFOli+05xYbK8YF1Dzkbzn+gDM4X9T4Ck= +k8s.io/utils v0.0.0-20251002143259-bc988d571ff4/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/letsencrypt v0.0.3/go.mod h1:buyQKZ6IXrRnB7TdkHP0RyEybLx18HHyOSoTyoOLqNY= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/boskos v0.0.0-20200526191642-45fc818e2d00/go.mod h1:L1ubP7d1CCMSQSjKiZv6dGbh7b4kfoG+dFPj8cfYDnI= -sigs.k8s.io/boskos v0.0.0-20200617235605-f289ba6555ba/go.mod h1:ZO5RV+VxJS9mb6DvZ1yAjywoyq/wQ8b0vDoZxcIA5kE= -sigs.k8s.io/boskos v0.0.0-20220711194915-6cb8a6fb2dd1 h1:KCcH/1chmSLMuUIKT0d0AT9rIapPkO1dXUJ7n128Org= -sigs.k8s.io/boskos v0.0.0-20220711194915-6cb8a6fb2dd1/go.mod h1:VELvEunXNBH+wKjZlM3C7dOIcqbr0twBPRaA4B0PtlU= -sigs.k8s.io/controller-runtime v0.3.0/go.mod h1:Cw6PkEg0Sa7dAYovGT4R0tRkGhHXpYijwNxYhAnAZZk= -sigs.k8s.io/controller-runtime v0.5.0/go.mod h1:REiJzC7Y00U+2YkMbT8wxgrsX5USpXKGhb2sCtAXiT8= -sigs.k8s.io/controller-runtime v0.5.4/go.mod h1:JZUwSMVbxDupo0lTJSSFP5pimEyxGynROImSsqIOx1A= -sigs.k8s.io/controller-runtime v0.9.0/go.mod h1:TgkfvrhhEw3PlI0BRL/5xM+89y3/yc0ZDfdbTl84si8= -sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8= -sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo= -sigs.k8s.io/kustomize v2.0.3+incompatible/go.mod h1:MkjgH3RdOWrievjo6c9T245dYlB5QeXV4WCbnt/PEpU= -sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= +sigs.k8s.io/boskos v0.0.0-20250908171729-5e4ab7284e90 h1:zWIBEqxnGu5n4oJTrzfvl3y15pvBeTeeNDV6+DhHyR8= +sigs.k8s.io/boskos v0.0.0-20250908171729-5e4ab7284e90/go.mod h1:v2jnRiOFvt2Ank4LbddEAFjwfj/+bv7uvrOfcNENTM8= +sigs.k8s.io/controller-runtime v0.23.1 h1:TjJSM80Nf43Mg21+RCy3J70aj/W6KyvDtOlpKf+PupE= +sigs.k8s.io/controller-runtime v0.23.1/go.mod h1:B6COOxKptp+YaUT5q4l6LqUJTRpizbgf9KSRNdQGns0= +sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg= +sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= +sigs.k8s.io/prow v0.0.0-20240619181241-cfb8754e0459 h1:t8nFAgqf4A53NMuaML7xbBkaKcQtN3aqPPHDsVLfWWs= +sigs.k8s.io/prow v0.0.0-20240619181241-cfb8754e0459/go.mod h1:B6hUZArrw0kjY/Q4I5qBJd6lQoZP0nloG0ot1cTMhaA= sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= -sigs.k8s.io/structured-merge-diff v0.0.0-20190302045857-e85c7b244fd2/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= -sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= -sigs.k8s.io/structured-merge-diff v1.0.1-0.20191108220359-b1b620dd3f06/go.mod h1:/ULNhyfzRopfcjskuui0cTITekDduZ7ycKN3oUT9R18= -sigs.k8s.io/structured-merge-diff v1.0.1/go.mod h1:IIgPezJWb76P0hotTxzDbWsMYB8APh18qZnxkomBpxA= -sigs.k8s.io/structured-merge-diff/v2 v2.0.1/go.mod h1:Wb7vfKAodbKgf6tn1Kl0VvGj7mRH6DGaRcixXEJXTsE= -sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= -sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.1.0/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.4.2/go.mod h1:N8f93tFZh9U6vpxwRArLiikrE5/2tiu1w1AGfACIGE4= -sigs.k8s.io/structured-merge-diff/v4 v4.7.0 h1:qPeWmscJcXP0snki5IYF79Z8xrl8ETFxgMd7wez1XkI= -sigs.k8s.io/structured-merge-diff/v4 v4.7.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps= -sigs.k8s.io/testing_frameworks v0.1.1/go.mod h1:VVBKrHmJ6Ekkfz284YKhQePcdycOzNH9qL6ht1zEr/U= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= -sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= +sigs.k8s.io/structured-merge-diff/v6 v6.3.2 h1:kwVWMx5yS1CrnFWA/2QHyRVJ8jM6dBA80uLmm0wJkk8= +sigs.k8s.io/structured-merge-diff/v6 v6.3.2/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= -sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= -sourcegraph.com/sqs/pbtypes v1.0.0/go.mod h1:3AciMUv4qUuRHRHhOG4TZOB+72GdPVz5k+c648qsFS4= -vbom.ml/util v0.0.0-20160121211510-db5cfe13f5cc/go.mod h1:so/NYdZXCz+E3ZpW0uAoCj6uzU2+8OWDFv/HxUSs7kI= -vbom.ml/util v0.0.0-20180919145318-efcd4e0f9787/go.mod h1:so/NYdZXCz+E3ZpW0uAoCj6uzU2+8OWDFv/HxUSs7kI= diff --git a/pkg/common/utils.go b/pkg/common/utils.go index e86373881..590d7c801 100644 --- a/pkg/common/utils.go +++ b/pkg/common/utils.go @@ -34,10 +34,9 @@ import ( "google.golang.org/api/googleapi" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" - "k8s.io/apimachinery/pkg/api/resource" "k8s.io/apimachinery/pkg/util/sets" - volumehelpers "k8s.io/cloud-provider/volume/helpers" "k8s.io/klog/v2" + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/constants" ) const ( @@ -90,33 +89,22 @@ const ( ) var ( - multiRegionalPattern = regexp.MustCompile(multiRegionalLocationFmt) - regionalPattern = regexp.MustCompile(regionalLocationFmt) - // Full or partial URL of the machine type resource, in the format: // zones/zone/machineTypes/machine-type machineTypeRegex = regexp.MustCompile(machineTypePattern) - storagePoolFieldsRegex = regexp.MustCompile(`^projects/([^/]+)/zones/([^/]+)/storagePools/([^/]+)$`) - zoneURIRegex = regexp.MustCompile(zoneURIPattern) // userErrorCodeMap tells how API error types are translated to error codes. userErrorCodeMap = map[int]codes.Code{ - http.StatusForbidden: codes.PermissionDenied, - http.StatusBadRequest: codes.InvalidArgument, - http.StatusTooManyRequests: codes.ResourceExhausted, - http.StatusNotFound: codes.NotFound, - http.StatusConflict: codes.FailedPrecondition, + http.StatusForbidden: codes.PermissionDenied, + http.StatusBadRequest: codes.InvalidArgument, + http.StatusTooManyRequests: codes.ResourceExhausted, + http.StatusNotFound: codes.NotFound, + http.StatusConflict: codes.FailedPrecondition, + http.StatusPreconditionFailed: codes.FailedPrecondition, } - validDataCacheMode = []string{DataCacheModeWriteBack, DataCacheModeWriteThrough} - - // Regular expressions for validating parent_id, key and value of a resource tag. - regexParent = regexp.MustCompile(`(^[1-9][0-9]{0,31}$)|(^[a-z][a-z0-9-]{4,28}[a-z0-9]$)`) - regexKey = regexp.MustCompile(`^[a-zA-Z0-9]([0-9A-Za-z_.-]{0,61}[a-zA-Z0-9])?$`) - regexValue = regexp.MustCompile(`^[a-zA-Z0-9]([0-9A-Za-z_.@%=+:,*#&()\[\]{}\-\s]{0,61}[a-zA-Z0-9])?$`) - csiRetryableErrorCodes = []codes.Code{codes.Canceled, codes.DeadlineExceeded, codes.Unavailable, codes.Aborted, codes.ResourceExhausted} ) @@ -165,9 +153,9 @@ func KeyToVolumeID(volKey *meta.Key, project string) (string, error) { func GenerateUnderspecifiedVolumeID(diskName string, isZonal bool) string { if isZonal { - return fmt.Sprintf(volIDZonalFmt, UnspecifiedValue, UnspecifiedValue, diskName) + return fmt.Sprintf(volIDZonalFmt, constants.UnspecifiedValue, constants.UnspecifiedValue, diskName) } - return fmt.Sprintf(volIDRegionalFmt, UnspecifiedValue, UnspecifiedValue, diskName) + return fmt.Sprintf(volIDRegionalFmt, constants.UnspecifiedValue, constants.UnspecifiedValue, diskName) } func SnapshotIDToProjectKey(id string) (string, string, string, error) { @@ -233,212 +221,6 @@ func CreateZonalVolumeID(project, zone, name string) string { return fmt.Sprintf(volIDZonalFmt, project, zone, name) } -// ConvertLabelsStringToMap converts the labels from string to map -// example: "key1=value1,key2=value2" gets converted into {"key1": "value1", "key2": "value2"} -// See https://cloud.google.com/compute/docs/labeling-resources#label_format for details. -func ConvertLabelsStringToMap(labels string) (map[string]string, error) { - const labelsDelimiter = "," - const labelsKeyValueDelimiter = "=" - - labelsMap := make(map[string]string) - if labels == "" { - return labelsMap, nil - } - - regexKey, _ := regexp.Compile(`^\p{Ll}[\p{Ll}0-9_-]{0,62}$`) - checkLabelKeyFn := func(key string) error { - if !regexKey.MatchString(key) { - return fmt.Errorf("label value %q is invalid (should start with lowercase letter / lowercase letter, digit, _ and - chars are allowed / 1-63 characters", key) - } - return nil - } - - regexValue, _ := regexp.Compile(`^[\p{Ll}0-9_-]{0,63}$`) - checkLabelValueFn := func(value string) error { - if !regexValue.MatchString(value) { - return fmt.Errorf("label value %q is invalid (lowercase letter, digit, _ and - chars are allowed / 0-63 characters", value) - } - - return nil - } - - keyValueStrings := strings.Split(labels, labelsDelimiter) - for _, keyValue := range keyValueStrings { - keyValue := strings.Split(keyValue, labelsKeyValueDelimiter) - - if len(keyValue) != 2 { - return nil, fmt.Errorf("labels %q are invalid, correct format: 'key1=value1,key2=value2'", labels) - } - - key := strings.TrimSpace(keyValue[0]) - if err := checkLabelKeyFn(key); err != nil { - return nil, err - } - - value := strings.TrimSpace(keyValue[1]) - if err := checkLabelValueFn(value); err != nil { - return nil, err - } - - labelsMap[key] = value - } - - const maxNumberOfLabels = 64 - if len(labelsMap) > maxNumberOfLabels { - return nil, fmt.Errorf("more than %d labels is not allowed, given: %d", maxNumberOfLabels, len(labelsMap)) - } - - return labelsMap, nil -} - -// ConvertTagsStringToMap converts the tags from string to Tag slice -// example: "parent_id1/tag_key1/tag_value1,parent_id2/tag_key2/tag_value2" gets -// converted into {"parent_id1/tag_key1":"tag_value1", "parent_id2/tag_key2":"tag_value2"} -// See https://cloud.google.com/resource-manager/docs/tags/tags-overview, -// https://cloud.google.com/resource-manager/docs/tags/tags-creating-and-managing for details -func ConvertTagsStringToMap(tags string) (map[string]string, error) { - const tagsDelimiter = "," - const tagsParentIDKeyValueDelimiter = "/" - - tagsMap := make(map[string]string) - if tags == "" { - return nil, nil - } - - checkTagParentIDFn := func(tag, parentID string) error { - if !regexParent.MatchString(parentID) { - return fmt.Errorf("tag parent_id %q for tag %q is invalid. parent_id can have a maximum of 32 characters and cannot be empty. parent_id can be either OrganizationID or ProjectID. OrganizationID must consist of decimal numbers, and cannot have leading zeroes and ProjectID must be 6 to 30 characters in length, can only contain lowercase letters, numbers, and hyphens, and must start with a letter, and cannot end with a hyphen", parentID, tag) - } - return nil - } - - checkTagKeyFn := func(tag, key string) error { - if !regexKey.MatchString(key) { - return fmt.Errorf("tag key %q for tag %q is invalid. Tag key can have a maximum of 63 characters and cannot be empty. Tag key must begin and end with an alphanumeric character, and must contain only uppercase, lowercase alphanumeric characters, and the following special characters `._-`", key, tag) - } - return nil - } - - checkTagValueFn := func(tag, value string) error { - if !regexValue.MatchString(value) { - return fmt.Errorf("tag value %q for tag %q is invalid. Tag value can have a maximum of 63 characters and cannot be empty. Tag value must begin and end with an alphanumeric character, and must contain only uppercase, lowercase alphanumeric characters, and the following special characters `_-.@%%=+:,*#&(){}[]` and spaces", value, tag) - } - - return nil - } - - checkTagParentIDKey := sets.String{} - parentIDkeyValueStrings := strings.Split(tags, tagsDelimiter) - for _, parentIDkeyValueString := range parentIDkeyValueStrings { - parentIDKeyValue := strings.Split(parentIDkeyValueString, tagsParentIDKeyValueDelimiter) - - if len(parentIDKeyValue) != 3 { - return nil, fmt.Errorf("tag %q is invalid, correct format: 'parent_id1/key1/value1,parent_id2/key2/value2'", parentIDkeyValueString) - } - - parentID := strings.TrimSpace(parentIDKeyValue[0]) - if err := checkTagParentIDFn(parentIDkeyValueString, parentID); err != nil { - return nil, err - } - - key := strings.TrimSpace(parentIDKeyValue[1]) - if err := checkTagKeyFn(parentIDkeyValueString, key); err != nil { - return nil, err - } - - value := strings.TrimSpace(parentIDKeyValue[2]) - if err := checkTagValueFn(parentIDkeyValueString, value); err != nil { - return nil, err - } - - parentIDKeyStr := fmt.Sprintf("%s/%s", parentID, key) - if checkTagParentIDKey.Has(parentIDKeyStr) { - return nil, fmt.Errorf("tag parent_id & key combination %q exists more than once", parentIDKeyStr) - } - checkTagParentIDKey.Insert(parentIDKeyStr) - - tagsMap[parentIDKeyStr] = value - } - - // The maximum number of tags allowed per resource is 50. For more details check the following: - // https://cloud.google.com/resource-manager/docs/tags/tags-creating-and-managing#attaching - // https://cloud.google.com/resource-manager/docs/limits#tag-limits - const maxNumberOfTags = 50 - if len(tagsMap) > maxNumberOfTags { - return nil, fmt.Errorf("more than %d tags is not allowed, given: %d", maxNumberOfTags, len(tagsMap)) - } - - return tagsMap, nil -} - -// ProcessStorageLocations trims and normalizes storage location to lower letters. -func ProcessStorageLocations(storageLocations string) ([]string, error) { - normalizedLoc := strings.ToLower(strings.TrimSpace(storageLocations)) - if !multiRegionalPattern.MatchString(normalizedLoc) && !regionalPattern.MatchString(normalizedLoc) { - return []string{}, fmt.Errorf("invalid location for snapshot: %q", storageLocations) - } - return []string{normalizedLoc}, nil -} - -// ValidateSnapshotType validates the type -func ValidateSnapshotType(snapshotType string) error { - switch snapshotType { - case DiskSnapshotType, DiskImageType: - return nil - default: - return fmt.Errorf("invalid snapshot type %s", snapshotType) - } -} - -// ConvertStringToInt64 converts a string to int64 -func ConvertStringToInt64(str string) (int64, error) { - quantity, err := resource.ParseQuantity(str) - if err != nil { - return -1, err - } - return volumehelpers.RoundUpToB(quantity) -} - -// ConvertMiStringToInt64 converts a GiB string to int64 -func ConvertMiStringToInt64(str string) (int64, error) { - quantity, err := resource.ParseQuantity(str) - if err != nil { - return -1, err - } - return volumehelpers.RoundUpToMiB(quantity) -} - -// ConvertGiStringToInt64 converts a GiB string to int64 -func ConvertGiStringToInt64(str string) (int64, error) { - quantity, err := resource.ParseQuantity(str) - if err != nil { - return -1, err - } - return volumehelpers.RoundUpToGiB(quantity) -} - -// ConvertStringToBool converts a string to a boolean. -func ConvertStringToBool(str string) (bool, error) { - switch strings.ToLower(str) { - case "true": - return true, nil - case "false": - return false, nil - } - return false, fmt.Errorf("Unexpected boolean string %s", str) -} - -// ConvertStringToAvailabilityClass converts a string to an availability class string. -func ConvertStringToAvailabilityClass(str string) (string, error) { - switch strings.ToLower(str) { - case ParameterNoAvailabilityClass: - return ParameterNoAvailabilityClass, nil - case ParameterRegionalHardFailoverClass: - return ParameterRegionalHardFailoverClass, nil - } - return "", fmt.Errorf("Unexpected boolean string %s", str) -} - // ParseMachineType returns an extracted machineType from a URL, or empty if not found. // machineTypeUrl: Full or partial URL of the machine type resource, in the format: // @@ -613,12 +395,6 @@ func NewCombinedError(msg string, errs []error) error { return LoggedError(msg, errors.Join(errs...)) } -func isValidDiskEncryptionKmsKey(DiskEncryptionKmsKey string) bool { - // Validate key against default kmskey pattern - kmsKeyPattern := regexp.MustCompile("projects/[^/]+/locations/([^/]+)/keyRings/[^/]+/cryptoKeys/[^/]+") - return kmsKeyPattern.MatchString(DiskEncryptionKmsKey) -} - func ParseZoneFromURI(zoneURI string) (string, error) { zoneMatch := zoneURIRegex.FindStringSubmatch(zoneURI) if zoneMatch == nil { @@ -627,66 +403,6 @@ func ParseZoneFromURI(zoneURI string) (string, error) { return zoneMatch[1], nil } -// ParseStoragePools returns an error if none of the given storagePools -// (delimited by a comma) are in the format -// projects/project/zones/zone/storagePools/storagePool. -func ParseStoragePools(storagePools string) ([]StoragePool, error) { - spSlice := strings.Split(storagePools, ",") - parsedStoragePools := []StoragePool{} - for _, sp := range spSlice { - project, location, spName, err := fieldsFromStoragePoolResourceName(sp) - if err != nil { - return nil, err - } - spObj := StoragePool{Project: project, Zone: location, Name: spName, ResourceName: sp} - parsedStoragePools = append(parsedStoragePools, spObj) - - } - return parsedStoragePools, nil -} - -// fieldsFromResourceName returns the project, zone, and Storage Pool name from the given -// Storage Pool resource name. The resource name must be in the format -// projects/project/zones/zone/storagePools/storagePool. -// All other formats are invalid, and an error will be returned. -func fieldsFromStoragePoolResourceName(resourceName string) (project, location, spName string, err error) { - fieldMatches := storagePoolFieldsRegex.FindStringSubmatch(resourceName) - // Field matches should have 4 strings: [resourceName, project, zone, storagePool]. The first - // match is the entire string. - if len(fieldMatches) != 4 { - err := fmt.Errorf("invalid Storage Pool resource name. Got %s, expected projects/project/zones/zone/storagePools/storagePool", resourceName) - return "", "", "", err - } - project = fieldMatches[1] - location = fieldMatches[2] - spName = fieldMatches[3] - return -} - -// StoragePoolZones returns the unique zones of the given storage pool resource names. -// Returns an error if multiple storage pools in 1 zone are found. -func StoragePoolZones(storagePools []StoragePool) ([]string, error) { - zonesSet := sets.String{} - var zones []string - for _, sp := range storagePools { - if zonesSet.Has(sp.Zone) { - return nil, fmt.Errorf("found multiple storage pools in zone %s. Only one storage pool per zone is allowed", sp.Zone) - } - zonesSet.Insert(sp.Zone) - zones = append(zones, sp.Zone) - } - return zones, nil -} - -func StoragePoolInZone(storagePools []StoragePool, zone string) *StoragePool { - for _, pool := range storagePools { - if zone == pool.Zone { - return &pool - } - } - return nil -} - func UnorderedSlicesEqual(slice1 []string, slice2 []string) bool { set1 := sets.NewString(slice1...) set2 := sets.NewString(slice2...) @@ -705,33 +421,10 @@ func VolumeIdAsMultiZone(volumeId string) (string, error) { if splitId[volIDToplogyKey] != "zones" { return "", fmt.Errorf("expected id to be zonal. Got: %s", volumeId) } - splitId[volIDToplogyValue] = MultiZoneValue + splitId[volIDToplogyValue] = constants.MultiZoneValue return strings.Join(splitId, "/"), nil } -func StringInSlice(s string, list []string) bool { - for _, v := range list { - if v == s { - return true - } - } - return false -} - -func ValidateDataCacheMode(s string) error { - if StringInSlice(s, validDataCacheMode) { - return nil - } - return fmt.Errorf("invalid data-cache-mode %s. Only \"writeback\" and \"writethrough\" is a valid input", s) -} - -func ValidateNonNegativeInt(n int64) error { - if n <= 0 { - return fmt.Errorf("Input should be set to > 0, got %d", n) - } - return nil -} - // NewLimiter returns a token bucket based request rate limiter after initializing // the passed values for limit, burst (or token bucket) size. If opted for emptyBucket // all initial tokens are reserved for the first burst. @@ -764,48 +457,52 @@ func ShortString(s string) string { // GetHyperdiskAttachLimit returns the hyperdisk attach limit based on machine type prefix and vCPUs func GetHyperdiskAttachLimit(machineTypePrefix string, vCPUs int64) int64 { - var limitMap []MachineHyperdiskLimit + var limitMap []constants.MachineHyperdiskLimit switch machineTypePrefix { case "c4": - limitMap = C4MachineHyperdiskAttachLimitMap + limitMap = constants.C4MachineHyperdiskAttachLimitMap case "c4d": - limitMap = C4DMachineHyperdiskAttachLimitMap + limitMap = constants.C4DMachineHyperdiskAttachLimitMap case "n4": - limitMap = N4MachineHyperdiskAttachLimitMap + limitMap = constants.N4MachineHyperdiskAttachLimitMap case "c4a": - limitMap = C4AMachineHyperdiskAttachLimitMap + limitMap = constants.C4AMachineHyperdiskAttachLimitMap case "a4x": - limitMap = A4XMachineHyperdiskAttachLimitMap + limitMap = constants.A4XMachineHyperdiskAttachLimitMap default: // Fallback to the most conservative Gen4 map for unknown types - return MapNumber(vCPUs, C4DMachineHyperdiskAttachLimitMap) + return MapNumber(vCPUs, constants.C4DMachineHyperdiskAttachLimitMap) } return MapNumber(vCPUs, limitMap) } // mapNumber maps the vCPUs to the appropriate hyperdisk limit -func MapNumber(vCPUs int64, limitMap []MachineHyperdiskLimit) int64 { +func MapNumber(vCPUs int64, limitMap []constants.MachineHyperdiskLimit) int64 { for _, limit := range limitMap { - if vCPUs <= limit.max { - return limit.value + if vCPUs <= limit.Max { + return limit.Value } } // Return the last value if vCPUs exceeds all max values if len(limitMap) > 0 { - return limitMap[len(limitMap)-1].value + return limitMap[len(limitMap)-1].Value } return 15 } // HasDiskTypeLabelKeyPrefix checks if the label key starts with the DiskTypeKeyPrefix. func HasDiskTypeLabelKeyPrefix(labelKey string) bool { - return strings.HasPrefix(labelKey, DiskTypeKeyPrefix) + return strings.HasPrefix(labelKey, constants.DiskTypeKeyPrefix) +} + +func DiskTypeFromLabel(labelKey string) string { + return strings.TrimPrefix(labelKey, constants.DiskTypeKeyPrefix+"/") } func DiskTypeLabelKey(diskType string) string { - return fmt.Sprintf("%s/%s", DiskTypeKeyPrefix, diskType) + return fmt.Sprintf("%s/%s", constants.DiskTypeKeyPrefix, diskType) } // IsUpdateIopsThroughputValuesAllowed checks if a disk type is hyperdisk, diff --git a/pkg/common/utils_test.go b/pkg/common/utils_test.go index 84fb46370..4fc079da1 100644 --- a/pkg/common/utils_test.go +++ b/pkg/common/utils_test.go @@ -32,6 +32,7 @@ import ( "google.golang.org/api/googleapi" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/parameters" ) const ( @@ -374,904 +375,6 @@ func TestKeyToVolumeID(t *testing.T) { } -func TestConvertLabelsStringToMap(t *testing.T) { - t.Run("parsing labels string into map", func(t *testing.T) { - testCases := []struct { - name string - labels string - expectedOutput map[string]string - expectedError bool - }{ - { - name: "should return empty map when labels string is empty", - labels: "", - expectedOutput: map[string]string{}, - expectedError: false, - }, - { - name: "single label string", - labels: "key=value", - expectedOutput: map[string]string{ - "key": "value", - }, - expectedError: false, - }, - { - name: "multiple label string", - labels: "key1=value1,key2=value2", - expectedOutput: map[string]string{ - "key1": "value1", - "key2": "value2", - }, - expectedError: false, - }, - { - name: "multiple labels string with whitespaces gets trimmed", - labels: "key1=value1, key2=value2", - expectedOutput: map[string]string{ - "key1": "value1", - "key2": "value2", - }, - expectedError: false, - }, - { - name: "malformed labels string (no keys and values)", - labels: ",,", - expectedOutput: nil, - expectedError: true, - }, - { - name: "malformed labels string (incorrect format)", - labels: "foo,bar", - expectedOutput: nil, - expectedError: true, - }, - { - name: "malformed labels string (missing key)", - labels: "key1=value1,=bar", - expectedOutput: nil, - expectedError: true, - }, - { - name: "malformed labels string (missing key and value)", - labels: "key1=value1,=bar,=", - expectedOutput: nil, - expectedError: true, - }, - } - - for _, tc := range testCases { - t.Logf("test case: %s", tc.name) - output, err := ConvertLabelsStringToMap(tc.labels) - if tc.expectedError && err == nil { - t.Errorf("Expected error but got none") - } - if err != nil { - if !tc.expectedError { - t.Errorf("Did not expect error but got: %v", err) - } - continue - } - - if !reflect.DeepEqual(output, tc.expectedOutput) { - t.Errorf("Got labels %v, but expected %v", output, tc.expectedOutput) - } - } - }) - - t.Run("checking google requirements", func(t *testing.T) { - testCases := []struct { - name string - labels string - expectedError bool - }{ - { - name: "64 labels at most", - labels: `k1=v,k2=v,k3=v,k4=v,k5=v,k6=v,k7=v,k8=v,k9=v,k10=v,k11=v,k12=v,k13=v,k14=v,k15=v,k16=v,k17=v,k18=v,k19=v,k20=v, - k21=v,k22=v,k23=v,k24=v,k25=v,k26=v,k27=v,k28=v,k29=v,k30=v,k31=v,k32=v,k33=v,k34=v,k35=v,k36=v,k37=v,k38=v,k39=v,k40=v, - k41=v,k42=v,k43=v,k44=v,k45=v,k46=v,k47=v,k48=v,k49=v,k50=v,k51=v,k52=v,k53=v,k54=v,k55=v,k56=v,k57=v,k58=v,k59=v,k60=v, - k61=v,k62=v,k63=v,k64=v,k65=v`, - expectedError: true, - }, - { - name: "label key must start with lowercase char (# case)", - labels: "#k=v", - expectedError: true, - }, - { - name: "label key must start with lowercase char (_ case)", - labels: "_k=v", - expectedError: true, - }, - { - name: "label key must start with lowercase char (- case)", - labels: "-k=v", - expectedError: true, - }, - { - name: "label key can only contain lowercase chars, digits, _ and -)", - labels: "k*=v", - expectedError: true, - }, - { - name: "label key may not have over 63 characters", - labels: "abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghij1234=v", - expectedError: true, - }, - { - name: "label key cannot contain . and /", - labels: "kubernetes.io/created-for/pvc/namespace=v", - expectedError: true, - }, - { - name: "label value can only contain lowercase chars, digits, _ and -)", - labels: "k1=###", - expectedError: true, - }, - { - name: "label value may not have over 63 characters", - labels: "abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghij1234=v", - expectedError: true, - }, - { - name: "label value cannot contain . and /", - labels: "kubernetes_io_created-for_pvc_namespace=v./", - expectedError: true, - }, - { - name: "label key can have up to 63 characters", - labels: "abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghij123=v", - expectedError: false, - }, - { - name: "label value can have up to 63 characters", - labels: "abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghij123=v", - expectedError: false, - }, - { - name: "label key can contain _ and -", - labels: "kubernetes_io_created-for_pvc_namespace=v", - expectedError: false, - }, - { - name: "label value can contain _ and -", - labels: "k=my_value-2", - expectedError: false, - }, - } - - for _, tc := range testCases { - t.Logf("test case: %s", tc.name) - _, err := ConvertLabelsStringToMap(tc.labels) - - if tc.expectedError && err == nil { - t.Errorf("Expected error but got none") - } - - if !tc.expectedError && err != nil { - t.Errorf("Did not expect error but got: %v", err) - } - } - }) - -} - -func TestConvertTagsStringToMap(t *testing.T) { - t.Run("parsing tags string into slice", func(t *testing.T) { - testCases := []struct { - name string - tags string - expectedOutput map[string]string - expectedError bool - }{ - { - name: "should return empty slice when tags string is empty", - tags: "", - expectedOutput: nil, - expectedError: false, - }, - { - name: "single tag string", - tags: "parent/key/value", - expectedOutput: map[string]string{"parent/key": "value"}, - expectedError: false, - }, - { - name: "multiple tag string", - tags: "parent1/key1/value1,parent2/key2/value2", - expectedOutput: map[string]string{"parent1/key1": "value1", "parent2/key2": "value2"}, - expectedError: false, - }, - { - name: "multiple tags string with whitespaces gets trimmed", - tags: "parent1/key1/value1, parent2/key2/value2", - expectedOutput: map[string]string{"parent1/key1": "value1", "parent2/key2": "value2"}, - expectedError: false, - }, - { - name: "malformed tags string (no parent_ids, keys and values)", - tags: ",,", - expectedOutput: nil, - expectedError: true, - }, - { - name: "malformed tags string (incorrect format)", - tags: "foo,bar", - expectedOutput: nil, - expectedError: true, - }, - { - name: "malformed tags string (missing parent_id)", - tags: "parent1/key1/value1,/key2/value2", - expectedOutput: nil, - expectedError: true, - }, - { - name: "malformed tags string (missing key)", - tags: "parent1//value1,parent2/key2/value2", - expectedOutput: nil, - expectedError: true, - }, - { - name: "malformed tags string (missing value)", - tags: "parent1/key1/value1,parent2/key2/", - expectedOutput: nil, - expectedError: true, - }, - { - name: "same tag parent_id, key and value string used more than once", - tags: "parent1/key1/value1,parent1/key1/value1", - expectedOutput: nil, - expectedError: true, - }, - { - name: "same tag parent_id & key string used more than once", - tags: "parent1/key1/value1,parent1/key1/value2", - expectedOutput: nil, - expectedError: true, - }, - } - - for _, tc := range testCases { - t.Logf("test case: %s", tc.name) - output, err := ConvertTagsStringToMap(tc.tags) - if tc.expectedError && err == nil { - t.Errorf("Expected error but got none") - } - - if !tc.expectedError && err != nil { - t.Errorf("Did not expect error but got: %v", err) - } - - if err == nil && !reflect.DeepEqual(output, tc.expectedOutput) { - t.Errorf("Got tags %v, but expected %v", output, tc.expectedOutput) - } - } - }) - - t.Run("checking google requirements", func(t *testing.T) { - testCases := []struct { - name string - tags string - expectedError bool - }{ - { - name: "50 tags at most", - tags: `p1/k/v,p2/k/v,p3/k/v,p4/k/v,p5/k/v,p6/k/v,p7/k/v,p8/k/v,p9/k/v,p10/k/v,p11/k/v,p12/k/v,p13/k/v,p14/k/v,p15/k/v,p16/k/v,p17/k/v, - p18/k/v,p19/k/v,p20/k/v,p21/k/v,p22/k/v,p23/k/v,p24/k/v,p25/k/v,p26/k/v,p27/k/v,p28/k/v,p29/k/v,p30/k/v,p31/k/v,p32/k/v,p33/k/v, - p34/k/v,p35/k/v,p36/k/v,p37/k/v,p38/k/v,p39/k/v,p40/k/v,p41/k/v,p42/k/v,p43/k/v,p44/k/v,p45/k/v,p46/k/v,p47/k/v,p48/k/v,p49/k/v, - p50/k/v,p51/k/v`, - expectedError: true, - }, - { - name: "tag parent_id must start with non-zero decimal when OrganizationID is used (leading zeroes case)", - tags: "01/k/v", - expectedError: true, - }, - { - name: "tag parent_id may not have more than 32 characters when OrganizationID is used", - tags: "123546789012345678901234567890123/k/v", - expectedError: true, - }, - { - name: "tag parent_id can have decimal characters when OrganizationID is used", - tags: "1234567890/k/v", - expectedError: false, - }, - { - name: "tag parent_id may not have less than 6 characters when ProjectID is used", - tags: "abcde/k/v", - expectedError: true, - }, - { - name: "tag parent_id must start with lowercase char when ProjectID is used (decimal case)", - tags: "1parent/k/v", - expectedError: true, - }, - { - name: "tag parent_id must start with lowercase char when ProjectID is used (- case)", - tags: "-parent/k/v", - expectedError: true, - }, - { - name: "tag parent_id must end with lowercase alphanumeric char when ProjectID is used (- case)", - tags: "parent-/k/v", - expectedError: true, - }, - { - name: "tag parent_id may not have more than 30 characters when ProjectID is used", - tags: "abcdefghijklmnopqrstuvwxyz12345/k/v", - expectedError: true, - }, - { - name: "tag parent_id can contain lowercase alphanumeric characters and hyphens when ProjectID is used", - tags: "parent-id-100/k/v", - expectedError: false, - }, - { - name: "tag key must start with alphanumeric char (. case)", - tags: "parent/.k/v", - expectedError: true, - }, - { - name: "tag key must start with alphanumeric char (_ case)", - tags: "parent/_k/v", - expectedError: true, - }, - { - name: "tag key must start with alphanumeric char (- case)", - tags: "parent/-k/v", - expectedError: true, - }, - { - name: "tag key can only contain uppercase, lowercase alphanumeric characters, and the following special characters '._-'", - tags: "parent/k*/v", - expectedError: true, - }, - { - name: "tag key may not have over 63 characters", - tags: "parent/abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghij1234/v", - expectedError: true, - }, - { - name: "tag key can contain uppercase, lowercase alphanumeric characters, and the following special characters '._-'", - tags: "parent/Type_of.cloud-platform/v", - expectedError: false, - }, - { - name: "tag value must start with alphanumeric char (. case)", - tags: "parent/k/.v", - expectedError: true, - }, - { - name: "tag value must start with alphanumeric char (_ case)", - tags: "parent/k/_v", - expectedError: true, - }, - { - name: "tag value must start with alphanumeric char (- case)", - tags: "parent/k/-v", - expectedError: true, - }, - { - name: "tag value can only contain uppercase, lowercase alphanumeric characters, and the following special characters `_-.@%%=+:,*#&(){}[]` and spaces", - tags: "parent/k/v*", - expectedError: true, - }, - { - name: "tag value may not have over 63 characters", - tags: "parent/k/abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghij1234", - expectedError: true, - }, - { - name: "tag key can contain uppercase, lowercase alphanumeric characters, and the following special characters `_-.@%%=+:,*#&(){}[]` and spaces", - tags: "parent/k/Special@value[10]{20}(30)-example", - expectedError: false, - }, - } - - for _, tc := range testCases { - t.Logf("test case: %s", tc.name) - _, err := ConvertTagsStringToMap(tc.tags) - - if tc.expectedError && err == nil { - t.Errorf("Expected error but got none") - } - - if !tc.expectedError && err != nil { - t.Errorf("Did not expect error but got: %v", err) - } - } - }) -} - -func TestSnapshotStorageLocations(t *testing.T) { - tests := []struct { - desc string - locationString string - expectedNormalizedLocations []string - expectError bool - }{ - { - "valid multi-region", - " uS ", - []string{"us"}, - false, - }, - { - "valid region", - " US-EAST1", - []string{"us-east1"}, - false, - }, - { - "valid region in large continent", - "europe-west12", - []string{"europe-west12"}, - false, - }, - { - // Zones are not valid bucket/snapshot locations. - "single zone", - "us-east1-a", - []string{}, - true, - }, - } - for _, tc := range tests { - t.Run(tc.desc, func(t *testing.T) { - normalizedLocations, err := ProcessStorageLocations(tc.locationString) - if err != nil && !tc.expectError { - t.Errorf("Got error %v processing storage locations %q; expect no error", err, tc.locationString) - } - if err == nil && tc.expectError { - t.Errorf("Got no error processing storage locations %q; expect an error", tc.locationString) - } - if err == nil && !reflect.DeepEqual(normalizedLocations, tc.expectedNormalizedLocations) { - t.Errorf("Got %v for normalized storage locations; expect %v", normalizedLocations, tc.expectedNormalizedLocations) - } - }) - } -} - -func TestConvertStringToInt64(t *testing.T) { - tests := []struct { - desc string - inputStr string - expInt64 int64 - expectError bool - }{ - { - desc: "valid number string", - inputStr: "10000", - expInt64: 10000, - expectError: false, - }, - { - desc: "test higher number", - inputStr: "15000", - expInt64: 15000, - expectError: false, - }, - { - desc: "round M to number", - inputStr: "1M", - expInt64: 1000000, - expectError: false, - }, - { - desc: "round m to number", - inputStr: "1m", - expInt64: 1, - expectError: false, - }, - { - desc: "round k to number", - inputStr: "1k", - expInt64: 1000, - expectError: false, - }, - { - desc: "invalid empty string", - inputStr: "", - expInt64: 0, - expectError: true, - }, - { - desc: "invalid string", - inputStr: "ew%65", - expInt64: 0, - expectError: true, - }, - { - desc: "invalid KiB string", - inputStr: "10KiB", - expInt64: 10000, - expectError: true, - }, - { - desc: "invalid GB string", - inputStr: "10GB", - expInt64: 0, - expectError: true, - }, - { - desc: "round Ki to number", - inputStr: "1Ki", - expInt64: 1024, - expectError: false, - }, - { - desc: "round k to number", - inputStr: "10k", - expInt64: 10000, - expectError: false, - }, - { - desc: "round Mi to number", - inputStr: "10Mi", - expInt64: 10485760, - expectError: false, - }, - { - desc: "round M to number", - inputStr: "10M", - expInt64: 10000000, - expectError: false, - }, - { - desc: "round G to number", - inputStr: "10G", - expInt64: 10000000000, - expectError: false, - }, - { - desc: "round Gi to number", - inputStr: "100Gi", - expInt64: 107374182400, - expectError: false, - }, - { - desc: "round decimal to number", - inputStr: "1.2Gi", - expInt64: 1288490189, - expectError: false, - }, - { - desc: "round big value to number", - inputStr: "8191Pi", - expInt64: 9222246136947933184, - expectError: false, - }, - } - for _, tc := range tests { - t.Run(tc.desc, func(t *testing.T) { - actualInt64, err := ConvertStringToInt64(tc.inputStr) - if err != nil && !tc.expectError { - t.Errorf("Got error %v converting string to int64 %s; expect no error", err, tc.inputStr) - } - if err == nil && tc.expectError { - t.Errorf("Got no error converting string to int64 %s; expect an error", tc.inputStr) - } - if err == nil && actualInt64 != tc.expInt64 { - t.Errorf("Got %d for converting string to int64; expect %d", actualInt64, tc.expInt64) - } - }) - } -} - -func TestConvertMiStringToInt64(t *testing.T) { - tests := []struct { - desc string - inputStr string - expInt64 int64 - expectError bool - }{ - { - desc: "valid number string", - inputStr: "10000", - expInt64: 1, - expectError: false, - }, - { - desc: "round Ki to MiB", - inputStr: "1000Ki", - expInt64: 1, - expectError: false, - }, - { - desc: "round k to MiB", - inputStr: "1000k", - expInt64: 1, - expectError: false, - }, - { - desc: "round Mi to MiB", - inputStr: "1000Mi", - expInt64: 1000, - expectError: false, - }, - { - desc: "round M to MiB", - inputStr: "1000M", - expInt64: 954, - expectError: false, - }, - { - desc: "round G to MiB", - inputStr: "1000G", - expInt64: 953675, - expectError: false, - }, - { - desc: "round Gi to MiB", - inputStr: "10000Gi", - expInt64: 10240000, - expectError: false, - }, - { - desc: "round decimal to MiB", - inputStr: "1.2Gi", - expInt64: 1229, - expectError: false, - }, - { - desc: "round big value to MiB", - inputStr: "8191Pi", - expInt64: 8795019280384, - expectError: false, - }, - { - desc: "invalid empty string", - inputStr: "", - expInt64: 0, - expectError: true, - }, - { - desc: "invalid KiB string", - inputStr: "10KiB", - expInt64: 10000, - expectError: true, - }, - { - desc: "invalid GB string", - inputStr: "10GB", - expInt64: 0, - expectError: true, - }, - { - desc: "invalid string", - inputStr: "ew%65", - expInt64: 0, - expectError: true, - }, - } - for _, tc := range tests { - t.Run(tc.desc, func(t *testing.T) { - actualInt64, err := ConvertMiStringToInt64(tc.inputStr) - if err != nil && !tc.expectError { - t.Errorf("Got error %v converting string to int64 %s; expect no error", err, tc.inputStr) - } - if err == nil && tc.expectError { - t.Errorf("Got no error converting string to int64 %s; expect an error", tc.inputStr) - } - if err == nil && actualInt64 != tc.expInt64 { - t.Errorf("Got %d for converting string to int64; expect %d", actualInt64, tc.expInt64) - } - }) - } -} - -func TestConvertGiStringToInt64(t *testing.T) { - tests := []struct { - desc string - inputStr string - expInt64 int64 - expectError bool - }{ - { - desc: "valid number string", - inputStr: "10000", - expInt64: 1, - expectError: false, - }, - { - desc: "round Ki to GiB", - inputStr: "1000000Ki", - expInt64: 1, - expectError: false, - }, - { - desc: "round k to GiB", - inputStr: "1000000k", - expInt64: 1, - expectError: false, - }, - { - desc: "round Mi to GiB", - inputStr: "1000Mi", - expInt64: 1, - expectError: false, - }, - { - desc: "round M to GiB", - inputStr: "1000M", - expInt64: 1, - expectError: false, - }, - { - desc: "round G to GiB", - inputStr: "1000G", - expInt64: 932, - expectError: false, - }, - { - desc: "round Gi to GiB - most common case", - inputStr: "1234Gi", - expInt64: 1234, - expectError: false, - }, - { - desc: "round decimal to GiB", - inputStr: "1.2Gi", - expInt64: 2, - expectError: false, - }, - { - desc: "round big value to GiB", - inputStr: "8191Pi", - expInt64: 8588886016, - expectError: false, - }, - { - desc: "invalid empty string", - inputStr: "", - expInt64: 0, - expectError: true, - }, - { - desc: "invalid KiB string", - inputStr: "10KiB", - expInt64: 10000, - expectError: true, - }, - { - desc: "invalid GB string", - inputStr: "10GB", - expInt64: 0, - expectError: true, - }, - { - desc: "invalid string", - inputStr: "ew%65", - expInt64: 0, - expectError: true, - }, - } - for _, tc := range tests { - t.Run(tc.desc, func(t *testing.T) { - actualInt64, err := ConvertGiStringToInt64(tc.inputStr) - if err != nil && !tc.expectError { - t.Errorf("Got error %v converting string to int64 %s; expect no error", err, tc.inputStr) - } - if err == nil && tc.expectError { - t.Errorf("Got no error converting string to int64 %s; expect an error", tc.inputStr) - } - if err == nil && actualInt64 != tc.expInt64 { - t.Errorf("Got %d for converting string to int64; expect %d", actualInt64, tc.expInt64) - } - }) - } -} - -func TestConvertStringToBool(t *testing.T) { - tests := []struct { - desc string - inputStr string - expected bool - expectError bool - }{ - { - desc: "valid true", - inputStr: "true", - expected: true, - expectError: false, - }, - { - desc: "valid mixed case true", - inputStr: "True", - expected: true, - expectError: false, - }, - { - desc: "valid false", - inputStr: "false", - expected: false, - expectError: false, - }, - { - desc: "valid mixed case false", - inputStr: "False", - expected: false, - expectError: false, - }, - { - desc: "invalid", - inputStr: "yes", - expected: false, - expectError: true, - }, - } - for _, tc := range tests { - t.Run(tc.desc, func(t *testing.T) { - got, err := ConvertStringToBool(tc.inputStr) - if err != nil && !tc.expectError { - t.Errorf("Got error %v converting string to bool %s; expect no error", err, tc.inputStr) - } - if err == nil && tc.expectError { - t.Errorf("Got no error converting string to bool %s; expect an error", tc.inputStr) - } - if err == nil && got != tc.expected { - t.Errorf("Got %v for converting string to bool; expect %v", got, tc.expected) - } - }) - } -} - -func TestConvertStringToAvailabilityClass(t *testing.T) { - tests := []struct { - desc string - inputStr string - expected string - expectError bool - }{ - { - desc: "valid none", - inputStr: "none", - expected: ParameterNoAvailabilityClass, - expectError: false, - }, - { - desc: "valid mixed case none", - inputStr: "None", - expected: ParameterNoAvailabilityClass, - expectError: false, - }, - { - desc: "valid failover", - inputStr: "regional-hard-failover", - expected: ParameterRegionalHardFailoverClass, - expectError: false, - }, - { - desc: "valid mixed case failover", - inputStr: "Regional-Hard-Failover", - expected: ParameterRegionalHardFailoverClass, - expectError: false, - }, - { - desc: "invalid", - inputStr: "yes", - expected: "", - expectError: true, - }, - } - for _, tc := range tests { - t.Run(tc.desc, func(t *testing.T) { - got, err := ConvertStringToAvailabilityClass(tc.inputStr) - if err != nil && !tc.expectError { - t.Errorf("Got error %v converting string to availablity class %s; expect no error", err, tc.inputStr) - } - if err == nil && tc.expectError { - t.Errorf("Got no error converting string to availablity class %s; expect an error", tc.inputStr) - } - if err == nil && got != tc.expected { - t.Errorf("Got %v for converting string to availablity class; expect %v", got, tc.expected) - } - }) - } -} - func TestParseMachineType(t *testing.T) { tests := []struct { desc string @@ -1451,6 +554,11 @@ func TestCodeForError(t *testing.T) { inputErr: &TemporaryError{code: codes.Aborted, err: context.Canceled}, expCode: codes.Aborted, }, + { + name: "CMEK precondition failed error, under layers of wrapping", + inputErr: fmt.Errorf("unknown Insert disk error: %w", &googleapi.Error{Code: http.StatusPreconditionFailed, Message: "CMEK policy violated"}), + expCode: codes.FailedPrecondition, + }, } for _, tc := range testCases { @@ -1540,94 +648,16 @@ func TestIsUserMultiAttachError(t *testing.T) { } } -func TestIsValidDiskEncryptionKmsKey(t *testing.T) { - cases := []struct { - diskEncryptionKmsKey string - expectedIsValid bool - }{ - { - diskEncryptionKmsKey: "projects/my-project/locations/us-central1/keyRings/TestKeyRing/cryptoKeys/test-key", - expectedIsValid: true, - }, - { - diskEncryptionKmsKey: "projects/my-project/locations/global/keyRings/TestKeyRing/cryptoKeys/test-key", - expectedIsValid: true, - }, - { - diskEncryptionKmsKey: "projects/my-project/locations/keyRings/TestKeyRing/cryptoKeys/test-key", - expectedIsValid: false, - }, - } - for _, tc := range cases { - isValid := isValidDiskEncryptionKmsKey(tc.diskEncryptionKmsKey) - if tc.expectedIsValid != isValid { - t.Errorf("test failed: the provided key %s expected to be %v bu tgot %v", tc.diskEncryptionKmsKey, tc.expectedIsValid, isValid) - } - } -} - -func TestFieldsFromResourceName(t *testing.T) { - testcases := []struct { - name string - resourceName string - expectedProject string - expectedZone string - expectedName string - expectedErr bool - }{ - { - name: "StoragePool_WithValidResourceName_ReturnsFields", - resourceName: "projects/my-project/zones/us-central1-a/storagePools/storagePool-1", - expectedProject: "my-project", - expectedZone: "us-central1-a", - expectedName: "storagePool-1", - }, - { - name: "StoragePool_WithFullResourceURL_ReturnsError", - resourceName: "https://www.googleapis.com/compute/v1/projects/project/zones/zone/storagePools/storagePool", - expectedErr: true, - }, - { - name: "StoragePool_WithMissingProject_ReturnsError", - resourceName: "zones/us-central1-a/storagePools/storagePool-1", - expectedErr: true, - }, - { - name: "StoragePool_WithMissingZone_ReturnsError", - resourceName: "projects/my-project/storagePools/storagePool-1", - expectedErr: true, - }, - { - name: "StoragePool_WithMissingStoragePoolName_ReturnsError", - resourceName: "projects/my-project/zones/us-central1-a/storagePool-1", - expectedErr: true, - }, - } - for _, tc := range testcases { - t.Run(tc.name, func(t *testing.T) { - project, zone, name, err := fieldsFromStoragePoolResourceName(tc.resourceName) - input := fmt.Sprintf("fieldsFromStoragePoolResourceName(%q)", tc.resourceName) - gotErr := err != nil - if gotErr != tc.expectedErr { - t.Errorf("%s error presence = %v, expected error presence = %v", input, gotErr, tc.expectedErr) - } - if project != tc.expectedProject || zone != tc.expectedZone || name != tc.expectedName { - t.Errorf("%s returned {project: %q, zone: %q, name: %q}, expected {project: %q, zone: %q, name: %q}", input, project, zone, name, tc.expectedProject, tc.expectedZone, tc.expectedName) - } - }) - } -} - func TestZones(t *testing.T) { testcases := []struct { name string - storagePools []StoragePool + storagePools []parameters.StoragePool expectedZones []string expectedErr bool }{ { name: "StoragePools_WithValidResourceNames_ReturnsZones", - storagePools: []StoragePool{ + storagePools: []parameters.StoragePool{ { Project: "my-project", Zone: "us-central1-a", @@ -1645,7 +675,7 @@ func TestZones(t *testing.T) { }, { name: "StoragePools_WithDuplicateZone_ReturnsError", - storagePools: []StoragePool{ + storagePools: []parameters.StoragePool{ { Project: "my-project", Zone: "us-central1-a", @@ -1664,7 +694,7 @@ func TestZones(t *testing.T) { } for _, tc := range testcases { t.Run(tc.name, func(t *testing.T) { - zones, err := StoragePoolZones(tc.storagePools) + zones, err := parameters.StoragePoolZones(tc.storagePools) input := fmt.Sprintf("StoragePoolZones(%q)", tc.storagePools) gotErr := err != nil if gotErr != tc.expectedErr { @@ -1680,14 +710,14 @@ func TestZones(t *testing.T) { func TestStoragePoolInZone(t *testing.T) { testcases := []struct { name string - storagePools []StoragePool + storagePools []parameters.StoragePool zone string - expectedStoragePool *StoragePool + expectedStoragePool *parameters.StoragePool expectedErr bool }{ { name: "ValidStoragePools_ReturnsStoragePoolInZone", - storagePools: []StoragePool{ + storagePools: []parameters.StoragePool{ { Project: "my-project", Zone: "us-central1-a", @@ -1702,7 +732,7 @@ func TestStoragePoolInZone(t *testing.T) { }, }, zone: "us-central1-a", - expectedStoragePool: &StoragePool{ + expectedStoragePool: ¶meters.StoragePool{ Project: "my-project", Zone: "us-central1-a", Name: "storagePool-1", @@ -1711,7 +741,7 @@ func TestStoragePoolInZone(t *testing.T) { }, { name: "StoragePoolNotInZone_ReturnsNil", - storagePools: []StoragePool{ + storagePools: []parameters.StoragePool{ { Project: "my-project", Zone: "us-central1-a", @@ -1725,7 +755,7 @@ func TestStoragePoolInZone(t *testing.T) { } for _, tc := range testcases { t.Run(tc.name, func(t *testing.T) { - sp := StoragePoolInZone(tc.storagePools, tc.zone) + sp := parameters.StoragePoolInZone(tc.storagePools, tc.zone) input := fmt.Sprintf("StoragePoolInZone(%q)", tc.storagePools) if diff := cmp.Diff(tc.expectedStoragePool, sp); diff != "" { t.Errorf("%s: -want, +got \n%s", input, diff) @@ -1777,106 +807,6 @@ func TestUnorderedSlicesEqual(t *testing.T) { } } -func TestStringInSlice(t *testing.T) { - testCases := []struct { - name string - inputStr string - inputSlice []string - expectedInSlice bool - }{ - { - name: "string is in the slice", - inputStr: "in slice", - inputSlice: []string{"in slice", "other string"}, - expectedInSlice: true, - }, - { - name: "string is NOT in the slice", - inputStr: "not in slice", - inputSlice: []string{"other string"}, - }, - } - - for _, tc := range testCases { - t.Logf("test case: %s", tc.name) - actualResult := StringInSlice(tc.inputStr, tc.inputSlice) - if actualResult != tc.expectedInSlice { - t.Errorf("Expect value is %v but got %v. inputStr is %s, inputSlice is %v", tc.expectedInSlice, actualResult, tc.inputStr, tc.inputSlice) - } - } -} - -func TestValidateDataCacheMode(t *testing.T) { - testCases := []struct { - name string - inputStr string - expectError bool - }{ - { - name: "valid input - writethrough", - inputStr: "writethrough", - }, - { - name: "valid input - writeback", - inputStr: "writeback", - }, - { - name: "invalid input", - inputStr: "write-back not valid", - expectError: true, - }, - } - - for _, tc := range testCases { - t.Logf("test case: %s", tc.name) - err := ValidateDataCacheMode(tc.inputStr) - if err != nil && !tc.expectError { - t.Errorf("Got error %v validate data cache mode %s; expect no error", err, tc.inputStr) - } - - if err == nil && tc.expectError { - t.Errorf("Got no error validate data cache mode %s; expect an error", tc.inputStr) - } - } - -} - -func TestValidateNonNegativeInt(t *testing.T) { - testCases := []struct { - name string - cacheSize int64 - expectError bool - }{ - { - name: "valid input - positive cache size", - cacheSize: 100000, - }, - { - name: "invalid input - cachesize 0", - cacheSize: 0, - expectError: true, - }, - { - name: "invalid input - negative cache size", - cacheSize: -100, - expectError: true, - }, - } - - for _, tc := range testCases { - t.Logf("test case: %s", tc.name) - err := ValidateNonNegativeInt(tc.cacheSize) - if err != nil && !tc.expectError { - t.Errorf("Got error %v validate data cache mode %d; expect no error", err, tc.cacheSize) - } - - if err == nil && tc.expectError { - t.Errorf("Got no error validate data cache mode %d; expect an error", tc.cacheSize) - } - } - -} - func TestParseZoneFromURI(t *testing.T) { testcases := []struct { name string diff --git a/pkg/common/volume_lock.go b/pkg/common/volume_lock.go index 65105e426..b1b70e0e9 100644 --- a/pkg/common/volume_lock.go +++ b/pkg/common/volume_lock.go @@ -22,10 +22,6 @@ import ( "k8s.io/apimachinery/pkg/util/sets" ) -const ( - VolumeOperationAlreadyExistsFmt = "An operation with the given Volume ID %s already exists" -) - // VolumeLocks implements a map with atomic operations. It stores a set of all volume IDs // with an ongoing operation. type VolumeLocks struct { diff --git a/pkg/common/constants.go b/pkg/constants/constants.go similarity index 82% rename from pkg/common/constants.go rename to pkg/constants/constants.go index 250105836..26c743e3b 100644 --- a/pkg/common/constants.go +++ b/pkg/constants/constants.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package common +package constants const ( // Keys for Topology. This key will be shared amongst drivers from GCP @@ -29,6 +29,9 @@ const ( UnspecifiedValue = "UNSPECIFIED" + // VolumeOperationAlreadyExistsFmt is the error message format for when a volume operation already exists + VolumeOperationAlreadyExistsFmt = "An operation with the given Volume ID %s already exists" + // Keyword indicating a 'multi-zone' volumeHandle. Replaces "zones" in the volumeHandle: // eg: projects/{project}/zones/multi-zone/disks/{name} vs. // projects/{project}/zones/{zone}/disks/{name} @@ -69,45 +72,45 @@ const ( // doc https://cloud.google.com/compute/docs/general-purpose-machines // MachineHyperdiskLimit represents the mapping between max vCPUs and hyperdisk (balanced) attach limit type MachineHyperdiskLimit struct { - max int64 - value int64 + Max int64 + Value int64 } // C4 Machine Types - Hyperdisk Balanced Limits var C4MachineHyperdiskAttachLimitMap = []MachineHyperdiskLimit{ - {max: 2, value: 7}, - {max: 4, value: 15}, - {max: 24, value: 31}, - {max: 48, value: 63}, - {max: 96, value: 127}, + {Max: 2, Value: 7}, + {Max: 4, Value: 15}, + {Max: 24, Value: 31}, + {Max: 48, Value: 63}, + {Max: 96, Value: 127}, } // C4D Machine Types - Hyperdisk Balanced Limits var C4DMachineHyperdiskAttachLimitMap = []MachineHyperdiskLimit{ - {max: 2, value: 3}, - {max: 4, value: 7}, - {max: 8, value: 15}, - {max: 96, value: 31}, - {max: 192, value: 63}, - {max: 384, value: 127}, + {Max: 2, Value: 3}, + {Max: 4, Value: 7}, + {Max: 8, Value: 15}, + {Max: 96, Value: 31}, + {Max: 192, Value: 63}, + {Max: 384, Value: 127}, } // N4 Machine Types - Hyperdisk Balanced Limits var N4MachineHyperdiskAttachLimitMap = []MachineHyperdiskLimit{ - {max: 8, value: 15}, - {max: 80, value: 31}, + {Max: 8, Value: 15}, + {Max: 80, Value: 31}, } // C4A Machine Types - Hyperdisk Balanced Limits var C4AMachineHyperdiskAttachLimitMap = []MachineHyperdiskLimit{ - {max: 2, value: 7}, - {max: 8, value: 15}, - {max: 48, value: 31}, - {max: 72, value: 63}, + {Max: 2, Value: 7}, + {Max: 8, Value: 15}, + {Max: 48, Value: 31}, + {Max: 72, Value: 63}, } // A4X Machine Types - Hyperdisk Balanced Limits. The max here is actually the GPU count (not CPU, like the others). var A4XMachineHyperdiskAttachLimitMap = []MachineHyperdiskLimit{ - {max: 1, value: 63}, - {max: 2, value: 127}, + {Max: 1, Value: 63}, + {Max: 2, Value: 127}, } diff --git a/pkg/convert/convert.go b/pkg/convert/convert.go new file mode 100644 index 000000000..dd83c6099 --- /dev/null +++ b/pkg/convert/convert.go @@ -0,0 +1,195 @@ +package convert + +import ( + "fmt" + "regexp" + "strings" + + "k8s.io/apimachinery/pkg/api/resource" + "k8s.io/apimachinery/pkg/util/sets" + volumehelpers "k8s.io/cloud-provider/volume/helpers" +) + +var ( + + // Regular expressions for validating parent_id, key and value of a resource tag. + regexParent = regexp.MustCompile(`(^[1-9][0-9]{0,31}$)|(^[a-z][a-z0-9-]{4,28}[a-z0-9]$)`) + regexKey = regexp.MustCompile(`^[a-zA-Z0-9]([0-9A-Za-z_.-]{0,61}[a-zA-Z0-9])?$`) + regexValue = regexp.MustCompile(`^[a-zA-Z0-9]([0-9A-Za-z_.@%=+:,*#&()\[\]{}\-\s]{0,61}[a-zA-Z0-9])?$`) +) + +// ConvertStringToInt64 converts a string to int64 +func ConvertStringToInt64(str string) (int64, error) { + quantity, err := resource.ParseQuantity(str) + if err != nil { + return -1, err + } + return volumehelpers.RoundUpToB(quantity) +} + +// ConvertMiStringToInt64 converts a GiB string to int64 +func ConvertMiStringToInt64(str string) (int64, error) { + quantity, err := resource.ParseQuantity(str) + if err != nil { + return -1, err + } + return volumehelpers.RoundUpToMiB(quantity) +} + +// ConvertGiStringToInt64 converts a GiB string to int64 +func ConvertGiStringToInt64(str string) (int64, error) { + quantity, err := resource.ParseQuantity(str) + if err != nil { + return -1, err + } + return volumehelpers.RoundUpToGiB(quantity) +} + +// ConvertStringToBool converts a string to a boolean. +func ConvertStringToBool(str string) (bool, error) { + switch strings.ToLower(str) { + case "true": + return true, nil + case "false": + return false, nil + } + return false, fmt.Errorf("Unexpected boolean string %s", str) +} + +// ConvertLabelsStringToMap converts the labels from string to map +// example: "key1=value1,key2=value2" gets converted into {"key1": "value1", "key2": "value2"} +// See https://cloud.google.com/compute/docs/labeling-resources#label_format for details. +func ConvertLabelsStringToMap(labels string) (map[string]string, error) { + const labelsDelimiter = "," + const labelsKeyValueDelimiter = "=" + + labelsMap := make(map[string]string) + if labels == "" { + return labelsMap, nil + } + + regexKey, _ := regexp.Compile(`^\p{Ll}[\p{Ll}0-9_-]{0,62}$`) + checkLabelKeyFn := func(key string) error { + if !regexKey.MatchString(key) { + return fmt.Errorf("label value %q is invalid (should start with lowercase letter / lowercase letter, digit, _ and - chars are allowed / 1-63 characters", key) + } + return nil + } + + regexValue, _ := regexp.Compile(`^[\p{Ll}0-9_-]{0,63}$`) + checkLabelValueFn := func(value string) error { + if !regexValue.MatchString(value) { + return fmt.Errorf("label value %q is invalid (lowercase letter, digit, _ and - chars are allowed / 0-63 characters", value) + } + + return nil + } + + keyValueStrings := strings.Split(labels, labelsDelimiter) + for _, keyValue := range keyValueStrings { + keyValue := strings.Split(keyValue, labelsKeyValueDelimiter) + + if len(keyValue) != 2 { + return nil, fmt.Errorf("labels %q are invalid, correct format: 'key1=value1,key2=value2'", labels) + } + + key := strings.TrimSpace(keyValue[0]) + if err := checkLabelKeyFn(key); err != nil { + return nil, err + } + + value := strings.TrimSpace(keyValue[1]) + if err := checkLabelValueFn(value); err != nil { + return nil, err + } + + labelsMap[key] = value + } + + const maxNumberOfLabels = 64 + if len(labelsMap) > maxNumberOfLabels { + return nil, fmt.Errorf("more than %d labels is not allowed, given: %d", maxNumberOfLabels, len(labelsMap)) + } + + return labelsMap, nil +} + +// ConvertTagsStringToMap converts the tags from string to Tag slice +// example: "parent_id1/tag_key1/tag_value1,parent_id2/tag_key2/tag_value2" gets +// converted into {"parent_id1/tag_key1":"tag_value1", "parent_id2/tag_key2":"tag_value2"} +// See https://cloud.google.com/resource-manager/docs/tags/tags-overview, +// https://cloud.google.com/resource-manager/docs/tags/tags-creating-and-managing for details +func ConvertTagsStringToMap(tags string) (map[string]string, error) { + const tagsDelimiter = "," + const tagsParentIDKeyValueDelimiter = "/" + + tagsMap := make(map[string]string) + if tags == "" { + return nil, nil + } + + checkTagParentIDFn := func(tag, parentID string) error { + if !regexParent.MatchString(parentID) { + return fmt.Errorf("tag parent_id %q for tag %q is invalid. parent_id can have a maximum of 32 characters and cannot be empty. parent_id can be either OrganizationID or ProjectID. OrganizationID must consist of decimal numbers, and cannot have leading zeroes and ProjectID must be 6 to 30 characters in length, can only contain lowercase letters, numbers, and hyphens, and must start with a letter, and cannot end with a hyphen", parentID, tag) + } + return nil + } + + checkTagKeyFn := func(tag, key string) error { + if !regexKey.MatchString(key) { + return fmt.Errorf("tag key %q for tag %q is invalid. Tag key can have a maximum of 63 characters and cannot be empty. Tag key must begin and end with an alphanumeric character, and must contain only uppercase, lowercase alphanumeric characters, and the following special characters `._-`", key, tag) + } + return nil + } + + checkTagValueFn := func(tag, value string) error { + if !regexValue.MatchString(value) { + return fmt.Errorf("tag value %q for tag %q is invalid. Tag value can have a maximum of 63 characters and cannot be empty. Tag value must begin and end with an alphanumeric character, and must contain only uppercase, lowercase alphanumeric characters, and the following special characters `_-.@%%=+:,*#&(){}[]` and spaces", value, tag) + } + + return nil + } + + checkTagParentIDKey := sets.String{} + parentIDkeyValueStrings := strings.Split(tags, tagsDelimiter) + for _, parentIDkeyValueString := range parentIDkeyValueStrings { + parentIDKeyValue := strings.Split(parentIDkeyValueString, tagsParentIDKeyValueDelimiter) + + if len(parentIDKeyValue) != 3 { + return nil, fmt.Errorf("tag %q is invalid, correct format: 'parent_id1/key1/value1,parent_id2/key2/value2'", parentIDkeyValueString) + } + + parentID := strings.TrimSpace(parentIDKeyValue[0]) + if err := checkTagParentIDFn(parentIDkeyValueString, parentID); err != nil { + return nil, err + } + + key := strings.TrimSpace(parentIDKeyValue[1]) + if err := checkTagKeyFn(parentIDkeyValueString, key); err != nil { + return nil, err + } + + value := strings.TrimSpace(parentIDKeyValue[2]) + if err := checkTagValueFn(parentIDkeyValueString, value); err != nil { + return nil, err + } + + parentIDKeyStr := fmt.Sprintf("%s/%s", parentID, key) + if checkTagParentIDKey.Has(parentIDKeyStr) { + return nil, fmt.Errorf("tag parent_id & key combination %q exists more than once", parentIDKeyStr) + } + checkTagParentIDKey.Insert(parentIDKeyStr) + + tagsMap[parentIDKeyStr] = value + } + + // The maximum number of tags allowed per resource is 50. For more details check the following: + // https://cloud.google.com/resource-manager/docs/tags/tags-creating-and-managing#attaching + // https://cloud.google.com/resource-manager/docs/limits#tag-limits + const maxNumberOfTags = 50 + if len(tagsMap) > maxNumberOfTags { + return nil, fmt.Errorf("more than %d tags is not allowed, given: %d", maxNumberOfTags, len(tagsMap)) + } + + return tagsMap, nil +} diff --git a/pkg/convert/convert_test.go b/pkg/convert/convert_test.go new file mode 100644 index 000000000..a4c929934 --- /dev/null +++ b/pkg/convert/convert_test.go @@ -0,0 +1,801 @@ +package convert + +import ( + "reflect" + "testing" +) + +func TestConvertLabelsStringToMap(t *testing.T) { + t.Run("parsing labels string into map", func(t *testing.T) { + testCases := []struct { + name string + labels string + expectedOutput map[string]string + expectedError bool + }{ + { + name: "should return empty map when labels string is empty", + labels: "", + expectedOutput: map[string]string{}, + expectedError: false, + }, + { + name: "single label string", + labels: "key=value", + expectedOutput: map[string]string{ + "key": "value", + }, + expectedError: false, + }, + { + name: "multiple label string", + labels: "key1=value1,key2=value2", + expectedOutput: map[string]string{ + "key1": "value1", + "key2": "value2", + }, + expectedError: false, + }, + { + name: "multiple labels string with whitespaces gets trimmed", + labels: "key1=value1, key2=value2", + expectedOutput: map[string]string{ + "key1": "value1", + "key2": "value2", + }, + expectedError: false, + }, + { + name: "malformed labels string (no keys and values)", + labels: ",,", + expectedOutput: nil, + expectedError: true, + }, + { + name: "malformed labels string (incorrect format)", + labels: "foo,bar", + expectedOutput: nil, + expectedError: true, + }, + { + name: "malformed labels string (missing key)", + labels: "key1=value1,=bar", + expectedOutput: nil, + expectedError: true, + }, + { + name: "malformed labels string (missing key and value)", + labels: "key1=value1,=bar,=", + expectedOutput: nil, + expectedError: true, + }, + } + + for _, tc := range testCases { + t.Logf("test case: %s", tc.name) + output, err := ConvertLabelsStringToMap(tc.labels) + if tc.expectedError && err == nil { + t.Errorf("Expected error but got none") + } + if err != nil { + if !tc.expectedError { + t.Errorf("Did not expect error but got: %v", err) + } + continue + } + + if !reflect.DeepEqual(output, tc.expectedOutput) { + t.Errorf("Got labels %v, but expected %v", output, tc.expectedOutput) + } + } + }) + + t.Run("checking google requirements", func(t *testing.T) { + testCases := []struct { + name string + labels string + expectedError bool + }{ + { + name: "64 labels at most", + labels: `k1=v,k2=v,k3=v,k4=v,k5=v,k6=v,k7=v,k8=v,k9=v,k10=v,k11=v,k12=v,k13=v,k14=v,k15=v,k16=v,k17=v,k18=v,k19=v,k20=v, + k21=v,k22=v,k23=v,k24=v,k25=v,k26=v,k27=v,k28=v,k29=v,k30=v,k31=v,k32=v,k33=v,k34=v,k35=v,k36=v,k37=v,k38=v,k39=v,k40=v, + k41=v,k42=v,k43=v,k44=v,k45=v,k46=v,k47=v,k48=v,k49=v,k50=v,k51=v,k52=v,k53=v,k54=v,k55=v,k56=v,k57=v,k58=v,k59=v,k60=v, + k61=v,k62=v,k63=v,k64=v,k65=v`, + expectedError: true, + }, + { + name: "label key must start with lowercase char (# case)", + labels: "#k=v", + expectedError: true, + }, + { + name: "label key must start with lowercase char (_ case)", + labels: "_k=v", + expectedError: true, + }, + { + name: "label key must start with lowercase char (- case)", + labels: "-k=v", + expectedError: true, + }, + { + name: "label key can only contain lowercase chars, digits, _ and -)", + labels: "k*=v", + expectedError: true, + }, + { + name: "label key may not have over 63 characters", + labels: "abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghij1234=v", + expectedError: true, + }, + { + name: "label key cannot contain . and /", + labels: "kubernetes.io/created-for/pvc/namespace=v", + expectedError: true, + }, + { + name: "label value can only contain lowercase chars, digits, _ and -)", + labels: "k1=###", + expectedError: true, + }, + { + name: "label value may not have over 63 characters", + labels: "abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghij1234=v", + expectedError: true, + }, + { + name: "label value cannot contain . and /", + labels: "kubernetes_io_created-for_pvc_namespace=v./", + expectedError: true, + }, + { + name: "label key can have up to 63 characters", + labels: "abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghij123=v", + expectedError: false, + }, + { + name: "label value can have up to 63 characters", + labels: "abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghij123=v", + expectedError: false, + }, + { + name: "label key can contain _ and -", + labels: "kubernetes_io_created-for_pvc_namespace=v", + expectedError: false, + }, + { + name: "label value can contain _ and -", + labels: "k=my_value-2", + expectedError: false, + }, + } + + for _, tc := range testCases { + t.Logf("test case: %s", tc.name) + _, err := ConvertLabelsStringToMap(tc.labels) + + if tc.expectedError && err == nil { + t.Errorf("Expected error but got none") + } + + if !tc.expectedError && err != nil { + t.Errorf("Did not expect error but got: %v", err) + } + } + }) + +} + +func TestConvertTagsStringToMap(t *testing.T) { + t.Run("parsing tags string into slice", func(t *testing.T) { + testCases := []struct { + name string + tags string + expectedOutput map[string]string + expectedError bool + }{ + { + name: "should return empty slice when tags string is empty", + tags: "", + expectedOutput: nil, + expectedError: false, + }, + { + name: "single tag string", + tags: "parent/key/value", + expectedOutput: map[string]string{"parent/key": "value"}, + expectedError: false, + }, + { + name: "multiple tag string", + tags: "parent1/key1/value1,parent2/key2/value2", + expectedOutput: map[string]string{"parent1/key1": "value1", "parent2/key2": "value2"}, + expectedError: false, + }, + { + name: "multiple tags string with whitespaces gets trimmed", + tags: "parent1/key1/value1, parent2/key2/value2", + expectedOutput: map[string]string{"parent1/key1": "value1", "parent2/key2": "value2"}, + expectedError: false, + }, + { + name: "malformed tags string (no parent_ids, keys and values)", + tags: ",,", + expectedOutput: nil, + expectedError: true, + }, + { + name: "malformed tags string (incorrect format)", + tags: "foo,bar", + expectedOutput: nil, + expectedError: true, + }, + { + name: "malformed tags string (missing parent_id)", + tags: "parent1/key1/value1,/key2/value2", + expectedOutput: nil, + expectedError: true, + }, + { + name: "malformed tags string (missing key)", + tags: "parent1//value1,parent2/key2/value2", + expectedOutput: nil, + expectedError: true, + }, + { + name: "malformed tags string (missing value)", + tags: "parent1/key1/value1,parent2/key2/", + expectedOutput: nil, + expectedError: true, + }, + { + name: "same tag parent_id, key and value string used more than once", + tags: "parent1/key1/value1,parent1/key1/value1", + expectedOutput: nil, + expectedError: true, + }, + { + name: "same tag parent_id & key string used more than once", + tags: "parent1/key1/value1,parent1/key1/value2", + expectedOutput: nil, + expectedError: true, + }, + } + + for _, tc := range testCases { + t.Logf("test case: %s", tc.name) + output, err := ConvertTagsStringToMap(tc.tags) + if tc.expectedError && err == nil { + t.Errorf("Expected error but got none") + } + + if !tc.expectedError && err != nil { + t.Errorf("Did not expect error but got: %v", err) + } + + if err == nil && !reflect.DeepEqual(output, tc.expectedOutput) { + t.Errorf("Got tags %v, but expected %v", output, tc.expectedOutput) + } + } + }) + + t.Run("checking google requirements", func(t *testing.T) { + testCases := []struct { + name string + tags string + expectedError bool + }{ + { + name: "50 tags at most", + tags: `p1/k/v,p2/k/v,p3/k/v,p4/k/v,p5/k/v,p6/k/v,p7/k/v,p8/k/v,p9/k/v,p10/k/v,p11/k/v,p12/k/v,p13/k/v,p14/k/v,p15/k/v,p16/k/v,p17/k/v, + p18/k/v,p19/k/v,p20/k/v,p21/k/v,p22/k/v,p23/k/v,p24/k/v,p25/k/v,p26/k/v,p27/k/v,p28/k/v,p29/k/v,p30/k/v,p31/k/v,p32/k/v,p33/k/v, + p34/k/v,p35/k/v,p36/k/v,p37/k/v,p38/k/v,p39/k/v,p40/k/v,p41/k/v,p42/k/v,p43/k/v,p44/k/v,p45/k/v,p46/k/v,p47/k/v,p48/k/v,p49/k/v, + p50/k/v,p51/k/v`, + expectedError: true, + }, + { + name: "tag parent_id must start with non-zero decimal when OrganizationID is used (leading zeroes case)", + tags: "01/k/v", + expectedError: true, + }, + { + name: "tag parent_id may not have more than 32 characters when OrganizationID is used", + tags: "123546789012345678901234567890123/k/v", + expectedError: true, + }, + { + name: "tag parent_id can have decimal characters when OrganizationID is used", + tags: "1234567890/k/v", + expectedError: false, + }, + { + name: "tag parent_id may not have less than 6 characters when ProjectID is used", + tags: "abcde/k/v", + expectedError: true, + }, + { + name: "tag parent_id must start with lowercase char when ProjectID is used (decimal case)", + tags: "1parent/k/v", + expectedError: true, + }, + { + name: "tag parent_id must start with lowercase char when ProjectID is used (- case)", + tags: "-parent/k/v", + expectedError: true, + }, + { + name: "tag parent_id must end with lowercase alphanumeric char when ProjectID is used (- case)", + tags: "parent-/k/v", + expectedError: true, + }, + { + name: "tag parent_id may not have more than 30 characters when ProjectID is used", + tags: "abcdefghijklmnopqrstuvwxyz12345/k/v", + expectedError: true, + }, + { + name: "tag parent_id can contain lowercase alphanumeric characters and hyphens when ProjectID is used", + tags: "parent-id-100/k/v", + expectedError: false, + }, + { + name: "tag key must start with alphanumeric char (. case)", + tags: "parent/.k/v", + expectedError: true, + }, + { + name: "tag key must start with alphanumeric char (_ case)", + tags: "parent/_k/v", + expectedError: true, + }, + { + name: "tag key must start with alphanumeric char (- case)", + tags: "parent/-k/v", + expectedError: true, + }, + { + name: "tag key can only contain uppercase, lowercase alphanumeric characters, and the following special characters '._-'", + tags: "parent/k*/v", + expectedError: true, + }, + { + name: "tag key may not have over 63 characters", + tags: "parent/abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghij1234/v", + expectedError: true, + }, + { + name: "tag key can contain uppercase, lowercase alphanumeric characters, and the following special characters '._-'", + tags: "parent/Type_of.cloud-platform/v", + expectedError: false, + }, + { + name: "tag value must start with alphanumeric char (. case)", + tags: "parent/k/.v", + expectedError: true, + }, + { + name: "tag value must start with alphanumeric char (_ case)", + tags: "parent/k/_v", + expectedError: true, + }, + { + name: "tag value must start with alphanumeric char (- case)", + tags: "parent/k/-v", + expectedError: true, + }, + { + name: "tag value can only contain uppercase, lowercase alphanumeric characters, and the following special characters `_-.@%%=+:,*#&(){}[]` and spaces", + tags: "parent/k/v*", + expectedError: true, + }, + { + name: "tag value may not have over 63 characters", + tags: "parent/k/abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghij1234", + expectedError: true, + }, + { + name: "tag key can contain uppercase, lowercase alphanumeric characters, and the following special characters `_-.@%%=+:,*#&(){}[]` and spaces", + tags: "parent/k/Special@value[10]{20}(30)-example", + expectedError: false, + }, + } + + for _, tc := range testCases { + t.Logf("test case: %s", tc.name) + _, err := ConvertTagsStringToMap(tc.tags) + + if tc.expectedError && err == nil { + t.Errorf("Expected error but got none") + } + + if !tc.expectedError && err != nil { + t.Errorf("Did not expect error but got: %v", err) + } + } + }) +} + +func TestConvertStringToBool(t *testing.T) { + tests := []struct { + desc string + inputStr string + expected bool + expectError bool + }{ + { + desc: "valid true", + inputStr: "true", + expected: true, + expectError: false, + }, + { + desc: "valid mixed case true", + inputStr: "True", + expected: true, + expectError: false, + }, + { + desc: "valid false", + inputStr: "false", + expected: false, + expectError: false, + }, + { + desc: "valid mixed case false", + inputStr: "False", + expected: false, + expectError: false, + }, + { + desc: "invalid", + inputStr: "yes", + expected: false, + expectError: true, + }, + } + for _, tc := range tests { + t.Run(tc.desc, func(t *testing.T) { + got, err := ConvertStringToBool(tc.inputStr) + if err != nil && !tc.expectError { + t.Errorf("Got error %v converting string to bool %s; expect no error", err, tc.inputStr) + } + if err == nil && tc.expectError { + t.Errorf("Got no error converting string to bool %s; expect an error", tc.inputStr) + } + if err == nil && got != tc.expected { + t.Errorf("Got %v for converting string to bool; expect %v", got, tc.expected) + } + }) + } +} + +func TestConvertStringToInt64(t *testing.T) { + tests := []struct { + desc string + inputStr string + expInt64 int64 + expectError bool + }{ + { + desc: "valid number string", + inputStr: "10000", + expInt64: 10000, + expectError: false, + }, + { + desc: "test higher number", + inputStr: "15000", + expInt64: 15000, + expectError: false, + }, + { + desc: "round M to number", + inputStr: "1M", + expInt64: 1000000, + expectError: false, + }, + { + desc: "round m to number", + inputStr: "1m", + expInt64: 1, + expectError: false, + }, + { + desc: "round k to number", + inputStr: "1k", + expInt64: 1000, + expectError: false, + }, + { + desc: "invalid empty string", + inputStr: "", + expInt64: 0, + expectError: true, + }, + { + desc: "invalid string", + inputStr: "ew%65", + expInt64: 0, + expectError: true, + }, + { + desc: "invalid KiB string", + inputStr: "10KiB", + expInt64: 10000, + expectError: true, + }, + { + desc: "invalid GB string", + inputStr: "10GB", + expInt64: 0, + expectError: true, + }, + { + desc: "round Ki to number", + inputStr: "1Ki", + expInt64: 1024, + expectError: false, + }, + { + desc: "round k to number", + inputStr: "10k", + expInt64: 10000, + expectError: false, + }, + { + desc: "round Mi to number", + inputStr: "10Mi", + expInt64: 10485760, + expectError: false, + }, + { + desc: "round M to number", + inputStr: "10M", + expInt64: 10000000, + expectError: false, + }, + { + desc: "round G to number", + inputStr: "10G", + expInt64: 10000000000, + expectError: false, + }, + { + desc: "round Gi to number", + inputStr: "100Gi", + expInt64: 107374182400, + expectError: false, + }, + { + desc: "round decimal to number", + inputStr: "1.2Gi", + expInt64: 1288490189, + expectError: false, + }, + { + desc: "round big value to number", + inputStr: "8191Pi", + expInt64: 9222246136947933184, + expectError: false, + }, + } + for _, tc := range tests { + t.Run(tc.desc, func(t *testing.T) { + actualInt64, err := ConvertStringToInt64(tc.inputStr) + if err != nil && !tc.expectError { + t.Errorf("Got error %v converting string to int64 %s; expect no error", err, tc.inputStr) + } + if err == nil && tc.expectError { + t.Errorf("Got no error converting string to int64 %s; expect an error", tc.inputStr) + } + if err == nil && actualInt64 != tc.expInt64 { + t.Errorf("Got %d for converting string to int64; expect %d", actualInt64, tc.expInt64) + } + }) + } +} + +func TestConvertMiStringToInt64(t *testing.T) { + tests := []struct { + desc string + inputStr string + expInt64 int64 + expectError bool + }{ + { + desc: "valid number string", + inputStr: "10000", + expInt64: 1, + expectError: false, + }, + { + desc: "round Ki to MiB", + inputStr: "1000Ki", + expInt64: 1, + expectError: false, + }, + { + desc: "round k to MiB", + inputStr: "1000k", + expInt64: 1, + expectError: false, + }, + { + desc: "round Mi to MiB", + inputStr: "1000Mi", + expInt64: 1000, + expectError: false, + }, + { + desc: "round M to MiB", + inputStr: "1000M", + expInt64: 954, + expectError: false, + }, + { + desc: "round G to MiB", + inputStr: "1000G", + expInt64: 953675, + expectError: false, + }, + { + desc: "round Gi to MiB", + inputStr: "10000Gi", + expInt64: 10240000, + expectError: false, + }, + { + desc: "round decimal to MiB", + inputStr: "1.2Gi", + expInt64: 1229, + expectError: false, + }, + { + desc: "round big value to MiB", + inputStr: "8191Pi", + expInt64: 8795019280384, + expectError: false, + }, + { + desc: "invalid empty string", + inputStr: "", + expInt64: 0, + expectError: true, + }, + { + desc: "invalid KiB string", + inputStr: "10KiB", + expInt64: 10000, + expectError: true, + }, + { + desc: "invalid GB string", + inputStr: "10GB", + expInt64: 0, + expectError: true, + }, + { + desc: "invalid string", + inputStr: "ew%65", + expInt64: 0, + expectError: true, + }, + } + for _, tc := range tests { + t.Run(tc.desc, func(t *testing.T) { + actualInt64, err := ConvertMiStringToInt64(tc.inputStr) + if err != nil && !tc.expectError { + t.Errorf("Got error %v converting string to int64 %s; expect no error", err, tc.inputStr) + } + if err == nil && tc.expectError { + t.Errorf("Got no error converting string to int64 %s; expect an error", tc.inputStr) + } + if err == nil && actualInt64 != tc.expInt64 { + t.Errorf("Got %d for converting string to int64; expect %d", actualInt64, tc.expInt64) + } + }) + } +} + +func TestConvertGiStringToInt64(t *testing.T) { + tests := []struct { + desc string + inputStr string + expInt64 int64 + expectError bool + }{ + { + desc: "valid number string", + inputStr: "10000", + expInt64: 1, + expectError: false, + }, + { + desc: "round Ki to GiB", + inputStr: "1000000Ki", + expInt64: 1, + expectError: false, + }, + { + desc: "round k to GiB", + inputStr: "1000000k", + expInt64: 1, + expectError: false, + }, + { + desc: "round Mi to GiB", + inputStr: "1000Mi", + expInt64: 1, + expectError: false, + }, + { + desc: "round M to GiB", + inputStr: "1000M", + expInt64: 1, + expectError: false, + }, + { + desc: "round G to GiB", + inputStr: "1000G", + expInt64: 932, + expectError: false, + }, + { + desc: "round Gi to GiB - most common case", + inputStr: "1234Gi", + expInt64: 1234, + expectError: false, + }, + { + desc: "round decimal to GiB", + inputStr: "1.2Gi", + expInt64: 2, + expectError: false, + }, + { + desc: "round big value to GiB", + inputStr: "8191Pi", + expInt64: 8588886016, + expectError: false, + }, + { + desc: "invalid empty string", + inputStr: "", + expInt64: 0, + expectError: true, + }, + { + desc: "invalid KiB string", + inputStr: "10KiB", + expInt64: 10000, + expectError: true, + }, + { + desc: "invalid GB string", + inputStr: "10GB", + expInt64: 0, + expectError: true, + }, + { + desc: "invalid string", + inputStr: "ew%65", + expInt64: 0, + expectError: true, + }, + } + for _, tc := range tests { + t.Run(tc.desc, func(t *testing.T) { + actualInt64, err := ConvertGiStringToInt64(tc.inputStr) + if err != nil && !tc.expectError { + t.Errorf("Got error %v converting string to int64 %s; expect no error", err, tc.inputStr) + } + if err == nil && tc.expectError { + t.Errorf("Got no error converting string to int64 %s; expect an error", tc.inputStr) + } + if err == nil && actualInt64 != tc.expInt64 { + t.Errorf("Got %d for converting string to int64; expect %d", actualInt64, tc.expInt64) + } + }) + } +} diff --git a/pkg/deviceutils/device-utils.go b/pkg/deviceutils/device-utils.go index 1f7a8fde3..53e1881c4 100644 --- a/pkg/deviceutils/device-utils.go +++ b/pkg/deviceutils/device-utils.go @@ -290,7 +290,10 @@ func (m *deviceUtils) VerifyDevicePath(devicePaths []string, deviceName string) }) if err != nil { - return "", fmt.Errorf("failed to find and re-link disk %s with udevadm after retrying for %v: %w", deviceName, pollTimeout, err) + klog.Warningf("For device %s udevadmin failed: %v. Trying to manually link", deviceName, err) + if err := manuallySetDevicePath(deviceName); err != nil { + return "", fmt.Errorf("failed to manually set link for disk %s: %w", deviceName, err) + } } return devicePath, nil @@ -338,11 +341,11 @@ func findAvailableDevFsPaths() ([]string, error) { return append(diskSDPaths, diskNvmePaths...), nil } -func udevadmTriggerForDiskIfExists(deviceName string) error { +func findDevice(deviceName string) (string, string, error) { devFsPathToSerial := map[string]string{} devFsPaths, err := findAvailableDevFsPaths() if err != nil { - return err + return "", "", err } for _, devFsPath := range devFsPaths { devFsSerial, err := getDevFsSerial(devFsPath) @@ -355,17 +358,33 @@ func udevadmTriggerForDiskIfExists(deviceName string) error { klog.V(4).Infof("device path %s, serial number %v", devFsPath, devFsSerial) devFsPathToSerial[devFsPath] = devFsSerial if devFsSerial == deviceName { - // Found the disk that we're looking for so run a trigger on it - // to resolve its /dev/by-id/ path - klog.Warningf("udevadm --trigger running to fix disk at path %s which has serial number %s", devFsPath, devFsSerial) - err := udevadmChangeToDrive(devFsPath) - if err != nil { - return fmt.Errorf("udevadm --trigger failed to fix device path %s which has serial number %s: %w", devFsPath, devFsSerial, err) - } - return nil + return devFsPath, devFsSerial, nil } } - return fmt.Errorf("udevadm --trigger requested to fix disk %s but no such disk was found in device path %v", deviceName, devFsPathToSerial) + return "", "", fmt.Errorf("udevadm --trigger requested to fix disk %s but no such disk was found in device path %v", deviceName, devFsPathToSerial) +} + +func manuallySetDevicePath(deviceName string) error { + devFsPath, devFsSerial, err := findDevice(deviceName) + if err != nil { + return err + } + return os.Symlink(devFsPath, path.Join(diskByIdPath, diskGooglePrefix+devFsSerial)) +} + +func udevadmTriggerForDiskIfExists(deviceName string) error { + devFsPath, devFsSerial, err := findDevice(deviceName) + if err != nil { + return err + } + // Found the disk that we're looking for so run a trigger on it + // to resolve its /dev/by-id/ path + klog.Warningf("udevadm --trigger running to fix disk at path %s which has serial number %s", devFsPath, devFsSerial) + err = udevadmChangeToDrive(devFsPath) + if err != nil { + return fmt.Errorf("udevadm --trigger failed to fix device path %s which has serial number %s: %w", devFsPath, devFsSerial, err) + } + return nil } // Calls "udevadm trigger --action=change" on the specified drive. drivePath diff --git a/pkg/gce-cloud-provider/compute/fake-gce.go b/pkg/gce-cloud-provider/compute/fake-gce.go index ab1b4735e..a9328284e 100644 --- a/pkg/gce-cloud-provider/compute/fake-gce.go +++ b/pkg/gce-cloud-provider/compute/fake-gce.go @@ -30,6 +30,7 @@ import ( "google.golang.org/grpc/status" "k8s.io/klog/v2" "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/common" + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/parameters" "k8s.io/apimachinery/pkg/util/sets" ) @@ -101,35 +102,8 @@ func (cloud *FakeCloudProvider) GetDefaultZone() string { return cloud.zone } -func (cloud *FakeCloudProvider) RepairUnderspecifiedVolumeKey(ctx context.Context, project string, volumeKey *meta.Key) (string, *meta.Key, error) { - if project == common.UnspecifiedValue { - project = cloud.project - } - switch volumeKey.Type() { - case meta.Zonal: - if volumeKey.Zone != common.UnspecifiedValue { - return project, volumeKey, nil - } - for diskVolKey, d := range cloud.disks { - if diskVolKey == volumeKey.String() { - volumeKey.Zone = d.GetZone() - return project, volumeKey, nil - } - } - return "", nil, notFoundError() - case meta.Regional: - if volumeKey.Region != common.UnspecifiedValue { - return project, volumeKey, nil - } - r, err := common.GetRegionFromZones([]string{cloud.zone}) - if err != nil { - return "", nil, fmt.Errorf("failed to get region from zones: %w", err) - } - volumeKey.Region = r - return project, volumeKey, nil - default: - return "", nil, fmt.Errorf("Volume key %v not zonal nor regional", volumeKey.Name) - } +func (cloud *FakeCloudProvider) RepairUnderspecifiedVolumeKey(ctx context.Context, project string, volumeKey *meta.Key, fallbackZone string) (string, *meta.Key, error) { + return repairUnderspecifiedVolumeKeyWithProvider(ctx, cloud, project, volumeKey, fallbackZone) } func (cloud *FakeCloudProvider) ListZones(ctx context.Context, region string) ([]string, error) { @@ -197,7 +171,7 @@ func (cloud *FakeCloudProvider) GetDisk(ctx context.Context, project string, vol return disk, nil } -func (cloud *FakeCloudProvider) InsertDisk(ctx context.Context, project string, volKey *meta.Key, params common.DiskParameters, capBytes int64, capacityRange *csi.CapacityRange, replicaZones []string, snapshotID string, volumeContentSourceVolumeID string, multiWriter bool, accessMode string) error { +func (cloud *FakeCloudProvider) InsertDisk(ctx context.Context, project string, volKey *meta.Key, params parameters.DiskParameters, capBytes int64, capacityRange *csi.CapacityRange, replicaZones []string, snapshotID string, volumeContentSourceVolumeID string, multiWriter bool, accessMode string) error { if disk, ok := cloud.disks[volKey.String()]; ok { err := ValidateExistingDisk(ctx, disk, params, int64(capacityRange.GetRequiredBytes()), @@ -229,9 +203,9 @@ func (cloud *FakeCloudProvider) InsertDisk(ctx context.Context, project string, return err } switch snapshotType { - case common.DiskSnapshotType: + case parameters.DiskSnapshotType: computeDisk.SourceSnapshotId = snapshotID - case common.DiskImageType: + case parameters.DiskImageType: computeDisk.SourceImageId = snapshotID default: return fmt.Errorf("invalid snapshot type in snapshot ID: %s", snapshotType) @@ -258,7 +232,7 @@ func (cloud *FakeCloudProvider) InsertDisk(ctx context.Context, project string, return nil } -func (cloud *FakeCloudProvider) UpdateDisk(ctx context.Context, project string, volKey *meta.Key, existingDisk *CloudDisk, params common.ModifyVolumeParameters) error { +func (cloud *FakeCloudProvider) UpdateDisk(ctx context.Context, project string, volKey *meta.Key, existingDisk *CloudDisk, params parameters.ModifyVolumeParameters) error { _, ok := cloud.disks[volKey.String()] if !ok { return notFoundError() @@ -399,7 +373,7 @@ func (cloud *FakeCloudProvider) GetSnapshot(ctx context.Context, project, snapsh return snapshot, nil } -func (cloud *FakeCloudProvider) CreateSnapshot(ctx context.Context, project string, volKey *meta.Key, snapshotName string, snapshotParams common.SnapshotParameters) (*computev1.Snapshot, error) { +func (cloud *FakeCloudProvider) CreateSnapshot(ctx context.Context, project string, volKey *meta.Key, snapshotName string, snapshotParams parameters.SnapshotParameters) (*computev1.Snapshot, error) { if snapshot, ok := cloud.snapshots[snapshotName]; ok { return snapshot, nil } @@ -480,7 +454,7 @@ func (cloud *FakeCloudProvider) GetImage(ctx context.Context, project, imageName return image, nil } -func (cloud *FakeCloudProvider) CreateImage(ctx context.Context, project string, volKey *meta.Key, imageName string, snapshotParams common.SnapshotParameters) (*computev1.Image, error) { +func (cloud *FakeCloudProvider) CreateImage(ctx context.Context, project string, volKey *meta.Key, imageName string, snapshotParams parameters.SnapshotParameters) (*computev1.Image, error) { if image, ok := cloud.images[imageName]; ok { return image, nil } @@ -583,14 +557,14 @@ type FakeBlockingCloudProvider struct { // Upon starting a CreateSnapshot, it passes a chan 'executeCreateSnapshot' into readyToExecute, then blocks on executeCreateSnapshot. // The test calling this function can block on readyToExecute to ensure that the operation has started and // allowed the CreateSnapshot to continue by passing a struct into executeCreateSnapshot. -func (cloud *FakeBlockingCloudProvider) CreateSnapshot(ctx context.Context, project string, volKey *meta.Key, snapshotName string, snapshotParams common.SnapshotParameters) (*computev1.Snapshot, error) { +func (cloud *FakeBlockingCloudProvider) CreateSnapshot(ctx context.Context, project string, volKey *meta.Key, snapshotName string, snapshotParams parameters.SnapshotParameters) (*computev1.Snapshot, error) { executeCreateSnapshot := make(chan Signal) cloud.ReadyToExecute <- executeCreateSnapshot <-executeCreateSnapshot return cloud.FakeCloudProvider.CreateSnapshot(ctx, project, volKey, snapshotName, snapshotParams) } -func (cloud *FakeBlockingCloudProvider) CreateImage(ctx context.Context, project string, volKey *meta.Key, imageName string, snapshotParams common.SnapshotParameters) (*computev1.Image, error) { +func (cloud *FakeBlockingCloudProvider) CreateImage(ctx context.Context, project string, volKey *meta.Key, imageName string, snapshotParams parameters.SnapshotParameters) (*computev1.Image, error) { executeCreateSnapshot := make(chan Signal) cloud.ReadyToExecute <- executeCreateSnapshot <-executeCreateSnapshot diff --git a/pkg/gce-cloud-provider/compute/gce-compute.go b/pkg/gce-cloud-provider/compute/gce-compute.go index 92b749178..4ae5e7646 100644 --- a/pkg/gce-cloud-provider/compute/gce-compute.go +++ b/pkg/gce-cloud-provider/compute/gce-compute.go @@ -21,6 +21,7 @@ import ( "fmt" "net/http" "regexp" + "slices" "strings" "time" @@ -39,8 +40,9 @@ import ( "google.golang.org/grpc/status" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/klog/v2" - "k8s.io/utils/strings/slices" "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/common" + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/constants" + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/parameters" ) const ( @@ -99,10 +101,10 @@ type GCECompute interface { GetDefaultZone() string // Disk Methods GetDisk(ctx context.Context, project string, volumeKey *meta.Key) (*CloudDisk, error) - RepairUnderspecifiedVolumeKey(ctx context.Context, project string, volumeKey *meta.Key) (string, *meta.Key, error) - InsertDisk(ctx context.Context, project string, volKey *meta.Key, params common.DiskParameters, capBytes int64, capacityRange *csi.CapacityRange, replicaZones []string, snapshotID string, volumeContentSourceVolumeID string, multiWriter bool, accessMode string) error + RepairUnderspecifiedVolumeKey(ctx context.Context, project string, volumeKey *meta.Key, fallbackZone string) (string, *meta.Key, error) + InsertDisk(ctx context.Context, project string, volKey *meta.Key, params parameters.DiskParameters, capBytes int64, capacityRange *csi.CapacityRange, replicaZones []string, snapshotID string, volumeContentSourceVolumeID string, multiWriter bool, accessMode string) error DeleteDisk(ctx context.Context, project string, volumeKey *meta.Key) error - UpdateDisk(ctx context.Context, project string, volKey *meta.Key, existingDisk *CloudDisk, params common.ModifyVolumeParameters) error + UpdateDisk(ctx context.Context, project string, volKey *meta.Key, existingDisk *CloudDisk, params parameters.ModifyVolumeParameters) error AttachDisk(ctx context.Context, project string, volKey *meta.Key, readWrite, diskType, instanceZone, instanceName string, forceAttach bool) error DetachDisk(ctx context.Context, project, deviceName, instanceZone, instanceName string) error SetDiskAccessMode(ctx context.Context, project string, volKey *meta.Key, accessMode string) error @@ -122,11 +124,11 @@ type GCECompute interface { ListZones(ctx context.Context, region string) ([]string, error) ListSnapshots(ctx context.Context, filter string) ([]*computev1.Snapshot, string, error) GetSnapshot(ctx context.Context, project, snapshotName string) (*computev1.Snapshot, error) - CreateSnapshot(ctx context.Context, project string, volKey *meta.Key, snapshotName string, snapshotParams common.SnapshotParameters) (*computev1.Snapshot, error) + CreateSnapshot(ctx context.Context, project string, volKey *meta.Key, snapshotName string, snapshotParams parameters.SnapshotParameters) (*computev1.Snapshot, error) DeleteSnapshot(ctx context.Context, project, snapshotName string) error ListImages(ctx context.Context, filter string) ([]*computev1.Image, string, error) GetImage(ctx context.Context, project, imageName string) (*computev1.Image, error) - CreateImage(ctx context.Context, project string, volKey *meta.Key, imageName string, snapshotParams common.SnapshotParameters) (*computev1.Image, error) + CreateImage(ctx context.Context, project string, volKey *meta.Key, imageName string, snapshotParams parameters.SnapshotParameters) (*computev1.Image, error) DeleteImage(ctx context.Context, project, imageName string) error } @@ -290,26 +292,30 @@ func (cloud *CloudProvider) listInstancesForProject(service *computev1.Service, // RepairUnderspecifiedVolumeKey will query the cloud provider and check each zone for the disk specified // by the volume key and return a volume key with a correct zone -func (cloud *CloudProvider) RepairUnderspecifiedVolumeKey(ctx context.Context, project string, volumeKey *meta.Key) (string, *meta.Key, error) { +func (cloud *CloudProvider) RepairUnderspecifiedVolumeKey(ctx context.Context, project string, volumeKey *meta.Key, fallbackZone string) (string, *meta.Key, error) { + return repairUnderspecifiedVolumeKeyWithProvider(ctx, cloud, project, volumeKey, fallbackZone) +} + +func repairUnderspecifiedVolumeKeyWithProvider(ctx context.Context, cloud GCECompute, project string, volumeKey *meta.Key, fallbackZone string) (string, *meta.Key, error) { klog.V(5).Infof("Repairing potentially underspecified volume key %v", volumeKey) - if project == common.UnspecifiedValue { - project = cloud.project + if project == constants.UnspecifiedValue { + project = cloud.GetDefaultProject() } - region, err := common.GetRegionFromZones([]string{cloud.zone}) + region, err := common.GetRegionFromZones([]string{cloud.GetDefaultZone()}) if err != nil { return "", nil, fmt.Errorf("failed to get region from zones: %w", err) } switch volumeKey.Type() { case meta.Zonal: - foundZone := "" - if volumeKey.Zone == common.UnspecifiedValue { + if volumeKey.Zone == constants.UnspecifiedValue { // list all zones, try to get disk in each zone zones, err := cloud.ListZones(ctx, region) if err != nil { return "", nil, err } + diskZones := []string{} for _, zone := range zones { - _, err := cloud.getZonalDiskOrError(ctx, project, zone, volumeKey.Name) + _, err := cloud.GetDisk(ctx, project, &meta.Key{Name: volumeKey.Name, Zone: zone}) if err != nil { if IsGCENotFoundError(err) { // Couldn't find the disk in this zone so we keep @@ -320,21 +326,27 @@ func (cloud *CloudProvider) RepairUnderspecifiedVolumeKey(ctx context.Context, p // so we return error immediately return "", nil, err } - if len(foundZone) > 0 { - return "", nil, fmt.Errorf("found disk %s in more than one zone: %s and %s", volumeKey.Name, foundZone, zone) - } - foundZone = zone + diskZones = append(diskZones, zone) } - if len(foundZone) == 0 { + if len(diskZones) == 0 { return "", nil, notFoundError() + } else if len(diskZones) > 1 && fallbackZone == "" { + return "", nil, fmt.Errorf("found disk %s in more than one zone and no fallback: %v", volumeKey.Name, diskZones) + } else if len(diskZones) > 1 && fallbackZone != "" { + if !slices.Contains(diskZones, fallbackZone) { + return "", nil, fmt.Errorf("found disk %s in more than one zone (%v) but none match fallback zone %s", volumeKey.Name, diskZones, fallbackZone) + } + volumeKey.Zone = fallbackZone + } else { + volumeKey.Zone = diskZones[0] } - volumeKey.Zone = foundZone + return project, volumeKey, nil } return project, volumeKey, nil case meta.Regional: - if volumeKey.Region == common.UnspecifiedValue { + if volumeKey.Region == constants.UnspecifiedValue { volumeKey.Region = region } return project, volumeKey, nil @@ -392,22 +404,6 @@ func (cloud *CloudProvider) GetDisk(ctx context.Context, project string, key *me } } -func (cloud *CloudProvider) getZonalDiskOrError(ctx context.Context, project, volumeZone, volumeName string) (*computev1.Disk, error) { - disk, err := cloud.service.Disks.Get(project, volumeZone, volumeName).Context(ctx).Do() - if err != nil { - return nil, err - } - return disk, nil -} - -func (cloud *CloudProvider) getRegionalDiskOrError(ctx context.Context, project, volumeRegion, volumeName string) (*computev1.Disk, error) { - disk, err := cloud.service.RegionDisks.Get(project, volumeRegion, volumeName).Context(ctx).Do() - if err != nil { - return nil, err - } - return disk, nil -} - func (cloud *CloudProvider) getZonalBetaDiskOrError(ctx context.Context, project, volumeZone, volumeName string) (*computebeta.Disk, error) { disk, err := cloud.betaService.Disks.Get(project, volumeZone, volumeName).Context(ctx).Do() if err != nil { @@ -438,7 +434,7 @@ func (cloud *CloudProvider) getRegionURI(project, region string) string { region) } -func ValidateExistingDisk(ctx context.Context, resp *CloudDisk, params common.DiskParameters, reqBytes, limBytes int64, multiWriter bool, accessMode string) error { +func ValidateExistingDisk(ctx context.Context, resp *CloudDisk, params parameters.DiskParameters, reqBytes, limBytes int64, multiWriter bool, accessMode string) error { klog.V(5).Infof("Validating existing disk %v with diskType: %s, reqested bytes: %v, limit bytes: %v", resp, params.DiskType, reqBytes, limBytes) if resp == nil { return fmt.Errorf("disk does not exist") @@ -468,8 +464,8 @@ func validAccessMode(want, got string) bool { return true } switch want { - case common.GCEReadOnlyManyAccessMode, common.GCEReadWriteOnceAccessMode: - return got == common.GCEReadWriteManyAccessMode + case constants.GCEReadOnlyManyAccessMode, constants.GCEReadWriteOnceAccessMode: + return got == constants.GCEReadWriteManyAccessMode // For RWX, no other access mode is valid. default: return false @@ -478,8 +474,9 @@ func validAccessMode(want, got string) bool { // ValidateDiskParameters takes a CloudDisk and returns true if the parameters // specified validly describe the disk provided, and false otherwise. -func ValidateDiskParameters(disk *CloudDisk, params common.DiskParameters) error { - if disk.GetPDType() != params.DiskType { +func ValidateDiskParameters(disk *CloudDisk, params parameters.DiskParameters) error { + // Skip this check for dynamic volumes because dynamic is not a valid disk type. + if disk.GetPDType() != params.DiskType && !params.IsDiskDynamic() { return fmt.Errorf("actual pd type %s did not match the expected param %s", disk.GetPDType(), params.DiskType) } @@ -497,7 +494,7 @@ func ValidateDiskParameters(disk *CloudDisk, params common.DiskParameters) error return nil } -func (cloud *CloudProvider) InsertDisk(ctx context.Context, project string, volKey *meta.Key, params common.DiskParameters, capBytes int64, capacityRange *csi.CapacityRange, replicaZones []string, snapshotID string, volumeContentSourceVolumeID string, multiWriter bool, accessMode string) error { +func (cloud *CloudProvider) InsertDisk(ctx context.Context, project string, volKey *meta.Key, params parameters.DiskParameters, capBytes int64, capacityRange *csi.CapacityRange, replicaZones []string, snapshotID string, volumeContentSourceVolumeID string, multiWriter bool, accessMode string) error { klog.V(5).Infof("Inserting disk %v", volKey) description, err := encodeTags(params.Tags) @@ -533,7 +530,7 @@ func (cloud *CloudProvider) constructDiskToCreate( ctx context.Context, project string, volKey *meta.Key, - params common.DiskParameters, + params parameters.DiskParameters, capBytes int64, replicaZones []string, snapshotID string, @@ -568,7 +565,7 @@ func (cloud *CloudProvider) constructDiskToCreate( if volKey.Type() == meta.Regional { return nil, status.Errorf(codes.InvalidArgument, "cannot create regional disks in a Storage Pool") } - sp := common.StoragePoolInZone(params.StoragePools, volKey.Zone) + sp := parameters.StoragePoolInZone(params.StoragePools, volKey.Zone) if sp == nil { return nil, status.Errorf(codes.InvalidArgument, "cannot create disk in zone %q: no Storage Pools exist in zone", volKey.Zone) } @@ -581,9 +578,9 @@ func (cloud *CloudProvider) constructDiskToCreate( return nil, err } switch snapshotType { - case common.DiskSnapshotType: + case parameters.DiskSnapshotType: diskToCreate.SourceSnapshot = snapshotID - case common.DiskImageType: + case parameters.DiskImageType: diskToCreate.SourceImage = snapshotID default: return nil, fmt.Errorf("invalid snapshot type in snapshot ID: %s", snapshotType) @@ -619,7 +616,7 @@ func (cloud *CloudProvider) constructDiskToCreate( return diskToCreate, nil } -func (cloud *CloudProvider) processDiskAlreadyExistErr(ctx context.Context, err error, project string, volKey *meta.Key, params common.DiskParameters, capacityRange *csi.CapacityRange, multiWriter bool, accessMode string) error { +func (cloud *CloudProvider) processDiskAlreadyExistErr(ctx context.Context, err error, project string, volKey *meta.Key, params parameters.DiskParameters, capacityRange *csi.CapacityRange, multiWriter bool, accessMode string) error { if err == nil { return nil } @@ -643,7 +640,7 @@ func (cloud *CloudProvider) processDiskAlreadyExistErr(ctx context.Context, err return err } -func (cloud *CloudProvider) insertConstructedDisk(ctx context.Context, disk *computebeta.Disk, isZonal bool, project string, volKey *meta.Key, params common.DiskParameters, capacityRange *csi.CapacityRange, multiWriter bool, accessMode string) error { +func (cloud *CloudProvider) insertConstructedDisk(ctx context.Context, disk *computebeta.Disk, isZonal bool, project string, volKey *meta.Key, params parameters.DiskParameters, capacityRange *csi.CapacityRange, multiWriter bool, accessMode string) error { var ( insertOp *computebeta.Operation opName string @@ -679,7 +676,7 @@ func (cloud *CloudProvider) insertConstructedDisk(ctx context.Context, disk *com return nil } -func (cloud *CloudProvider) UpdateDisk(ctx context.Context, project string, volKey *meta.Key, existingDisk *CloudDisk, params common.ModifyVolumeParameters) error { +func (cloud *CloudProvider) UpdateDisk(ctx context.Context, project string, volKey *meta.Key, existingDisk *CloudDisk, params parameters.ModifyVolumeParameters) error { // hyperdisks are zonal disks // pd-disks do not support modification of IOPS and Throughput if volKey.Type() == meta.Regional { @@ -689,7 +686,7 @@ func (cloud *CloudProvider) UpdateDisk(ctx context.Context, project string, volK return cloud.updateZonalDisk(ctx, project, volKey, existingDisk, params) } -func (cloud *CloudProvider) updateZonalDisk(ctx context.Context, project string, volKey *meta.Key, existingDisk *CloudDisk, params common.ModifyVolumeParameters) error { +func (cloud *CloudProvider) updateZonalDisk(ctx context.Context, project string, volKey *meta.Key, existingDisk *CloudDisk, params parameters.ModifyVolumeParameters) error { specifiedIops := params.IOPS != nil && *params.IOPS != 0 specifiedThroughput := params.Throughput != nil && *params.Throughput != 0 if !specifiedIops && !specifiedThroughput { @@ -1268,7 +1265,7 @@ func (cloud *CloudProvider) DeleteSnapshot(ctx context.Context, project, snapsho return nil } -func (cloud *CloudProvider) CreateSnapshot(ctx context.Context, project string, volKey *meta.Key, snapshotName string, snapshotParams common.SnapshotParameters) (*computev1.Snapshot, error) { +func (cloud *CloudProvider) CreateSnapshot(ctx context.Context, project string, volKey *meta.Key, snapshotName string, snapshotParams parameters.SnapshotParameters) (*computev1.Snapshot, error) { klog.V(5).Infof("Creating snapshot %s for volume %v", snapshotName, volKey) description, err := encodeTags(snapshotParams.Tags) @@ -1311,7 +1308,7 @@ func (cloud *CloudProvider) CreateSnapshot(ctx context.Context, project string, return snapshot, err } -func (cloud *CloudProvider) CreateImage(ctx context.Context, project string, volKey *meta.Key, imageName string, snapshotParams common.SnapshotParameters) (*computev1.Image, error) { +func (cloud *CloudProvider) CreateImage(ctx context.Context, project string, volKey *meta.Key, imageName string, snapshotParams parameters.SnapshotParameters) (*computev1.Image, error) { klog.V(5).Infof("Creating image %s for source %v", imageName, volKey) description, err := encodeTags(snapshotParams.Tags) @@ -1588,7 +1585,7 @@ func (cloud *CloudProvider) waitForSnapshotCreation(ctx context.Context, project } } case <-timer.C: - return nil, fmt.Errorf("Timeout waiting for snapshot %s to be created.", snapshotName) + return nil, status.Errorf(codes.DeadlineExceeded, "Timeout waiting for snapshot %s to be created.", snapshotName) } } } diff --git a/pkg/gce-cloud-provider/compute/gce-compute_test.go b/pkg/gce-cloud-provider/compute/gce-compute_test.go index eb2661e40..537d68a18 100644 --- a/pkg/gce-cloud-provider/compute/gce-compute_test.go +++ b/pkg/gce-cloud-provider/compute/gce-compute_test.go @@ -16,12 +16,17 @@ package gcecloudprovider import ( "context" + "fmt" "testing" + "github.com/GoogleCloudPlatform/k8s-cloud-provider/pkg/cloud/meta" computebeta "google.golang.org/api/compute/v0.beta" + "google.golang.org/api/compute/v1" computev1 "google.golang.org/api/compute/v1" "google.golang.org/grpc/codes" "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/common" + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/constants" + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/parameters" ) func TestValidateDiskParameters(t *testing.T) { @@ -86,7 +91,7 @@ func TestValidateDiskParameters(t *testing.T) { Kind: "compute#disk", }) - storageClassParams := common.DiskParameters{ + storageClassParams := parameters.DiskParameters{ DiskType: "pd-standard", ReplicationType: "none", DiskEncryptionKMSKey: tc.storageClassKMSKey, @@ -175,51 +180,51 @@ func TestValidateExistingDisk(t *testing.T) { }, { name: "valid hyperdisk with same access mode config", - accessMode: common.GCEReadWriteManyAccessMode, + accessMode: constants.GCEReadWriteManyAccessMode, disk: &computebeta.Disk{ - AccessMode: common.GCEReadWriteManyAccessMode, + AccessMode: constants.GCEReadWriteManyAccessMode, }, diskType: hyperdisk, }, { name: "valid hyperdisk with compatible access mode config - ROX can use RWX", - accessMode: common.GCEReadOnlyManyAccessMode, + accessMode: constants.GCEReadOnlyManyAccessMode, disk: &computebeta.Disk{ - AccessMode: common.GCEReadWriteManyAccessMode, + AccessMode: constants.GCEReadWriteManyAccessMode, }, diskType: hyperdisk, }, { name: "valid hyperdisk with compatible access mode config - RWO can use RWX", - accessMode: common.GCEReadWriteOnceAccessMode, + accessMode: constants.GCEReadWriteOnceAccessMode, disk: &computebeta.Disk{ - AccessMode: common.GCEReadWriteManyAccessMode, + AccessMode: constants.GCEReadWriteManyAccessMode, }, diskType: hyperdisk, }, { name: "invalid hyperdisk with incompatible access mode config - ROX cannot use RWO", - accessMode: common.GCEReadOnlyManyAccessMode, + accessMode: constants.GCEReadOnlyManyAccessMode, disk: &computebeta.Disk{ - AccessMode: common.GCEReadWriteOnceAccessMode, + AccessMode: constants.GCEReadWriteOnceAccessMode, }, diskType: hyperdisk, wantErr: true, }, { name: "invalid hyperdisk with incompatible access mode config - RWO cannot use ROX", - accessMode: common.GCEReadWriteOnceAccessMode, + accessMode: constants.GCEReadWriteOnceAccessMode, disk: &computebeta.Disk{ - AccessMode: common.GCEReadOnlyManyAccessMode, + AccessMode: constants.GCEReadOnlyManyAccessMode, }, diskType: hyperdisk, wantErr: true, }, { name: "invalid hyperdisk with incompatible access mode config - RWX cannot use ROX", - accessMode: common.GCEReadWriteManyAccessMode, + accessMode: constants.GCEReadWriteManyAccessMode, disk: &computebeta.Disk{ - AccessMode: common.GCEReadOnlyManyAccessMode, + AccessMode: constants.GCEReadOnlyManyAccessMode, }, diskType: hyperdisk, wantErr: true, @@ -228,7 +233,7 @@ func TestValidateExistingDisk(t *testing.T) { name: "invalid access mode", accessMode: "RANDOM_ERROR", disk: &computebeta.Disk{ - AccessMode: common.GCEReadOnlyManyAccessMode, + AccessMode: constants.GCEReadOnlyManyAccessMode, }, diskType: hyperdisk, wantErr: true, @@ -241,7 +246,7 @@ func TestValidateExistingDisk(t *testing.T) { d.Zone = "zone" // Bootstrap params. We don't care about these as they are already tested in previous unit test. - params := common.DiskParameters{ + params := parameters.DiskParameters{ DiskType: tc.diskType, } @@ -329,3 +334,118 @@ func TestCodeForGCEOpError(t *testing.T) { } } } + +func TestRepairUnderspecifiedVolumeKey(t *testing.T) { + cloudProvider, err := CreateFakeCloudProvider("project-id", "country-region-fakefirstzone", []*CloudDisk{ + CloudDiskFromV1(&compute.Disk{ + Name: "disk-a", + Zone: "country-region-fakefirstzone", + SelfLink: fmt.Sprintf("https://www.googleapis.com/compute/v1/projects/project-id/zones/country-region-fakefirstzone/disks/disk-a"), + }), + CloudDiskFromV1(&compute.Disk{ + Name: "disk-ab", + Zone: "country-region-fakefirstzone", + SelfLink: fmt.Sprintf("https://www.googleapis.com/compute/v1/projects/project-id/zones/country-region-fakefirstzone/disks/disk-ab"), + }), + CloudDiskFromV1(&compute.Disk{ + Name: "disk-ab", + Zone: "country-region-fakesecondzone", + SelfLink: fmt.Sprintf("https://www.googleapis.com/compute/v1/projects/project-id/zones/country-region-fakesecondzone/disks/disk-ab"), + }), + }) + if err != nil { + t.Fatalf("can't create fake cloud provider: %v", err) + } + + for _, tc := range []struct { + testName string + project string + key meta.Key + fallback string + expectedProject string + expectedKey meta.Key + expectError bool + }{ + { + testName: "fully specified", + project: "my-project", + key: meta.Key{Name: "disk", Zone: "zone-1"}, + expectedProject: "my-project", + expectedKey: meta.Key{Name: "disk", Zone: "zone-1"}, + }, + { + testName: "fully specified, fallback ignored", + project: "my-project", + key: meta.Key{Name: "disk", Zone: "zone-1"}, + fallback: "zone-2", + expectedProject: "my-project", + expectedKey: meta.Key{Name: "disk", Zone: "zone-1"}, + }, + { + testName: "unspecified zonal", + project: "UNSPECIFIED", + key: meta.Key{Name: "disk-a", Zone: "UNSPECIFIED"}, + expectedProject: "project-id", + expectedKey: meta.Key{Name: "disk-a", Zone: "country-region-fakefirstzone"}, + }, + { + testName: "unspecified regional", + project: "UNSPECIFIED", + key: meta.Key{Name: "disk-a", Region: "UNSPECIFIED"}, + expectedProject: "project-id", + expectedKey: meta.Key{Name: "disk-a", Region: "country-region"}, + }, + { + testName: "multizone regional", + project: "UNSPECIFIED", + key: meta.Key{Name: "disk-ab", Region: "UNSPECIFIED"}, + expectedProject: "project-id", + expectedKey: meta.Key{Name: "disk-ab", Region: "country-region"}, + }, + { + testName: "multi-zone, no fallback", + project: "project-id", + key: meta.Key{Name: "disk-ab", Zone: "UNSPECIFIED"}, + expectError: true, + }, + { + testName: "multi-zone, no matching fallback", + project: "project-id", + key: meta.Key{Name: "disk-ab", Zone: "UNSPECIFIED"}, + fallback: "unknown-zone", + expectError: true, + }, + { + testName: "multi-zone, fallback", + project: "my-project", + key: meta.Key{Name: "disk-ab", Zone: "UNSPECIFIED"}, + fallback: "country-region-fakesecondzone", + expectedProject: "my-project", + expectedKey: meta.Key{Name: "disk-ab", Zone: "country-region-fakesecondzone"}, + }, + } { + t.Run(tc.testName, func(t *testing.T) { + // RepairUnderspecifiedVolumeKey mutates the argument as well as returning it, sigh. We verify those semantics here + key := tc.key + prj, retKey, err := cloudProvider.RepairUnderspecifiedVolumeKey(context.Background(), tc.project, &key, tc.fallback) + if tc.expectError { + if err == nil { + t.Error("Expected error but got none") + } + } else { + if err != nil { + t.Errorf("Expected no error but got %v", err) + } + if retKey != &key { + t.Error("Did not return argument key") + } + if prj != tc.expectedProject { + t.Errorf("Got project %s, expected %s", prj, tc.expectedProject) + } + if key.Name != tc.expectedKey.Name || key.Zone != tc.expectedKey.Zone || key.Region != tc.expectedKey.Region { + t.Errorf("Got key %+v, expected %+v", key, tc.expectedKey) + } + } + }) + } +} diff --git a/pkg/gce-pd-csi-driver/cache.go b/pkg/gce-pd-csi-driver/cache.go index 66bf25f53..8db570153 100644 --- a/pkg/gce-pd-csi-driver/cache.go +++ b/pkg/gce-pd-csi-driver/cache.go @@ -14,6 +14,7 @@ import ( "google.golang.org/grpc/status" "k8s.io/klog/v2" "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/common" + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/constants" "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/k8sclient" ) @@ -169,7 +170,7 @@ func setupCaching(devicePath string, req *csi.NodeStageVolumeRequest, nodeId str // Validate that cache is setup for required size klog.V(4).Infof("Assuming valid data cache size and mode, resizing cache is not supported") } else { - cacheSize := req.GetPublishContext()[common.ContextDataCacheSize] + cacheSize := req.GetPublishContext()[constants.ContextDataCacheSize] maxChunkSizeStr := strconv.FormatInt(int64(maxChunkSize/KiB), 10) var chunkSize string cachePvSize, err := fetchPvSizeGiB() @@ -215,7 +216,7 @@ func setupCaching(devicePath string, req *csi.NodeStageVolumeRequest, nodeId str "--zero", "y", "--cachemode", - req.GetPublishContext()[common.ContextDataCacheMode], + req.GetPublishContext()[constants.ContextDataCacheMode], volumeGroupName + "/" + mainLvName, "--chunksize", chunkSize, @@ -257,7 +258,7 @@ func GetDataCacheCountFromNodeLabel(ctx context.Context, nodeName string) (int, return 0, err } - if val, found := node.GetLabels()[fmt.Sprintf(common.NodeLabelPrefix, common.DataCacheLssdCountLabel)]; found { + if val, found := node.GetLabels()[fmt.Sprintf(constants.NodeLabelPrefix, constants.DataCacheLssdCountLabel)]; found { dataCacheCount, err := strconv.Atoi(val) if err != nil { return 0, fmt.Errorf("Error getting Data Cache's LSSD count from node label: %v", err) diff --git a/pkg/gce-pd-csi-driver/controller.go b/pkg/gce-pd-csi-driver/controller.go index 9855098b5..8c0ba0b08 100644 --- a/pkg/gce-pd-csi-driver/controller.go +++ b/pkg/gce-pd-csi-driver/controller.go @@ -39,8 +39,11 @@ import ( "k8s.io/utils/strings/slices" "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/common" + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/constants" + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/convert" gce "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/gce-cloud-provider/compute" "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/metrics" + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/parameters" ) type GCEControllerServer struct { @@ -112,6 +115,9 @@ type GCEControllerServer struct { // If set to true, the CSI Driver will allow volumes to be provisioned with data cache configuration enableDataCache bool + // If set to true, the CSI Driver will allow volumes to be provisioned with dynamic disk type selection. + enableDynamicVolumes bool + multiZoneVolumeHandleConfig MultiZoneVolumeHandleConfig listVolumesConfig ListVolumesConfig @@ -242,10 +248,10 @@ var ( "nextPageToken", } listDisksFieldsWithUsers = append(listDisksFieldsWithoutUsers, "items/users") - disksWithModifiableAccessMode = []string{common.DiskTypeHdML} + disksWithModifiableAccessMode = []string{parameters.DiskTypeHdML} disksWithUnsettableAccessMode = map[string]bool{ - common.DiskTypeHdE: true, - common.DiskTypeHdT: true, + parameters.DiskTypeHdE: true, + parameters.DiskTypeHdT: true, } ) @@ -318,7 +324,14 @@ func (gceCS *GCEControllerServer) createVolumeInternal(ctx context.Context, req var err error // Apply Parameters (case-insensitive). We leave validation of // the values to the cloud provider. - params, dataCacheParams, err := gceCS.parameterProcessor().ExtractAndDefaultParameters(req.GetParameters(), gceCS.Driver.extraVolumeLabels, gceCS.enableDataCache, gceCS.Driver.extraTags) + params, dataCacheParams, err := gceCS.parameterProcessor().ExtractAndDefaultParameters(req.GetParameters()) + if gceCS.enableDynamicVolumes && params.IsDiskDynamic() { + params.DiskType, err = SelectDisk(ctx, req, gceCS.CloudProvider) + if err != nil { + return nil, status.Errorf(codes.InvalidArgument, "failed to select disk type: %v", err.Error()) + } + parameters.SanitizeDiskParameters(¶ms) + } metrics.UpdateRequestMetadataFromParams(ctx, params) if err != nil { return nil, status.Errorf(codes.InvalidArgument, "failed to extract parameters: %v", err.Error()) @@ -353,7 +366,7 @@ func (gceCS *GCEControllerServer) createVolumeInternal(ctx context.Context, req if !supportsIopsChange && !supportsThroughputChange { return nil, status.Errorf(codes.InvalidArgument, "Disk type %s does not support dynamic provisioning", params.DiskType) } - p, err := common.ExtractModifyVolumeParameters(mutableParams) + p, err := parameters.ExtractModifyVolumeParameters(mutableParams) if err != nil { return nil, status.Errorf(codes.InvalidArgument, "Invalid mutable parameters: %v", err) } @@ -385,12 +398,12 @@ func (gceCS *GCEControllerServer) createVolumeInternal(ctx context.Context, req // Validate VolumeContentSource is set when access mode is read only readonly, _ := getReadOnlyFromCapabilities(volumeCapabilities) - if readonly && req.GetVolumeContentSource() == nil && params.DiskType != common.DiskTypeHdML { + if readonly && req.GetVolumeContentSource() == nil && params.DiskType != parameters.DiskTypeHdML { return nil, status.Error(codes.InvalidArgument, "VolumeContentSource must be provided when AccessMode is set to read only") } - if readonly && params.DiskType == common.DiskTypeHdHA { - return nil, status.Errorf(codes.InvalidArgument, "Invalid access mode for disk type %s", common.DiskTypeHdHA) + if readonly && params.DiskType == parameters.DiskTypeHdHA { + return nil, status.Errorf(codes.InvalidArgument, "Invalid access mode for disk type %s", parameters.DiskTypeHdHA) } // Hyperdisk-throughput and hyperdisk-extreme do not support attaching to multiple VMs. @@ -431,7 +444,7 @@ func (gceCS *GCEControllerServer) getSupportedZonesForPDType(ctx context.Context return zones, nil } -func (gceCS *GCEControllerServer) getMultiZoneProvisioningZones(ctx context.Context, req *csi.CreateVolumeRequest, params common.DiskParameters) ([]string, error) { +func (gceCS *GCEControllerServer) getMultiZoneProvisioningZones(ctx context.Context, req *csi.CreateVolumeRequest, params parameters.DiskParameters) ([]string, error) { top := req.GetAccessibilityRequirements() if top == nil { return nil, status.Errorf(codes.InvalidArgument, "no topology specified") @@ -474,7 +487,7 @@ func (gceCS *GCEControllerServer) getMultiZoneProvisioningZones(ctx context.Cont return combinedZones.List(), nil } -func (gceCS *GCEControllerServer) createMultiZoneDisk(ctx context.Context, req *csi.CreateVolumeRequest, params common.DiskParameters, dataCacheParams common.DataCacheParameters, enableDataCache bool) (*csi.CreateVolumeResponse, error) { +func (gceCS *GCEControllerServer) createMultiZoneDisk(ctx context.Context, req *csi.CreateVolumeRequest, params parameters.DiskParameters, dataCacheParams parameters.DataCacheParameters, enableDataCache bool) (*csi.CreateVolumeResponse, error) { var err error // For multi-zone, we either select: // 1) The zones specified in requisite topology requirements @@ -484,21 +497,21 @@ func (gceCS *GCEControllerServer) createMultiZoneDisk(ctx context.Context, req * return nil, err } - multiZoneVolKey := meta.ZonalKey(req.GetName(), common.MultiZoneValue) + multiZoneVolKey := meta.ZonalKey(req.GetName(), constants.MultiZoneValue) volumeID, err := common.KeyToVolumeID(multiZoneVolKey, gceCS.CloudProvider.GetDefaultProject()) if err != nil { return nil, err } if acquired := gceCS.volumeLocks.TryAcquire(volumeID); !acquired { - return nil, status.Errorf(codes.Aborted, common.VolumeOperationAlreadyExistsFmt, volumeID) + return nil, status.Errorf(codes.Aborted, constants.VolumeOperationAlreadyExistsFmt, volumeID) } defer gceCS.volumeLocks.Release(volumeID) // If creating an empty disk (content source nil), always create RWO disks (when supported) // This allows disks to be created as underlying RWO disks, so they can be hydrated. - accessMode := common.GCEReadWriteOnceAccessMode + accessMode := constants.GCEReadWriteOnceAccessMode if req.GetVolumeContentSource() != nil { - accessMode = common.GCEReadOnlyManyAccessMode + accessMode = constants.GCEReadOnlyManyAccessMode } createDiskErrs := []error{} @@ -523,7 +536,7 @@ func (gceCS *GCEControllerServer) createMultiZoneDisk(ctx context.Context, req * } // Use the first response as a template - volumeId := fmt.Sprintf("projects/%s/zones/%s/disks/%s", gceCS.CloudProvider.GetDefaultProject(), common.MultiZoneValue, req.GetName()) + volumeId := fmt.Sprintf("projects/%s/zones/%s/disks/%s", gceCS.CloudProvider.GetDefaultProject(), constants.MultiZoneValue, req.GetName()) klog.V(4).Infof("CreateVolume succeeded for multi-zone disks in zones %s: %v", zones, multiZoneVolKey) return gceCS.generateCreateVolumeResponseWithVolumeId(createdDisks[0], zones, params, dataCacheParams, enableDataCache, volumeId), nil @@ -562,15 +575,15 @@ func (gceCS *GCEControllerServer) updateAccessModeIfNecessary(ctx context.Contex return nil } - if disk.GetAccessMode() == common.GCEReadOnlyManyAccessMode { + if disk.GetAccessMode() == constants.GCEReadOnlyManyAccessMode { // If the access mode is already readonly, return return nil } - return gceCS.CloudProvider.SetDiskAccessMode(ctx, project, volKey, common.GCEReadOnlyManyAccessMode) + return gceCS.CloudProvider.SetDiskAccessMode(ctx, project, volKey, constants.GCEReadOnlyManyAccessMode) } -func (gceCS *GCEControllerServer) createSingleDeviceDisk(ctx context.Context, req *csi.CreateVolumeRequest, params common.DiskParameters, dataCacheParams common.DataCacheParameters, enableDataCache bool) (*csi.CreateVolumeResponse, error) { +func (gceCS *GCEControllerServer) createSingleDeviceDisk(ctx context.Context, req *csi.CreateVolumeRequest, params parameters.DiskParameters, dataCacheParams parameters.DataCacheParameters, enableDataCache bool) (*csi.CreateVolumeResponse, error) { var err error var locationTopReq *locationRequirements if useVolumeCloning(req) { @@ -618,12 +631,12 @@ func (gceCS *GCEControllerServer) createSingleDeviceDisk(ctx context.Context, re // If creating an empty disk (content source nil), always create RWO disks (when supported) // This allows disks to be created as underlying RWO disks, so they can be hydrated. readonly, _ := getReadOnlyFromCapabilities(req.GetVolumeCapabilities()) - if readonly && req.GetVolumeContentSource() == nil && params.DiskType == common.DiskTypeHdML { - accessMode = common.GCEReadWriteOnceAccessMode + if readonly && req.GetVolumeContentSource() == nil && params.DiskType == parameters.DiskTypeHdML { + accessMode = constants.GCEReadWriteOnceAccessMode } if acquired := gceCS.volumeLocks.TryAcquire(volumeID); !acquired { - return nil, status.Errorf(codes.Aborted, common.VolumeOperationAlreadyExistsFmt, volumeID) + return nil, status.Errorf(codes.Aborted, constants.VolumeOperationAlreadyExistsFmt, volumeID) } defer gceCS.volumeLocks.Release(volumeID) @@ -635,7 +648,7 @@ func (gceCS *GCEControllerServer) createSingleDeviceDisk(ctx context.Context, re return gceCS.generateCreateVolumeResponseWithVolumeId(disk, zones, params, dataCacheParams, enableDataCache, volumeID), nil } -func getAccessMode(req *csi.CreateVolumeRequest, params common.DiskParameters) (string, error) { +func getAccessMode(req *csi.CreateVolumeRequest, params parameters.DiskParameters) (string, error) { readonly, _ := getReadOnlyFromCapabilities(req.GetVolumeCapabilities()) if common.IsHyperdisk(params.DiskType) { if am, err := getHyperdiskAccessModeFromCapabilities(req.GetVolumeCapabilities()); err != nil { @@ -643,7 +656,7 @@ func getAccessMode(req *csi.CreateVolumeRequest, params common.DiskParameters) ( } else if disksWithUnsettableAccessMode[params.DiskType] { // Disallow multi-attach for HdT and HdE. These checks were done in `createVolumeInternal`, // but repeating them here future-proves us from possible refactors. - if am != common.GCEReadWriteOnceAccessMode { + if am != constants.GCEReadWriteOnceAccessMode { return "", status.Errorf(codes.Internal, "") } } else { @@ -652,13 +665,13 @@ func getAccessMode(req *csi.CreateVolumeRequest, params common.DiskParameters) ( } if readonly && slices.Contains(disksWithModifiableAccessMode, params.DiskType) { - return common.GCEReadOnlyManyAccessMode, nil + return constants.GCEReadOnlyManyAccessMode, nil } return "", nil } -func (gceCS *GCEControllerServer) createSingleDisk(ctx context.Context, req *csi.CreateVolumeRequest, params common.DiskParameters, volKey *meta.Key, zones []string, accessMode string) (*gce.CloudDisk, error) { +func (gceCS *GCEControllerServer) createSingleDisk(ctx context.Context, req *csi.CreateVolumeRequest, params parameters.DiskParameters, volKey *meta.Key, zones []string, accessMode string) (*gce.CloudDisk, error) { capacityRange := req.GetCapacityRange() capBytes, _ := getRequestCapacity(capacityRange) @@ -732,8 +745,11 @@ func (gceCS *GCEControllerServer) createSingleDisk(ctx context.Context, req *csi } } // Verify the disk type and encryption key of the clone are the same as that of the source disk. - if diskFromSourceVolume.GetPDType() != params.DiskType || !gce.KmsKeyEqual(diskFromSourceVolume.GetKMSKeyName(), params.DiskEncryptionKMSKey) { - return nil, status.Errorf(codes.InvalidArgument, "CreateVolume Parameters %v do not match source volume Parameters", params) + if diskFromSourceVolume.GetPDType() != params.DiskType { + return nil, status.Errorf(codes.InvalidArgument, "CreateVolume source volume disk type %q must match new volume %q", diskFromSourceVolume.GetPDType(), params.DiskType) + } + if !gce.KmsKeyEqual(diskFromSourceVolume.GetKMSKeyName(), params.DiskEncryptionKMSKey) { + return nil, status.Errorf(codes.InvalidArgument, "CreateVolume source volume KMS key %q must match new volume %q", diskFromSourceVolume.GetKMSKeyName(), params.DiskEncryptionKMSKey) } // Verify the disk capacity range are the same or greater as that of the source disk. if diskFromSourceVolume.GetSizeGb() > common.BytesToGbRoundDown(capBytes) { @@ -844,7 +860,7 @@ func (gceCS *GCEControllerServer) ControllerModifyVolume(ctx context.Context, re return nil, err } - volumeModifyParams, err := common.ExtractModifyVolumeParameters(req.GetMutableParameters()) + volumeModifyParams, err := parameters.ExtractModifyVolumeParameters(req.GetMutableParameters()) if err != nil { klog.Errorf("Failed to extract parameters for volume %s: %v", volumeID, err) err = status.Errorf(codes.InvalidArgument, "Invalid parameters: %v", err) @@ -937,7 +953,7 @@ func (gceCS *GCEControllerServer) deleteMultiZoneDisk(ctx context.Context, req * volumeID := req.GetVolumeId() if acquired := gceCS.volumeLocks.TryAcquire(volumeID); !acquired { - return nil, status.Errorf(codes.Aborted, common.VolumeOperationAlreadyExistsFmt, volumeID) + return nil, status.Errorf(codes.Aborted, constants.VolumeOperationAlreadyExistsFmt, volumeID) } defer gceCS.volumeLocks.Release(volumeID) @@ -968,7 +984,7 @@ func (gceCS *GCEControllerServer) deleteMultiZoneDisk(ctx context.Context, req * func (gceCS *GCEControllerServer) deleteSingleDeviceDisk(ctx context.Context, req *csi.DeleteVolumeRequest, project string, volKey *meta.Key) (*csi.DeleteVolumeResponse, error) { var err error volumeID := req.GetVolumeId() - project, volKey, err = gceCS.CloudProvider.RepairUnderspecifiedVolumeKey(ctx, project, volKey) + project, volKey, err = gceCS.CloudProvider.RepairUnderspecifiedVolumeKey(ctx, project, volKey, "") if err != nil { if gce.IsGCENotFoundError(err) { klog.Warningf("DeleteVolume treating volume as deleted because cannot find volume %v: %v", volumeID, err.Error()) @@ -978,7 +994,7 @@ func (gceCS *GCEControllerServer) deleteSingleDeviceDisk(ctx context.Context, re } if acquired := gceCS.volumeLocks.TryAcquire(volumeID); !acquired { - return nil, status.Errorf(codes.Aborted, common.VolumeOperationAlreadyExistsFmt, volumeID) + return nil, status.Errorf(codes.Aborted, constants.VolumeOperationAlreadyExistsFmt, volumeID) } defer gceCS.volumeLocks.Release(volumeID) disk, _ := gceCS.CloudProvider.GetDisk(ctx, project, volKey) @@ -1068,13 +1084,13 @@ func (gceCS *GCEControllerServer) validateMultiZoneDisk(volumeID string, disk *g if !slices.Contains(gceCS.multiZoneVolumeHandleConfig.DiskTypes, disk.GetPDType()) { return status.Errorf(codes.InvalidArgument, "Multi-zone volumeID %q points to disk with unsupported disk type %q: %v", volumeID, disk.GetPDType(), disk.GetSelfLink()) } - if _, ok := disk.GetLabels()[common.MultiZoneLabel]; !ok { - return status.Errorf(codes.InvalidArgument, "Multi-zone volumeID %q points to disk that is missing label %q: %v", volumeID, common.MultiZoneLabel, disk.GetSelfLink()) + if _, ok := disk.GetLabels()[constants.MultiZoneLabel]; !ok { + return status.Errorf(codes.InvalidArgument, "Multi-zone volumeID %q points to disk that is missing label %q: %v", volumeID, constants.MultiZoneLabel, disk.GetSelfLink()) } return nil } -func (gceCS *GCEControllerServer) validateMultiZoneProvisioning(req *csi.CreateVolumeRequest, params common.DiskParameters) error { +func (gceCS *GCEControllerServer) validateMultiZoneProvisioning(req *csi.CreateVolumeRequest, params parameters.DiskParameters) error { if !gceCS.multiZoneVolumeHandleConfig.Enable { return nil } @@ -1087,22 +1103,22 @@ func (gceCS *GCEControllerServer) validateMultiZoneProvisioning(req *csi.CreateV // We don't have support volume cloning from an existing PVC if useVolumeCloning(req) { - return fmt.Errorf("%q parameter does not support volume cloning", common.ParameterKeyEnableMultiZoneProvisioning) + return fmt.Errorf("%q parameter does not support volume cloning", parameters.ParameterKeyEnableMultiZoneProvisioning) } if readonly, _ := getReadOnlyFromCapabilities(req.GetVolumeCapabilities()); !readonly && req.GetVolumeContentSource() != nil { - return fmt.Errorf("%q parameter does not support specifying volume content source in readwrite mode", common.ParameterKeyEnableMultiZoneProvisioning) + return fmt.Errorf("%q parameter does not support specifying volume content source in readwrite mode", parameters.ParameterKeyEnableMultiZoneProvisioning) } if !slices.Contains(gceCS.multiZoneVolumeHandleConfig.DiskTypes, params.DiskType) { - return fmt.Errorf("%q parameter with unsupported disk type: %v", common.ParameterKeyEnableMultiZoneProvisioning, params.DiskType) + return fmt.Errorf("%q parameter with unsupported disk type: %v", parameters.ParameterKeyEnableMultiZoneProvisioning, params.DiskType) } return nil } func isMultiZoneVolKey(volumeKey *meta.Key) bool { - return volumeKey.Type() == meta.Zonal && volumeKey.Zone == common.MultiZoneValue + return volumeKey.Type() == meta.Zonal && volumeKey.Zone == constants.MultiZoneValue } func (gceCS *GCEControllerServer) executeControllerPublishVolume(ctx context.Context, req *csi.ControllerPublishVolumeRequest) (*csi.ControllerPublishVolumeResponse, error, *gce.CloudDisk) { @@ -1122,10 +1138,10 @@ func (gceCS *GCEControllerServer) executeControllerPublishVolume(ctx context.Con // Set data cache publish context if gceCS.enableDataCache && req.GetVolumeContext() != nil { - if req.GetVolumeContext()[common.ContextDataCacheSize] != "" { + if req.GetVolumeContext()[constants.ContextDataCacheSize] != "" { pubVolResp.PublishContext = map[string]string{} - pubVolResp.PublishContext[common.ContextDataCacheSize] = req.GetVolumeContext()[common.ContextDataCacheSize] - pubVolResp.PublishContext[common.ContextDataCacheMode] = req.GetVolumeContext()[common.ContextDataCacheMode] + pubVolResp.PublishContext[constants.ContextDataCacheSize] = req.GetVolumeContext()[constants.ContextDataCacheSize] + pubVolResp.PublishContext[constants.ContextDataCacheMode] = req.GetVolumeContext()[constants.ContextDataCacheMode] } } @@ -1144,7 +1160,7 @@ func (gceCS *GCEControllerServer) executeControllerPublishVolume(ctx context.Con volKey = convertMultiZoneVolKeyToZoned(volKey, instanceZone) } - project, volKey, err = gceCS.CloudProvider.RepairUnderspecifiedVolumeKey(ctx, project, volKey) + project, volKey, err = gceCS.CloudProvider.RepairUnderspecifiedVolumeKey(ctx, project, volKey, "") if err != nil { if gce.IsGCENotFoundError(err) { return nil, status.Errorf(codes.NotFound, "ControllerPublishVolume could not find volume with ID %v: %v", volumeID, err.Error()), nil @@ -1156,7 +1172,7 @@ func (gceCS *GCEControllerServer) executeControllerPublishVolume(ctx context.Con // to publish the same volume onto different nodes concurrently lockingVolumeID := fmt.Sprintf("%s/%s", nodeID, volumeID) if acquired := gceCS.volumeLocks.TryAcquire(lockingVolumeID); !acquired { - return nil, status.Errorf(codes.Aborted, common.VolumeOperationAlreadyExistsFmt, lockingVolumeID), nil + return nil, status.Errorf(codes.Aborted, constants.VolumeOperationAlreadyExistsFmt, lockingVolumeID), nil } defer gceCS.volumeLocks.Release(lockingVolumeID) disk, err := gceCS.CloudProvider.GetDisk(ctx, project, volKey) @@ -1167,7 +1183,7 @@ func (gceCS *GCEControllerServer) executeControllerPublishVolume(ctx context.Con return nil, common.LoggedError("Failed to getDisk: ", err), disk } if gceCS.EnableDiskSizeValidation && pubVolResp.GetPublishContext() != nil { - pubVolResp.PublishContext[common.ContextDiskSizeGB] = strconv.FormatInt(disk.GetSizeGb(), 10) + pubVolResp.PublishContext[constants.ContextDiskSizeGB] = strconv.FormatInt(disk.GetSizeGb(), 10) } instance, err := gceCS.CloudProvider.GetInstanceOrError(ctx, project, instanceZone, instanceName) if err != nil { @@ -1292,7 +1308,7 @@ func (gceCS *GCEControllerServer) executeControllerUnpublishVolume(ctx context.C volKey = convertMultiZoneVolKeyToZoned(volKey, instanceZone) } - project, volKey, err = gceCS.CloudProvider.RepairUnderspecifiedVolumeKey(ctx, project, volKey) + project, volKey, err = gceCS.CloudProvider.RepairUnderspecifiedVolumeKey(ctx, project, volKey, instanceZone) if err != nil { if gce.IsGCENotFoundError(err) { klog.Warningf("Treating volume %v as unpublished because it could not be found", volumeID) @@ -1305,7 +1321,7 @@ func (gceCS *GCEControllerServer) executeControllerUnpublishVolume(ctx context.C // to unpublish the same volume from different nodes concurrently lockingVolumeID := fmt.Sprintf("%s/%s", nodeID, volumeID) if acquired := gceCS.volumeLocks.TryAcquire(lockingVolumeID); !acquired { - return nil, status.Errorf(codes.Aborted, common.VolumeOperationAlreadyExistsFmt, lockingVolumeID), nil + return nil, status.Errorf(codes.Aborted, constants.VolumeOperationAlreadyExistsFmt, lockingVolumeID), nil } defer gceCS.volumeLocks.Release(lockingVolumeID) diskToUnpublish, _ := gceCS.CloudProvider.GetDisk(ctx, project, volKey) @@ -1340,13 +1356,17 @@ func (gceCS *GCEControllerServer) executeControllerUnpublishVolume(ctx context.C return &csi.ControllerUnpublishVolumeResponse{}, nil, diskToUnpublish } -func (gceCS *GCEControllerServer) parameterProcessor() *common.ParameterProcessor { - return &common.ParameterProcessor{ - DriverName: gceCS.Driver.name, - EnableStoragePools: gceCS.enableStoragePools, - EnableMultiZone: gceCS.multiZoneVolumeHandleConfig.Enable, - EnableHdHA: gceCS.enableHdHA, - EnableDiskTopology: gceCS.EnableDiskTopology, +func (gceCS *GCEControllerServer) parameterProcessor() *parameters.ParameterProcessor { + return ¶meters.ParameterProcessor{ + DriverName: gceCS.Driver.name, + EnableStoragePools: gceCS.enableStoragePools, + EnableMultiZone: gceCS.multiZoneVolumeHandleConfig.Enable, + EnableHdHA: gceCS.enableHdHA, + EnableDiskTopology: gceCS.EnableDiskTopology, + ExtraVolumeLabels: gceCS.Driver.extraVolumeLabels, + EnableDataCache: gceCS.enableDataCache, + ExtraTags: gceCS.Driver.extraTags, + EnableDynamicVolumes: gceCS.enableDynamicVolumes, } } @@ -1364,7 +1384,7 @@ func (gceCS *GCEControllerServer) ValidateVolumeCapabilities(ctx context.Context return nil, status.Errorf(codes.InvalidArgument, "Volume ID is invalid: %v", err.Error()) } - project, volKey, err = gceCS.CloudProvider.RepairUnderspecifiedVolumeKey(ctx, project, volKey) + project, volKey, err = gceCS.CloudProvider.RepairUnderspecifiedVolumeKey(ctx, project, volKey, "") if err != nil { if gce.IsGCENotFoundError(err) { return nil, status.Errorf(codes.NotFound, "ValidateVolumeCapabilities could not find volume with ID %v: %v", volumeID, err.Error()) @@ -1373,7 +1393,7 @@ func (gceCS *GCEControllerServer) ValidateVolumeCapabilities(ctx context.Context } if acquired := gceCS.volumeLocks.TryAcquire(volumeID); !acquired { - return nil, status.Errorf(codes.Aborted, common.VolumeOperationAlreadyExistsFmt, volumeID) + return nil, status.Errorf(codes.Aborted, constants.VolumeOperationAlreadyExistsFmt, volumeID) } defer gceCS.volumeLocks.Release(volumeID) @@ -1392,7 +1412,7 @@ func (gceCS *GCEControllerServer) ValidateVolumeCapabilities(ctx context.Context } // Validate the disk parameters match the disk we GET - params, _, err := gceCS.parameterProcessor().ExtractAndDefaultParameters(req.GetParameters(), gceCS.Driver.extraVolumeLabels, gceCS.enableDataCache, gceCS.Driver.extraTags) + params, _, err := gceCS.parameterProcessor().ExtractAndDefaultParameters(req.GetParameters()) if err != nil { return nil, status.Errorf(codes.InvalidArgument, "failed to extract parameters: %v", err.Error()) } @@ -1496,7 +1516,7 @@ func (gceCS *GCEControllerServer) ListVolumes(ctx context.Context, req *csi.List func isMultiZoneDisk(diskRsrc string, diskLabels map[string]string) (string, bool) { isMultiZoneDisk := false for l := range diskLabels { - if l == common.MultiZoneLabel { + if l == constants.MultiZoneLabel { isMultiZoneDisk = true } } @@ -1614,7 +1634,7 @@ func (gceCS *GCEControllerServer) CreateSnapshot(ctx context.Context, req *csi.C } if acquired := gceCS.volumeLocks.TryAcquire(volumeID); !acquired { - return nil, status.Errorf(codes.Aborted, common.VolumeOperationAlreadyExistsFmt, volumeID) + return nil, status.Errorf(codes.Aborted, constants.VolumeOperationAlreadyExistsFmt, volumeID) } defer gceCS.volumeLocks.Release(volumeID) @@ -1628,21 +1648,21 @@ func (gceCS *GCEControllerServer) CreateSnapshot(ctx context.Context, req *csi.C return nil, common.LoggedError("CreateSnapshot, failed to getDisk: ", err) } - snapshotParams, err := common.ExtractAndDefaultSnapshotParameters(req.GetParameters(), gceCS.Driver.name, gceCS.Driver.extraTags) + snapshotParams, err := parameters.ExtractAndDefaultSnapshotParameters(req.GetParameters(), gceCS.Driver.name, gceCS.Driver.extraTags) if err != nil { return nil, status.Errorf(codes.InvalidArgument, "Invalid snapshot parameters: %v", err.Error()) } var snapshot *csi.Snapshot switch snapshotParams.SnapshotType { - case common.DiskSnapshotType: + case parameters.DiskSnapshotType: snapshot, err = gceCS.createPDSnapshot(ctx, project, volKey, req.Name, snapshotParams) if err != nil { return nil, err } - case common.DiskImageType: + case parameters.DiskImageType: if disk.LocationType() == meta.Regional { - return nil, status.Errorf(codes.InvalidArgument, "Cannot create backup type %s for regional disk %s", common.DiskImageType, disk.GetName()) + return nil, status.Errorf(codes.InvalidArgument, "Cannot create backup type %s for regional disk %s", parameters.DiskImageType, disk.GetName()) } snapshot, err = gceCS.createImage(ctx, project, volKey, req.Name, snapshotParams) if err != nil { @@ -1656,7 +1676,7 @@ func (gceCS *GCEControllerServer) CreateSnapshot(ctx context.Context, req *csi.C return &csi.CreateSnapshotResponse{Snapshot: snapshot}, nil } -func (gceCS *GCEControllerServer) createPDSnapshot(ctx context.Context, project string, volKey *meta.Key, snapshotName string, snapshotParams common.SnapshotParameters) (*csi.Snapshot, error) { +func (gceCS *GCEControllerServer) createPDSnapshot(ctx context.Context, project string, volKey *meta.Key, snapshotName string, snapshotParams parameters.SnapshotParameters) (*csi.Snapshot, error) { volumeID, err := common.KeyToVolumeID(volKey, project) if err != nil { return nil, status.Errorf(codes.InvalidArgument, "Invalid volume key: %v", volKey) @@ -1703,7 +1723,7 @@ func (gceCS *GCEControllerServer) createPDSnapshot(ctx context.Context, project return nil, status.Errorf(codes.Internal, "Failed to covert creation timestamp: %v", err.Error()) } - ready, err := isCSISnapshotReady(snapshot.Status) + ready, err := isCSISnapshotReady(snapshot) if err != nil { return nil, status.Errorf(codes.Internal, "Snapshot had error checking ready status: %v", err.Error()) } @@ -1717,7 +1737,7 @@ func (gceCS *GCEControllerServer) createPDSnapshot(ctx context.Context, project }, nil } -func (gceCS *GCEControllerServer) createImage(ctx context.Context, project string, volKey *meta.Key, imageName string, snapshotParams common.SnapshotParameters) (*csi.Snapshot, error) { +func (gceCS *GCEControllerServer) createImage(ctx context.Context, project string, volKey *meta.Key, imageName string, snapshotParams parameters.SnapshotParameters) (*csi.Snapshot, error) { volumeID, err := common.KeyToVolumeID(volKey, project) if err != nil { return nil, status.Errorf(codes.InvalidArgument, "Invalid volume key: %v", volKey) @@ -1845,15 +1865,13 @@ func (gceCS *GCEControllerServer) validateExistingSnapshot(snapshot *compute.Sna return nil } -func isCSISnapshotReady(status string) (bool, error) { - switch status { +func isCSISnapshotReady(snapshot *compute.Snapshot) (bool, error) { + klog.V(4).Infof("snapshot %s is %s", snapshot.SelfLink, snapshot.Status) + switch snapshot.Status { case "READY": return true, nil case "FAILED": - return false, fmt.Errorf("snapshot status is FAILED") - case "DELETING": - klog.V(4).Infof("snapshot is in DELETING") - fallthrough + return false, fmt.Errorf("snapshot %s status is FAILED", snapshot.SelfLink) default: return false, nil } @@ -1876,12 +1894,12 @@ func (gceCS *GCEControllerServer) DeleteSnapshot(ctx context.Context, req *csi.D } switch snapshotType { - case common.DiskSnapshotType: + case parameters.DiskSnapshotType: err = gceCS.CloudProvider.DeleteSnapshot(ctx, project, key) if err != nil { return nil, common.LoggedError("Failed to DeleteSnapshot: ", err) } - case common.DiskImageType: + case parameters.DiskImageType: err = gceCS.CloudProvider.DeleteImage(ctx, project, key) if err != nil { return nil, common.LoggedError("Failed to DeleteImage error: ", err) @@ -1960,7 +1978,7 @@ func (gceCS *GCEControllerServer) ControllerExpandVolume(ctx context.Context, re if err != nil { return nil, status.Errorf(codes.InvalidArgument, "ControllerExpandVolume Volume ID is invalid: %v", err.Error()) } - project, volKey, err = gceCS.CloudProvider.RepairUnderspecifiedVolumeKey(ctx, project, volKey) + project, volKey, err = gceCS.CloudProvider.RepairUnderspecifiedVolumeKey(ctx, project, volKey, "") if err != nil { if gce.IsGCENotFoundError(err) { @@ -2044,7 +2062,7 @@ func (gceCS *GCEControllerServer) getSnapshotByID(ctx context.Context, snapshotI var entries []*csi.ListSnapshotsResponse_Entry switch snapshotType { - case common.DiskSnapshotType: + case parameters.DiskSnapshotType: snapshot, err := gceCS.CloudProvider.GetSnapshot(ctx, project, key) if err != nil { if gce.IsGCEError(err, "notFound") { @@ -2058,7 +2076,7 @@ func (gceCS *GCEControllerServer) getSnapshotByID(ctx context.Context, snapshotI return nil, fmt.Errorf("failed to generate snapshot entry: %w", err) } entries = []*csi.ListSnapshotsResponse_Entry{e} - case common.DiskImageType: + case parameters.DiskImageType: image, err := gceCS.CloudProvider.GetImage(ctx, project, key) if err != nil { if gce.IsGCEError(err, "notFound") { @@ -2101,7 +2119,7 @@ func generateDiskSnapshotEntry(snapshot *compute.Snapshot) (*csi.ListSnapshotsRe // We ignore the error intentionally here since we are just listing snapshots // TODO: If the snapshot is in "FAILED" state we need to think through what this // should actually look like. - ready, _ := isCSISnapshotReady(snapshot.Status) + ready, _ := isCSISnapshotReady(snapshot) entry := &csi.ListSnapshotsResponse_Entry{ Snapshot: &csi.Snapshot{ @@ -2322,19 +2340,12 @@ func getZonesFromTopology(topList []*csi.Topology) ([]string, error) { } func getZoneFromSegment(seg map[string]string) (string, error) { - var zone string for k, v := range seg { - switch k { - case common.TopologyKeyZone: - zone = v - default: - return "", fmt.Errorf("topology segment has unknown key %v", k) + if k == constants.TopologyKeyZone { + return v, nil } } - if len(zone) == 0 { - return "", fmt.Errorf("topology specified but could not find zone in segment: %v", seg) - } - return zone, nil + return "", fmt.Errorf("topology specified but could not find zone in segment: %v", seg) } func (gceCS *GCEControllerServer) pickZones(ctx context.Context, top *csi.TopologyRequirement, numZones int, locationTopReq *locationRequirements) ([]string, error) { @@ -2396,7 +2407,7 @@ func getNumDefaultZonesInRegion(ctx context.Context, gceCS *GCEControllerServer, return ret, nil } -func paramsToVolumeContext(params common.DiskParameters) map[string]string { +func paramsToVolumeContext(params parameters.DiskParameters) map[string]string { context := map[string]string{} if params.ForceAttach { context[contextForceAttach] = "true" @@ -2414,7 +2425,7 @@ func extractVolumeContext(context map[string]string) (*PDCSIContext, error) { for key, val := range context { switch key { case contextForceAttach: - b, err := common.ConvertStringToBool(val) + b, err := convert.ConvertStringToBool(val) if err != nil { return nil, fmt.Errorf("bad volume context force attach: %w", err) } @@ -2424,12 +2435,12 @@ func extractVolumeContext(context map[string]string) (*PDCSIContext, error) { return info, nil } -func (gceCS *GCEControllerServer) generateCreateVolumeResponseWithVolumeId(disk *gce.CloudDisk, zones []string, params common.DiskParameters, dataCacheParams common.DataCacheParameters, enableDataCache bool, volumeId string) *csi.CreateVolumeResponse { +func (gceCS *GCEControllerServer) generateCreateVolumeResponseWithVolumeId(disk *gce.CloudDisk, zones []string, params parameters.DiskParameters, dataCacheParams parameters.DataCacheParameters, enableDataCache bool, volumeId string) *csi.CreateVolumeResponse { tops := []*csi.Topology{} for _, zone := range zones { top := &csi.Topology{ Segments: map[string]string{ - common.TopologyKeyZone: zone, + constants.TopologyKeyZone: zone, }, } @@ -2454,12 +2465,12 @@ func (gceCS *GCEControllerServer) generateCreateVolumeResponseWithVolumeId(disk }, } // Set data cache volume context - if enableDataCache && dataCacheParams != (common.DataCacheParameters{}) { + if enableDataCache && dataCacheParams != (parameters.DataCacheParameters{}) { if createResp.Volume.VolumeContext == nil { createResp.Volume.VolumeContext = map[string]string{} } - createResp.Volume.VolumeContext[common.ContextDataCacheMode] = dataCacheParams.DataCacheMode - createResp.Volume.VolumeContext[common.ContextDataCacheSize] = dataCacheParams.DataCacheSize + createResp.Volume.VolumeContext[constants.ContextDataCacheMode] = dataCacheParams.DataCacheMode + createResp.Volume.VolumeContext[constants.ContextDataCacheSize] = dataCacheParams.DataCacheSize } snapshotID := disk.GetSnapshotId() imageID := disk.GetImageId() @@ -2527,7 +2538,7 @@ func getResourceId(resourceLink string) (string, error) { return strings.Join(elts[3:], "/"), nil } -func createRegionalDisk(ctx context.Context, cloudProvider gce.GCECompute, name string, zones []string, params common.DiskParameters, capacityRange *csi.CapacityRange, capBytes int64, snapshotID string, volumeContentSourceVolumeID string, multiWriter bool, accessMode string) (*gce.CloudDisk, error) { +func createRegionalDisk(ctx context.Context, cloudProvider gce.GCECompute, name string, zones []string, params parameters.DiskParameters, capacityRange *csi.CapacityRange, capBytes int64, snapshotID string, volumeContentSourceVolumeID string, multiWriter bool, accessMode string) (*gce.CloudDisk, error) { project := cloudProvider.GetDefaultProject() region, err := common.GetRegionFromZones(zones) if err != nil { @@ -2553,7 +2564,7 @@ func createRegionalDisk(ctx context.Context, cloudProvider gce.GCECompute, name return disk, nil } -func createSingleZoneDisk(ctx context.Context, cloudProvider gce.GCECompute, name string, zones []string, params common.DiskParameters, capacityRange *csi.CapacityRange, capBytes int64, snapshotID string, volumeContentSourceVolumeID string, multiWriter bool, accessMode string) (*gce.CloudDisk, error) { +func createSingleZoneDisk(ctx context.Context, cloudProvider gce.GCECompute, name string, zones []string, params parameters.DiskParameters, capacityRange *csi.CapacityRange, capBytes int64, snapshotID string, volumeContentSourceVolumeID string, multiWriter bool, accessMode string) (*gce.CloudDisk, error) { project := cloudProvider.GetDefaultProject() if len(zones) != 1 { return nil, fmt.Errorf("got wrong number of zones for zonal create volume: %v", len(zones)) diff --git a/pkg/gce-pd-csi-driver/controller_test.go b/pkg/gce-pd-csi-driver/controller_test.go index 92e7e2282..a267e1a91 100644 --- a/pkg/gce-pd-csi-driver/controller_test.go +++ b/pkg/gce-pd-csi-driver/controller_test.go @@ -44,8 +44,10 @@ import ( csi "github.com/container-storage-interface/spec/lib/go/csi" "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/common" + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/constants" gce "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/gce-cloud-provider/compute" gcecloudprovider "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/gce-cloud-provider/compute" + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/parameters" ) const ( @@ -66,11 +68,11 @@ var ( RequiredBytes: common.GbToBytes(20), } stdParams = map[string]string{ - common.ParameterKeyType: stdDiskType, + parameters.ParameterKeyType: stdDiskType, } stdTopology = []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: zone}, + Segments: map[string]string{constants.TopologyKeyZone: zone}, }, } @@ -108,7 +110,7 @@ func TestCreateSnapshotArguments(t *testing.T) { req: &csi.CreateSnapshotRequest{ Name: name, SourceVolumeId: testVolumeID, - Parameters: map[string]string{common.ParameterKeyStorageLocations: " US-WEST2"}, + Parameters: map[string]string{parameters.ParameterKeyStorageLocations: " US-WEST2"}, }, seedDisks: []*gce.CloudDisk{ createZonalCloudDisk(name), @@ -126,7 +128,7 @@ func TestCreateSnapshotArguments(t *testing.T) { req: &csi.CreateSnapshotRequest{ Name: name, SourceVolumeId: testVolumeID, - Parameters: map[string]string{common.ParameterKeyStorageLocations: " US-WEST2", common.ParameterKeySnapshotType: "images"}, + Parameters: map[string]string{parameters.ParameterKeyStorageLocations: " US-WEST2", parameters.ParameterKeySnapshotType: "images"}, }, seedDisks: []*gce.CloudDisk{ createZonalCloudDisk(name), @@ -188,7 +190,7 @@ func TestCreateSnapshotArguments(t *testing.T) { req: &csi.CreateSnapshotRequest{ Name: name, SourceVolumeId: testVolumeID, - Parameters: map[string]string{common.ParameterKeyStorageLocations: "bad-region"}, + Parameters: map[string]string{parameters.ParameterKeyStorageLocations: "bad-region"}, }, seedDisks: []*gce.CloudDisk{ createZonalCloudDisk(name), @@ -230,13 +232,13 @@ func TestCreateSnapshotArguments(t *testing.T) { req: &csi.CreateSnapshotRequest{ Name: name, SourceVolumeId: testRegionalID, - Parameters: map[string]string{common.ParameterKeyStorageLocations: " US-WEST2", common.ParameterKeySnapshotType: "images"}, + Parameters: map[string]string{parameters.ParameterKeyStorageLocations: " US-WEST2", parameters.ParameterKeySnapshotType: "images"}, }, seedDisks: []*gce.CloudDisk{ gce.CloudDiskFromV1(&compute.Disk{ Name: name, SelfLink: fmt.Sprintf("https://www.googleapis.com/compute/v1/projects/project/regions/country-region/name/%s", name), - Type: common.DiskTypeHdHA, + Type: parameters.DiskTypeHdHA, Region: "country-region", }), }, @@ -247,13 +249,13 @@ func TestCreateSnapshotArguments(t *testing.T) { req: &csi.CreateSnapshotRequest{ Name: name, SourceVolumeId: testRegionalID, - Parameters: map[string]string{common.ParameterKeyStorageLocations: " US-WEST2"}, + Parameters: map[string]string{parameters.ParameterKeyStorageLocations: " US-WEST2"}, }, seedDisks: []*gce.CloudDisk{ gce.CloudDiskFromV1(&compute.Disk{ Name: name, SelfLink: fmt.Sprintf("https://www.googleapis.com/compute/v1/projects/project/regions/country-region/name/%s", name), - Type: common.DiskTypeHdHA, + Type: parameters.DiskTypeHdHA, Region: "country-region", }), }, @@ -537,7 +539,7 @@ func TestListSnapshotsArguments(t *testing.T) { createReq := &csi.CreateSnapshotRequest{ Name: nameID, SourceVolumeId: volumeID, - Parameters: map[string]string{common.ParameterKeySnapshotType: common.DiskSnapshotType}, + Parameters: map[string]string{parameters.ParameterKeySnapshotType: parameters.DiskSnapshotType}, } _, err := gceDriver.cs.CreateSnapshot(context.Background(), createReq) if err != nil { @@ -551,7 +553,7 @@ func TestListSnapshotsArguments(t *testing.T) { createReq := &csi.CreateSnapshotRequest{ Name: nameID, SourceVolumeId: volumeID, - Parameters: map[string]string{common.ParameterKeySnapshotType: common.DiskImageType}, + Parameters: map[string]string{parameters.ParameterKeySnapshotType: parameters.DiskImageType}, } _, err := gceDriver.cs.CreateSnapshot(context.Background(), createReq) if err != nil { @@ -593,12 +595,13 @@ func TestListSnapshotsArguments(t *testing.T) { func TestCreateVolumeArguments(t *testing.T) { testCases := []struct { - name string - req *csi.CreateVolumeRequest - enableStoragePools bool - expVol *csi.Volume - expErrCode codes.Code - enableDiskTopology bool + name string + req *csi.CreateVolumeRequest + enableStoragePools bool + expVol *csi.Volume + expErrCode codes.Code + enableDiskTopology bool + enableDynamicVolumes bool }{ { name: "success default", @@ -723,7 +726,7 @@ func TestCreateVolumeArguments(t *testing.T) { AccessibilityRequirements: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "topology-zone"}, + Segments: map[string]string{constants.TopologyKeyZone: "topology-zone"}, }, }, }, @@ -734,7 +737,7 @@ func TestCreateVolumeArguments(t *testing.T) { VolumeContext: nil, AccessibleTopology: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "topology-zone"}, + Segments: map[string]string{constants.TopologyKeyZone: "topology-zone"}, }, }, }, @@ -749,24 +752,24 @@ func TestCreateVolumeArguments(t *testing.T) { AccessibilityRequirements: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "topology-zone3"}, + Segments: map[string]string{constants.TopologyKeyZone: "topology-zone3"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "topology-zone1"}, + Segments: map[string]string{constants.TopologyKeyZone: "topology-zone1"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "topology-zone2"}, + Segments: map[string]string{constants.TopologyKeyZone: "topology-zone2"}, }, }, Preferred: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "topology-zone2"}, + Segments: map[string]string{constants.TopologyKeyZone: "topology-zone2"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "topology-zone3"}, + Segments: map[string]string{constants.TopologyKeyZone: "topology-zone3"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "topology-zone1"}, + Segments: map[string]string{constants.TopologyKeyZone: "topology-zone1"}, }, }, }, @@ -777,27 +780,10 @@ func TestCreateVolumeArguments(t *testing.T) { VolumeContext: nil, AccessibleTopology: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "topology-zone2"}, - }, - }, - }, - }, - { - name: "fail with extra topology", - req: &csi.CreateVolumeRequest{ - Name: "test-name", - CapacityRange: stdCapRange, - VolumeCapabilities: stdVolCaps, - Parameters: stdParams, - AccessibilityRequirements: &csi.TopologyRequirement{ - Requisite: []*csi.Topology{ - { - Segments: map[string]string{"ooblezoners": "topology-zone", common.TopologyKeyZone: "top-zone"}, - }, + Segments: map[string]string{constants.TopologyKeyZone: "topology-zone2"}, }, }, }, - expErrCode: codes.InvalidArgument, }, { name: "fail with missing topology zone", @@ -823,14 +809,14 @@ func TestCreateVolumeArguments(t *testing.T) { Name: name, CapacityRange: stdCapRange, VolumeCapabilities: stdVolCaps, - Parameters: map[string]string{common.ParameterKeyReplicationType: replicationTypeRegionalPD}, + Parameters: map[string]string{parameters.ParameterKeyReplicationType: replicationTypeRegionalPD}, AccessibilityRequirements: &csi.TopologyRequirement{ Preferred: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: region + "-c"}, + Segments: map[string]string{constants.TopologyKeyZone: region + "-c"}, }, { - Segments: map[string]string{common.TopologyKeyZone: region + "-b"}, + Segments: map[string]string{constants.TopologyKeyZone: region + "-b"}, }, }, }, @@ -841,10 +827,10 @@ func TestCreateVolumeArguments(t *testing.T) { VolumeContext: nil, AccessibleTopology: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: region + "-c"}, + Segments: map[string]string{constants.TopologyKeyZone: region + "-c"}, }, { - Segments: map[string]string{common.TopologyKeyZone: region + "-b"}, + Segments: map[string]string{constants.TopologyKeyZone: region + "-b"}, }, }, }, @@ -856,17 +842,17 @@ func TestCreateVolumeArguments(t *testing.T) { CapacityRange: stdCapRange, VolumeCapabilities: stdVolCaps, Parameters: map[string]string{ - common.ParameterKeyReplicationType: replicationTypeRegionalPD, + parameters.ParameterKeyReplicationType: replicationTypeRegionalPD, }, AccessibilityRequirements: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: region + "-c"}, + Segments: map[string]string{constants.TopologyKeyZone: region + "-c"}, }, }, Preferred: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: region + "-c"}, + Segments: map[string]string{constants.TopologyKeyZone: region + "-c"}, }, }, }, @@ -880,7 +866,7 @@ func TestCreateVolumeArguments(t *testing.T) { CapacityRange: stdCapRange, VolumeCapabilities: stdVolCaps, Parameters: map[string]string{ - common.ParameterKeyReplicationType: replicationTypeRegionalPD, + parameters.ParameterKeyReplicationType: replicationTypeRegionalPD, }, }, expVol: &csi.Volume{ @@ -889,10 +875,10 @@ func TestCreateVolumeArguments(t *testing.T) { VolumeContext: nil, AccessibleTopology: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: zone}, + Segments: map[string]string{constants.TopologyKeyZone: zone}, }, { - Segments: map[string]string{common.TopologyKeyZone: secondZone}, + Segments: map[string]string{constants.TopologyKeyZone: secondZone}, }, }, }, @@ -904,14 +890,14 @@ func TestCreateVolumeArguments(t *testing.T) { Name: name, CapacityRange: stdCapRange, VolumeCapabilities: stdVolCaps, - Parameters: map[string]string{common.ParameterKeyType: common.DiskTypeHdHA}, + Parameters: map[string]string{parameters.ParameterKeyType: parameters.DiskTypeHdHA}, AccessibilityRequirements: &csi.TopologyRequirement{ Preferred: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: region + "-c"}, + Segments: map[string]string{constants.TopologyKeyZone: region + "-c"}, }, { - Segments: map[string]string{common.TopologyKeyZone: region + "-b"}, + Segments: map[string]string{constants.TopologyKeyZone: region + "-b"}, }, }, }, @@ -922,10 +908,10 @@ func TestCreateVolumeArguments(t *testing.T) { VolumeContext: nil, AccessibleTopology: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: region + "-c"}, + Segments: map[string]string{constants.TopologyKeyZone: region + "-c"}, }, { - Segments: map[string]string{common.TopologyKeyZone: region + "-b"}, + Segments: map[string]string{constants.TopologyKeyZone: region + "-b"}, }, }, }, @@ -937,17 +923,17 @@ func TestCreateVolumeArguments(t *testing.T) { CapacityRange: stdCapRange, VolumeCapabilities: stdVolCaps, Parameters: map[string]string{ - common.ParameterKeyType: common.DiskTypeHdHA, + parameters.ParameterKeyType: parameters.DiskTypeHdHA, }, AccessibilityRequirements: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: region + "-c"}, + Segments: map[string]string{constants.TopologyKeyZone: region + "-c"}, }, }, Preferred: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: region + "-c"}, + Segments: map[string]string{constants.TopologyKeyZone: region + "-c"}, }, }, }, @@ -961,7 +947,7 @@ func TestCreateVolumeArguments(t *testing.T) { CapacityRange: stdCapRange, VolumeCapabilities: stdVolCaps, Parameters: map[string]string{ - common.ParameterKeyType: common.DiskTypeHdHA, + parameters.ParameterKeyType: parameters.DiskTypeHdHA, }, }, expVol: &csi.Volume{ @@ -970,10 +956,10 @@ func TestCreateVolumeArguments(t *testing.T) { VolumeContext: nil, AccessibleTopology: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: zone}, + Segments: map[string]string{constants.TopologyKeyZone: zone}, }, { - Segments: map[string]string{common.TopologyKeyZone: secondZone}, + Segments: map[string]string{constants.TopologyKeyZone: secondZone}, }, }, }, @@ -1025,7 +1011,7 @@ func TestCreateVolumeArguments(t *testing.T) { CapacityRange: stdCapRange, VolumeCapabilities: stdVolCaps, Parameters: map[string]string{ - common.ParameterKeyDiskEncryptionKmsKey: "projects/KMS_PROJECT_ID/locations/REGION/keyRings/KEY_RING/cryptoKeys/KEY", + parameters.ParameterKeyDiskEncryptionKmsKey: "projects/KMS_PROJECT_ID/locations/REGION/keyRings/KEY_RING/cryptoKeys/KEY", }, }, expVol: &csi.Volume{ @@ -1120,12 +1106,12 @@ func TestCreateVolumeArguments(t *testing.T) { AccessibilityRequirements: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, }, Preferred: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, }, }, @@ -1137,7 +1123,7 @@ func TestCreateVolumeArguments(t *testing.T) { VolumeContext: nil, AccessibleTopology: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, }, }, @@ -1152,12 +1138,12 @@ func TestCreateVolumeArguments(t *testing.T) { AccessibilityRequirements: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, }, Preferred: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, }, }, @@ -1175,12 +1161,12 @@ func TestCreateVolumeArguments(t *testing.T) { AccessibilityRequirements: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, }, Preferred: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, }, }, @@ -1297,7 +1283,7 @@ func TestCreateVolumeArguments(t *testing.T) { }, }, Parameters: map[string]string{ - common.ParameterKeyType: "hyperdisk-balanced", + parameters.ParameterKeyType: "hyperdisk-balanced", }, }, expErrCode: codes.InvalidArgument, @@ -1318,7 +1304,7 @@ func TestCreateVolumeArguments(t *testing.T) { }, }, Parameters: map[string]string{ - common.ParameterKeyType: "hyperdisk-ml", + parameters.ParameterKeyType: "hyperdisk-ml", }, }, expVol: &csi.Volume{ @@ -1338,7 +1324,7 @@ func TestCreateVolumeArguments(t *testing.T) { VolumeCapabilities: stdVolCaps, Parameters: mergeParameters( stdParams, - map[string]string{common.ParameterKeyUseAllowedDiskTopology: "false"}, + map[string]string{parameters.ParameterKeyUseAllowedDiskTopology: "false"}, ), }, enableDiskTopology: true, @@ -1349,7 +1335,7 @@ func TestCreateVolumeArguments(t *testing.T) { AccessibleTopology: []*csi.Topology{ { Segments: map[string]string{ - common.TopologyKeyZone: zone, + constants.TopologyKeyZone: zone, // Disk not type not included since useAllowedDiskTopology is false }, }, @@ -1364,7 +1350,7 @@ func TestCreateVolumeArguments(t *testing.T) { VolumeCapabilities: stdVolCaps, Parameters: mergeParameters( stdParams, - map[string]string{common.ParameterKeyUseAllowedDiskTopology: "true"}, + map[string]string{parameters.ParameterKeyUseAllowedDiskTopology: "true"}, ), }, enableDiskTopology: true, @@ -1375,7 +1361,7 @@ func TestCreateVolumeArguments(t *testing.T) { AccessibleTopology: []*csi.Topology{ { Segments: map[string]string{ - common.TopologyKeyZone: zone, + constants.TopologyKeyZone: zone, // Disk type is added as topology segment. common.DiskTypeLabelKey(stdDiskType): "true", }, @@ -1383,13 +1369,154 @@ func TestCreateVolumeArguments(t *testing.T) { }, }, }, + { + name: "success with dynamic volumes enabled but standard type", + req: &csi.CreateVolumeRequest{ + Name: "test-name", + CapacityRange: stdCapRange, + VolumeCapabilities: stdVolCaps, + Parameters: stdParams, + }, + expVol: &csi.Volume{ + CapacityBytes: common.GbToBytes(20), + VolumeId: testVolumeID, + VolumeContext: nil, + AccessibleTopology: []*csi.Topology{ + { + Segments: map[string]string{ + constants.TopologyKeyZone: zone, + }, + }, + }, + }, + }, + { + name: "success with dynamic volumes selecting disk", + req: &csi.CreateVolumeRequest{ + Name: "test-name", + CapacityRange: stdCapRange, + VolumeCapabilities: stdVolCaps, + Parameters: map[string]string{ + parameters.ParameterKeyType: parameters.DynamicVolumeType, + parameters.ParameterPDType: "pd-balanced", + parameters.ParameterHDType: "hyperdisk-balanced", + }, + }, + enableDynamicVolumes: true, + expVol: &csi.Volume{ + CapacityBytes: common.GbToBytes(20), + VolumeId: testVolumeID, + VolumeContext: nil, + AccessibleTopology: []*csi.Topology{ + { + Segments: map[string]string{ + constants.TopologyKeyZone: zone, + }, + }, + }, + }, + }, + { + name: "success defaulting pd-type", + req: &csi.CreateVolumeRequest{ + Name: "test-name", + CapacityRange: stdCapRange, + VolumeCapabilities: stdVolCaps, + Parameters: map[string]string{ + parameters.ParameterKeyType: parameters.DynamicVolumeType, + parameters.ParameterHDType: "hyperdisk-balanced", + }, + }, + enableDynamicVolumes: true, + expVol: &csi.Volume{ + CapacityBytes: common.GbToBytes(20), + VolumeId: testVolumeID, + VolumeContext: nil, + AccessibleTopology: []*csi.Topology{ + { + Segments: map[string]string{ + constants.TopologyKeyZone: zone, + }, + }, + }, + }, + }, + { + name: "success defaulting hd-type", + req: &csi.CreateVolumeRequest{ + Name: "test-name", + CapacityRange: stdCapRange, + VolumeCapabilities: stdVolCaps, + Parameters: map[string]string{ + parameters.ParameterKeyType: parameters.DynamicVolumeType, + parameters.ParameterPDType: "pd-balanced", + }, + }, + enableDynamicVolumes: true, + expVol: &csi.Volume{ + CapacityBytes: common.GbToBytes(20), + VolumeId: testVolumeID, + VolumeContext: nil, + AccessibleTopology: []*csi.Topology{ + { + Segments: map[string]string{ + constants.TopologyKeyZone: zone, + }, + }, + }, + }, + }, + { + name: "fail with dynamic volume missing dynamic type", + req: &csi.CreateVolumeRequest{ + Name: "test-name", + CapacityRange: stdCapRange, + VolumeCapabilities: stdVolCaps, + Parameters: map[string]string{ + parameters.ParameterHDType: "hyperdisk-balanced", + parameters.ParameterPDType: "pd-balanced", + }, + }, + enableDynamicVolumes: true, + expErrCode: codes.InvalidArgument, + }, + { + name: "success with dynamic volumes selecting disk override", + req: &csi.CreateVolumeRequest{ + Name: "test-name", + CapacityRange: stdCapRange, + VolumeCapabilities: stdVolCaps, + Parameters: map[string]string{ + parameters.ParameterKeyType: parameters.DynamicVolumeType, + parameters.ParameterPDType: "pd-balanced", + parameters.ParameterHDType: "hyperdisk-balanced", + parameters.ParameterDiskPreference: parameters.ParameterPDType, + }, + }, + enableDynamicVolumes: true, + expVol: &csi.Volume{ + CapacityBytes: common.GbToBytes(20), + VolumeId: testVolumeID, + VolumeContext: nil, + AccessibleTopology: []*csi.Topology{ + { + Segments: map[string]string{ + constants.TopologyKeyZone: zone, + }, + }, + }, + }, + }, } // Run test cases for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { // Setup new driver each time so no interference - args := &GCEControllerServerArgs{EnableDiskTopology: tc.enableDiskTopology} + args := &GCEControllerServerArgs{ + EnableDiskTopology: tc.enableDiskTopology, + EnableDynamicVolumes: tc.enableDynamicVolumes, + } gceDriver := initGCEDriver(t, nil, args) gceDriver.cs.enableStoragePools = tc.enableStoragePools @@ -1450,8 +1577,8 @@ func TestMultiZoneVolumeCreation(t *testing.T) { }, }, Parameters: map[string]string{ - common.ParameterKeyType: "hyperdisk-ml", - common.ParameterKeyEnableMultiZoneProvisioning: "true", + parameters.ParameterKeyType: "hyperdisk-ml", + parameters.ParameterKeyEnableMultiZoneProvisioning: "true", }, VolumeContentSource: &csi.VolumeContentSource{ Type: &csi.VolumeContentSource_Snapshot{ @@ -1463,12 +1590,12 @@ func TestMultiZoneVolumeCreation(t *testing.T) { AccessibilityRequirements: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, }, Preferred: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, }, }, @@ -1491,8 +1618,8 @@ func TestMultiZoneVolumeCreation(t *testing.T) { }, }, Parameters: map[string]string{ - common.ParameterKeyType: "hyperdisk-ml", - common.ParameterKeyEnableMultiZoneProvisioning: "true", + parameters.ParameterKeyType: "hyperdisk-ml", + parameters.ParameterKeyEnableMultiZoneProvisioning: "true", }, VolumeContentSource: &csi.VolumeContentSource{ Type: &csi.VolumeContentSource_Snapshot{ @@ -1522,8 +1649,8 @@ func TestMultiZoneVolumeCreation(t *testing.T) { }, }, Parameters: map[string]string{ - common.ParameterKeyType: "hyperdisk-ml", - common.ParameterKeyEnableMultiZoneProvisioning: "true", + parameters.ParameterKeyType: "hyperdisk-ml", + parameters.ParameterKeyEnableMultiZoneProvisioning: "true", }, VolumeContentSource: &csi.VolumeContentSource{ Type: &csi.VolumeContentSource_Snapshot{ @@ -1535,18 +1662,18 @@ func TestMultiZoneVolumeCreation(t *testing.T) { AccessibilityRequirements: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, }, Preferred: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-b"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-b"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-c"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-c"}, }, }, }, @@ -1569,24 +1696,24 @@ func TestMultiZoneVolumeCreation(t *testing.T) { }, }, Parameters: map[string]string{ - common.ParameterKeyType: "hyperdisk-ml", - common.ParameterKeyEnableMultiZoneProvisioning: "true", + parameters.ParameterKeyType: "hyperdisk-ml", + parameters.ParameterKeyEnableMultiZoneProvisioning: "true", }, AccessibilityRequirements: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, }, Preferred: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-b"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-b"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-c"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-c"}, }, }, }, @@ -1609,21 +1736,21 @@ func TestMultiZoneVolumeCreation(t *testing.T) { }, }, Parameters: map[string]string{ - common.ParameterKeyType: "hyperdisk-ml", - common.ParameterKeyEnableMultiZoneProvisioning: "true", + parameters.ParameterKeyType: "hyperdisk-ml", + parameters.ParameterKeyEnableMultiZoneProvisioning: "true", }, AccessibilityRequirements: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, }, Preferred: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-b"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-b"}, }, }, }, @@ -1646,21 +1773,21 @@ func TestMultiZoneVolumeCreation(t *testing.T) { }, }, Parameters: map[string]string{ - common.ParameterKeyType: "hyperdisk-balanced", - common.ParameterKeyEnableMultiZoneProvisioning: "true", + parameters.ParameterKeyType: "hyperdisk-balanced", + parameters.ParameterKeyEnableMultiZoneProvisioning: "true", }, AccessibilityRequirements: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, }, Preferred: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-b"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-b"}, }, }, }, @@ -1683,8 +1810,8 @@ func TestMultiZoneVolumeCreation(t *testing.T) { }, }, Parameters: map[string]string{ - common.ParameterKeyType: "hyperdisk-ml", - common.ParameterKeyEnableMultiZoneProvisioning: "true", + parameters.ParameterKeyType: "hyperdisk-ml", + parameters.ParameterKeyEnableMultiZoneProvisioning: "true", }, VolumeContentSource: &csi.VolumeContentSource{ Type: &csi.VolumeContentSource_Snapshot{ @@ -1712,8 +1839,8 @@ func TestMultiZoneVolumeCreation(t *testing.T) { }, }, Parameters: map[string]string{ - common.ParameterKeyType: "hyperdisk-ml", - common.ParameterKeyEnableMultiZoneProvisioning: "true", + parameters.ParameterKeyType: "hyperdisk-ml", + parameters.ParameterKeyEnableMultiZoneProvisioning: "true", }, VolumeContentSource: &csi.VolumeContentSource{ Type: &csi.VolumeContentSource_Snapshot{ @@ -1725,12 +1852,12 @@ func TestMultiZoneVolumeCreation(t *testing.T) { AccessibilityRequirements: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, }, Preferred: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, }, }, @@ -1760,18 +1887,18 @@ func TestMultiZoneVolumeCreation(t *testing.T) { }, }, Parameters: map[string]string{ - common.ParameterKeyType: "hyperdisk-ml", - common.ParameterKeyEnableMultiZoneProvisioning: "true", + parameters.ParameterKeyType: "hyperdisk-ml", + parameters.ParameterKeyEnableMultiZoneProvisioning: "true", }, AccessibilityRequirements: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, }, Preferred: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, }, }, @@ -1795,12 +1922,12 @@ func TestMultiZoneVolumeCreation(t *testing.T) { gceDriver.cs.fallbackRequisiteZones = tc.fallbackZones if tc.req.VolumeContentSource.GetType() != nil { - snapshotParams, err := common.ExtractAndDefaultSnapshotParameters(nil, gceDriver.name, nil) + snapshotParams, err := parameters.ExtractAndDefaultSnapshotParameters(nil, gceDriver.name, nil) if err != nil { t.Errorf("Got error extracting snapshot parameters: %v", err) } - if snapshotParams.SnapshotType == common.DiskSnapshotType { - fcp.CreateSnapshot(context.Background(), project, meta.ZonalKey(name, common.MultiZoneValue), name, snapshotParams) + if snapshotParams.SnapshotType == parameters.DiskSnapshotType { + fcp.CreateSnapshot(context.Background(), project, meta.ZonalKey(name, constants.MultiZoneValue), name, snapshotParams) } else { t.Fatalf("No volume source mentioned in snapshot parameters %v", snapshotParams) } @@ -1825,7 +1952,7 @@ func TestMultiZoneVolumeCreation(t *testing.T) { topologies := make([]*csi.Topology, 0, len(tc.expZones)) for _, zone := range tc.expZones { topologies = append(topologies, &csi.Topology{ - Segments: map[string]string{common.TopologyKeyZone: zone}, + Segments: map[string]string{constants.TopologyKeyZone: zone}, }) } @@ -1847,7 +1974,7 @@ func TestMultiZoneVolumeCreation(t *testing.T) { klog.Warningf("Got accessible topology: %v", vol.GetAccessibleTopology()) sortTopologies := func(t1, t2 *csi.Topology) bool { - return t1.Segments[common.TopologyKeyZone] < t2.Segments[common.TopologyKeyZone] + return t1.Segments[constants.TopologyKeyZone] < t2.Segments[constants.TopologyKeyZone] } // Custom comparers to compare two volumes @@ -1897,8 +2024,8 @@ func TestMultiZoneVolumeCreation(t *testing.T) { if err != nil { t.Fatalf("Get Disk failed for created disk with error: %v", err) } - if disk.GetLabels()[common.MultiZoneLabel] != "true" { - t.Fatalf("Expect %s disk to have %s label, got: %v", volumeKey, common.MultiZoneLabel, disk.GetLabels()) + if disk.GetLabels()[constants.MultiZoneLabel] != "true" { + t.Fatalf("Expect %s disk to have %s label, got: %v", volumeKey, constants.MultiZoneLabel, disk.GetLabels()) } } } @@ -1927,7 +2054,7 @@ func TestCreateVolumeMultiWriterOrAccessMode(t *testing.T) { }, }, Parameters: map[string]string{ - common.ParameterKeyType: "pd-balanced", + parameters.ParameterKeyType: "pd-balanced", }, }, expMultiWriter: false, @@ -1947,7 +2074,7 @@ func TestCreateVolumeMultiWriterOrAccessMode(t *testing.T) { }, }, Parameters: map[string]string{ - common.ParameterKeyType: "pd-balanced", + parameters.ParameterKeyType: "pd-balanced", }, }, expMultiWriter: true, @@ -1967,10 +2094,10 @@ func TestCreateVolumeMultiWriterOrAccessMode(t *testing.T) { }, }, Parameters: map[string]string{ - common.ParameterKeyType: "hyperdisk-balanced", + parameters.ParameterKeyType: "hyperdisk-balanced", }, }, - expAccessMode: common.GCEReadWriteManyAccessMode, + expAccessMode: constants.GCEReadWriteManyAccessMode, }, { name: "success non-multi-writer Hyperdisk", @@ -1987,10 +2114,10 @@ func TestCreateVolumeMultiWriterOrAccessMode(t *testing.T) { }, }, Parameters: map[string]string{ - common.ParameterKeyType: "hyperdisk-balanced", + parameters.ParameterKeyType: "hyperdisk-balanced", }, }, - expAccessMode: common.GCEReadWriteOnceAccessMode, + expAccessMode: constants.GCEReadWriteOnceAccessMode, }, { name: "failure unsupported access mode for Hyperdisk", @@ -2007,7 +2134,7 @@ func TestCreateVolumeMultiWriterOrAccessMode(t *testing.T) { }, }, Parameters: map[string]string{ - common.ParameterKeyType: "hyperdisk-balanced", + parameters.ParameterKeyType: "hyperdisk-balanced", }, }, expErrCode: codes.InvalidArgument, @@ -2099,7 +2226,7 @@ func (cloud *FakeCloudProviderInsertDiskErr) AddDiskForErr(volKey *meta.Key, err cloud.insertDiskErrors[volKey.String()] = err } -func (cloud *FakeCloudProviderInsertDiskErr) InsertDisk(ctx context.Context, project string, volKey *meta.Key, params common.DiskParameters, capBytes int64, capacityRange *csi.CapacityRange, replicaZones []string, snapshotID string, volumeContentSourceVolumeID string, multiWriter bool, accessMode string) error { +func (cloud *FakeCloudProviderInsertDiskErr) InsertDisk(ctx context.Context, project string, volKey *meta.Key, params parameters.DiskParameters, capBytes int64, capacityRange *csi.CapacityRange, replicaZones []string, snapshotID string, volumeContentSourceVolumeID string, multiWriter bool, accessMode string) error { if err, ok := cloud.insertDiskErrors[volKey.String()]; ok { return err } @@ -2131,24 +2258,24 @@ func TestMultiZoneVolumeCreationErrHandling(t *testing.T) { }, }, Parameters: map[string]string{ - common.ParameterKeyType: "hyperdisk-ml", - common.ParameterKeyEnableMultiZoneProvisioning: "true", + parameters.ParameterKeyType: "hyperdisk-ml", + parameters.ParameterKeyEnableMultiZoneProvisioning: "true", }, AccessibilityRequirements: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-b"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-b"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-c"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-c"}, }, }, Preferred: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, }, }, @@ -2178,24 +2305,24 @@ func TestMultiZoneVolumeCreationErrHandling(t *testing.T) { }, }, Parameters: map[string]string{ - common.ParameterKeyType: "hyperdisk-ml", - common.ParameterKeyEnableMultiZoneProvisioning: "true", + parameters.ParameterKeyType: "hyperdisk-ml", + parameters.ParameterKeyEnableMultiZoneProvisioning: "true", }, AccessibilityRequirements: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-b"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-b"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-c"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-c"}, }, }, Preferred: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, }, }, @@ -2281,14 +2408,14 @@ func TestCreateVolumeWithVolumeAttributeClassParameters(t *testing.T) { }, }, Parameters: map[string]string{ - common.ParameterKeyType: "hyperdisk-balanced", - common.ParameterKeyProvisionedIOPSOnCreate: "10000", - common.ParameterKeyProvisionedThroughputOnCreate: "500Mi", + parameters.ParameterKeyType: "hyperdisk-balanced", + parameters.ParameterKeyProvisionedIOPSOnCreate: "10000", + parameters.ParameterKeyProvisionedThroughputOnCreate: "500Mi", }, AccessibilityRequirements: &csi.TopologyRequirement{ Preferred: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, }, }, @@ -2314,14 +2441,14 @@ func TestCreateVolumeWithVolumeAttributeClassParameters(t *testing.T) { }, }, Parameters: map[string]string{ - common.ParameterKeyType: "pd-ssd", - common.ParameterKeyProvisionedIOPSOnCreate: "10000", - common.ParameterKeyProvisionedThroughputOnCreate: "500Mi", + parameters.ParameterKeyType: "pd-ssd", + parameters.ParameterKeyProvisionedIOPSOnCreate: "10000", + parameters.ParameterKeyProvisionedThroughputOnCreate: "500Mi", }, AccessibilityRequirements: &csi.TopologyRequirement{ Preferred: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, }, }, @@ -2384,7 +2511,7 @@ func TestVolumeModifyOperation(t *testing.T) { name string req *csi.ControllerModifyVolumeRequest diskType string - params *common.DiskParameters + params *parameters.DiskParameters expIops int64 expThroughput int64 expErrMessage string @@ -2396,7 +2523,7 @@ func TestVolumeModifyOperation(t *testing.T) { MutableParameters: map[string]string{"iops": "20000", "throughput": "600Mi"}, }, diskType: "hyperdisk-balanced", - params: &common.DiskParameters{ + params: ¶meters.DiskParameters{ DiskType: "hyperdisk-balanced", ProvisionedIOPSOnCreate: 10000, ProvisionedThroughputOnCreate: 500, @@ -2412,7 +2539,7 @@ func TestVolumeModifyOperation(t *testing.T) { MutableParameters: map[string]string{"iops": "0", "throughput": "0Mi"}, }, diskType: "hyperdisk-balanced", - params: &common.DiskParameters{ + params: ¶meters.DiskParameters{ DiskType: "hyperdisk-balanced", ProvisionedIOPSOnCreate: 10000, ProvisionedThroughputOnCreate: 500, @@ -2428,7 +2555,7 @@ func TestVolumeModifyOperation(t *testing.T) { MutableParameters: map[string]string{"iops": "20000", "throughput": "600Mi"}, }, diskType: "pd-ssd", - params: &common.DiskParameters{ + params: ¶meters.DiskParameters{ DiskType: "pd-ssd", }, expIops: 0, @@ -2502,7 +2629,7 @@ func (cloud *FakeCloudProviderUpdateDiskErr) AddDiskForErr(volKey *meta.Key, err cloud.updateDiskErrors[volKey.String()] = err } -func (cloud *FakeCloudProviderUpdateDiskErr) UpdateDisk(ctx context.Context, project string, volKey *meta.Key, existingDisk *gcecloudprovider.CloudDisk, params common.ModifyVolumeParameters) error { +func (cloud *FakeCloudProviderUpdateDiskErr) UpdateDisk(ctx context.Context, project string, volKey *meta.Key, existingDisk *gcecloudprovider.CloudDisk, params parameters.ModifyVolumeParameters) error { if err, ok := cloud.updateDiskErrors[volKey.String()]; ok { return err } @@ -2537,20 +2664,20 @@ func TestVolumeModifyErrorHandling(t *testing.T) { createReq: &csi.CreateVolumeRequest{ Name: name, Parameters: map[string]string{ - common.ParameterKeyType: "hyperdisk-balanced", - common.ParameterKeyProvisionedIOPSOnCreate: "3000", - common.ParameterKeyProvisionedThroughputOnCreate: "150Mi", + parameters.ParameterKeyType: "hyperdisk-balanced", + parameters.ParameterKeyProvisionedIOPSOnCreate: "3000", + parameters.ParameterKeyProvisionedThroughputOnCreate: "150Mi", }, VolumeCapabilities: stdVolCaps, AccessibilityRequirements: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, }, Preferred: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, }, }, @@ -2573,20 +2700,20 @@ func TestVolumeModifyErrorHandling(t *testing.T) { createReq: &csi.CreateVolumeRequest{ Name: name, Parameters: map[string]string{ - common.ParameterKeyType: "hyperdisk-balanced", - common.ParameterKeyProvisionedIOPSOnCreate: "3000", - common.ParameterKeyProvisionedThroughputOnCreate: "150Mi", + parameters.ParameterKeyType: "hyperdisk-balanced", + parameters.ParameterKeyProvisionedIOPSOnCreate: "3000", + parameters.ParameterKeyProvisionedThroughputOnCreate: "150Mi", }, VolumeCapabilities: stdVolCaps, AccessibilityRequirements: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, }, Preferred: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, }, }, @@ -2964,12 +3091,12 @@ func TestListVolumeResponse(t *testing.T) { { Name: fmt.Sprintf("%s-pv-1", zone1), SelfLink: fmt.Sprintf("https://www.googleapis.com/compute/v1/projects/%s/zones/%s/disks/%s", project, zone1, "pv-1"), - Labels: map[string]string{common.MultiZoneLabel: "true"}, + Labels: map[string]string{constants.MultiZoneLabel: "true"}, }, { Name: fmt.Sprintf("%s-pv-1", zone2), SelfLink: fmt.Sprintf("https://www.googleapis.com/compute/v1/projects/%s/zones/%s/disks/%s", project, zone2, "pv-1"), - Labels: map[string]string{common.MultiZoneLabel: "true"}, + Labels: map[string]string{constants.MultiZoneLabel: "true"}, }, }, instances: []compute.Instance{ @@ -3079,14 +3206,14 @@ func TestCreateVolumeWithVolumeSourceFromSnapshot(t *testing.T) { name: "success with data source of snapshot type", project: "test-project", volKey: meta.ZonalKey("my-disk", zone), - snapshotType: common.DiskSnapshotType, + snapshotType: parameters.DiskSnapshotType, snapshotOnCloud: true, }, { name: "fail with data source of snapshot type that doesn't exist", project: "test-project", volKey: meta.ZonalKey("my-disk", zone), - snapshotType: common.DiskSnapshotType, + snapshotType: parameters.DiskSnapshotType, snapshotOnCloud: false, expErrCode: codes.NotFound, }, @@ -3094,14 +3221,14 @@ func TestCreateVolumeWithVolumeSourceFromSnapshot(t *testing.T) { name: "success with data source of snapshot type", project: "test-project", volKey: meta.ZonalKey("my-disk", zone), - snapshotType: common.DiskImageType, + snapshotType: parameters.DiskImageType, snapshotOnCloud: true, }, { name: "fail with data source of snapshot type that doesn't exist", project: "test-project", volKey: meta.ZonalKey("my-disk", zone), - snapshotType: common.DiskImageType, + snapshotType: parameters.DiskImageType, snapshotOnCloud: false, expErrCode: codes.NotFound, }, @@ -3113,7 +3240,7 @@ func TestCreateVolumeWithVolumeSourceFromSnapshot(t *testing.T) { // Setup new driver each time so no interference gceDriver := initGCEDriver(t, nil, &GCEControllerServerArgs{}) - snapshotParams, err := common.ExtractAndDefaultSnapshotParameters(nil, gceDriver.name, nil) + snapshotParams, err := parameters.ExtractAndDefaultSnapshotParameters(nil, gceDriver.name, nil) if err != nil { t.Errorf("Got error extracting snapshot parameters: %v", err) } @@ -3121,12 +3248,12 @@ func TestCreateVolumeWithVolumeSourceFromSnapshot(t *testing.T) { // Start Test var snapshotID string switch tc.snapshotType { - case common.DiskSnapshotType: + case parameters.DiskSnapshotType: snapshotID = testSnapshotID if tc.snapshotOnCloud { gceDriver.cs.CloudProvider.CreateSnapshot(context.Background(), tc.project, tc.volKey, name, snapshotParams) } - case common.DiskImageType: + case parameters.DiskImageType: snapshotID = testImageID if tc.snapshotOnCloud { gceDriver.cs.CloudProvider.CreateImage(context.Background(), tc.project, tc.volKey, name, snapshotParams) @@ -3192,7 +3319,7 @@ func TestCloningLocationRequirements(t *testing.T) { sourceVolumeID: testZonalVolumeSourceID, requestCapacityRange: stdCapRange, reqParameters: map[string]string{ - common.ParameterKeyReplicationType: replicationTypeNone, + parameters.ParameterKeyReplicationType: replicationTypeNone, }, cloneIsRegional: false, expectedLocationRequirements: &locationRequirements{srcVolRegion: region, srcVolZone: zone, srcIsRegional: false, cloneIsRegional: false}, @@ -3203,7 +3330,7 @@ func TestCloningLocationRequirements(t *testing.T) { sourceVolumeID: testRegionalVolumeSourceID, requestCapacityRange: stdCapRange, reqParameters: map[string]string{ - common.ParameterKeyReplicationType: replicationTypeRegionalPD, + parameters.ParameterKeyReplicationType: replicationTypeRegionalPD, }, cloneIsRegional: true, expectedLocationRequirements: &locationRequirements{srcVolRegion: region, srcVolZone: "", srcIsRegional: true, cloneIsRegional: true}, @@ -3214,7 +3341,7 @@ func TestCloningLocationRequirements(t *testing.T) { sourceVolumeID: testZonalVolumeSourceID, requestCapacityRange: stdCapRange, reqParameters: map[string]string{ - common.ParameterKeyType: common.DiskTypeHdHA, + parameters.ParameterKeyType: parameters.DiskTypeHdHA, }, cloneIsRegional: true, expectedLocationRequirements: &locationRequirements{srcVolRegion: region, srcVolZone: zone, srcIsRegional: false, cloneIsRegional: true}, @@ -3225,7 +3352,7 @@ func TestCloningLocationRequirements(t *testing.T) { nilVolumeContentSource: true, requestCapacityRange: stdCapRange, reqParameters: map[string]string{ - common.ParameterKeyReplicationType: replicationTypeRegionalPD, + parameters.ParameterKeyReplicationType: replicationTypeRegionalPD, }, cloneIsRegional: true, expectedLocationRequirements: nil, @@ -3236,7 +3363,7 @@ func TestCloningLocationRequirements(t *testing.T) { sourceVolumeID: fmt.Sprintf("projects/%s/disks/%s", project, testSourceVolumeName), requestCapacityRange: stdCapRange, reqParameters: map[string]string{ - common.ParameterKeyReplicationType: replicationTypeNone, + parameters.ParameterKeyReplicationType: replicationTypeNone, }, cloneIsRegional: false, expectedLocationRequirements: nil, @@ -3282,40 +3409,40 @@ func TestCreateVolumeWithVolumeSourceFromVolume(t *testing.T) { testRegionalVolumeSourceID := fmt.Sprintf("projects/%s/regions/%s/disks/%s", project, region, testSourceVolumeName) testSecondZonalVolumeSourceID := fmt.Sprintf("projects/%s/zones/%s/disks/%s", project, "different-zone1", testSourceVolumeName) zonalParams := map[string]string{ - common.ParameterKeyType: stdDiskType, common.ParameterKeyReplicationType: replicationTypeNone, - common.ParameterKeyDiskEncryptionKmsKey: "encryption-key", + parameters.ParameterKeyType: stdDiskType, parameters.ParameterKeyReplicationType: replicationTypeNone, + parameters.ParameterKeyDiskEncryptionKmsKey: "encryption-key", } regionalParams := map[string]string{ - common.ParameterKeyType: stdDiskType, common.ParameterKeyReplicationType: replicationTypeRegionalPD, - common.ParameterKeyDiskEncryptionKmsKey: "encryption-key", + parameters.ParameterKeyType: stdDiskType, parameters.ParameterKeyReplicationType: replicationTypeRegionalPD, + parameters.ParameterKeyDiskEncryptionKmsKey: "encryption-key", } requisiteTopology := []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: zone}, + Segments: map[string]string{constants.TopologyKeyZone: zone}, }, { - Segments: map[string]string{common.TopologyKeyZone: secondZone}, + Segments: map[string]string{constants.TopologyKeyZone: secondZone}, }, } requisiteAllRegionZonesTopology := []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "country-region-fakethirdzone"}, + Segments: map[string]string{constants.TopologyKeyZone: "country-region-fakethirdzone"}, }, { - Segments: map[string]string{common.TopologyKeyZone: zone}, + Segments: map[string]string{constants.TopologyKeyZone: zone}, }, { - Segments: map[string]string{common.TopologyKeyZone: secondZone}, + Segments: map[string]string{constants.TopologyKeyZone: secondZone}, }, } prefTopology := []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: zone}, + Segments: map[string]string{constants.TopologyKeyZone: zone}, }, { - Segments: map[string]string{common.TopologyKeyZone: secondZone}, + Segments: map[string]string{constants.TopologyKeyZone: secondZone}, }, } @@ -3354,7 +3481,7 @@ func TestCreateVolumeWithVolumeSourceFromVolume(t *testing.T) { expCloneKey: &meta.Key{Name: testCloneVolumeName, Zone: zone, Region: ""}, expAccessibleTop: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "country-region-zone"}, + Segments: map[string]string{constants.TopologyKeyZone: "country-region-zone"}, }, }, }, @@ -3375,17 +3502,17 @@ func TestCreateVolumeWithVolumeSourceFromVolume(t *testing.T) { Requisite: requisiteTopology, Preferred: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: secondZone}, + Segments: map[string]string{constants.TopologyKeyZone: secondZone}, }, { - Segments: map[string]string{common.TopologyKeyZone: zone}, + Segments: map[string]string{constants.TopologyKeyZone: zone}, }, }, }, expCloneKey: &meta.Key{Name: testCloneVolumeName, Zone: zone, Region: ""}, expAccessibleTop: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "country-region-zone"}, + Segments: map[string]string{constants.TopologyKeyZone: "country-region-zone"}, }, }, }, @@ -3409,7 +3536,7 @@ func TestCreateVolumeWithVolumeSourceFromVolume(t *testing.T) { expCloneKey: &meta.Key{Name: testCloneVolumeName, Zone: zone, Region: ""}, expAccessibleTop: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "country-region-zone"}, + Segments: map[string]string{constants.TopologyKeyZone: "country-region-zone"}, }, }, }, @@ -3421,10 +3548,10 @@ func TestCreateVolumeWithVolumeSourceFromVolume(t *testing.T) { sourceCapacityRange: stdCapRange, enableStoragePools: true, reqParameters: map[string]string{ - common.ParameterKeyType: "hyperdisk-balanced", - common.ParameterKeyReplicationType: replicationTypeNone, - common.ParameterKeyDiskEncryptionKmsKey: "encryption-key", - common.ParameterKeyStoragePools: "projects/test-project/zones/country-region-zone/storagePools/storagePool-1", + parameters.ParameterKeyType: "hyperdisk-balanced", + parameters.ParameterKeyReplicationType: replicationTypeNone, + parameters.ParameterKeyDiskEncryptionKmsKey: "encryption-key", + parameters.ParameterKeyStoragePools: "projects/test-project/zones/country-region-zone/storagePools/storagePool-1", }, sourceReqParameters: zonalParams, sourceTopology: &csi.TopologyRequirement{ @@ -3458,7 +3585,7 @@ func TestCreateVolumeWithVolumeSourceFromVolume(t *testing.T) { expCloneKey: &meta.Key{Name: testCloneVolumeName, Zone: zone, Region: ""}, expAccessibleTop: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "country-region-zone"}, + Segments: map[string]string{constants.TopologyKeyZone: "country-region-zone"}, }, }, }, @@ -3478,10 +3605,10 @@ func TestCreateVolumeWithVolumeSourceFromVolume(t *testing.T) { expCloneKey: &meta.Key{Name: testCloneVolumeName, Zone: "", Region: "country-region"}, expAccessibleTop: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "country-region-zone"}, + Segments: map[string]string{constants.TopologyKeyZone: "country-region-zone"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "country-region-fakesecondzone"}, + Segments: map[string]string{constants.TopologyKeyZone: "country-region-fakesecondzone"}, }, }, }, @@ -3501,20 +3628,20 @@ func TestCreateVolumeWithVolumeSourceFromVolume(t *testing.T) { Requisite: requisiteTopology, Preferred: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: secondZone}, + Segments: map[string]string{constants.TopologyKeyZone: secondZone}, }, { - Segments: map[string]string{common.TopologyKeyZone: zone}, + Segments: map[string]string{constants.TopologyKeyZone: zone}, }, }, }, expCloneKey: &meta.Key{Name: testCloneVolumeName, Zone: "", Region: "country-region"}, expAccessibleTop: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "country-region-zone"}, + Segments: map[string]string{constants.TopologyKeyZone: "country-region-zone"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "country-region-fakesecondzone"}, + Segments: map[string]string{constants.TopologyKeyZone: "country-region-fakesecondzone"}, }, }, }, @@ -3537,10 +3664,10 @@ func TestCreateVolumeWithVolumeSourceFromVolume(t *testing.T) { expCloneKey: &meta.Key{Name: testCloneVolumeName, Zone: "", Region: "country-region"}, expAccessibleTop: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "country-region-zone"}, + Segments: map[string]string{constants.TopologyKeyZone: "country-region-zone"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "country-region-fakesecondzone"}, + Segments: map[string]string{constants.TopologyKeyZone: "country-region-fakesecondzone"}, }, }, }, @@ -3563,10 +3690,10 @@ func TestCreateVolumeWithVolumeSourceFromVolume(t *testing.T) { expCloneKey: &meta.Key{Name: testCloneVolumeName, Zone: "", Region: "country-region"}, expAccessibleTop: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "country-region-zone"}, + Segments: map[string]string{constants.TopologyKeyZone: "country-region-zone"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "country-region-fakesecondzone"}, + Segments: map[string]string{constants.TopologyKeyZone: "country-region-fakesecondzone"}, }, }, }, @@ -3586,10 +3713,10 @@ func TestCreateVolumeWithVolumeSourceFromVolume(t *testing.T) { expCloneKey: &meta.Key{Name: testCloneVolumeName, Zone: "", Region: "country-region"}, expAccessibleTop: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "country-region-zone"}, + Segments: map[string]string{constants.TopologyKeyZone: "country-region-zone"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "country-region-fakesecondzone"}, + Segments: map[string]string{constants.TopologyKeyZone: "country-region-fakesecondzone"}, }, }, }, @@ -3609,20 +3736,20 @@ func TestCreateVolumeWithVolumeSourceFromVolume(t *testing.T) { Requisite: requisiteTopology, Preferred: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: secondZone}, + Segments: map[string]string{constants.TopologyKeyZone: secondZone}, }, { - Segments: map[string]string{common.TopologyKeyZone: zone}, + Segments: map[string]string{constants.TopologyKeyZone: zone}, }, }, }, expCloneKey: &meta.Key{Name: testCloneVolumeName, Zone: "", Region: "country-region"}, expAccessibleTop: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "country-region-zone"}, + Segments: map[string]string{constants.TopologyKeyZone: "country-region-zone"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "country-region-fakesecondzone"}, + Segments: map[string]string{constants.TopologyKeyZone: "country-region-fakesecondzone"}, }, }, }, @@ -3645,10 +3772,10 @@ func TestCreateVolumeWithVolumeSourceFromVolume(t *testing.T) { expCloneKey: &meta.Key{Name: testCloneVolumeName, Zone: "", Region: "country-region"}, expAccessibleTop: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "country-region-zone"}, + Segments: map[string]string{constants.TopologyKeyZone: "country-region-zone"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "country-region-fakesecondzone"}, + Segments: map[string]string{constants.TopologyKeyZone: "country-region-fakesecondzone"}, }, }, }, @@ -3671,10 +3798,10 @@ func TestCreateVolumeWithVolumeSourceFromVolume(t *testing.T) { expCloneKey: &meta.Key{Name: testCloneVolumeName, Zone: "", Region: "country-region"}, expAccessibleTop: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "country-region-zone"}, + Segments: map[string]string{constants.TopologyKeyZone: "country-region-zone"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "country-region-fakesecondzone"}, + Segments: map[string]string{constants.TopologyKeyZone: "country-region-fakesecondzone"}, }, }, }, @@ -3694,10 +3821,10 @@ func TestCreateVolumeWithVolumeSourceFromVolume(t *testing.T) { requestTopology: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "different-zone1"}, + Segments: map[string]string{constants.TopologyKeyZone: "different-zone1"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "different-zone2"}, + Segments: map[string]string{constants.TopologyKeyZone: "different-zone2"}, }, }, }, @@ -3711,7 +3838,7 @@ func TestCreateVolumeWithVolumeSourceFromVolume(t *testing.T) { sourceCapacityRange: stdCapRange, reqParameters: zonalParams, sourceReqParameters: map[string]string{ - common.ParameterKeyType: "different-type", + parameters.ParameterKeyType: "different-type", }, sourceTopology: &csi.TopologyRequirement{ Requisite: requisiteTopology, @@ -3731,8 +3858,8 @@ func TestCreateVolumeWithVolumeSourceFromVolume(t *testing.T) { sourceCapacityRange: stdCapRange, reqParameters: zonalParams, sourceReqParameters: map[string]string{ - common.ParameterKeyType: stdDiskType, common.ParameterKeyReplicationType: replicationTypeNone, - common.ParameterKeyDiskEncryptionKmsKey: "different-encryption-key", + parameters.ParameterKeyType: stdDiskType, parameters.ParameterKeyReplicationType: replicationTypeNone, + parameters.ParameterKeyDiskEncryptionKmsKey: "different-encryption-key", }, sourceTopology: &csi.TopologyRequirement{ Requisite: requisiteTopology, @@ -3755,10 +3882,10 @@ func TestCreateVolumeWithVolumeSourceFromVolume(t *testing.T) { sourceTopology: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "different-zone1"}, + Segments: map[string]string{constants.TopologyKeyZone: "different-zone1"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "different-zone2"}, + Segments: map[string]string{constants.TopologyKeyZone: "different-zone2"}, }, }, }, @@ -3918,7 +4045,7 @@ func TestCreateVolumeWithVolumeSourceFromVolume(t *testing.T) { func sortTopologies(in []*csi.Topology) { sort.Slice(in, func(i, j int) bool { - return in[i].Segments[common.TopologyKeyZone] < in[j].Segments[common.TopologyKeyZone] + return in[i].Segments[constants.TopologyKeyZone] < in[j].Segments[constants.TopologyKeyZone] }) } @@ -3937,13 +4064,13 @@ func TestCreateVolumeRandomRequisiteTopology(t *testing.T) { AccessibilityRequirements: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "topology-zone3"}, + Segments: map[string]string{constants.TopologyKeyZone: "topology-zone3"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "topology-zone1"}, + Segments: map[string]string{constants.TopologyKeyZone: "topology-zone1"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "topology-zone2"}, + Segments: map[string]string{constants.TopologyKeyZone: "topology-zone2"}, }, }, }, @@ -3958,7 +4085,7 @@ func TestCreateVolumeRandomRequisiteTopology(t *testing.T) { if err != nil { t.Fatalf("CreateVolume did not expect error, but got %v", err) } - tZone, ok := resp.GetVolume().GetAccessibleTopology()[0].GetSegments()[common.TopologyKeyZone] + tZone, ok := resp.GetVolume().GetAccessibleTopology()[0].GetSegments()[constants.TopologyKeyZone] if !ok { t.Fatalf("Could not find topology zone in response") } @@ -4062,7 +4189,7 @@ func TestMultiZoneDeleteVolume(t *testing.T) { createZonalCloudDiskWithZone(name, zone), }, req: &csi.DeleteVolumeRequest{ - VolumeId: fmt.Sprintf("projects/%s/zones/%s/disks/%s", project, common.MultiZoneValue, name), + VolumeId: fmt.Sprintf("projects/%s/zones/%s/disks/%s", project, constants.MultiZoneValue, name), }, }, { @@ -4072,7 +4199,7 @@ func TestMultiZoneDeleteVolume(t *testing.T) { createZonalCloudDiskWithZone(name, secondZone), }, req: &csi.DeleteVolumeRequest{ - VolumeId: fmt.Sprintf("projects/%s/zones/%s/disks/%s", project, common.MultiZoneValue, name), + VolumeId: fmt.Sprintf("projects/%s/zones/%s/disks/%s", project, constants.MultiZoneValue, name), }, }, } @@ -4341,7 +4468,7 @@ func TestGetZonesFromTopology(t *testing.T) { name: "success: normal", topology: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "test-zone"}, + Segments: map[string]string{constants.TopologyKeyZone: "test-zone"}, }, }, expZones: sets.NewString([]string{"test-zone"}...), @@ -4350,10 +4477,10 @@ func TestGetZonesFromTopology(t *testing.T) { name: "success: multiple topologies", topology: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "test-zone"}, + Segments: map[string]string{constants.TopologyKeyZone: "test-zone"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "test-zone2"}, + Segments: map[string]string{constants.TopologyKeyZone: "test-zone2"}, }, }, expZones: sets.NewString([]string{"test-zone", "test-zone2"}...), @@ -4362,10 +4489,10 @@ func TestGetZonesFromTopology(t *testing.T) { name: "fail: wrong key", topology: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "test-zone"}, + Segments: map[string]string{constants.TopologyKeyZone: "test-zone"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "test-zone2"}, + Segments: map[string]string{constants.TopologyKeyZone: "test-zone2"}, }, { Segments: map[string]string{"fake-key": "fake-value"}, @@ -4377,10 +4504,10 @@ func TestGetZonesFromTopology(t *testing.T) { name: "success: duplicate", topology: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "test-zone"}, + Segments: map[string]string{constants.TopologyKeyZone: "test-zone"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "test-zone"}, + Segments: map[string]string{constants.TopologyKeyZone: "test-zone"}, }, }, expZones: sets.NewString([]string{"test-zone"}...), @@ -4390,18 +4517,6 @@ func TestGetZonesFromTopology(t *testing.T) { topology: []*csi.Topology{}, expZones: sets.NewString(), }, - { - name: "fail: wrong key inside", - topology: []*csi.Topology{ - { - Segments: map[string]string{common.TopologyKeyZone: "test-zone", "fake-key": "fake-value"}, - }, - { - Segments: map[string]string{common.TopologyKeyZone: "test-zone2"}, - }, - }, - expErr: true, - }, { name: "success: no topology", expZones: sets.NewString(), @@ -4521,24 +4636,24 @@ func TestPickZonesFromTopology(t *testing.T) { top: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "topology-zone3"}, + Segments: map[string]string{constants.TopologyKeyZone: "topology-zone3"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "topology-zone1"}, + Segments: map[string]string{constants.TopologyKeyZone: "topology-zone1"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "topology-zone2"}, + Segments: map[string]string{constants.TopologyKeyZone: "topology-zone2"}, }, }, Preferred: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "topology-zone2"}, + Segments: map[string]string{constants.TopologyKeyZone: "topology-zone2"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "topology-zone3"}, + Segments: map[string]string{constants.TopologyKeyZone: "topology-zone3"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "topology-zone1"}, + Segments: map[string]string{constants.TopologyKeyZone: "topology-zone1"}, }, }, }, @@ -4550,24 +4665,24 @@ func TestPickZonesFromTopology(t *testing.T) { top: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-c"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-c"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-b"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-b"}, }, }, Preferred: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-b"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-b"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-c"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-c"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, }, }, @@ -4580,16 +4695,16 @@ func TestPickZonesFromTopology(t *testing.T) { top: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-b"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-b"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-c"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-c"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-f"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-f"}, }, }, Preferred: []*csi.Topology{}, @@ -4603,30 +4718,30 @@ func TestPickZonesFromTopology(t *testing.T) { top: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "topology-zone3"}, + Segments: map[string]string{constants.TopologyKeyZone: "topology-zone3"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "topology-zone1"}, + Segments: map[string]string{constants.TopologyKeyZone: "topology-zone1"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "topology-zone2"}, + Segments: map[string]string{constants.TopologyKeyZone: "topology-zone2"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "topology-zone5"}, + Segments: map[string]string{constants.TopologyKeyZone: "topology-zone5"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "topology-zone6"}, + Segments: map[string]string{constants.TopologyKeyZone: "topology-zone6"}, }, }, Preferred: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "topology-zone2"}, + Segments: map[string]string{constants.TopologyKeyZone: "topology-zone2"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "topology-zone3"}, + Segments: map[string]string{constants.TopologyKeyZone: "topology-zone3"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "topology-zone1"}, + Segments: map[string]string{constants.TopologyKeyZone: "topology-zone1"}, }, }, }, @@ -4638,27 +4753,27 @@ func TestPickZonesFromTopology(t *testing.T) { top: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-c"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-c"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-d"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-d"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-f"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-f"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-west1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-west1-a"}, }, }, Preferred: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-b"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-b"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-east1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-east1-a"}, }, }, }, @@ -4671,27 +4786,27 @@ func TestPickZonesFromTopology(t *testing.T) { top: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-c"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-c"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-d"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-d"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-f"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-f"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-west1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-west1-a"}, }, }, Preferred: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-b"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-b"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-east1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-east1-a"}, }, }, }, @@ -4704,24 +4819,24 @@ func TestPickZonesFromTopology(t *testing.T) { top: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-b"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-b"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-c"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-c"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-f"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-f"}, }, }, Preferred: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-c"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-c"}, }, }, }, @@ -4734,24 +4849,24 @@ func TestPickZonesFromTopology(t *testing.T) { top: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-b"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-b"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-c"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-c"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-f"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-f"}, }, }, Preferred: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-b"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-b"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-c"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-c"}, }, }, }, @@ -4764,18 +4879,18 @@ func TestPickZonesFromTopology(t *testing.T) { top: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-b"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-b"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-c"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-c"}, }, }, Preferred: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, }, }, @@ -4789,15 +4904,15 @@ func TestPickZonesFromTopology(t *testing.T) { top: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-b"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-b"}, }, }, Preferred: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-b"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-b"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-west1-b"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-west1-b"}, }, }, }, @@ -4815,7 +4930,7 @@ func TestPickZonesFromTopology(t *testing.T) { // This only has one, so we can test that a second is pulled from // fallbackRequisiteZones. { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-b"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-b"}, }, }, }, @@ -4829,12 +4944,12 @@ func TestPickZonesFromTopology(t *testing.T) { top: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-b"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-b"}, }, }, Preferred: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-b"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-b"}, }, }, }, @@ -4847,24 +4962,24 @@ func TestPickZonesFromTopology(t *testing.T) { top: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "topology-zone3"}, + Segments: map[string]string{constants.TopologyKeyZone: "topology-zone3"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "topology-zone1"}, + Segments: map[string]string{constants.TopologyKeyZone: "topology-zone1"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "topology-zone2"}, + Segments: map[string]string{constants.TopologyKeyZone: "topology-zone2"}, }, }, Preferred: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "topology-zone2"}, + Segments: map[string]string{constants.TopologyKeyZone: "topology-zone2"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "topology-zone3"}, + Segments: map[string]string{constants.TopologyKeyZone: "topology-zone3"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "topology-zone1"}, + Segments: map[string]string{constants.TopologyKeyZone: "topology-zone1"}, }, }, }, @@ -4876,12 +4991,12 @@ func TestPickZonesFromTopology(t *testing.T) { top: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, }, Preferred: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, }, }, @@ -4894,24 +5009,24 @@ func TestPickZonesFromTopology(t *testing.T) { top: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-c"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-c"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-b"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-b"}, }, }, Preferred: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-b"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-b"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-c"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-c"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, }, }, @@ -4924,24 +5039,24 @@ func TestPickZonesFromTopology(t *testing.T) { top: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-c"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-c"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-b"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-b"}, }, }, Preferred: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-b"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-b"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-c"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-c"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, }, }, @@ -4954,24 +5069,24 @@ func TestPickZonesFromTopology(t *testing.T) { top: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-c"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-c"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-b"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-b"}, }, }, Preferred: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-b"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-b"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-c"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-c"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, }, }, @@ -4984,13 +5099,13 @@ func TestPickZonesFromTopology(t *testing.T) { top: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-c"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-c"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-b"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-b"}, }, }, }, @@ -5002,13 +5117,13 @@ func TestPickZonesFromTopology(t *testing.T) { top: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "topology-zone3"}, + Segments: map[string]string{constants.TopologyKeyZone: "topology-zone3"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "topology-zone1"}, + Segments: map[string]string{constants.TopologyKeyZone: "topology-zone1"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "topology-zone2"}, + Segments: map[string]string{constants.TopologyKeyZone: "topology-zone2"}, }, }, }, @@ -5680,9 +5795,9 @@ func TestCreateConfidentialVolume(t *testing.T) { CapacityRange: stdCapRange, VolumeCapabilities: stdVolCaps, Parameters: map[string]string{ - common.ParameterKeyEnableConfidentialCompute: "true", - common.ParameterKeyDiskEncryptionKmsKey: testDiskEncryptionKmsKey, - common.ParameterKeyType: "hyperdisk-balanced", + parameters.ParameterKeyEnableConfidentialCompute: "true", + parameters.ParameterKeyDiskEncryptionKmsKey: testDiskEncryptionKmsKey, + parameters.ParameterKeyType: "hyperdisk-balanced", }, VolumeContentSource: &csi.VolumeContentSource{ Type: &csi.VolumeContentSource_Snapshot{ @@ -5702,8 +5817,8 @@ func TestCreateConfidentialVolume(t *testing.T) { CapacityRange: stdCapRange, VolumeCapabilities: stdVolCaps, Parameters: map[string]string{ - common.ParameterKeyEnableConfidentialCompute: "false", - common.ParameterKeyType: "hyperdisk-balanced", + parameters.ParameterKeyEnableConfidentialCompute: "false", + parameters.ParameterKeyType: "hyperdisk-balanced", }, VolumeContentSource: &csi.VolumeContentSource{ Type: &csi.VolumeContentSource_Snapshot{ @@ -5725,11 +5840,11 @@ func TestCreateConfidentialVolume(t *testing.T) { gceDriver := initGCEDriverWithCloudProvider(t, fcp, &GCEControllerServerArgs{}) if tc.req.VolumeContentSource.GetType() != nil { - snapshotParams, err := common.ExtractAndDefaultSnapshotParameters(nil, gceDriver.name, nil) + snapshotParams, err := parameters.ExtractAndDefaultSnapshotParameters(nil, gceDriver.name, nil) if err != nil { t.Errorf("Got error extracting snapshot parameters: %v", err) } - if snapshotParams.SnapshotType == common.DiskSnapshotType { + if snapshotParams.SnapshotType == parameters.DiskSnapshotType { fcp.CreateSnapshot(context.Background(), project, tc.volKey, name, snapshotParams) } else { t.Fatalf("No volume source mentioned in snapshot parameters %v", snapshotParams) @@ -5752,7 +5867,7 @@ func TestCreateConfidentialVolume(t *testing.T) { if err != nil { t.Fatalf("Get Disk failed for created disk with error: %v", err) } - val, ok := tc.req.Parameters[common.ParameterKeyEnableConfidentialCompute] + val, ok := tc.req.Parameters[parameters.ParameterKeyEnableConfidentialCompute] if ok && val != strconv.FormatBool(createdDisk.GetEnableConfidentialCompute()) { t.Fatalf("Confidential disk parameter does not match with created disk: %v Got error %v", createdDisk.GetEnableConfidentialCompute(), err) } diff --git a/pkg/gce-pd-csi-driver/disk_selection.go b/pkg/gce-pd-csi-driver/disk_selection.go new file mode 100644 index 000000000..371c85147 --- /dev/null +++ b/pkg/gce-pd-csi-driver/disk_selection.go @@ -0,0 +1,139 @@ +package gceGCEDriver + +import ( + "context" + "fmt" + "strings" + + "github.com/container-storage-interface/spec/lib/go/csi" + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/common" + gce "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/gce-cloud-provider/compute" + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/parameters" +) + +const ( + defaultTypePD = "pd-balanced" + defaultTypeHD = "hyperdisk-balanced" +) + +func SelectDisk(ctx context.Context, req *csi.CreateVolumeRequest, gce gce.GCECompute) (string, error) { + // This should never happen in practice. + if req == nil { + return "", fmt.Errorf("CreateVolumeRequest is nil") + } + + dts, err := getDynamicDiskTypes(req.GetParameters()) + if err != nil { + return "", fmt.Errorf("failed to get disk types from request parameters: %v", err) + } + + if isSourceVolumeSpecified(req.GetVolumeContentSource()) { + return getTypeFromSourceVolume(ctx, req.GetVolumeContentSource(), gce, dts) + } + + return selectDiskTypeFromTopologies(req.GetAccessibilityRequirements(), dts), nil +} + +type dynamicDiskTypes struct { + PD string + HD string + Default string +} + +// Extract disk types from the CSI CreateVolumeRequest. +func getDynamicDiskTypes(reqParams map[string]string) (*dynamicDiskTypes, error) { + if reqParams == nil { + return nil, fmt.Errorf("request parameters are nil") + } + + pdType := defaultTypePD + if param := strings.ToLower(reqParams[parameters.ParameterPDType]); param != "" { + pdType = param + } + + hdType := defaultTypeHD + if param := strings.ToLower(reqParams[parameters.ParameterHDType]); param != "" { + hdType = param + } + + // Determine default disk type based on preference parameter. If the parameter is + // unspecfied than default to hdType. + defaultDiskType := hdType + if diskTypePreference, hasParameter := reqParams[parameters.ParameterDiskPreference]; hasParameter { + switch strings.ToLower(diskTypePreference) { + case parameters.ParameterPDType: + defaultDiskType = pdType + case parameters.ParameterHDType: + defaultDiskType = hdType + default: + return nil, fmt.Errorf("invalid disk type preference %q, must be %q or %q", diskTypePreference, parameters.ParameterPDType, parameters.ParameterHDType) + } + } + + return &dynamicDiskTypes{ + PD: pdType, + HD: hdType, + Default: defaultDiskType, + }, nil +} + +func isSourceVolumeSpecified(vcs *csi.VolumeContentSource) bool { + switch { + case vcs == nil: + return false + case vcs.GetVolume() == nil: + return false + default: + return true + } +} + +func getTypeFromSourceVolume(ctx context.Context, vcs *csi.VolumeContentSource, gce gce.GCECompute, dts *dynamicDiskTypes) (string, error) { + volumeContentSourceVolumeID := vcs.GetVolume().GetVolumeId() + // Verify that the source VolumeID is in the correct format. + project, sourceVolKey, err := common.VolumeIDToKey(volumeContentSourceVolumeID) + if err != nil { + return "", fmt.Errorf("failed to get source volume key: %v", err) + } + + // Verify that the volume in VolumeContentSource exists, and it's disk type + // match the specified dynamic disk types. + d, err := gce.GetDisk(ctx, project, sourceVolKey) + if err != nil { + return "", fmt.Errorf("failed to get disk type from source volume: %v", err) + } + sourceDiskType := d.GetPDType() + if sourceDiskType != dts.HD && sourceDiskType != dts.PD { + return "", fmt.Errorf("source volume has invalid disk type %q, must be %q or %q", sourceDiskType, dts.PD, dts.HD) + } + + return d.GetPDType(), nil +} + +// Select disk type based on the allowed topologies in the CreateVolumeRequest. Only the first node is +// considered because this node is preferred by the scheduler. +func selectDiskTypeFromTopologies(topologies *csi.TopologyRequirement, dts *dynamicDiskTypes) string { + if len(topologies.GetPreferred()) > 0 { + t := topologies.GetPreferred()[0] + + labels := t.GetSegments() + supportedDiskTypes := map[string]bool{} + for key := range labels { + if common.HasDiskTypeLabelKeyPrefix(key) { + supportedDiskTypes[common.DiskTypeFromLabel(key)] = true + } + } + + isHDSupported := supportedDiskTypes[dts.HD] + isPDSupported := supportedDiskTypes[dts.PD] + + if isHDSupported && !isPDSupported { + return dts.HD + } + if isPDSupported && !isHDSupported { + return dts.PD + } + } + + return dts.Default +} diff --git a/pkg/gce-pd-csi-driver/disk_selection_test.go b/pkg/gce-pd-csi-driver/disk_selection_test.go new file mode 100644 index 000000000..647f6dfc1 --- /dev/null +++ b/pkg/gce-pd-csi-driver/disk_selection_test.go @@ -0,0 +1,432 @@ +package gceGCEDriver + +import ( + "context" + "fmt" + "testing" + + "github.com/container-storage-interface/spec/lib/go/csi" + "github.com/google/go-cmp/cmp" + computev1 "google.golang.org/api/compute/v1" + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/common" + gce "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/gce-cloud-provider/compute" + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/parameters" +) + +const ( + pdTestDiskType = "pd-fake" + hdTestDiskType = "hyperdisk-fake" + + testProject = "fake-project" + testZone = "us-central1-f" +) + +var ( + fakeDiskPD = gce.CloudDiskFromV1(&computev1.Disk{ + Name: "pd-source-disk", + Type: pdTestDiskType, + }) + fakeDiskHD = gce.CloudDiskFromV1(&computev1.Disk{ + Name: "hd-source-disk", + Type: hdTestDiskType, + }) + fakeDiskInvalid = gce.CloudDiskFromV1(&computev1.Disk{ + Name: "invalid-source-disk", + Type: "invalid-type", + }) +) + +func TestSelectDisk(t *testing.T) { + tests := []struct { + desc string + req *csi.CreateVolumeRequest + want string + wantErr bool + }{ + { + desc: "no topologies select hd by default", + req: &csi.CreateVolumeRequest{ + Parameters: map[string]string{ + parameters.ParameterPDType: pdTestDiskType, + parameters.ParameterHDType: hdTestDiskType, + }, + }, + want: hdTestDiskType, + }, + { + desc: "disk type override", + req: &csi.CreateVolumeRequest{ + Parameters: map[string]string{ + parameters.ParameterPDType: pdTestDiskType, + parameters.ParameterHDType: hdTestDiskType, + parameters.ParameterDiskPreference: parameters.ParameterPDType, + }, + }, + want: pdTestDiskType, + }, + { + desc: "topologies only support pd", + req: &csi.CreateVolumeRequest{ + Parameters: map[string]string{ + parameters.ParameterPDType: pdTestDiskType, + parameters.ParameterHDType: hdTestDiskType, + }, + AccessibilityRequirements: &csi.TopologyRequirement{ + Preferred: []*csi.Topology{ + { + Segments: map[string]string{ + common.DiskTypeLabelKey(pdTestDiskType): "true", + }, + }, + }, + }, + }, + want: pdTestDiskType, + }, + { + desc: "source volume specified", + req: &csi.CreateVolumeRequest{ + Parameters: map[string]string{ + parameters.ParameterPDType: pdTestDiskType, + parameters.ParameterHDType: hdTestDiskType, + }, + VolumeContentSource: &csi.VolumeContentSource{ + Type: &csi.VolumeContentSource_Volume{ + Volume: &csi.VolumeContentSource_VolumeSource{ + VolumeId: fmt.Sprintf("projects/%s/zones/%s/disks/%s", testProject, testZone, fakeDiskPD.GetName())}, + }, + }, + }, + want: pdTestDiskType, + }, + { + desc: "fail parameters missing", + req: &csi.CreateVolumeRequest{}, + wantErr: true, + }, + { + desc: "fail source volume missing", + req: &csi.CreateVolumeRequest{ + Parameters: map[string]string{ + parameters.ParameterPDType: pdTestDiskType, + parameters.ParameterHDType: hdTestDiskType, + }, + VolumeContentSource: &csi.VolumeContentSource{ + Type: &csi.VolumeContentSource_Volume{ + Volume: &csi.VolumeContentSource_VolumeSource{ + VolumeId: fmt.Sprintf("projects/%s/zones/%s/disks/%s", testProject, testZone, fakeDiskInvalid.GetName())}, + }, + }, + }, + wantErr: true, + }, + } + + for _, tc := range tests { + t.Run(tc.desc, func(t *testing.T) { + fcp, err := gce.CreateFakeCloudProvider(testProject, testZone, []*gce.CloudDisk{fakeDiskPD}) + if err != nil { + t.Fatalf("Failed to create fake cloud provider: %v", err) + } + got, err := SelectDisk(context.Background(), tc.req, fcp) + if (err != nil) != tc.wantErr { + t.Fatalf("SelectDisk() wantErr = %v, gotErr = %v", tc.wantErr, err) + } + + if got != tc.want { + t.Errorf("SelectDisk() = %v, want %v", got, tc.want) + } + }) + } +} + +func TestGetDiskTypes(t *testing.T) { + tests := []struct { + desc string + parameters map[string]string + want *dynamicDiskTypes + wantErr bool + }{ + { + desc: "successful extraction", + parameters: map[string]string{ + parameters.ParameterPDType: pdTestDiskType, + parameters.ParameterHDType: hdTestDiskType, + }, + want: &dynamicDiskTypes{ + PD: pdTestDiskType, + HD: hdTestDiskType, + Default: hdTestDiskType, + }, + }, + { + desc: "pd default override", + parameters: map[string]string{ + parameters.ParameterPDType: pdTestDiskType, + parameters.ParameterHDType: hdTestDiskType, + parameters.ParameterDiskPreference: parameters.ParameterHDType, + }, + want: &dynamicDiskTypes{ + PD: pdTestDiskType, + HD: hdTestDiskType, + Default: hdTestDiskType, + }, + }, + { + desc: "hd default override", + parameters: map[string]string{ + parameters.ParameterPDType: pdTestDiskType, + parameters.ParameterHDType: hdTestDiskType, + parameters.ParameterDiskPreference: parameters.ParameterHDType, + }, + want: &dynamicDiskTypes{ + PD: pdTestDiskType, + HD: hdTestDiskType, + Default: hdTestDiskType, + }, + }, + { + desc: "invalid type preference", + parameters: map[string]string{ + parameters.ParameterPDType: pdTestDiskType, + parameters.ParameterHDType: hdTestDiskType, + parameters.ParameterDiskPreference: "fake-preference", + }, + wantErr: true, + }, + { + desc: "missing pd type", + parameters: map[string]string{ + parameters.ParameterHDType: hdTestDiskType, + }, + want: &dynamicDiskTypes{ + PD: defaultTypePD, + HD: hdTestDiskType, + Default: hdTestDiskType, + }, + }, + { + desc: "missing hd type", + parameters: map[string]string{ + parameters.ParameterPDType: pdTestDiskType, + }, + want: &dynamicDiskTypes{ + PD: pdTestDiskType, + HD: defaultTypeHD, + Default: defaultTypeHD, + }, + }, + } + + for _, tc := range tests { + t.Run(tc.desc, func(t *testing.T) { + got, err := getDynamicDiskTypes(tc.parameters) + if (err != nil) != tc.wantErr { + t.Fatalf("getDiskTypes() wantErr = %v, gotErr = %v", tc.wantErr, err) + } + + if diff := cmp.Diff(got, tc.want); diff != "" { + t.Errorf("Unexpected disk types (-want +got):\n%s", diff) + } + }) + } +} + +func TestIsSourceVolumeSpecified(t *testing.T) { + tests := []struct { + desc string + sourceVolume *csi.VolumeContentSource + want bool + }{ + { + desc: "nil volume content source", + want: false, + }, + { + desc: "snapshot source specified", + sourceVolume: &csi.VolumeContentSource{ + Type: &csi.VolumeContentSource_Snapshot{}, + }, + want: false, + }, + { + desc: "source volume specified", + sourceVolume: &csi.VolumeContentSource{ + Type: &csi.VolumeContentSource_Volume{ + Volume: &csi.VolumeContentSource_VolumeSource{ + VolumeId: "projects/fake-project/zones/us-central1-f/disks/fake-disk"}, + }, + }, + want: true, + }, + } + for _, tc := range tests { + t.Run(tc.desc, func(t *testing.T) { + got := isSourceVolumeSpecified(tc.sourceVolume) + if got != tc.want { + t.Errorf("isSourceVolumeSpecified() = %v, want %v", got, tc.want) + } + }) + } +} + +func TestGetTypeFromSourceVolume(t *testing.T) { + tests := []struct { + desc string + sourceVolume *csi.VolumeContentSource + want string + wantErr bool + }{ + { + desc: "source volume select pd type", + sourceVolume: &csi.VolumeContentSource{ + Type: &csi.VolumeContentSource_Volume{ + Volume: &csi.VolumeContentSource_VolumeSource{ + VolumeId: fmt.Sprintf("projects/%s/zones/%s/disks/%s", testProject, testZone, fakeDiskPD.GetName())}, + }, + }, + want: pdTestDiskType, + }, + { + desc: "source volume select hd type", + sourceVolume: &csi.VolumeContentSource{ + Type: &csi.VolumeContentSource_Volume{ + Volume: &csi.VolumeContentSource_VolumeSource{ + VolumeId: fmt.Sprintf("projects/%s/zones/%s/disks/%s", testProject, testZone, fakeDiskHD.GetName())}, + }, + }, + want: hdTestDiskType, + }, + { + desc: "fail source type does not match parameters", + sourceVolume: &csi.VolumeContentSource{ + Type: &csi.VolumeContentSource_Volume{ + Volume: &csi.VolumeContentSource_VolumeSource{ + VolumeId: fmt.Sprintf("projects/%s/zones/%s/disks/%s", testProject, testZone, fakeDiskInvalid.GetName())}, + }, + }, + wantErr: true, + }, + { + desc: "fail source volume missing", + sourceVolume: &csi.VolumeContentSource{ + Type: &csi.VolumeContentSource_Volume{ + Volume: &csi.VolumeContentSource_VolumeSource{ + VolumeId: fmt.Sprintf("projects/%s/zones/%s/disks/%s", testProject, testZone, "non-existent-disk")}, + }, + }, + wantErr: true, + }, + { + desc: "fail invalid volume id format", + sourceVolume: &csi.VolumeContentSource{ + Type: &csi.VolumeContentSource_Volume{ + Volume: &csi.VolumeContentSource_VolumeSource{ + VolumeId: "invalid-volume-id"}, + }, + }, + wantErr: true, + }, + } + + for _, tc := range tests { + t.Run(tc.desc, func(t *testing.T) { + fcp, err := gce.CreateFakeCloudProvider(testProject, testZone, []*gce.CloudDisk{fakeDiskPD, fakeDiskHD, fakeDiskInvalid}) + if err != nil { + t.Fatalf("Failed to create fake cloud provider: %v", err) + } + got, err := getTypeFromSourceVolume(context.Background(), tc.sourceVolume, fcp, &dynamicDiskTypes{ + PD: pdTestDiskType, + HD: hdTestDiskType, + Default: hdTestDiskType, + }) + if (err != nil) != tc.wantErr { + t.Fatalf("getTypeFromSourceVolume() wantErr = %v, gotErr = %v", tc.wantErr, err) + } + + if got != tc.want { + t.Errorf("getTypeFromSourceVolume() = %v, want %v", got, tc.want) + } + }) + } +} + +func TestSelectDiskTypeFromTopology(t *testing.T) { + // This is not an actual value, and used only by this test to verify default behavior, + const defaultDiskType = "default-type" + + tests := []struct { + desc string + topologies *csi.TopologyRequirement + want string + }{ + { + desc: "only hd supported", + topologies: &csi.TopologyRequirement{ + Preferred: []*csi.Topology{ + { + Segments: map[string]string{ + common.DiskTypeLabelKey(hdTestDiskType): "true", + }, + }, + }, + }, + want: hdTestDiskType, + }, + { + desc: "only pd supported", + topologies: &csi.TopologyRequirement{ + Preferred: []*csi.Topology{ + { + Segments: map[string]string{ + common.DiskTypeLabelKey(pdTestDiskType): "true", + }, + }, + }, + }, + want: pdTestDiskType, + }, + { + desc: "both are supported", + topologies: &csi.TopologyRequirement{ + Preferred: []*csi.Topology{ + { + Segments: map[string]string{ + common.DiskTypeLabelKey(pdTestDiskType): "true", + common.DiskTypeLabelKey(hdTestDiskType): "true", + }, + }, + }, + }, + want: defaultDiskType, + }, + { + desc: "none are supported", + topologies: &csi.TopologyRequirement{ + Preferred: []*csi.Topology{ + { + Segments: map[string]string{}, + }, + }, + }, + want: defaultDiskType, + }, + { + desc: "no topologies", + want: defaultDiskType, + }, + } + + for _, tc := range tests { + t.Run(tc.desc, func(t *testing.T) { + got := selectDiskTypeFromTopologies(tc.topologies, &dynamicDiskTypes{ + PD: pdTestDiskType, + HD: hdTestDiskType, + Default: defaultDiskType, + }) + if got != tc.want { + t.Errorf("selectDiskTypeFromTopologies() = %v, want %v", got, tc.want) + } + }) + } +} diff --git a/pkg/gce-pd-csi-driver/gce-pd-driver.go b/pkg/gce-pd-csi-driver/gce-pd-driver.go index a0eefe960..cf7d2a0f4 100644 --- a/pkg/gce-pd-csi-driver/gce-pd-driver.go +++ b/pkg/gce-pd-csi-driver/gce-pd-driver.go @@ -179,6 +179,7 @@ func NewControllerServer(gceDriver *GCEDriver, cloudProvider gce.GCECompute, err listVolumesConfig: listVolumesConfig, provisionableDisksConfig: provisionableDisksConfig, enableHdHA: enableHdHA, + enableDynamicVolumes: args.EnableDynamicVolumes, EnableDiskTopology: args.EnableDiskTopology, EnableDiskSizeValidation: args.EnableDiskSizeValidation, } diff --git a/pkg/gce-pd-csi-driver/node.go b/pkg/gce-pd-csi-driver/node.go index 4460405e8..d940f690e 100644 --- a/pkg/gce-pd-csi-driver/node.go +++ b/pkg/gce-pd-csi-driver/node.go @@ -33,9 +33,12 @@ import ( csi "github.com/container-storage-interface/spec/lib/go/csi" corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" + volumehelpers "k8s.io/cloud-provider/volume/helpers" "k8s.io/klog/v2" "k8s.io/mount-utils" "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/common" + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/constants" "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/deviceutils" metadataservice "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/gce-cloud-provider/metadata" "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/k8sclient" @@ -131,17 +134,31 @@ const ( fsTypeExt3 = "ext3" fsTypeBtrfs = "btrfs" - readAheadKBMountFlagRegexPattern = "^read_ahead_kb=(.+)$" - btrfsReclaimDataRegexPattern = "^btrfs-allocation-data-bg_reclaim_threshold=(\\d{1,2})$" // 0-99 are valid, incl. 00 - btrfsReclaimMetadataRegexPattern = "^btrfs-allocation-metadata-bg_reclaim_threshold=(\\d{1,2})$" // ditto ^ + readAheadKBMountFlagRegexPattern = "^read_ahead_kb=(.+)$" + btrfsReclaimDataRegexPattern = "^btrfs-allocation-data-bg_reclaim_threshold=(\\d{1,2})$" // 0-99 are valid, incl. 00 + btrfsReclaimMetadataRegexPattern = "^btrfs-allocation-metadata-bg_reclaim_threshold=(\\d{1,2})$" // ditto ^ + btrfsDynamicReclaimDataRegexPattern = "^btrfs-allocation-data-dynamic_reclaim=(0|1)$" // boolean in kernel, so accepting 0 or 1 + btrfsDynamicReclaimMetadataRegexPattern = "^btrfs-allocation-metadata-dynamic_reclaim=(0|1)$" // ditto ^ + btrfsReadAheadKBRegexPattern = "^btrfs-bdi-read_ahead_kb=(\\d+)$" ) var ( - readAheadKBMountFlagRegex = regexp.MustCompile(readAheadKBMountFlagRegexPattern) - btrfsReclaimDataRegex = regexp.MustCompile(btrfsReclaimDataRegexPattern) - btrfsReclaimMetadataRegex = regexp.MustCompile(btrfsReclaimMetadataRegexPattern) + readAheadKBMountFlagRegex = regexp.MustCompile(readAheadKBMountFlagRegexPattern) + btrfsReclaimDataRegex = regexp.MustCompile(btrfsReclaimDataRegexPattern) + btrfsReclaimMetadataRegex = regexp.MustCompile(btrfsReclaimMetadataRegexPattern) + btrfsDynamicReclaimDataRegex = regexp.MustCompile(btrfsDynamicReclaimDataRegexPattern) + btrfsDynamicReclaimMetadataRegex = regexp.MustCompile(btrfsDynamicReclaimMetadataRegexPattern) + btrfsReadAheadKBRegex = regexp.MustCompile(btrfsReadAheadKBRegexPattern) ) +type btrfsFlags struct { + reclaimData, + reclaimMetadata, + dynamicReclaimData, + dynamicReclaimMetadata, + readAheadKb string +} + func getDefaultFsType() string { if runtime.GOOS == "windows" { return defaultWindowsFsType @@ -203,7 +220,7 @@ func (ns *GCENodeServer) NodePublishVolume(ctx context.Context, req *csi.NodePub } if acquired := ns.volumeLocks.TryAcquire(volumeID); !acquired { - return nil, status.Errorf(codes.Aborted, common.VolumeOperationAlreadyExistsFmt, volumeID) + return nil, status.Errorf(codes.Aborted, constants.VolumeOperationAlreadyExistsFmt, volumeID) } defer ns.volumeLocks.Release(volumeID) @@ -245,7 +262,7 @@ func (ns *GCENodeServer) NodePublishVolume(ctx context.Context, req *csi.NodePub klog.V(4).Infof("NodePublishVolume with block volume mode") partition := "" - if part, ok := req.GetVolumeContext()[common.VolumeAttributePartition]; ok { + if part, ok := req.GetVolumeContext()[constants.VolumeAttributePartition]; ok { partition = part } @@ -327,7 +344,7 @@ func (ns *GCENodeServer) NodeUnpublishVolume(ctx context.Context, req *csi.NodeU } if acquired := ns.volumeLocks.TryAcquire(volumeID); !acquired { - return nil, status.Errorf(codes.Aborted, common.VolumeOperationAlreadyExistsFmt, volumeID) + return nil, status.Errorf(codes.Aborted, constants.VolumeOperationAlreadyExistsFmt, volumeID) } defer ns.volumeLocks.Release(volumeID) @@ -355,7 +372,7 @@ func (ns *GCENodeServer) NodeStageVolume(ctx context.Context, req *csi.NodeStage } if acquired := ns.volumeLocks.TryAcquire(volumeID); !acquired { - return nil, status.Errorf(codes.Aborted, common.VolumeOperationAlreadyExistsFmt, volumeID) + return nil, status.Errorf(codes.Aborted, constants.VolumeOperationAlreadyExistsFmt, volumeID) } defer ns.volumeLocks.Release(volumeID) @@ -373,7 +390,7 @@ func (ns *GCENodeServer) NodeStageVolume(ctx context.Context, req *csi.NodeStage // Part 1: Get device path of attached device partition := "" - if part, ok := req.GetVolumeContext()[common.VolumeAttributePartition]; ok { + if part, ok := req.GetVolumeContext()[constants.VolumeAttributePartition]; ok { partition = part } devicePath, err := getDevicePath(ns, volumeID, partition) @@ -383,7 +400,7 @@ func (ns *GCENodeServer) NodeStageVolume(ctx context.Context, req *csi.NodeStage klog.Infof("Successfully found attached GCE PD %q at device path %s.", volumeKey.Name, devicePath) - if ns.EnableDataCache && (req.GetPublishContext()[common.ContextDataCacheSize] != "" || req.GetPublishContext()[common.ContextDataCacheMode] != "") { + if ns.EnableDataCache && (req.GetPublishContext()[constants.ContextDataCacheSize] != "" || req.GetPublishContext()[constants.ContextDataCacheMode] != "") { if len(nodeId) == 0 { return nil, status.Error(codes.InvalidArgument, "NodeStageVolume Node ID must be provided") } @@ -391,7 +408,7 @@ func (ns *GCENodeServer) NodeStageVolume(ctx context.Context, req *csi.NodeStage if err != nil { klog.Errorf("filepath.EvalSymlinks(%q) failed when trying to create volume group: %v", devicePath, err) } - configError := ValidateDataCacheConfig(req.GetPublishContext()[common.ContextDataCacheMode], req.GetPublishContext()[common.ContextDataCacheSize], ctx) + configError := ValidateDataCacheConfig(req.GetPublishContext()[constants.ContextDataCacheMode], req.GetPublishContext()[constants.ContextDataCacheSize], ctx) if configError != nil { if ns.DataCacheEnabledNodePool { return nil, status.Error(codes.DataLoss, fmt.Sprintf("Error validate configuration for Data Cache: %v", configError.Error())) @@ -421,7 +438,7 @@ func (ns *GCENodeServer) NodeStageVolume(ctx context.Context, req *csi.NodeStage // Part 3: Mount device to stagingTargetPath fstype := getDefaultFsType() - var btrfsReclaimData, btrfsReclaimMetadata string + var btrfsFlags btrfsFlags shouldUpdateReadAhead := false var readAheadKB int64 options := []string{} @@ -437,7 +454,7 @@ func (ns *GCENodeServer) NodeStageVolume(ctx context.Context, req *csi.NodeStage } if mnt.FsType == fsTypeBtrfs { - btrfsReclaimData, btrfsReclaimMetadata = extractBtrfsReclaimFlags(mnt.MountFlags) + btrfsFlags = extractBtrfsFlags(mnt.MountFlags) } } else if blk := volumeCapability.GetBlock(); blk != nil { // Noop for Block NodeStageVolume @@ -452,14 +469,22 @@ func (ns *GCENodeServer) NodeStageVolume(ctx context.Context, req *csi.NodeStage } // If a disk size is provided in the publish context, ensure it matches the actual device size. - if expectedSize := req.GetPublishContext()[common.ContextDiskSizeGB]; expectedSize != "" { - actualSize, err := getBlockSizeBytes(devicePath, ns.Mounter) + expectedDiskSizeStr := req.GetPublishContext()[constants.ContextDiskSizeGB] + if expectedSizeGib, err := strconv.ParseInt(expectedDiskSizeStr, 10, 64); err == nil { + actualSizeBytes, err := getBlockSizeBytes(devicePath, ns.Mounter) if err != nil { return nil, status.Error(codes.Internal, fmt.Sprintf("failed to get block size for '%s': %v", devicePath, err.Error())) } - if expectedSize != strconv.FormatInt(actualSize, 10) { - return nil, status.Error(codes.Internal, fmt.Sprintf("expected block size %q, got %q", expectedSize, strconv.FormatInt(actualSize, 10))) + actualSizeGib, err := volumehelpers.RoundUpToGiB(*resource.NewQuantity(actualSizeBytes, resource.DecimalSI)) + if err != nil { + return nil, status.Error(codes.Internal, fmt.Sprintf("failed to convert block size '%d' to GiB: %v", actualSizeBytes, err.Error())) + } + + if expectedSizeGib > actualSizeGib { + return nil, status.Error(codes.Internal, fmt.Sprintf("expected block size %q, got %q", expectedSizeGib, actualSizeGib)) } + } else { + klog.V(4).Infof("skipping disk size validation due to invalid expected size: %v", err) } err = ns.formatAndMount(devicePath, stagingTargetPath, fstype, options, ns.Mounter) @@ -495,47 +520,58 @@ func (ns *GCENodeServer) NodeStageVolume(ctx context.Context, req *csi.NodeStage } } - // Part 5: Update read_ahead + // Part 5: Update read_ahead for the block device if shouldUpdateReadAhead { if err := ns.updateReadAhead(devicePath, readAheadKB); err != nil { return nil, status.Errorf(codes.Internal, "failure updating readahead for %s to %dKB: %v", devicePath, readAheadKB, err.Error()) } } - // Part 6: if configured, write sysfs values + btrfsSysfs := map[string]string{} + + if btrfsFlags.readAheadKb != "" { + btrfsSysfs["bdi/read_ahead_kb"] = btrfsFlags.readAheadKb + } + if !readonly { - sysfs := map[string]string{} - if btrfsReclaimData != "" { - sysfs["allocation/data/bg_reclaim_threshold"] = btrfsReclaimData - } - if btrfsReclaimMetadata != "" { - sysfs["allocation/metadata/bg_reclaim_threshold"] = btrfsReclaimMetadata - } - - if len(sysfs) > 0 { - args := []string{"--match-tag", "UUID", "--output", "value", stagingTargetPath} - cmd := ns.Mounter.Exec.Command("blkid", args...) - var stderr bytes.Buffer - cmd.SetStderr(&stderr) - klog.V(4).Infof( - "running %q for volume %s", - strings.Join(append([]string{"blkid"}, args...), " "), - volumeID, - ) - uuid, err := cmd.Output() - if err != nil { - klog.Errorf("blkid failed for %s. stderr:\n%s", volumeID, stderr.String()) - return nil, status.Errorf(codes.Internal, "blkid failed: %v", err) - } - uuid = bytes.TrimRight(uuid, "\n") + if btrfsFlags.reclaimData != "" { + btrfsSysfs["allocation/data/bg_reclaim_threshold"] = btrfsFlags.reclaimData + } + if btrfsFlags.reclaimMetadata != "" { + btrfsSysfs["allocation/metadata/bg_reclaim_threshold"] = btrfsFlags.reclaimMetadata + } + if btrfsFlags.dynamicReclaimData != "" { + btrfsSysfs["allocation/data/dynamic_reclaim"] = btrfsFlags.dynamicReclaimData + } + if btrfsFlags.dynamicReclaimMetadata != "" { + btrfsSysfs["allocation/metadata/dynamic_reclaim"] = btrfsFlags.dynamicReclaimMetadata + } + } - for key, value := range sysfs { - path := fmt.Sprintf("%s/fs/btrfs/%s/%s", ns.SysfsPath, uuid, key) - if err := writeSysfs(path, value); err != nil { - return nil, status.Error(codes.Internal, err.Error()) - } - klog.V(4).Infof("NodeStageVolume set %s %s=%s", volumeID, key, value) + // Part 6: if configured, write sysfs values + if len(btrfsSysfs) > 0 { + args := []string{"--match-tag", "UUID", "--output", "value", devicePath} + cmd := ns.Mounter.Exec.Command("blkid", args...) + var stderr bytes.Buffer + cmd.SetStderr(&stderr) + klog.V(4).Infof( + "running %q for volume %s", + strings.Join(append([]string{"blkid"}, args...), " "), + volumeID, + ) + uuid, err := cmd.Output() + if err != nil { + klog.Errorf("blkid failed for %s. stderr:\n%s", volumeID, stderr.String()) + return nil, status.Errorf(codes.Internal, "blkid failed: %v", err) + } + uuid = bytes.TrimRight(uuid, "\n") + + for key, value := range btrfsSysfs { + path := fmt.Sprintf("%s/fs/btrfs/%s/%s", ns.SysfsPath, uuid, key) + if err := writeSysfs(path, value); err != nil { + return nil, status.Error(codes.Internal, err.Error()) } + klog.V(4).Infof("NodeStageVolume set %s %s=%s", volumeID, key, value) } } @@ -563,7 +599,6 @@ func writeSysfs(path, value string) (_err error) { if _, err := f.Write([]byte(value)); err != nil { return err } - return nil } @@ -583,16 +618,22 @@ func (ns *GCENodeServer) updateReadAhead(devicePath string, readAheadKB int64) e return nil } -func extractBtrfsReclaimFlags(mountFlags []string) (string, string) { - var reclaimData, reclaimMetadata string +func extractBtrfsFlags(mountFlags []string) btrfsFlags { + var flags btrfsFlags for _, mountFlag := range mountFlags { if got := btrfsReclaimDataRegex.FindStringSubmatch(mountFlag); len(got) == 2 { - reclaimData = got[1] + flags.reclaimData = got[1] } else if got := btrfsReclaimMetadataRegex.FindStringSubmatch(mountFlag); len(got) == 2 { - reclaimMetadata = got[1] + flags.reclaimMetadata = got[1] + } else if got := btrfsReadAheadKBRegex.FindStringSubmatch(mountFlag); len(got) == 2 { + flags.readAheadKb = got[1] + } else if got := btrfsDynamicReclaimDataRegex.FindStringSubmatch(mountFlag); len(got) == 2 { + flags.dynamicReclaimData = got[1] + } else if got := btrfsDynamicReclaimMetadataRegex.FindStringSubmatch(mountFlag); len(got) == 2 { + flags.dynamicReclaimMetadata = got[1] } } - return reclaimData, reclaimMetadata + return flags } func extractReadAheadKBMountFlag(mountFlags []string) (int64, bool, error) { @@ -627,7 +668,7 @@ func (ns *GCENodeServer) NodeUnstageVolume(ctx context.Context, req *csi.NodeUns } if acquired := ns.volumeLocks.TryAcquire(volumeID); !acquired { - return nil, status.Errorf(codes.Aborted, common.VolumeOperationAlreadyExistsFmt, volumeID) + return nil, status.Errorf(codes.Aborted, constants.VolumeOperationAlreadyExistsFmt, volumeID) } defer ns.volumeLocks.Release(volumeID) @@ -699,7 +740,7 @@ func (ns *GCENodeServer) NodeGetCapabilities(ctx context.Context, req *csi.NodeG func (ns *GCENodeServer) NodeGetInfo(ctx context.Context, req *csi.NodeGetInfoRequest) (*csi.NodeGetInfoResponse, error) { top := &csi.Topology{ - Segments: map[string]string{common.TopologyKeyZone: ns.MetadataService.GetZone()}, + Segments: map[string]string{constants.TopologyKeyZone: ns.MetadataService.GetZone()}, } node, err := k8sclient.GetNodeWithRetry(ctx, ns.GetNodeName()) @@ -961,7 +1002,8 @@ func getAttachLimitsOverrideFromNodeLabel(node *corev1.Node) (int64, error) { if node == nil { return 0, fmt.Errorf("node is nil") } - if val, found := node.GetLabels()[fmt.Sprintf(common.NodeRestrictionLabelPrefix, common.AttachLimitOverrideLabel)]; found { + + if val, found := node.GetLabels()[fmt.Sprintf(constants.NodeRestrictionLabelPrefix, constants.AttachLimitOverrideLabel)]; found { attachLimitOverrideForNode, err := strconv.ParseInt(val, 10, 64) if err != nil { return 0, fmt.Errorf("error getting attach limit override from node label: %v", err) diff --git a/pkg/gce-pd-csi-driver/node_test.go b/pkg/gce-pd-csi-driver/node_test.go index 13e065044..a7ba1e52e 100644 --- a/pkg/gce-pd-csi-driver/node_test.go +++ b/pkg/gce-pd-csi-driver/node_test.go @@ -19,6 +19,7 @@ import ( "context" "fmt" "os" + "path" "path/filepath" "sort" "strings" @@ -36,7 +37,7 @@ import ( corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/mount-utils" - "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/common" + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/constants" "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/deviceutils" metadataservice "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/gce-cloud-provider/metadata" "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/linkcache" @@ -442,7 +443,7 @@ func TestNodeGetVolumeLimits(t *testing.T) { node: &corev1.Node{ ObjectMeta: metav1.ObjectMeta{ Labels: map[string]string{ - fmt.Sprintf(common.NodeRestrictionLabelPrefix, common.AttachLimitOverrideLabel): "63", + fmt.Sprintf(constants.NodeRestrictionLabelPrefix, constants.AttachLimitOverrideLabel): "63", }, }, }, @@ -454,7 +455,7 @@ func TestNodeGetVolumeLimits(t *testing.T) { node: &corev1.Node{ ObjectMeta: metav1.ObjectMeta{ Labels: map[string]string{ - fmt.Sprintf(common.NodeRestrictionLabelPrefix, common.AttachLimitOverrideLabel): "invalid", + fmt.Sprintf(constants.NodeRestrictionLabelPrefix, constants.AttachLimitOverrideLabel): "invalid", }, }, }, @@ -466,7 +467,7 @@ func TestNodeGetVolumeLimits(t *testing.T) { node: &corev1.Node{ ObjectMeta: metav1.ObjectMeta{ Labels: map[string]string{ - fmt.Sprintf(common.NodeRestrictionLabelPrefix, common.AttachLimitOverrideLabel): "9999", + fmt.Sprintf(constants.NodeRestrictionLabelPrefix, constants.AttachLimitOverrideLabel): "9999", }, }, }, @@ -669,36 +670,48 @@ func TestNodeStageVolume(t *testing.T) { defer os.RemoveAll(tempDir) stagingPath := filepath.Join(tempDir, defaultStagingPath) - btrfsUUID := "00000000-0000-0000-0000-000000000001" - btrfsPrefix := fmt.Sprintf("%s/sys/fs/btrfs/%s/allocation", tempDir, btrfsUUID) + var ( + btrfsUUID = "00000000-0000-0000-0000-000000000001" + btrfsPrefix = fmt.Sprintf("%s/sys/fs/btrfs/%s", tempDir, btrfsUUID) + btrfsFixtures = map[string]string{ + "allocation/data/bg_reclaim_threshold": "0\n", + "allocation/data/dynamic_reclaim": "0\n", + "allocation/metadata/bg_reclaim_threshold": "0\n", + "allocation/metadata/dynamic_reclaim": "0\n", + "bdi/read_ahead_kb": "4096\n", + } + ) - for _, suffix := range []string{"data", "metadata"} { - dir := btrfsPrefix + "/" + suffix + for fname, contents := range btrfsFixtures { + fullPath := btrfsPrefix + "/" + fname + dir := path.Dir(fullPath) if err := os.MkdirAll(dir, 0755); err != nil { t.Fatalf("Failed to set up fake sysfs dir %q: %v", dir, err) } - fname := dir + "/bg_reclaim_threshold" - if err := os.WriteFile(fname, []byte("0\n"), 0644); err != nil { - t.Fatalf("write %q: %v", fname, err) + if err := os.WriteFile(fullPath, []byte(contents), 0644); err != nil { + t.Fatalf("write %q: %v", fullPath, err) } } testCases := []struct { - name string - req *csi.NodeStageVolumeRequest - deviceSize int - blockExtSize int - readonlyBit string - expResize bool - expReadAheadUpdate bool - expReadAheadKB string - expReadOnlyRemount bool - expCommandList []fakeCmd - readAheadSectors string - btrfsReclaimData string - btrfsReclaimMetadata string - sectorSizeInBytes int - expErrCode codes.Code + name string + req *csi.NodeStageVolumeRequest + deviceSize int + blockExtSize int + readonlyBit string + expResize bool + expReadAheadUpdate bool + expReadAheadKB string + expReadOnlyRemount bool + expCommandList []fakeCmd + readAheadSectors string + btrfsReclaimData string + btrfsReclaimMetadata string + btrfsDynamicReclaimData string + btrfsDynamicReclaimMetadata string + btrfsReadAheadKb string + sectorSizeInBytes int + expErrCode codes.Code }{ { name: "Valid request, resize even though block and filesystem sizes match", @@ -945,13 +958,13 @@ func TestNodeStageVolume(t *testing.T) { }, { cmd: "blkid", - args: fmt.Sprintf("--match-tag UUID --output value %v", stagingPath), + args: fmt.Sprintf("--match-tag UUID --output value /dev/disk/fake-path"), stdout: btrfsUUID + "\n", }, }, }, { - name: "Valid request, set btrfs-allocation-{,meta}data-bg_reclaim_threshold", + name: "Valid request, set btrfs props", req: &csi.NodeStageVolumeRequest{ VolumeId: volumeID, StagingTargetPath: stagingPath, @@ -962,6 +975,9 @@ func TestNodeStageVolume(t *testing.T) { MountFlags: []string{ "btrfs-allocation-data-bg_reclaim_threshold=90", "btrfs-allocation-metadata-bg_reclaim_threshold=91", + "btrfs-allocation-data-dynamic_reclaim=1", + "btrfs-allocation-metadata-dynamic_reclaim=1", + "btrfs-bdi-read_ahead_kb=128", }, }, }, @@ -970,11 +986,14 @@ func TestNodeStageVolume(t *testing.T) { }, }, }, - deviceSize: 1, - blockExtSize: 1, - readonlyBit: "0", - btrfsReclaimData: "90", - btrfsReclaimMetadata: "91", + deviceSize: 1, + blockExtSize: 1, + readonlyBit: "0", + btrfsReclaimData: "90", + btrfsReclaimMetadata: "91", + btrfsDynamicReclaimData: "1", + btrfsDynamicReclaimMetadata: "1", + btrfsReadAheadKb: "128", expCommandList: []fakeCmd{ { cmd: "blkid", @@ -1008,7 +1027,7 @@ func TestNodeStageVolume(t *testing.T) { }, { cmd: "blkid", - args: fmt.Sprintf("--match-tag UUID --output value %v", stagingPath), + args: fmt.Sprintf("--match-tag UUID --output value /dev/disk/fake-path"), stdout: btrfsUUID + "\n", }, }, @@ -1144,14 +1163,49 @@ func TestNodeStageVolume(t *testing.T) { }, }, { - name: "Valid request with disk size check", + name: "Valid request disk size matches expected size", req: &csi.NodeStageVolumeRequest{ VolumeId: volumeID, StagingTargetPath: stagingPath, VolumeCapability: stdVolCap, - PublishContext: map[string]string{common.ContextDiskSizeGB: "1"}, + PublishContext: map[string]string{constants.ContextDiskSizeGB: "6"}, }, - deviceSize: 1, + deviceSize: 6442450944, + blockExtSize: 1, + readonlyBit: "1", + expResize: false, + expCommandList: []fakeCmd{ + { + cmd: "blockdev", + args: "--getsize64 /dev/disk/fake-path", + stdout: "%v", + }, + { + cmd: "blkid", + args: "-p -s TYPE -s PTTYPE -o export /dev/disk/fake-path", + stdout: "DEVNAME=/dev/sdb\nTYPE=%v", + }, + { + cmd: "fsck", + args: "-a /dev/disk/fake-path", + stdout: "", + }, + { + cmd: "blockdev", + args: "--getro /dev/disk/fake-path", + stdout: "%v", + }, + }, + }, + { + name: "Valid request disk size exceeds expected size", + req: &csi.NodeStageVolumeRequest{ + VolumeId: volumeID, + StagingTargetPath: stagingPath, + VolumeCapability: stdVolCap, + PublishContext: map[string]string{constants.ContextDiskSizeGB: "1"}, + }, + deviceSize: 6442450944, blockExtSize: 1, readonlyBit: "1", expResize: false, @@ -1263,9 +1317,9 @@ func TestNodeStageVolume(t *testing.T) { VolumeId: volumeID, StagingTargetPath: stagingPath, VolumeCapability: stdVolCap, - PublishContext: map[string]string{common.ContextDiskSizeGB: "10"}, + PublishContext: map[string]string{constants.ContextDiskSizeGB: "10"}, }, - deviceSize: 5, + deviceSize: 6442450944, expErrCode: codes.Internal, expCommandList: []fakeCmd{ { @@ -1355,29 +1409,33 @@ func TestNodeStageVolume(t *testing.T) { if tc.expReadAheadUpdate == false && readAheadUpdateCalled == true { t.Fatalf("Test updated read ahead, but it was not expected.") } - if tc.btrfsReclaimData == "" && tc.btrfsReclaimMetadata == "" && blkidCalled { + if tc.btrfsReclaimData == "" && tc.btrfsReclaimMetadata == "" && + tc.btrfsDynamicReclaimData == "" && tc.btrfsDynamicReclaimMetadata == "" && + tc.btrfsReadAheadKb == "" && blkidCalled { t.Fatalf("blkid was called, but was not expected.") } - if tc.btrfsReclaimData != "" { - fname := btrfsPrefix + "/data/bg_reclaim_threshold" - got, err := os.ReadFile(fname) - if err != nil { - t.Fatalf("read %q: %v", fname, err) - } - if s := strings.TrimSpace(string(got)); s != tc.btrfsReclaimData { - t.Fatalf("%q: expected %q, got %q", fname, tc.btrfsReclaimData, s) - } + btrfsProps := map[string]string{ + "/allocation/data/bg_reclaim_threshold": tc.btrfsReclaimData, + "/allocation/metadata/bg_reclaim_threshold": tc.btrfsReclaimMetadata, + "/allocation/data/dynamic_reclaim": tc.btrfsDynamicReclaimData, + "/allocation/metadata/dynamic_reclaim": tc.btrfsDynamicReclaimMetadata, + "/bdi/read_ahead_kb": tc.btrfsReadAheadKb, } - if tc.btrfsReclaimMetadata != "" { - fname := btrfsPrefix + "/metadata/bg_reclaim_threshold" - got, err := os.ReadFile(fname) + + for fname, prop := range btrfsProps { + if prop == "" { + continue + } + + got, err := os.ReadFile(btrfsPrefix + fname) if err != nil { - t.Fatalf("read %q: %v", fname, err) + t.Fatalf("read %q: %v", btrfsPrefix+fname, err) } - if s := strings.TrimSpace(string(got)); s != tc.btrfsReclaimMetadata { - t.Fatalf("%q: expected %q, got %q", fname, tc.btrfsReclaimMetadata, s) + if s := strings.TrimSpace(string(got)); s != prop { + t.Fatalf("%q: expected %q, got %q", btrfsPrefix+fname, prop, s) } + } }) } @@ -1721,8 +1779,8 @@ func TestBlockingFormatAndMount(t *testing.T) { func TestGetDiskTypeLabels(t *testing.T) { const ( nodeName = "test-node" - diskA = common.DiskTypeKeyPrefix + "/disk-a" - diskB = common.DiskTypeKeyPrefix + "/disk-b" + diskA = constants.DiskTypeKeyPrefix + "/disk-a" + diskB = constants.DiskTypeKeyPrefix + "/disk-b" ) testCases := []struct { @@ -1808,7 +1866,7 @@ func TestNodeGetInfo(t *testing.T) { MaxVolumesPerNode: volumeLimitBig, AccessibleTopology: &csi.Topology{ Segments: map[string]string{ - common.TopologyKeyZone: zone, + constants.TopologyKeyZone: zone, }, }, }, @@ -1821,7 +1879,7 @@ func TestNodeGetInfo(t *testing.T) { MaxVolumesPerNode: volumeLimitBig, AccessibleTopology: &csi.Topology{ Segments: map[string]string{ - common.TopologyKeyZone: zone, + constants.TopologyKeyZone: zone, }, }, }, diff --git a/pkg/gce-pd-csi-driver/server_test.go b/pkg/gce-pd-csi-driver/server_test.go index 9b6bcf420..9a645c4cb 100644 --- a/pkg/gce-pd-csi-driver/server_test.go +++ b/pkg/gce-pd-csi-driver/server_test.go @@ -25,9 +25,9 @@ import ( "google.golang.org/grpc" csi "github.com/container-storage-interface/spec/lib/go/csi" - "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/common" gce "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/gce-cloud-provider/compute" "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/metrics" + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/parameters" ) func createSocketFile() (string, func(), error) { @@ -104,7 +104,7 @@ func TestServerCreateVolumeMetric(t *testing.T) { CapacityRange: stdCapRange, VolumeCapabilities: stdVolCaps, Parameters: map[string]string{ - common.ParameterKeyType: "pd-balanced", + parameters.ParameterKeyType: "pd-balanced", }, } resp, err := controllerClient.CreateVolume(context.Background(), req) diff --git a/pkg/gce-pd-csi-driver/utils.go b/pkg/gce-pd-csi-driver/utils.go index f8a4d0461..604644d99 100644 --- a/pkg/gce-pd-csi-driver/utils.go +++ b/pkg/gce-pd-csi-driver/utils.go @@ -27,6 +27,8 @@ import ( "k8s.io/klog/v2" "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/common" + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/constants" + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/parameters" ) const ( @@ -37,9 +39,9 @@ var ( ProbeCSIFullMethod = "/csi.v1.Identity/Probe" csiAccessModeToHyperdiskMode = map[csi.VolumeCapability_AccessMode_Mode]string{ - csi.VolumeCapability_AccessMode_SINGLE_NODE_WRITER: common.GCEReadWriteOnceAccessMode, - csi.VolumeCapability_AccessMode_MULTI_NODE_READER_ONLY: common.GCEReadOnlyManyAccessMode, - csi.VolumeCapability_AccessMode_MULTI_NODE_MULTI_WRITER: common.GCEReadWriteManyAccessMode, + csi.VolumeCapability_AccessMode_SINGLE_NODE_WRITER: constants.GCEReadWriteOnceAccessMode, + csi.VolumeCapability_AccessMode_MULTI_NODE_READER_ONLY: constants.GCEReadOnlyManyAccessMode, + csi.VolumeCapability_AccessMode_MULTI_NODE_MULTI_WRITER: constants.GCEReadWriteManyAccessMode, } supportedMultiAttachAccessModes = map[csi.VolumeCapability_AccessMode_Mode]bool{ @@ -155,7 +157,7 @@ func validateAccessMode(am *csi.VolumeCapability_AccessMode) error { return nil } -func validateStoragePools(req *csi.CreateVolumeRequest, params common.DiskParameters, project string) error { +func validateStoragePools(req *csi.CreateVolumeRequest, params parameters.DiskParameters, project string) error { storagePoolsEnabled := params.StoragePools != nil if !storagePoolsEnabled || req == nil { return nil @@ -191,8 +193,8 @@ func validateStoragePools(req *csi.CreateVolumeRequest, params common.DiskParame return nil } -func validateStoragePoolZones(req *csi.CreateVolumeRequest, storagePools []common.StoragePool) error { - storagePoolZones, err := common.StoragePoolZones(storagePools) +func validateStoragePoolZones(req *csi.CreateVolumeRequest, storagePools []parameters.StoragePool) error { + storagePoolZones, err := parameters.StoragePoolZones(storagePools) if err != nil { return err } @@ -206,7 +208,7 @@ func validateStoragePoolZones(req *csi.CreateVolumeRequest, storagePools []commo return nil } -func validateStoragePoolProjects(project string, storagePools []common.StoragePool) error { +func validateStoragePoolProjects(project string, storagePools []parameters.StoragePool) error { spProjects := sets.String{} for _, sp := range storagePools { if sp.Project != project { @@ -306,18 +308,26 @@ func collectMountOptions(fsType string, mntFlags []string) []string { var options []string for _, opt := range mntFlags { + // The flags below are special flags that aren't + // passed directly as an options to the mount command. if readAheadKBMountFlagRegex.FindString(opt) != "" { - // The read_ahead_kb flag is a special flag that isn't - // passed directly as an option to the mount command. continue } - if btrfsReclaimDataRegex.FindString(opt) != "" { continue } if btrfsReclaimMetadataRegex.FindString(opt) != "" { continue } + if btrfsDynamicReclaimDataRegex.FindString(opt) != "" { + continue + } + if btrfsDynamicReclaimMetadataRegex.FindString(opt) != "" { + continue + } + if btrfsReadAheadKBRegex.FindString(opt) != "" { + continue + } options = append(options, opt) } @@ -344,7 +354,7 @@ func IsDataCacheEnabledNodePool(ctx context.Context, nodeName string, enableData if !enableDataCacheFlag { return false, nil } - if nodeName == common.TestNode { // disregard logic below when E2E testing. + if nodeName == constants.TestNode { // disregard logic below when E2E testing. return true, nil } if len(nodeName) > 0 { diff --git a/pkg/gce-pd-csi-driver/utils_test.go b/pkg/gce-pd-csi-driver/utils_test.go index 263c0143f..60bdd8511 100644 --- a/pkg/gce-pd-csi-driver/utils_test.go +++ b/pkg/gce-pd-csi-driver/utils_test.go @@ -25,7 +25,8 @@ import ( csi "github.com/container-storage-interface/spec/lib/go/csi" "github.com/google/go-cmp/cmp" - "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/common" + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/constants" + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/parameters" ) var ( @@ -301,7 +302,7 @@ func TestValidateStoragePools(t *testing.T) { testCases := []struct { name string req *csi.CreateVolumeRequest - params common.DiskParameters + params parameters.DiskParameters project string expErr error enableHdHA bool @@ -311,7 +312,7 @@ func TestValidateStoragePools(t *testing.T) { req: &csi.CreateVolumeRequest{ Name: "test-name", }, - params: common.DiskParameters{ + params: parameters.DiskParameters{ DiskType: "hyperdisk-balanced", }, expErr: nil, @@ -319,7 +320,7 @@ func TestValidateStoragePools(t *testing.T) { { name: "success with nil CreateVolumeReq", req: nil, - params: common.DiskParameters{ + params: parameters.DiskParameters{ DiskType: "hyperdisk-balanced", }, expErr: nil, @@ -329,9 +330,9 @@ func TestValidateStoragePools(t *testing.T) { req: &csi.CreateVolumeRequest{ Name: "test-name", }, - params: common.DiskParameters{ + params: parameters.DiskParameters{ DiskType: "hyperdisk-balanced", - StoragePools: []common.StoragePool{ + StoragePools: []parameters.StoragePool{ { Project: "test-project", Zone: "us-central1-a", @@ -355,9 +356,9 @@ func TestValidateStoragePools(t *testing.T) { req: &csi.CreateVolumeRequest{ Name: "test-name", }, - params: common.DiskParameters{ + params: parameters.DiskParameters{ DiskType: "pd-balanced", - StoragePools: []common.StoragePool{ + StoragePools: []parameters.StoragePool{ { Project: "test-project", Zone: "us-central1-a", @@ -380,10 +381,10 @@ func TestValidateStoragePools(t *testing.T) { req: &csi.CreateVolumeRequest{ Name: "test-name", }, - params: common.DiskParameters{ + params: parameters.DiskParameters{ DiskType: "hyperdisk-balanced", ReplicationType: "regional-pd", - StoragePools: []common.StoragePool{ + StoragePools: []parameters.StoragePool{ { Project: "test-project", Zone: "us-central1-a", @@ -406,9 +407,9 @@ func TestValidateStoragePools(t *testing.T) { req: &csi.CreateVolumeRequest{ Name: "test-name", }, - params: common.DiskParameters{ + params: parameters.DiskParameters{ DiskType: "hyperdisk-balanced-high-availability", - StoragePools: []common.StoragePool{ + StoragePools: []parameters.StoragePool{ { Project: "test-project", Zone: "us-central1-a", @@ -432,9 +433,9 @@ func TestValidateStoragePools(t *testing.T) { req: &csi.CreateVolumeRequest{ Name: "test-name", }, - params: common.DiskParameters{ + params: parameters.DiskParameters{ DiskType: "hyperdisk-balanced-high-availability", - StoragePools: []common.StoragePool{ + StoragePools: []parameters.StoragePool{ { Project: "test-project", Zone: "us-central1-a", @@ -464,9 +465,9 @@ func TestValidateStoragePools(t *testing.T) { }, }, }, - params: common.DiskParameters{ + params: parameters.DiskParameters{ DiskType: "hyperdisk-balanced", - StoragePools: []common.StoragePool{ + StoragePools: []parameters.StoragePool{ { Project: "test-project", Zone: "us-central1-a", @@ -491,22 +492,22 @@ func TestValidateStoragePools(t *testing.T) { AccessibilityRequirements: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, }, Preferred: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-b"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-b"}, }, }, }, }, - params: common.DiskParameters{ + params: parameters.DiskParameters{ DiskType: "hyperdisk-balanced", - StoragePools: []common.StoragePool{ + StoragePools: []parameters.StoragePool{ { Project: "test-project", Zone: "us-central1-a", @@ -531,25 +532,25 @@ func TestValidateStoragePools(t *testing.T) { AccessibilityRequirements: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-b"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-b"}, }, }, Preferred: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-b"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-b"}, }, }, }, }, - params: common.DiskParameters{ + params: parameters.DiskParameters{ DiskType: "hyperdisk-balanced", - StoragePools: []common.StoragePool{ + StoragePools: []parameters.StoragePool{ { Project: "test-project", Zone: "us-central1-a", @@ -574,25 +575,25 @@ func TestValidateStoragePools(t *testing.T) { AccessibilityRequirements: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-b"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-b"}, }, }, Preferred: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-b"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-b"}, }, }, }, }, - params: common.DiskParameters{ + params: parameters.DiskParameters{ DiskType: "hyperdisk-balanced", - StoragePools: []common.StoragePool{ + StoragePools: []parameters.StoragePool{ { Project: "test-project", Zone: "us-central1-a", @@ -633,7 +634,7 @@ func TestValidateStoragePoolZones(t *testing.T) { testCases := []struct { name string req *csi.CreateVolumeRequest - storagePools []common.StoragePool + storagePools []parameters.StoragePool expErr error }{ { @@ -643,17 +644,17 @@ func TestValidateStoragePoolZones(t *testing.T) { AccessibilityRequirements: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, }, Preferred: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, }, }, }, - storagePools: []common.StoragePool{ + storagePools: []parameters.StoragePool{ { Project: "test-project", Zone: "us-central1-a", @@ -677,12 +678,12 @@ func TestValidateStoragePoolZones(t *testing.T) { Requisite: []*csi.Topology{{}}, Preferred: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, }, }, }, - storagePools: []common.StoragePool{ + storagePools: []parameters.StoragePool{ { Project: "test-project", Zone: "us-central1-a", @@ -699,17 +700,17 @@ func TestValidateStoragePoolZones(t *testing.T) { AccessibilityRequirements: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, }, Preferred: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, }, }, }, - storagePools: []common.StoragePool{ + storagePools: []parameters.StoragePool{ { Project: "test-project", Zone: "us-central1-b", @@ -726,23 +727,23 @@ func TestValidateStoragePoolZones(t *testing.T) { AccessibilityRequirements: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-b"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-b"}, }, }, Preferred: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-a"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-b"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-b"}, }, }, }, }, - storagePools: []common.StoragePool{ + storagePools: []parameters.StoragePool{ { Project: "test-project", Zone: "us-central1-a", @@ -821,7 +822,7 @@ func TestGetHyperdiskAccessModeFromCapabilities(t *testing.T) { }, }, }, - want: common.GCEReadOnlyManyAccessMode, + want: constants.GCEReadOnlyManyAccessMode, }, { name: "success getting RWO", @@ -832,7 +833,7 @@ func TestGetHyperdiskAccessModeFromCapabilities(t *testing.T) { }, }, }, - want: common.GCEReadWriteOnceAccessMode, + want: constants.GCEReadWriteOnceAccessMode, }, { name: "success getting RWX", @@ -843,7 +844,7 @@ func TestGetHyperdiskAccessModeFromCapabilities(t *testing.T) { }, }, }, - want: common.GCEReadWriteManyAccessMode, + want: constants.GCEReadWriteManyAccessMode, }, } { t.Logf("Running test: %v", tc.name) @@ -884,7 +885,7 @@ func TestIsDataCacheEnabledNodePool(t *testing.T) { }, { name: "test node", - nodeName: common.TestNode, + nodeName: constants.TestNode, dataCacheFlag: true, wantDataCacheEnabled: true, }, diff --git a/pkg/k8sclient/node.go b/pkg/k8sclient/node.go index 1c4fa9b8b..7a67c061c 100644 --- a/pkg/k8sclient/node.go +++ b/pkg/k8sclient/node.go @@ -2,6 +2,7 @@ package k8sclient import ( "context" + "fmt" "time" v1 "k8s.io/api/core/v1" @@ -13,6 +14,9 @@ import ( ) func GetNodeWithRetry(ctx context.Context, nodeName string) (*v1.Node, error) { + if nodeName == "" { + return nil, fmt.Errorf("node name is empty") + } cfg, err := rest.InClusterConfig() if err != nil { return nil, err diff --git a/pkg/linkcache/devices_linux.go b/pkg/linkcache/devices_linux.go index b6e367d1e..35b97f7e6 100644 --- a/pkg/linkcache/devices_linux.go +++ b/pkg/linkcache/devices_linux.go @@ -12,21 +12,22 @@ import ( "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/common" "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/deviceutils" "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/k8sclient" + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/metrics" ) const byIdDir = "/dev/disk/by-id" -func NewDeviceCacheForNode(ctx context.Context, period time.Duration, nodeName string, driverName string, deviceUtils deviceutils.DeviceUtils) (*DeviceCache, error) { +func NewDeviceCacheForNode(ctx context.Context, period time.Duration, nodeName string, driverName string, deviceUtils deviceutils.DeviceUtils, metricsManager *metrics.MetricsManager) (*DeviceCache, error) { node, err := k8sclient.GetNodeWithRetry(ctx, nodeName) if err != nil { return nil, fmt.Errorf("failed to get node %s: %w", nodeName, err) } - return newDeviceCacheForNode(period, node, driverName, deviceUtils), nil + return newDeviceCacheForNode(period, node, driverName, deviceUtils, metricsManager), nil } func NewTestDeviceCache(period time.Duration, node *v1.Node) *DeviceCache { - return newDeviceCacheForNode(period, node, "pd.csi.storage.gke.io", deviceutils.NewDeviceUtils()) + return newDeviceCacheForNode(period, node, "pd.csi.storage.gke.io", deviceutils.NewDeviceUtils(), nil) } func NewTestNodeWithVolumes(volumes []string) *v1.Node { @@ -42,12 +43,13 @@ func NewTestNodeWithVolumes(volumes []string) *v1.Node { } } -func newDeviceCacheForNode(period time.Duration, node *v1.Node, driverName string, deviceUtils deviceutils.DeviceUtils) *DeviceCache { +func newDeviceCacheForNode(period time.Duration, node *v1.Node, driverName string, deviceUtils deviceutils.DeviceUtils, metricsManager *metrics.MetricsManager) *DeviceCache { deviceCache := &DeviceCache{ - symlinks: make(map[string]deviceMapping), - period: period, - deviceUtils: deviceUtils, - dir: byIdDir, + symlinks: make(map[string]deviceMapping), + period: period, + deviceUtils: deviceUtils, + dir: byIdDir, + metricsManager: metricsManager, } // Look at the status.volumesInUse field. For each, take the last section @@ -163,6 +165,9 @@ func (d *DeviceCache) listAndUpdate() { // Check if the realPath has changed if realPath != device.realPath { klog.Warningf("Change in device path for volume %s (symlink: %s), previous path: %s, new path: %s", device.volumeID, symlink, device.realPath, realPath) + if d.metricsManager != nil { + d.metricsManager.RecordUnexpectedDevicePathChangesMetric() + } // Update the cache with the new realPath device.realPath = realPath diff --git a/pkg/linkcache/devices_windows.go b/pkg/linkcache/devices_windows.go index d7937bc0b..287ebd835 100644 --- a/pkg/linkcache/devices_windows.go +++ b/pkg/linkcache/devices_windows.go @@ -8,9 +8,10 @@ import ( "k8s.io/klog/v2" "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/deviceutils" + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/metrics" ) -func NewDeviceCacheForNode(ctx context.Context, period time.Duration, nodeName string, driverName string, deviceUtils deviceutils.DeviceUtils) (*DeviceCache, error) { +func NewDeviceCacheForNode(ctx context.Context, period time.Duration, nodeName string, driverName string, deviceUtils deviceutils.DeviceUtils, metricsManager *metrics.MetricsManager) (*DeviceCache, error) { klog.Infof("NewDeviceCacheForNode is not implemented for Windows") return nil, nil } diff --git a/pkg/linkcache/types.go b/pkg/linkcache/types.go index 04d4688eb..62e98ad20 100644 --- a/pkg/linkcache/types.go +++ b/pkg/linkcache/types.go @@ -5,6 +5,7 @@ import ( "time" "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/deviceutils" + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/metrics" ) type deviceMapping struct { @@ -17,6 +18,7 @@ type DeviceCache struct { symlinks map[string]deviceMapping period time.Duration // dir is the directory to look for device symlinks - dir string - deviceUtils deviceutils.DeviceUtils + dir string + deviceUtils deviceutils.DeviceUtils + metricsManager *metrics.MetricsManager } diff --git a/pkg/metrics/metadata.go b/pkg/metrics/metadata.go index a2e41e81a..1dd6eead9 100644 --- a/pkg/metrics/metadata.go +++ b/pkg/metrics/metadata.go @@ -4,8 +4,8 @@ import ( "context" "strconv" - "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/common" gce "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/gce-cloud-provider/compute" + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/parameters" ) const ( @@ -35,7 +35,7 @@ func MetadataFromContext(ctx context.Context) *RequestMetadata { return requestMetadata } -func UpdateRequestMetadataFromParams(ctx context.Context, params common.DiskParameters) { +func UpdateRequestMetadataFromParams(ctx context.Context, params parameters.DiskParameters) { metadata := MetadataFromContext(ctx) if metadata != nil { metadata.diskType = params.DiskType diff --git a/pkg/metrics/metrics.go b/pkg/metrics/metrics.go index 18e7d6f90..ae007a30c 100644 --- a/pkg/metrics/metrics.go +++ b/pkg/metrics/metrics.go @@ -63,6 +63,15 @@ var ( }, []string{"driver_name", "file_system_format", "error_type"}, ) + + unexpectedDevicePathChangesMetric = metrics.NewCounterVec(&metrics.CounterOpts{ + Subsystem: "node", + Name: "unexpected_device_path_changes", + Help: "Unexpected device path changes", + StabilityLevel: metrics.ALPHA, + }, + []string{"driver_name"}, + ) ) type MetricsManager struct { @@ -92,6 +101,10 @@ func (mm *MetricsManager) RegisterMountMetric() { mm.registry.MustRegister(mountErrorMetric) } +func (mm *MetricsManager) RegisterUnexpectedDevicePathChangesMetric() { + mm.registry.MustRegister(unexpectedDevicePathChangesMetric) +} + func (mm *MetricsManager) recordComponentVersionMetric() error { v := getEnvVar(envGKEPDCSIVersion) if v == "" { @@ -121,6 +134,11 @@ func (mm *MetricsManager) RecordMountErrorMetric(fs_format string, err error) { klog.Infof("Recorded mount error type: %q", errType) } +func (mm *MetricsManager) RecordUnexpectedDevicePathChangesMetric() { + unexpectedDevicePathChangesMetric.WithLabelValues(pdcsiDriverName).Inc() + klog.Infof("Recorded unexpected device path change") +} + func (mm *MetricsManager) EmmitProcessStartTime() error { return metrics.RegisterProcessStartTime(mm.registry.Register) } diff --git a/pkg/nodelabeler/configmap.go b/pkg/nodelabeler/configmap.go new file mode 100644 index 000000000..c1d3cad38 --- /dev/null +++ b/pkg/nodelabeler/configmap.go @@ -0,0 +1,44 @@ +package nodelabeler + +import ( + "context" + + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/types" + "k8s.io/klog/v2" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/reconcile" +) + +type ConfigMapEventHandler struct { + Client client.Client + Reconciler *Reconciler +} + +func (h *ConfigMapEventHandler) Map(ctx context.Context, obj client.Object) []reconcile.Request { + cm, ok := obj.(*corev1.ConfigMap) + if !ok { + klog.Errorf("Expected a ConfigMap object but got %T", obj) + return nil + } + if err := h.Reconciler.UpdateMachinePDCompatibility(ctx); err != nil { + klog.Errorf("Failed to update disk compatibility map from ConfigMap %s/%s: %v", cm.Namespace, cm.Name, err) + return nil + } + + var nodes corev1.NodeList + if err := h.Client.List(ctx, &nodes); err != nil { + klog.Errorf("Failed to list nodes for configmap change reconciliation: %v", err) + return nil + } + requests := make([]reconcile.Request, len(nodes.Items)) + for i, node := range nodes.Items { + requests[i] = reconcile.Request{ + NamespacedName: types.NamespacedName{ + Name: node.Name, + }, + } + } + klog.Infof("ConfigMap changed, enqueuing reconciliation for %d nodes", len(requests)) + return requests +} diff --git a/pkg/nodelabeler/configmap_test.go b/pkg/nodelabeler/configmap_test.go new file mode 100644 index 000000000..744fcfbf9 --- /dev/null +++ b/pkg/nodelabeler/configmap_test.go @@ -0,0 +1,81 @@ +package nodelabeler + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/client/fake" + "sigs.k8s.io/controller-runtime/pkg/reconcile" +) + +func TestConfigMapEventHandler_Map(t *testing.T) { + testCases := []struct { + name string + nodes []client.Object + configMap *corev1.ConfigMap + expectedReqs []reconcile.Request + }{ + { + name: "nodes exist", + nodes: []client.Object{ + &corev1.Node{ObjectMeta: metav1.ObjectMeta{Name: "node1"}}, + &corev1.Node{ObjectMeta: metav1.ObjectMeta{Name: "node2"}}, + }, + configMap: &corev1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-cm", + Namespace: "test-ns", + }, + Data: map[string]string{ + "machine-pd-compatibility.json": `{"n2":{"pd-standard":true}}`, + }, + }, + expectedReqs: []reconcile.Request{ + {NamespacedName: types.NamespacedName{Name: "node1"}}, + {NamespacedName: types.NamespacedName{Name: "node2"}}, + }, + }, + { + name: "no nodes exist", + nodes: []client.Object{}, + configMap: &corev1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-cm", + Namespace: "test-ns", + }, + Data: map[string]string{ + "machine-pd-compatibility.json": `{"n2":{"pd-standard":true}}`, + }, + }, + expectedReqs: []reconcile.Request{}, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + allObjects := append(tc.nodes, tc.configMap) + fakeClient := fake.NewClientBuilder().WithObjects(allObjects...).Build() + + reconciler := &Reconciler{ + Client: fakeClient, + ConfigMapName: "test-cm", + ConfigMapNamespace: "test-ns", + } + + eventHandler := &ConfigMapEventHandler{ + Client: fakeClient, + Reconciler: reconciler, + } + + got := eventHandler.Map(context.Background(), tc.configMap) + if diff := cmp.Diff(tc.expectedReqs, got); diff != "" { + t.Errorf("Map() returned diff (-want +got):\n%s", diff) + } + }) + } +} diff --git a/pkg/nodelabeler/reconciler.go b/pkg/nodelabeler/reconciler.go new file mode 100644 index 000000000..ccf707f46 --- /dev/null +++ b/pkg/nodelabeler/reconciler.go @@ -0,0 +1,172 @@ +/* +Copyright 2025 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 nodelabeler + +import ( + "context" + "encoding/json" + "maps" + "strings" + "sync" + + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/types" + "k8s.io/klog/v2" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/reconcile" + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/common" + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/constants" +) + +const ( + instanceTypeLabel = "node.kubernetes.io/instance-type" + machinePDCompatibilityKey = "machine-pd-compatibility.json" +) + +// Reconciler reconciles Node objects to add disk type labels based on machine type. +type Reconciler struct { + Client client.Client + ConfigMapName string + ConfigMapNamespace string + mux sync.RWMutex + compatibility map[string][]string +} + +func (r *Reconciler) Reconcile(ctx context.Context, request reconcile.Request) (reconcile.Result, error) { + node := &corev1.Node{} + err := r.Client.Get(ctx, request.NamespacedName, node) + if err != nil { + if errors.IsNotFound(err) { + return reconcile.Result{}, nil + } + return reconcile.Result{}, err + } + + instanceType, ok := node.Labels[instanceTypeLabel] + if !ok { + klog.V(4).Infof("Node %q does not have label %q, skipping", node.Name, instanceTypeLabel) + return reconcile.Result{}, nil + } + + pds := r.compatiblePDs(instanceType) + if len(pds) == 0 { + klog.V(4).Infof("No compatible PDs found for instance type %q on node %q", instanceType, node.Name) + return reconcile.Result{}, nil + } + + newLabels := make(map[string]string) + maps.Copy(newLabels, node.Labels) + + diskTypeLabelKeys := make(map[string]struct{}) + for _, diskType := range pds { + key := common.DiskTypeLabelKey(diskType) + diskTypeLabelKeys[key] = struct{}{} + } + + labelsChanged := false + for key := range diskTypeLabelKeys { + if val, ok := newLabels[key]; !ok || val != "true" { + newLabels[key] = "true" + labelsChanged = true + } + } + + for key := range newLabels { + if strings.HasPrefix(key, constants.DiskTypeKeyPrefix) { + if _, isExpected := diskTypeLabelKeys[key]; !isExpected { + delete(newLabels, key) + labelsChanged = true + } + } + } + + if !labelsChanged { + klog.V(4).Infof("Node %q already has the correct PD compatibility labels", node.Name) + return reconcile.Result{}, nil + } + + klog.Infof("Updating labels for node %q", node.Name) + patch := client.MergeFrom(node.DeepCopy()) + node.Labels = newLabels + if err := r.Client.Patch(ctx, node, patch); err != nil { + klog.Errorf("Failed to patch node %q: %v", node.Name, err) + return reconcile.Result{}, err + } + + klog.Infof("Successfully updated labels for node %q", node.Name) + return reconcile.Result{}, nil +} + +func (r *Reconciler) compatiblePDs(instanceType string) []string { + r.mux.RLock() + defer r.mux.RUnlock() + + mf := machineFamily(instanceType) + if disks, ok := r.compatibility[mf]; ok { + return disks + } + + return nil +} + +// machineFamily extracts the machine family from the instance type +// e.g. "n2-standard-4" -> "n2", "e2-medium" -> "e2". +func machineFamily(instanceType string) string { + mf, _, _ := strings.Cut(instanceType, "-") + return mf +} + +// UpdateMachinePDCompatibility updates the controller's machine PD compatibility map from a ConfigMap. +func (r *Reconciler) UpdateMachinePDCompatibility(ctx context.Context) error { + cm := &corev1.ConfigMap{} + err := r.Client.Get(ctx, types.NamespacedName{Name: r.ConfigMapName, Namespace: r.ConfigMapNamespace}, cm) + if err != nil { + return err + } + return r.updateMap(cm) +} + +func (r *Reconciler) updateMap(cm *corev1.ConfigMap) error { + klog.Infof("Updating disk compatibility map from ConfigMap %s/%s", cm.Namespace, cm.Name) + jsonData, ok := cm.Data[machinePDCompatibilityKey] + if !ok { + klog.Warningf("ConfigMap %s/%s does not contain key '%s'", cm.Namespace, cm.Name, machinePDCompatibilityKey) + return nil + } + + var parsedData map[string]map[string]bool + if err := json.Unmarshal([]byte(jsonData), &parsedData); err != nil { + klog.Errorf("Failed to unmarshal JSON from ConfigMap %s/%s: %v", cm.Namespace, cm.Name, err) + return err + } + + newMap := make(map[string][]string) + for machineFamily, disks := range parsedData { + var compatibleDisks []string + for disk, supported := range disks { + if supported { + compatibleDisks = append(compatibleDisks, disk) + } + } + newMap[machineFamily] = compatibleDisks + } + + r.mux.Lock() + defer r.mux.Unlock() + r.compatibility = newMap + klog.Infof("Machine PD compatibility map updated successfully") + return nil +} diff --git a/pkg/nodelabeler/reconciler_test.go b/pkg/nodelabeler/reconciler_test.go new file mode 100644 index 000000000..ec225b48c --- /dev/null +++ b/pkg/nodelabeler/reconciler_test.go @@ -0,0 +1,286 @@ +/* +Copyright 2025 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 nodelabeler + +import ( + "context" + "encoding/json" + "sort" + "testing" + + "github.com/google/go-cmp/cmp" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/types" + "sigs.k8s.io/controller-runtime/pkg/client/fake" + "sigs.k8s.io/controller-runtime/pkg/reconcile" + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/constants" +) + +const ( + testConfigMapName = "machine-pd-compatibility" + testConfigMapNamespace = "gce-pd-csi-driver" +) + +func TestReconcile(t *testing.T) { + testCases := []struct { + name string + initialObjects []runtime.Object + req reconcile.Request + expectedLabels map[string]string + expectError bool + }{ + { + name: "should add labels to node", + initialObjects: []runtime.Object{ + &corev1.Node{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-node", + Labels: map[string]string{ + instanceTypeLabel: "e2-medium", + }, + }, + }, + &corev1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: testConfigMapName, + Namespace: testConfigMapNamespace, + }, + Data: map[string]string{ + "machine-pd-compatibility.json": `{ + "e2": { "pd-standard": true, "pd-ssd": true } + }`, + }, + }, + }, + req: reconcile.Request{ + NamespacedName: types.NamespacedName{Name: "test-node"}, + }, + expectedLabels: map[string]string{ + instanceTypeLabel: "e2-medium", + constants.DiskTypeKeyPrefix + "/pd-standard": "true", + constants.DiskTypeKeyPrefix + "/pd-ssd": "true", + }, + expectError: false, + }, + { + name: "should remove pd labels that are not in compatibility map", + initialObjects: []runtime.Object{ + &corev1.Node{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-node", + Labels: map[string]string{ + "foo": "bar", + instanceTypeLabel: "e2-medium", + constants.DiskTypeKeyPrefix + "/pd-standard": "true", + constants.DiskTypeKeyPrefix + "/pd-ssd": "true", + constants.DiskTypeKeyPrefix + "/pd-extreme": "true", + }, + }, + }, + &corev1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: testConfigMapName, + Namespace: testConfigMapNamespace, + }, + Data: map[string]string{ + "machine-pd-compatibility.json": `{ + "e2": { "pd-standard": true, "pd-ssd": true } + }`, + }, + }, + }, + req: reconcile.Request{ + NamespacedName: types.NamespacedName{Name: "test-node"}, + }, + expectedLabels: map[string]string{ + "foo": "bar", + instanceTypeLabel: "e2-medium", + constants.DiskTypeKeyPrefix + "/pd-standard": "true", + constants.DiskTypeKeyPrefix + "/pd-ssd": "true", + }, + expectError: false, + }, + { + name: "should do nothing if node not found", + initialObjects: []runtime.Object{ + &corev1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{Name: testConfigMapName, Namespace: testConfigMapNamespace}, + Data: map[string]string{"machine-pd-compatibility.json": `{}`}, + }, + }, + req: reconcile.Request{ + NamespacedName: types.NamespacedName{Name: "non-existent-node"}, + }, + expectError: false, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + scheme := runtime.NewScheme() + corev1.AddToScheme(scheme) + + fakeClient := fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects(tc.initialObjects...).Build() + + reconciler := &Reconciler{ + Client: fakeClient, + ConfigMapName: testConfigMapName, + ConfigMapNamespace: testConfigMapNamespace, + } + + if err := reconciler.UpdateMachinePDCompatibility(context.Background()); err != nil { + if len(tc.initialObjects) > 1 { + t.Fatalf("UpdateDiskCompatibilityMapFromConfigMap() failed: %v", err) + } + } + + if _, err := reconciler.Reconcile(context.Background(), tc.req); (err != nil) != tc.expectError { + t.Fatalf("Reconcile() error = %v, wantErr %v", err, tc.expectError) + } + + if tc.expectedLabels != nil { + updatedNode := &corev1.Node{} + if err := fakeClient.Get(context.Background(), tc.req.NamespacedName, updatedNode); err != nil { + t.Fatalf("Failed to get updated node: %v", err) + } + if diff := cmp.Diff(tc.expectedLabels, updatedNode.Labels); diff != "" { + t.Errorf("Node labels mismatch (-want +got):\n%s", diff) + } + } + }) + } +} + +func TestUpdateMachinePDCompatibility(t *testing.T) { + testCases := []struct { + name string + configMap *corev1.ConfigMap + expectedMap map[string][]string + expectErr bool + reconciler *Reconciler + configMapName string + }{ + { + name: "valid configmap", + configMap: &corev1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-cm", + Namespace: "test-ns", + }, + Data: map[string]string{ + machinePDCompatibilityKey: `{"e2":{"pd-balanced":true,"pd-standard":true},"n2":{"pd-standard":true,"pd-ssd":true}}`, + }, + }, + expectedMap: map[string][]string{ + "n2": {"pd-standard", "pd-ssd"}, + "e2": {"pd-balanced", "pd-standard"}, + }, + expectErr: false, + reconciler: &Reconciler{ + ConfigMapName: "test-cm", + ConfigMapNamespace: "test-ns", + }, + configMapName: "test-cm", + }, + { + name: "configmap missing key", + configMap: &corev1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-cm", + Namespace: "test-ns", + }, + Data: map[string]string{}, + }, + expectedMap: nil, + expectErr: false, + reconciler: &Reconciler{ + ConfigMapName: "test-cm", + ConfigMapNamespace: "test-ns", + }, + configMapName: "test-cm", + }, + { + name: "invalid json", + configMap: &corev1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-cm", + Namespace: "test-ns", + }, + Data: map[string]string{ + machinePDCompatibilityKey: `{"n2":}`, + }, + }, + expectedMap: nil, + expectErr: true, + reconciler: &Reconciler{ + ConfigMapName: "test-cm", + ConfigMapNamespace: "test-ns", + }, + configMapName: "test-cm", + }, + { + name: "configmap not found", + configMap: &corev1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-cm", + Namespace: "test-ns", + }, + }, + expectedMap: nil, + expectErr: true, + reconciler: &Reconciler{ + ConfigMapName: "test-cm", + ConfigMapNamespace: "test-ns", + }, + configMapName: "wrong-name", + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + fakeClient := fake.NewClientBuilder().WithObjects(tc.configMap).Build() + tc.reconciler.Client = fakeClient + tc.reconciler.ConfigMapName = tc.configMapName + err := tc.reconciler.UpdateMachinePDCompatibility(context.Background()) + if (err != nil) != tc.expectErr { + t.Errorf("UpdateMachinePDCompatibility() error = %v, wantErr %v", err, tc.expectErr) + return + } + + if tc.expectedMap != nil { + expectedJSONBytes, _ := json.Marshal(tc.expectedMap) + gotJSONBytes, _ := json.Marshal(tc.reconciler.compatibility) + var want, got map[string][]string + json.Unmarshal(expectedJSONBytes, &want) + json.Unmarshal(gotJSONBytes, &got) + for _, v := range want { + sort.Strings(v) + } + for _, v := range got { + sort.Strings(v) + } + if diff := cmp.Diff(want, got); diff != "" { + t.Errorf("UpdateMachinePDCompatibility() mismatch (-want +got):\n%s", diff) + } + } else if tc.reconciler.compatibility != nil { + t.Errorf("UpdateMachinePDCompatibility() compatibility map = %v, want nil", tc.reconciler.compatibility) + } + }) + } +} diff --git a/pkg/parameters/constants.go b/pkg/parameters/constants.go new file mode 100644 index 000000000..343fe5f61 --- /dev/null +++ b/pkg/parameters/constants.go @@ -0,0 +1,71 @@ +package parameters + +const ( + // Disk Params + ParameterAccessMode = "access-mode" + + // Parameters for StorageClass + ParameterKeyType = "type" + ParameterKeyReplicationType = "replication-type" + ParameterKeyDiskEncryptionKmsKey = "disk-encryption-kms-key" + ParameterKeyLabels = "labels" + ParameterKeyProvisionedIOPSOnCreate = "provisioned-iops-on-create" + ParameterKeyProvisionedThroughputOnCreate = "provisioned-throughput-on-create" + ParameterAvailabilityClass = "availability-class" + ParameterKeyEnableConfidentialCompute = "enable-confidential-storage" + ParameterKeyStoragePools = "storage-pools" + ParameterKeyUseAllowedDiskTopology = "use-allowed-disk-topology" + + // Parameters for Data Cache + ParameterKeyDataCacheSize = "data-cache-size" + ParameterKeyDataCacheMode = "data-cache-mode" + ParameterKeyResourceTags = "resource-tags" + ParameterKeyEnableMultiZoneProvisioning = "enable-multi-zone-provisioning" + + // Parameters for VolumeSnapshotClass + ParameterKeyStorageLocations = "storage-locations" + ParameterKeySnapshotType = "snapshot-type" + ParameterKeyImageFamily = "image-family" + replicationTypeNone = "none" + + // Keys for PV and PVC parameters as reported by external-provisioner + ParameterKeyPVCName = "csi.storage.k8s.io/pvc/name" + ParameterKeyPVCNamespace = "csi.storage.k8s.io/pvc/namespace" + ParameterKeyPVName = "csi.storage.k8s.io/pv/name" + + // Keys for tags to put in the provisioned disk description + tagKeyCreatedForClaimNamespace = "kubernetes.io/created-for/pvc/namespace" + tagKeyCreatedForClaimName = "kubernetes.io/created-for/pvc/name" + tagKeyCreatedForVolumeName = "kubernetes.io/created-for/pv/name" + tagKeyCreatedBy = "storage.gke.io/created-by" + + // Keys for Snapshot and SnapshotContent parameters as reported by external-snapshotter + ParameterKeyVolumeSnapshotName = "csi.storage.k8s.io/volumesnapshot/name" + ParameterKeyVolumeSnapshotNamespace = "csi.storage.k8s.io/volumesnapshot/namespace" + ParameterKeyVolumeSnapshotContentName = "csi.storage.k8s.io/volumesnapshotcontent/name" + + // Parameters for AvailabilityClass + ParameterNoAvailabilityClass = "none" + ParameterRegionalHardFailoverClass = "regional-hard-failover" + + // Keys for tags to put in the provisioned snapshot description + tagKeyCreatedForSnapshotName = "kubernetes.io/created-for/volumesnapshot/name" + tagKeyCreatedForSnapshotNamespace = "kubernetes.io/created-for/volumesnapshot/namespace" + tagKeyCreatedForSnapshotContentName = "kubernetes.io/created-for/volumesnapshotcontent/name" + + // Hyperdisk disk types + DiskTypeHdHA = "hyperdisk-balanced-high-availability" + DiskTypeHdT = "hyperdisk-throughput" + DiskTypeHdE = "hyperdisk-extreme" + DiskTypeHdML = "hyperdisk-ml" + + // Parameters for VolumeSnapshotClass + DiskSnapshotType = "snapshots" + DiskImageType = "images" + + // Parameter for DynamicVolumes + DynamicVolumeType = "dynamic" + ParameterHDType = "hyperdisk-type" + ParameterPDType = "pd-type" + ParameterDiskPreference = "disk-type-preference" +) diff --git a/pkg/common/parameters.go b/pkg/parameters/parameters.go similarity index 57% rename from pkg/common/parameters.go rename to pkg/parameters/parameters.go index 5ea701f26..2525a614c 100644 --- a/pkg/common/parameters.go +++ b/pkg/parameters/parameters.go @@ -14,172 +14,22 @@ See the License for the specific language governing permissions and limitations under the License. */ -package common +package parameters import ( "fmt" "strconv" "strings" + "k8s.io/apimachinery/pkg/util/sets" "k8s.io/klog/v2" + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/constants" + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/convert" ) -const ( - // Disk Params - ParameterAccessMode = "access-mode" - - // Parameters for StorageClass - ParameterKeyType = "type" - ParameterKeyReplicationType = "replication-type" - ParameterKeyDiskEncryptionKmsKey = "disk-encryption-kms-key" - ParameterKeyLabels = "labels" - ParameterKeyProvisionedIOPSOnCreate = "provisioned-iops-on-create" - ParameterKeyProvisionedThroughputOnCreate = "provisioned-throughput-on-create" - ParameterAvailabilityClass = "availability-class" - ParameterKeyEnableConfidentialCompute = "enable-confidential-storage" - ParameterKeyStoragePools = "storage-pools" - ParameterKeyUseAllowedDiskTopology = "use-allowed-disk-topology" - - // Parameters for Data Cache - ParameterKeyDataCacheSize = "data-cache-size" - ParameterKeyDataCacheMode = "data-cache-mode" - ParameterKeyResourceTags = "resource-tags" - ParameterKeyEnableMultiZoneProvisioning = "enable-multi-zone-provisioning" - - // Parameters for VolumeSnapshotClass - ParameterKeyStorageLocations = "storage-locations" - ParameterKeySnapshotType = "snapshot-type" - ParameterKeyImageFamily = "image-family" - DiskSnapshotType = "snapshots" - DiskImageType = "images" - replicationTypeNone = "none" - - // Parameters for AvailabilityClass - ParameterNoAvailabilityClass = "none" - ParameterRegionalHardFailoverClass = "regional-hard-failover" - - // Keys for PV and PVC parameters as reported by external-provisioner - ParameterKeyPVCName = "csi.storage.k8s.io/pvc/name" - ParameterKeyPVCNamespace = "csi.storage.k8s.io/pvc/namespace" - ParameterKeyPVName = "csi.storage.k8s.io/pv/name" - - // Keys for tags to put in the provisioned disk description - tagKeyCreatedForClaimNamespace = "kubernetes.io/created-for/pvc/namespace" - tagKeyCreatedForClaimName = "kubernetes.io/created-for/pvc/name" - tagKeyCreatedForVolumeName = "kubernetes.io/created-for/pv/name" - tagKeyCreatedBy = "storage.gke.io/created-by" - - // Keys for Snapshot and SnapshotContent parameters as reported by external-snapshotter - ParameterKeyVolumeSnapshotName = "csi.storage.k8s.io/volumesnapshot/name" - ParameterKeyVolumeSnapshotNamespace = "csi.storage.k8s.io/volumesnapshot/namespace" - ParameterKeyVolumeSnapshotContentName = "csi.storage.k8s.io/volumesnapshotcontent/name" - - // Keys for tags to put in the provisioned snapshot description - tagKeyCreatedForSnapshotName = "kubernetes.io/created-for/volumesnapshot/name" - tagKeyCreatedForSnapshotNamespace = "kubernetes.io/created-for/volumesnapshot/namespace" - tagKeyCreatedForSnapshotContentName = "kubernetes.io/created-for/volumesnapshotcontent/name" - - // Hyperdisk disk types - DiskTypeHdHA = "hyperdisk-balanced-high-availability" - DiskTypeHdT = "hyperdisk-throughput" - DiskTypeHdE = "hyperdisk-extreme" - DiskTypeHdML = "hyperdisk-ml" -) - -type DataCacheParameters struct { - // Values: {string} in int64 form - // Default: "" - DataCacheSize string - // Values: writethrough, writeback - // Default: writethrough - DataCacheMode string -} - -// DiskParameters contains normalized and defaulted disk parameters -type DiskParameters struct { - // Values: pd-standard, pd-balanced, pd-ssd, or any other PD disk type. Not validated. - // Default: pd-standard - DiskType string - // Values: "none", regional-pd - // Default: "none" - ReplicationType string - // Values: {string} - // Default: "" - DiskEncryptionKMSKey string - // Values: {map[string]string} - // Default: "" - Tags map[string]string - // Values: {map[string]string} - // Default: "" - Labels map[string]string - // Values: {int64} - // Default: none - ProvisionedIOPSOnCreate int64 - // Values: {int64} - // Default: none - ProvisionedThroughputOnCreate int64 - // Values: {bool} - // Default: false - EnableConfidentialCompute bool - // Default: false - ForceAttach bool - // Values: {[]string} - // Default: "" - StoragePools []StoragePool - // Values: {map[string]string} - // Default: "" - ResourceTags map[string]string - // Values: {bool} - // Default: false - MultiZoneProvisioning bool - // Values: READ_WRITE_SINGLE, READ_ONLY_MANY, READ_WRITE_MANY - // Default: READ_WRITE_SINGLE - AccessMode string - // Values {} - // Default: false - UseAllowedDiskTopology bool -} - -func (dp *DiskParameters) IsRegional() bool { - return dp.ReplicationType == "regional-pd" || dp.DiskType == DiskTypeHdHA -} - -// SnapshotParameters contains normalized and defaulted parameters for snapshots -type SnapshotParameters struct { - StorageLocations []string - SnapshotType string - ImageFamily string - Tags map[string]string - Labels map[string]string - ResourceTags map[string]string -} - -type StoragePool struct { - Project string - Zone string - Name string - ResourceName string -} - -type ParameterProcessor struct { - DriverName string - EnableStoragePools bool - EnableMultiZone bool - EnableHdHA bool - EnableDiskTopology bool -} - -type ModifyVolumeParameters struct { - IOPS *int64 - Throughput *int64 -} - // ExtractAndDefaultParameters will take the relevant parameters from a map and // put them into a well defined struct making sure to default unspecified fields. -// extraVolumeLabels are added as labels; if there are also labels specified in -// parameters, any matching extraVolumeLabels will be overridden. -func (pp *ParameterProcessor) ExtractAndDefaultParameters(parameters map[string]string, extraVolumeLabels map[string]string, enableDataCache bool, extraTags map[string]string) (DiskParameters, DataCacheParameters, error) { - +func (pp *ParameterProcessor) ExtractAndDefaultParameters(parameters map[string]string) (DiskParameters, DataCacheParameters, error) { p := DiskParameters{ DiskType: "pd-standard", // Default ReplicationType: replicationTypeNone, // Default @@ -191,15 +41,15 @@ func (pp *ParameterProcessor) ExtractAndDefaultParameters(parameters map[string] // Set data cache mode default d := DataCacheParameters{} - if enableDataCache && parameters[ParameterKeyDataCacheSize] != "" { - d.DataCacheMode = DataCacheModeWriteThrough + if pp.EnableDataCache && parameters[ParameterKeyDataCacheSize] != "" { + d.DataCacheMode = constants.DataCacheModeWriteThrough } - for k, v := range extraVolumeLabels { + for k, v := range pp.ExtraVolumeLabels { p.Labels[k] = v } - for k, v := range extraTags { + for k, v := range pp.ExtraTags { p.ResourceTags[k] = v } @@ -212,9 +62,15 @@ func (pp *ParameterProcessor) ExtractAndDefaultParameters(parameters map[string] case ParameterKeyType: if v != "" { p.DiskType = strings.ToLower(v) - if !pp.EnableHdHA && p.DiskType == DiskTypeHdHA { + if pp.isHDHADisabled() && p.DiskType == DiskTypeHdHA { return p, d, fmt.Errorf("parameters contain invalid disk type %s", DiskTypeHdHA) } + if p.DiskType == DynamicVolumeType { + if pp.isDynamicVolumesDisabled() { + return p, d, fmt.Errorf("parameters contain invalid disk type %s, must enable dynamic volumes", DynamicVolumeType) + } + } + } case ParameterKeyReplicationType: if v != "" { @@ -230,7 +86,7 @@ func (pp *ParameterProcessor) ExtractAndDefaultParameters(parameters map[string] case ParameterKeyPVName: p.Tags[tagKeyCreatedForVolumeName] = v case ParameterKeyLabels: - paramLabels, err := ConvertLabelsStringToMap(v) + paramLabels, err := convert.ConvertLabelsStringToMap(v) if err != nil { return p, d, fmt.Errorf("parameters contain invalid labels parameter: %w", err) } @@ -239,13 +95,13 @@ func (pp *ParameterProcessor) ExtractAndDefaultParameters(parameters map[string] p.Labels[labelKey] = labelValue } case ParameterKeyProvisionedIOPSOnCreate: - paramProvisionedIOPSOnCreate, err := ConvertStringToInt64(v) + paramProvisionedIOPSOnCreate, err := convert.ConvertStringToInt64(v) if err != nil { return p, d, fmt.Errorf("parameters contain invalid provisionedIOPSOnCreate parameter: %w", err) } p.ProvisionedIOPSOnCreate = paramProvisionedIOPSOnCreate case ParameterKeyProvisionedThroughputOnCreate: - paramProvisionedThroughputOnCreate, err := ConvertMiStringToInt64(v) + paramProvisionedThroughputOnCreate, err := convert.ConvertMiStringToInt64(v) if err != nil { return p, d, fmt.Errorf("parameters contain invalid provisionedThroughputOnCreate parameter: %w", err) } @@ -254,7 +110,7 @@ func (pp *ParameterProcessor) ExtractAndDefaultParameters(parameters map[string] } p.ProvisionedThroughputOnCreate = paramProvisionedThroughputOnCreate case ParameterAvailabilityClass: - paramAvailabilityClass, err := ConvertStringToAvailabilityClass(v) + paramAvailabilityClass, err := convertStringToAvailabilityClass(v) if err != nil { return p, d, fmt.Errorf("parameters contain invalid availability class parameter: %w", err) } @@ -262,7 +118,7 @@ func (pp *ParameterProcessor) ExtractAndDefaultParameters(parameters map[string] p.ForceAttach = true } case ParameterKeyEnableConfidentialCompute: - paramEnableConfidentialCompute, err := ConvertStringToBool(v) + paramEnableConfidentialCompute, err := convert.ConvertStringToBool(v) if err != nil { return p, d, fmt.Errorf("parameters contain invalid value for enable-confidential-storage parameter: %w", err) } @@ -270,13 +126,13 @@ func (pp *ParameterProcessor) ExtractAndDefaultParameters(parameters map[string] if paramEnableConfidentialCompute { // DiskEncryptionKmsKey is needed to enable confidentialStorage if val, ok := parameters[ParameterKeyDiskEncryptionKmsKey]; !ok || !isValidDiskEncryptionKmsKey(val) { - return p, d, fmt.Errorf("Valid %v is required to enable ConfidentialStorage", ParameterKeyDiskEncryptionKmsKey) + return p, d, fmt.Errorf("valid %v is required to enable ConfidentialStorage", ParameterKeyDiskEncryptionKmsKey) } } p.EnableConfidentialCompute = paramEnableConfidentialCompute case ParameterKeyStoragePools: - if !pp.EnableStoragePools { + if pp.isStoragePoolDisabled() { return p, d, fmt.Errorf("parameters contains invalid option %q", ParameterKeyStoragePools) } storagePools, err := ParseStoragePools(v) @@ -285,11 +141,11 @@ func (pp *ParameterProcessor) ExtractAndDefaultParameters(parameters map[string] } p.StoragePools = storagePools case ParameterKeyDataCacheSize: - if !enableDataCache { - return p, d, fmt.Errorf("data caching enabled: %v; parameters contains invalid option %q", enableDataCache, ParameterKeyDataCacheSize) + if pp.isDataCacheDisabled() { + return p, d, fmt.Errorf("data caching enabled: %v; parameters contains invalid option %q", pp.EnableDataCache, ParameterKeyDataCacheSize) } - paramDataCacheSize, err := ConvertGiStringToInt64(v) + paramDataCacheSize, err := convert.ConvertGiStringToInt64(v) if err != nil { return p, d, fmt.Errorf("parameters contain invalid dataCacheSize parameter: %w", err) } @@ -298,8 +154,8 @@ func (pp *ParameterProcessor) ExtractAndDefaultParameters(parameters map[string] } d.DataCacheSize = strconv.FormatInt(paramDataCacheSize, 10) case ParameterKeyDataCacheMode: - if !enableDataCache { - return p, d, fmt.Errorf("data caching enabled %v; parameters contains invalid option %q", enableDataCache, ParameterKeyDataCacheSize) + if pp.isDataCacheDisabled() { + return p, d, fmt.Errorf("data caching enabled %v; parameters contains invalid option %q", pp.EnableDataCache, ParameterKeyDataCacheMode) } if err := ValidateDataCacheMode(v); err != nil { return p, d, fmt.Errorf("parameters contains invalid option: %s: %w", ParameterKeyDataCacheMode, err) @@ -310,35 +166,55 @@ func (pp *ParameterProcessor) ExtractAndDefaultParameters(parameters map[string] return p, d, err } case ParameterKeyEnableMultiZoneProvisioning: - if !pp.EnableMultiZone { + if pp.isMultiZoneDisabled() { return p, d, fmt.Errorf("parameters contains invalid option %q", ParameterKeyEnableMultiZoneProvisioning) } - paramEnableMultiZoneProvisioning, err := ConvertStringToBool(v) + paramEnableMultiZoneProvisioning, err := convert.ConvertStringToBool(v) if err != nil { return p, d, fmt.Errorf("parameters contain invalid value for %s parameter: %w", ParameterKeyEnableMultiZoneProvisioning, err) } p.MultiZoneProvisioning = paramEnableMultiZoneProvisioning if paramEnableMultiZoneProvisioning { - p.Labels[MultiZoneLabel] = "true" + p.Labels[constants.MultiZoneLabel] = "true" } case ParameterAccessMode: if v != "" { p.AccessMode = v } case ParameterKeyUseAllowedDiskTopology: - if !pp.EnableDiskTopology { + if pp.isDiskTopologyDisabled() { klog.Warningf("parameters contains invalid option %q when disk topology is not enabled", ParameterKeyUseAllowedDiskTopology) continue } - paramUseAllowedDiskTopology, err := ConvertStringToBool(v) + paramUseAllowedDiskTopology, err := convert.ConvertStringToBool(v) if err != nil { klog.Warningf("failed to convert %s parameter with value %q to bool: %v", ParameterKeyUseAllowedDiskTopology, v, err) continue } p.UseAllowedDiskTopology = paramUseAllowedDiskTopology + case ParameterHDType, ParameterPDType: + if pp.isDynamicVolumesDisabled() { + return p, d, fmt.Errorf("parameters contains invalid option %q, must enable dynamic volumes", k) + } + if strings.ToLower(parameters[ParameterKeyType]) != DynamicVolumeType { + return p, d, fmt.Errorf("must specify %q parameter as %q when %q is specified", ParameterKeyType, DynamicVolumeType, k) + } + case ParameterDiskPreference: + if pp.isDynamicVolumesDisabled() { + return p, d, fmt.Errorf("parameters contains invalid option %q, must enable dynamic volumes", k) + } + if v != "" { + preference := strings.ToLower(v) + if preference != ParameterHDType && preference != ParameterPDType { + return p, d, fmt.Errorf("must specify disk type preference as either %q or %q", ParameterHDType, ParameterPDType) + } + } + if strings.ToLower(parameters[ParameterKeyType]) != DynamicVolumeType { + return p, d, fmt.Errorf("must specify %q parameter as %q when using dynamic volume", ParameterKeyType, DynamicVolumeType) + } default: return p, d, fmt.Errorf("parameters contains invalid option %q", k) } @@ -385,7 +261,7 @@ func ExtractAndDefaultSnapshotParameters(parameters map[string]string, driverNam case ParameterKeyVolumeSnapshotContentName: p.Tags[tagKeyCreatedForSnapshotContentName] = v case ParameterKeyLabels: - paramLabels, err := ConvertLabelsStringToMap(v) + paramLabels, err := convert.ConvertLabelsStringToMap(v) if err != nil { return p, fmt.Errorf("parameters contain invalid labels parameter: %w", err) } @@ -408,7 +284,7 @@ func ExtractAndDefaultSnapshotParameters(parameters map[string]string, driverNam } func extractResourceTagsParameter(tagsString string, resourceTags map[string]string) error { - paramResourceTags, err := ConvertTagsStringToMap(tagsString) + paramResourceTags, err := convert.ConvertTagsStringToMap(tagsString) if err != nil { return fmt.Errorf("parameters contain invalid %s parameter: %w", ParameterKeyResourceTags, err) } @@ -420,19 +296,18 @@ func extractResourceTagsParameter(tagsString string, resourceTags map[string]str } func ExtractModifyVolumeParameters(parameters map[string]string) (ModifyVolumeParameters, error) { - modifyVolumeParams := ModifyVolumeParameters{} for key, value := range parameters { switch strings.ToLower(key) { case "iops": - iops, err := ConvertStringToInt64(value) + iops, err := convert.ConvertStringToInt64(value) if err != nil { return ModifyVolumeParameters{}, fmt.Errorf("parameters contain invalid iops parameter: %w", err) } modifyVolumeParams.IOPS = &iops case "throughput": - throughput, err := ConvertMiStringToInt64(value) + throughput, err := convert.ConvertMiStringToInt64(value) if err != nil { return ModifyVolumeParameters{}, fmt.Errorf("parameters contain invalid throughput parameter: %w", err) } @@ -441,5 +316,42 @@ func ExtractModifyVolumeParameters(parameters map[string]string) (ModifyVolumePa return ModifyVolumeParameters{}, fmt.Errorf("parameters contain unknown parameter: %s", key) } } + return modifyVolumeParams, nil } + +// convertStringToAvailabilityClass converts a string to an availability class string. +func convertStringToAvailabilityClass(str string) (string, error) { + switch strings.ToLower(str) { + case ParameterNoAvailabilityClass: + return ParameterNoAvailabilityClass, nil + case ParameterRegionalHardFailoverClass: + return ParameterRegionalHardFailoverClass, nil + } + return "", fmt.Errorf("unexpected boolean string %s", str) +} + +// StoragePoolZones returns the unique zones of the given storage pool resource names. +// Returns an error if multiple storage pools in 1 zone are found. +func StoragePoolZones(storagePools []StoragePool) ([]string, error) { + zonesSet := sets.New[string]() + var zones []string + for _, sp := range storagePools { + if zonesSet.Has(sp.Zone) { + return nil, fmt.Errorf("found multiple storage pools in zone %s. Only one storage pool per zone is allowed", sp.Zone) + } + zonesSet.Insert(sp.Zone) + zones = append(zones, sp.Zone) + } + return zones, nil +} + +// StoragePoolInZone returns the storage pool in the given zone. +func StoragePoolInZone(storagePools []StoragePool, zone string) *StoragePool { + for _, pool := range storagePools { + if zone == pool.Zone { + return &pool + } + } + return nil +} diff --git a/pkg/common/parameters_test.go b/pkg/parameters/parameters_test.go similarity index 94% rename from pkg/common/parameters_test.go rename to pkg/parameters/parameters_test.go index 1ff498a45..322eb2538 100644 --- a/pkg/common/parameters_test.go +++ b/pkg/parameters/parameters_test.go @@ -14,13 +14,15 @@ See the License for the specific language governing permissions and limitations under the License. */ -package common +package parameters import ( "reflect" "testing" "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/constants" ) func TestExtractAndDefaultParameters(t *testing.T) { @@ -280,6 +282,24 @@ func TestExtractAndDefaultParameters(t *testing.T) { ResourceTags: map[string]string{}, }, }, + { + name: "confidential compute enabled with valid KMS key", + parameters: map[string]string{ParameterKeyEnableConfidentialCompute: "true", ParameterKeyDiskEncryptionKmsKey: validKmsKeyRegional}, + expectParams: DiskParameters{ + DiskType: "pd-standard", + ReplicationType: "none", + DiskEncryptionKMSKey: validKmsKeyRegional, + EnableConfidentialCompute: true, + Tags: map[string]string{}, + Labels: map[string]string{}, + ResourceTags: map[string]string{}, + }, + }, + { + name: "confidential compute enabled with invalid KMS key", + parameters: map[string]string{ParameterKeyEnableConfidentialCompute: "true", ParameterKeyDiskEncryptionKmsKey: invalidKmsKey}, + expectErr: true, + }, { name: "storage pool parameters", enableStoragePools: true, @@ -380,14 +400,14 @@ func TestExtractAndDefaultParameters(t *testing.T) { ResourceTags: map[string]string{}, }, expectDataCacheParams: DataCacheParameters{ - DataCacheMode: DataCacheModeWriteThrough, + DataCacheMode: constants.DataCacheModeWriteThrough, DataCacheSize: "1234", }, }, { name: "data cache parameters", enableDataCache: true, - parameters: map[string]string{ParameterKeyType: "pd-balanced", ParameterKeyReplicationType: "none", ParameterKeyDiskEncryptionKmsKey: "foo/key", ParameterKeyLabels: "key1=value1,key2=value2", ParameterKeyDataCacheSize: "1234Gi", ParameterKeyDataCacheMode: DataCacheModeWriteBack}, + parameters: map[string]string{ParameterKeyType: "pd-balanced", ParameterKeyReplicationType: "none", ParameterKeyDiskEncryptionKmsKey: "foo/key", ParameterKeyLabels: "key1=value1,key2=value2", ParameterKeyDataCacheSize: "1234Gi", ParameterKeyDataCacheMode: constants.DataCacheModeWriteBack}, labels: map[string]string{}, expectParams: DiskParameters{ DiskType: "pd-balanced", @@ -401,27 +421,27 @@ func TestExtractAndDefaultParameters(t *testing.T) { ResourceTags: map[string]string{}, }, expectDataCacheParams: DataCacheParameters{ - DataCacheMode: DataCacheModeWriteBack, + DataCacheMode: constants.DataCacheModeWriteBack, DataCacheSize: "1234", }, }, { name: "data cache parameters - enableDataCache is false", enableDataCache: false, - parameters: map[string]string{ParameterKeyType: "pd-balanced", ParameterKeyReplicationType: "none", ParameterKeyDiskEncryptionKmsKey: "foo/key", ParameterKeyLabels: "key1=value1,key2=value2", ParameterKeyDataCacheSize: "1234Gi", ParameterKeyDataCacheMode: DataCacheModeWriteBack}, + parameters: map[string]string{ParameterKeyType: "pd-balanced", ParameterKeyReplicationType: "none", ParameterKeyDiskEncryptionKmsKey: "foo/key", ParameterKeyLabels: "key1=value1,key2=value2", ParameterKeyDataCacheSize: "1234Gi", ParameterKeyDataCacheMode: constants.DataCacheModeWriteBack}, labels: map[string]string{}, expectErr: true, }, { name: "multi-zone-enable parameters, multi-zone label is set, multi-zone feature enabled", parameters: map[string]string{ParameterKeyType: "hyperdisk-ml", ParameterKeyEnableMultiZoneProvisioning: "true"}, - labels: map[string]string{MultiZoneLabel: "true"}, + labels: map[string]string{constants.MultiZoneLabel: "true"}, enableMultiZone: true, expectParams: DiskParameters{ DiskType: "hyperdisk-ml", ReplicationType: "none", Tags: map[string]string{}, - Labels: map[string]string{MultiZoneLabel: "true"}, + Labels: map[string]string{constants.MultiZoneLabel: "true"}, ResourceTags: map[string]string{}, MultiZoneProvisioning: true, }, @@ -523,8 +543,11 @@ func TestExtractAndDefaultParameters(t *testing.T) { EnableMultiZone: tc.enableMultiZone, EnableHdHA: tc.enableHdHA, EnableDiskTopology: tc.enableDiskTopology, + ExtraVolumeLabels: tc.labels, + EnableDataCache: tc.enableDataCache, + ExtraTags: tc.extraTags, } - p, d, err := pp.ExtractAndDefaultParameters(tc.parameters, tc.labels, tc.enableDataCache, tc.extraTags) + p, d, err := pp.ExtractAndDefaultParameters(tc.parameters) if gotErr := err != nil; gotErr != tc.expectErr { t.Fatalf("ExtractAndDefaultParameters(%+v) = %v; expectedErr: %v", tc.parameters, err, tc.expectErr) } @@ -532,7 +555,7 @@ func TestExtractAndDefaultParameters(t *testing.T) { return } - if diff := cmp.Diff(tc.expectParams, p); diff != "" { + if diff := cmp.Diff(tc.expectParams, p, cmpopts.IgnoreUnexported(DiskParameters{})); diff != "" { t.Errorf("ExtractAndDefaultParameters(%+v): -want, +got \n%s", tc.parameters, diff) } diff --git a/pkg/parameters/sanitize.go b/pkg/parameters/sanitize.go new file mode 100644 index 000000000..815db5c03 --- /dev/null +++ b/pkg/parameters/sanitize.go @@ -0,0 +1,55 @@ +package parameters + +import "strings" + +// Map of sanitizers for parameters that apply to only a subset of disk types. Each sanitizeer +// should only be responsible for a single parameter. +var sanitizers = map[string]sanitizer{ + "ReplicationType": func(dp *DiskParameters) { + // Only sanitize replication type if parameter has been specified. + if isHD(dp.DiskType) && dp.ReplicationType != "" { + dp.ReplicationType = replicationTypeNone + } + }, + "ProvisionedIOPSOnCreate": func(dp *DiskParameters) { + if isPD(dp.DiskType) && dp.DiskType != "pd-extreme" { + dp.ProvisionedIOPSOnCreate = 0 + } + }, + "ProvisionedThroughputOnCreate": func(dp *DiskParameters) { + if isPD(dp.DiskType) { + dp.ProvisionedThroughputOnCreate = 0 + } + }, + "StoragePools": func(dp *DiskParameters) { + if isPD(dp.DiskType) { + dp.StoragePools = nil + } + }, + "ForceAttach": func(dp *DiskParameters) { + if isHD(dp.DiskType) { + dp.ForceAttach = false + } + }, +} + +func isHD(diskType string) bool { + return strings.HasPrefix(diskType, "hyperdisk-") +} + +func isPD(diskType string) bool { + return strings.HasPrefix(diskType, "pd-") +} + +type sanitizer func(dp *DiskParameters) + +// SanitizeDiskParameters removes any parameters that are not applicable to the specified disk type, +// and is intended to only be used for dynamic volumes. +func SanitizeDiskParameters(dp *DiskParameters) { + if dp == nil { + return + } + for _, sanitizer := range sanitizers { + sanitizer(dp) + } +} diff --git a/pkg/parameters/sanitize_test.go b/pkg/parameters/sanitize_test.go new file mode 100644 index 000000000..836e1ded2 --- /dev/null +++ b/pkg/parameters/sanitize_test.go @@ -0,0 +1,201 @@ +package parameters + +import ( + "testing" + + "github.com/google/go-cmp/cmp" +) + +func TestSanitizeDiskParameters(t *testing.T) { + tests := []struct { + desc string + parameters *DiskParameters + want *DiskParameters + }{ + { + desc: "nil parameters", + parameters: nil, + }, + { + desc: "empty parameters unchanged", + parameters: &DiskParameters{}, + want: &DiskParameters{}, + }, + { + desc: "general parameters unchanged PD", + parameters: &DiskParameters{ + DiskType: "pd-balanced", + DiskEncryptionKMSKey: "fake-kms-key", + Tags: map[string]string{"fake-tag": "fake-resource-tag-value"}, + Labels: map[string]string{"fake-label": "fake-label-value"}, + EnableConfidentialCompute: true, + ResourceTags: map[string]string{"fake-resource-tag": "fake-resource-tag-value"}, + AccessMode: "READ_WRITE_SINGLE", + UseAllowedDiskTopology: true, + }, + want: &DiskParameters{ + DiskType: "pd-balanced", + DiskEncryptionKMSKey: "fake-kms-key", + Tags: map[string]string{"fake-tag": "fake-resource-tag-value"}, + Labels: map[string]string{"fake-label": "fake-label-value"}, + EnableConfidentialCompute: true, + ResourceTags: map[string]string{"fake-resource-tag": "fake-resource-tag-value"}, + AccessMode: "READ_WRITE_SINGLE", + UseAllowedDiskTopology: true, + }, + }, + { + desc: "general parameters unchanged HD", + parameters: &DiskParameters{ + DiskType: "hyperdisk-balanced", + DiskEncryptionKMSKey: "fake-kms-key", + Tags: map[string]string{"fake-tag": "fake-resource-tag-value"}, + Labels: map[string]string{"fake-label": "fake-label-value"}, + EnableConfidentialCompute: true, + ResourceTags: map[string]string{"fake-resource-tag": "fake-resource-tag-value"}, + AccessMode: "READ_WRITE_SINGLE", + UseAllowedDiskTopology: true, + }, + want: &DiskParameters{ + DiskType: "hyperdisk-balanced", + DiskEncryptionKMSKey: "fake-kms-key", + Tags: map[string]string{"fake-tag": "fake-resource-tag-value"}, + Labels: map[string]string{"fake-label": "fake-label-value"}, + EnableConfidentialCompute: true, + ResourceTags: map[string]string{"fake-resource-tag": "fake-resource-tag-value"}, + AccessMode: "READ_WRITE_SINGLE", + UseAllowedDiskTopology: true, + }, + }, + { + // For replication type, the sanitized value is "none" instead of an empty string. + desc: "ReplicationType sanitized for HD", + parameters: &DiskParameters{ + DiskType: "hyperdisk-balanced", + ReplicationType: "regional-pd", + }, + want: &DiskParameters{ + DiskType: "hyperdisk-balanced", + ReplicationType: "none", + }, + }, + { + desc: "ReplicationType unchanged for PD", + parameters: &DiskParameters{ + DiskType: "pd-balanced", + ReplicationType: "regional", + }, + want: &DiskParameters{ + DiskType: "pd-balanced", + ReplicationType: "regional", + }, + }, + { + desc: "ProvisionedIOPSOnCreate sanitized for PD", + parameters: &DiskParameters{ + DiskType: "pd-balanced", + ProvisionedIOPSOnCreate: 1000, + }, + want: &DiskParameters{ + DiskType: "pd-balanced", + }, + }, + { + desc: "ProvisionedIOPSOnCreate unchanged for HD", + parameters: &DiskParameters{ + DiskType: "hyperdisk-balanced", + ProvisionedIOPSOnCreate: 5000, + }, + want: &DiskParameters{ + DiskType: "hyperdisk-balanced", + ProvisionedIOPSOnCreate: 5000, + }, + }, + { + desc: "ProvisionedIOPSOnCreate unchanged for pd-extreme", + parameters: &DiskParameters{ + DiskType: "pd-extreme", + ProvisionedIOPSOnCreate: 5000, + }, + want: &DiskParameters{ + DiskType: "pd-extreme", + ProvisionedIOPSOnCreate: 5000, + }, + }, + { + desc: "ProvisionedThroughputOnCreate sanitized for PD", + parameters: &DiskParameters{ + DiskType: "pd-standard", + ProvisionedThroughputOnCreate: 200, + }, + want: &DiskParameters{ + DiskType: "pd-standard", + }, + }, + { + desc: "ProvisionedThroughputOnCreate unchanged for HD", + parameters: &DiskParameters{ + DiskType: "hyperdisk-balanced", + ProvisionedThroughputOnCreate: 200, + }, + want: &DiskParameters{ + DiskType: "hyperdisk-balanced", + ProvisionedThroughputOnCreate: 200, + }, + }, + { + desc: "StoragePools sanitized for PD", + parameters: &DiskParameters{ + DiskType: "pd-balanced", + StoragePools: []StoragePool{{Name: "fake-pool"}}, + }, + want: &DiskParameters{ + DiskType: "pd-balanced", + }, + }, + { + desc: "StoragePools unchanged for HD", + parameters: &DiskParameters{ + DiskType: "hyperdisk-balanced", + StoragePools: []StoragePool{{Name: "fake-pool"}}, + }, + want: &DiskParameters{ + DiskType: "hyperdisk-balanced", + StoragePools: []StoragePool{{Name: "fake-pool"}}, + }, + }, + { + desc: "ForceAttach sanitized for HD", + parameters: &DiskParameters{ + DiskType: "hyperdisk-balanced", + ForceAttach: true, + }, + want: &DiskParameters{ + DiskType: "hyperdisk-balanced", + }, + }, + { + desc: "ForceAttach unchanged for PD", + parameters: &DiskParameters{ + DiskType: "pd-balanced", + ForceAttach: true, + }, + want: &DiskParameters{ + DiskType: "pd-balanced", + ForceAttach: true, + }, + }, + } + + for _, tc := range tests { + t.Run(tc.desc, func(t *testing.T) { + SanitizeDiskParameters(tc.parameters) + got := tc.parameters + if diff := cmp.Diff(tc.want, got); diff != "" { + t.Errorf("sanitizeDiskParameters() mismatch (-want +got):\n%s", diff) + } + + }) + } + +} diff --git a/pkg/parameters/types.go b/pkg/parameters/types.go new file mode 100644 index 000000000..157cfb7a7 --- /dev/null +++ b/pkg/parameters/types.go @@ -0,0 +1,131 @@ +package parameters + +type StoragePool struct { + Project string + Zone string + Name string + ResourceName string +} + +type DataCacheParameters struct { + // Values: {string} in int64 form + // Default: "" + DataCacheSize string + // Values: writethrough, writeback + // Default: writethrough + DataCacheMode string +} + +// DiskParameters contains normalized and defaulted disk parameters +type DiskParameters struct { + // Values: pd-standard, pd-balanced, pd-ssd, or any other PD disk type. Not validated. + // Default: pd-standard + DiskType string + // Values: any PD type. Not validated. + // Default: "" + PDType string + // Values: any HD type. Not validated. + // Default: "" + HDType string + // Values: pdType, hdType + // Default: hdType + DiskTypePreference string + // Values: "none", regional-pd + // Default: "none" + ReplicationType string + // Values: {string} + // Default: "" + DiskEncryptionKMSKey string + // Values: {map[string]string} + // Default: "" + Tags map[string]string + // Values: {map[string]string} + // Default: "" + Labels map[string]string + // Values: {int64} + // Default: none + ProvisionedIOPSOnCreate int64 + // Values: {int64} + // Default: none + ProvisionedThroughputOnCreate int64 + // Values: {bool} + // Default: false + EnableConfidentialCompute bool + // Values: {bool} + // Default: false + ForceAttach bool + // Values: {[]string} + // Default: "" + StoragePools []StoragePool + // Values: {map[string]string} + // Default: "" + ResourceTags map[string]string + // Values: {bool} + // Default: false + MultiZoneProvisioning bool + // Values: READ_WRITE_SINGLE, READ_ONLY_MANY, READ_WRITE_MANY + // Default: READ_WRITE_SINGLE + AccessMode string + // Values: {bool} + // Default: false + UseAllowedDiskTopology bool +} + +func (dp *DiskParameters) IsRegional() bool { + return dp.ReplicationType == "regional-pd" || dp.DiskType == DiskTypeHdHA +} + +func (dp *DiskParameters) IsDiskDynamic() bool { + return dp.DiskType == DynamicVolumeType +} + +// SnapshotParameters contains normalized and defaulted parameters for snapshots +type SnapshotParameters struct { + StorageLocations []string + SnapshotType string + ImageFamily string + Tags map[string]string + Labels map[string]string + ResourceTags map[string]string +} + +type ParameterProcessor struct { + DriverName string + EnableStoragePools bool + EnableMultiZone bool + EnableHdHA bool + EnableDiskTopology bool + EnableDataCache bool + EnableDynamicVolumes bool + ExtraVolumeLabels map[string]string + ExtraTags map[string]string +} + +func (pp *ParameterProcessor) isHDHADisabled() bool { + return !pp.EnableHdHA +} + +func (pp *ParameterProcessor) isStoragePoolDisabled() bool { + return !pp.EnableStoragePools +} + +func (pp *ParameterProcessor) isDataCacheDisabled() bool { + return !pp.EnableDataCache +} + +func (pp *ParameterProcessor) isMultiZoneDisabled() bool { + return !pp.EnableMultiZone +} + +func (pp *ParameterProcessor) isDiskTopologyDisabled() bool { + return !pp.EnableDiskTopology +} + +func (pp *ParameterProcessor) isDynamicVolumesDisabled() bool { + return !pp.EnableDynamicVolumes +} + +type ModifyVolumeParameters struct { + IOPS *int64 + Throughput *int64 +} diff --git a/pkg/parameters/utils.go b/pkg/parameters/utils.go new file mode 100644 index 000000000..2eaa0c03f --- /dev/null +++ b/pkg/parameters/utils.go @@ -0,0 +1,126 @@ +/* +Copyright 2018 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 parameters + +import ( + "fmt" + "regexp" + "strings" + + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/constants" +) + +const ( + // Snapshot storage location format + // Reference: https://cloud.google.com/storage/docs/locations + // Example: us + multiRegionalLocationFmt = "^[a-z]+$" + // Example: us-east1 + regionalLocationFmt = "^[a-z]+-[a-z]+[0-9]{1,2}$" +) + +var ( + multiRegionalPattern = regexp.MustCompile(multiRegionalLocationFmt) + regionalPattern = regexp.MustCompile(regionalLocationFmt) + + validDataCacheMode = []string{constants.DataCacheModeWriteBack, constants.DataCacheModeWriteThrough} + storagePoolFieldsRegex = regexp.MustCompile(`^projects/([^/]+)/zones/([^/]+)/storagePools/([^/]+)$`) +) + +// ProcessStorageLocations trims and normalizes storage location to lower letters. +func ProcessStorageLocations(storageLocations string) ([]string, error) { + normalizedLoc := strings.ToLower(strings.TrimSpace(storageLocations)) + if !multiRegionalPattern.MatchString(normalizedLoc) && !regionalPattern.MatchString(normalizedLoc) { + return []string{}, fmt.Errorf("invalid location for snapshot: %q", storageLocations) + } + return []string{normalizedLoc}, nil +} + +// ValidateSnapshotType validates the type +func ValidateSnapshotType(snapshotType string) error { + switch snapshotType { + case DiskSnapshotType, DiskImageType: + return nil + default: + return fmt.Errorf("invalid snapshot type %s", snapshotType) + } +} + +// ParseStoragePools returns an error if none of the given storagePools +// (delimited by a comma) are in the format +// projects/project/zones/zone/storagePools/storagePool. +func ParseStoragePools(storagePools string) ([]StoragePool, error) { + spSlice := strings.Split(storagePools, ",") + parsedStoragePools := []StoragePool{} + for _, sp := range spSlice { + project, location, spName, err := fieldsFromStoragePoolResourceName(sp) + if err != nil { + return nil, err + } + spObj := StoragePool{Project: project, Zone: location, Name: spName, ResourceName: sp} + parsedStoragePools = append(parsedStoragePools, spObj) + + } + return parsedStoragePools, nil +} + +// fieldsFromResourceName returns the project, zone, and Storage Pool name from the given +// Storage Pool resource name. The resource name must be in the format +// projects/project/zones/zone/storagePools/storagePool. +// All other formats are invalid, and an error will be returned. +func fieldsFromStoragePoolResourceName(resourceName string) (project, location, spName string, err error) { + fieldMatches := storagePoolFieldsRegex.FindStringSubmatch(resourceName) + // Field matches should have 4 strings: [resourceName, project, zone, storagePool]. The first + // match is the entire string. + if len(fieldMatches) != 4 { + err := fmt.Errorf("invalid Storage Pool resource name. Got %s, expected projects/project/zones/zone/storagePools/storagePool", resourceName) + return "", "", "", err + } + project = fieldMatches[1] + location = fieldMatches[2] + spName = fieldMatches[3] + return +} + +func ValidateDataCacheMode(s string) error { + if StringInSlice(s, validDataCacheMode) { + return nil + } + return fmt.Errorf("invalid data-cache-mode %s. Only \"writeback\" and \"writethrough\" is a valid input", s) +} + +func ValidateNonNegativeInt(n int64) error { + if n <= 0 { + return fmt.Errorf("Input should be set to > 0, got %d", n) + } + return nil +} + +func StringInSlice(s string, list []string) bool { + for _, v := range list { + if v == s { + return true + } + } + return false +} + +func isValidDiskEncryptionKmsKey(DiskEncryptionKmsKey string) bool { + // Validate key against default kmskey pattern + kmsKeyPattern := regexp.MustCompile("projects/[^/]+/locations/([^/]+)/keyRings/[^/]+/cryptoKeys/[^/]+") + return kmsKeyPattern.MatchString(DiskEncryptionKmsKey) +} diff --git a/pkg/parameters/utils_test.go b/pkg/parameters/utils_test.go new file mode 100644 index 000000000..503c4b976 --- /dev/null +++ b/pkg/parameters/utils_test.go @@ -0,0 +1,240 @@ +package parameters + +import ( + "fmt" + "reflect" + "testing" +) + +const ( + validKmsKeyRegional = "projects/my-project/locations/us-central1/keyRings/TestKeyRing/cryptoKeys/test-key" + validKmsKeyGlobal = "projects/my-project/locations/global/keyRings/TestKeyRing/cryptoKeys/test-key" + invalidKmsKey = "projects/my-project/locations/keyRings/TestKeyRing/cryptoKeys/test-key" +) + +func TestSnapshotStorageLocations(t *testing.T) { + tests := []struct { + desc string + locationString string + expectedNormalizedLocations []string + expectError bool + }{ + { + "valid multi-region", + " uS ", + []string{"us"}, + false, + }, + { + "valid region", + " US-EAST1", + []string{"us-east1"}, + false, + }, + { + "valid region in large continent", + "europe-west12", + []string{"europe-west12"}, + false, + }, + { + // Zones are not valid bucket/snapshot locations. + "single zone", + "us-east1-a", + []string{}, + true, + }, + } + for _, tc := range tests { + t.Run(tc.desc, func(t *testing.T) { + normalizedLocations, err := ProcessStorageLocations(tc.locationString) + if err != nil && !tc.expectError { + t.Errorf("Got error %v processing storage locations %q; expect no error", err, tc.locationString) + } + if err == nil && tc.expectError { + t.Errorf("Got no error processing storage locations %q; expect an error", tc.locationString) + } + if err == nil && !reflect.DeepEqual(normalizedLocations, tc.expectedNormalizedLocations) { + t.Errorf("Got %v for normalized storage locations; expect %v", normalizedLocations, tc.expectedNormalizedLocations) + } + }) + } +} + +func TestStringInSlice(t *testing.T) { + testCases := []struct { + name string + inputStr string + inputSlice []string + expectedInSlice bool + }{ + { + name: "string is in the slice", + inputStr: "in slice", + inputSlice: []string{"in slice", "other string"}, + expectedInSlice: true, + }, + { + name: "string is NOT in the slice", + inputStr: "not in slice", + inputSlice: []string{"other string"}, + }, + } + + for _, tc := range testCases { + t.Logf("test case: %s", tc.name) + actualResult := StringInSlice(tc.inputStr, tc.inputSlice) + if actualResult != tc.expectedInSlice { + t.Errorf("Expect value is %v but got %v. inputStr is %s, inputSlice is %v", tc.expectedInSlice, actualResult, tc.inputStr, tc.inputSlice) + } + } +} + +func TestValidateDataCacheMode(t *testing.T) { + testCases := []struct { + name string + inputStr string + expectError bool + }{ + { + name: "valid input - writethrough", + inputStr: "writethrough", + }, + { + name: "valid input - writeback", + inputStr: "writeback", + }, + { + name: "invalid input", + inputStr: "write-back not valid", + expectError: true, + }, + } + + for _, tc := range testCases { + t.Logf("test case: %s", tc.name) + err := ValidateDataCacheMode(tc.inputStr) + if err != nil && !tc.expectError { + t.Errorf("Got error %v validate data cache mode %s; expect no error", err, tc.inputStr) + } + + if err == nil && tc.expectError { + t.Errorf("Got no error validate data cache mode %s; expect an error", tc.inputStr) + } + } + +} + +func TestValidateNonNegativeInt(t *testing.T) { + testCases := []struct { + name string + cacheSize int64 + expectError bool + }{ + { + name: "valid input - positive cache size", + cacheSize: 100000, + }, + { + name: "invalid input - cachesize 0", + cacheSize: 0, + expectError: true, + }, + { + name: "invalid input - negative cache size", + cacheSize: -100, + expectError: true, + }, + } + + for _, tc := range testCases { + t.Logf("test case: %s", tc.name) + err := ValidateNonNegativeInt(tc.cacheSize) + if err != nil && !tc.expectError { + t.Errorf("Got error %v validate data cache mode %d; expect no error", err, tc.cacheSize) + } + + if err == nil && tc.expectError { + t.Errorf("Got no error validate data cache mode %d; expect an error", tc.cacheSize) + } + } + +} + +func TestIsValidDiskEncryptionKmsKey(t *testing.T) { + cases := []struct { + diskEncryptionKmsKey string + expectedIsValid bool + }{ + { + diskEncryptionKmsKey: validKmsKeyRegional, + expectedIsValid: true, + }, + { + diskEncryptionKmsKey: validKmsKeyGlobal, + expectedIsValid: true, + }, + { + diskEncryptionKmsKey: invalidKmsKey, + expectedIsValid: false, + }, + } + for _, tc := range cases { + isValid := isValidDiskEncryptionKmsKey(tc.diskEncryptionKmsKey) + if tc.expectedIsValid != isValid { + t.Errorf("test failed: the provided key %s expected to be %v bu tgot %v", tc.diskEncryptionKmsKey, tc.expectedIsValid, isValid) + } + } +} + +func TestFieldsFromResourceName(t *testing.T) { + testcases := []struct { + name string + resourceName string + expectedProject string + expectedZone string + expectedName string + expectedErr bool + }{ + { + name: "StoragePool_WithValidResourceName_ReturnsFields", + resourceName: "projects/my-project/zones/us-central1-a/storagePools/storagePool-1", + expectedProject: "my-project", + expectedZone: "us-central1-a", + expectedName: "storagePool-1", + }, + { + name: "StoragePool_WithFullResourceURL_ReturnsError", + resourceName: "https://www.googleapis.com/compute/v1/projects/project/zones/zone/storagePools/storagePool", + expectedErr: true, + }, + { + name: "StoragePool_WithMissingProject_ReturnsError", + resourceName: "zones/us-central1-a/storagePools/storagePool-1", + expectedErr: true, + }, + { + name: "StoragePool_WithMissingZone_ReturnsError", + resourceName: "projects/my-project/storagePools/storagePool-1", + expectedErr: true, + }, + { + name: "StoragePool_WithMissingStoragePoolName_ReturnsError", + resourceName: "projects/my-project/zones/us-central1-a/storagePool-1", + expectedErr: true, + }, + } + for _, tc := range testcases { + t.Run(tc.name, func(t *testing.T) { + project, zone, name, err := fieldsFromStoragePoolResourceName(tc.resourceName) + input := fmt.Sprintf("fieldsFromStoragePoolResourceName(%q)", tc.resourceName) + gotErr := err != nil + if gotErr != tc.expectedErr { + t.Errorf("%s error presence = %v, expected error presence = %v", input, gotErr, tc.expectedErr) + } + if project != tc.expectedProject || zone != tc.expectedZone || name != tc.expectedName { + t.Errorf("%s returned {project: %q, zone: %q, name: %q}, expected {project: %q, zone: %q, name: %q}", input, project, zone, name, tc.expectedProject, tc.expectedZone, tc.expectedName) + } + }) + } +} diff --git a/release-tools/cloudbuild.yaml b/release-tools/cloudbuild.yaml index 40e845470..8402787f5 100644 --- a/release-tools/cloudbuild.yaml +++ b/release-tools/cloudbuild.yaml @@ -26,22 +26,22 @@ steps: # The image must contain bash and curl. Ideally it should also contain # the desired version of Go (currently defined in release-tools/prow.sh), # but that just speeds up the build and is not required. - - name: 'gcr.io/k8s-staging-test-infra/gcb-docker-gcloud:v20210917-12df099d55' + - name: "gcr.io/k8s-staging-test-infra/gcb-docker-gcloud:v20250513-9264efb079" entrypoint: ./.cloudbuild.sh env: - - GIT_TAG=${_GIT_TAG} - - PULL_BASE_REF=${_PULL_BASE_REF} - - REGISTRY_NAME=gcr.io/${_STAGING_PROJECT} - - HOME=/root + - GIT_TAG=${_GIT_TAG} + - PULL_BASE_REF=${_PULL_BASE_REF} + - REGISTRY_NAME=gcr.io/${_STAGING_PROJECT} + - HOME=/root substitutions: # _GIT_TAG will be filled with a git-based tag for the image, of the form vYYYYMMDD-hash, and # can be used as a substitution. - _GIT_TAG: '12345' + _GIT_TAG: "12345" # _PULL_BASE_REF will contain the ref that was pushed to trigger this build - # a branch like 'master' or 'release-0.2', or a tag like 'v0.2'. - _PULL_BASE_REF: 'master' + _PULL_BASE_REF: "master" # The default gcr.io staging project for Kubernetes-CSI # (=> https://console.cloud.google.com/gcr/images/k8s-staging-sig-storage/GLOBAL). # Might be overridden in the Prow build job for a repo which wants # images elsewhere. - _STAGING_PROJECT: 'k8s-staging-sig-storage' + _STAGING_PROJECT: "k8s-staging-sig-storage" diff --git a/test/e2e/tests/multi_zone_e2e_test.go b/test/e2e/tests/multi_zone_e2e_test.go index fec2a1da2..e681c9c8d 100644 --- a/test/e2e/tests/multi_zone_e2e_test.go +++ b/test/e2e/tests/multi_zone_e2e_test.go @@ -31,7 +31,9 @@ import ( "k8s.io/apimachinery/pkg/util/wait" "k8s.io/klog/v2" "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/common" + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/constants" gce "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/gce-cloud-provider/compute" + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/parameters" testutils "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/test/e2e/utils" remote "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/test/remote" ) @@ -86,7 +88,7 @@ var _ = Describe("GCE PD CSI Driver Multi-Zone", func() { segments := resp.GetAccessibleTopology().GetSegments() Expect(segments).ToNot(BeNil()) - Expect(segments[common.TopologyKeyZone]).To(Equal(z)) + Expect(segments[constants.TopologyKeyZone]).To(Equal(z)) Expect(len(segments)).To(Equal(1)) } @@ -126,7 +128,7 @@ var _ = Describe("GCE PD CSI Driver Multi-Zone", func() { _, volID1 := createAndValidateZonalDisk(controllerClient, p, zones[1], "hyperdisk-ml", volName) labelsMap := map[string]string{ - common.MultiZoneLabel: "true", + constants.MultiZoneLabel: "true", } disk1, err := computeService.Disks.Get(p, zones[0], volName).Do() Expect(err).To(BeNil(), "Could not get disk") @@ -217,7 +219,7 @@ var _ = Describe("GCE PD CSI Driver Multi-Zone", func() { _, volID0 := createAndValidateZonalDisk(controllerClient, p, zones[0], "hyperdisk-ml", volName) labelsMap := map[string]string{ - common.MultiZoneLabel: "true", + constants.MultiZoneLabel: "true", } disk1, err := computeService.Disks.Get(p, zones[0], volName).Do() Expect(err).To(BeNil(), "Could not get disk") @@ -233,13 +235,13 @@ var _ = Describe("GCE PD CSI Driver Multi-Zone", func() { // Create multi-zone Disk resp, err := controllerClient.CreateVolumeWithCaps(volName, map[string]string{ - common.ParameterKeyEnableMultiZoneProvisioning: "true", - common.ParameterKeyType: "hyperdisk-ml", + parameters.ParameterKeyEnableMultiZoneProvisioning: "true", + parameters.ParameterKeyType: "hyperdisk-ml", }, defaultHdmlSizeGb, &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: zones[1]}, + Segments: map[string]string{constants.TopologyKeyZone: zones[1]}, }, }, }, @@ -257,7 +259,7 @@ var _ = Describe("GCE PD CSI Driver Multi-Zone", func() { Expect(err).To(BeNil(), "Error creating multi-zone volume") topology := resp.GetAccessibleTopology() Expect(len(topology)).To(Equal(2)) - gotZones := []string{topology[0].Segments[common.TopologyKeyZone], topology[1].Segments[common.TopologyKeyZone]} + gotZones := []string{topology[0].Segments[constants.TopologyKeyZone], topology[1].Segments[constants.TopologyKeyZone]} Expect(gotZones).To(ConsistOf(zones[0], zones[1])) volID := fmt.Sprintf("projects/%s/zones/multi-zone/disks/%s", p, volName) @@ -355,16 +357,16 @@ var _ = Describe("GCE PD CSI Driver Multi-Zone", func() { // Create multi-zone Disk volName := testNamePrefix + string(uuid.NewUUID()) _, err = controllerClient.CreateVolumeWithCaps(volName, map[string]string{ - common.ParameterKeyEnableMultiZoneProvisioning: "true", - common.ParameterKeyType: "hyperdisk-ml", + parameters.ParameterKeyEnableMultiZoneProvisioning: "true", + parameters.ParameterKeyType: "hyperdisk-ml", }, defaultHdmlSizeGb, &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: zones[0]}, + Segments: map[string]string{constants.TopologyKeyZone: zones[0]}, }, { - Segments: map[string]string{common.TopologyKeyZone: zones[1]}, + Segments: map[string]string{constants.TopologyKeyZone: zones[1]}, }, }, }, @@ -423,8 +425,8 @@ var _ = Describe("GCE PD CSI Driver Multi-Zone", func() { Expect(err).To(BeNil(), "Failed to get disk %v/%v", zones[1], volName) // Validate disks have multi-zone labels - Expect(disk1.Labels[common.MultiZoneLabel]).To(Equal("true")) - Expect(disk2.Labels[common.MultiZoneLabel]).To(Equal("true")) + Expect(disk1.Labels[constants.MultiZoneLabel]).To(Equal("true")) + Expect(disk2.Labels[constants.MultiZoneLabel]).To(Equal("true")) // Validate disks are ROX Expect(disk1.AccessMode).To(Equal("READ_ONLY_MANY")) @@ -503,8 +505,8 @@ var _ = Describe("GCE PD CSI Driver Multi-Zone", func() { // Create multi-zone Disk volName := testNamePrefix + string(uuid.NewUUID()) _, err = controllerClient.CreateVolumeWithCaps(volName, map[string]string{ - common.ParameterKeyEnableMultiZoneProvisioning: "true", - common.ParameterKeyType: "hyperdisk-ml", + parameters.ParameterKeyEnableMultiZoneProvisioning: "true", + parameters.ParameterKeyType: "hyperdisk-ml", }, defaultHdmlSizeGb, &csi.TopologyRequirement{}, []*csi.VolumeCapability{ @@ -562,8 +564,8 @@ var _ = Describe("GCE PD CSI Driver Multi-Zone", func() { Expect(err).To(BeNil(), "Failed to get disk %v/%v", zones[1], volName) // Validate disks have multi-zone labels - Expect(disk1.Labels[common.MultiZoneLabel]).To(Equal("true")) - Expect(disk2.Labels[common.MultiZoneLabel]).To(Equal("true")) + Expect(disk1.Labels[constants.MultiZoneLabel]).To(Equal("true")) + Expect(disk2.Labels[constants.MultiZoneLabel]).To(Equal("true")) // Validate disks are ROX Expect(disk1.AccessMode).To(Equal("READ_ONLY_MANY")) @@ -647,16 +649,16 @@ var _ = Describe("GCE PD CSI Driver Multi-Zone", func() { volName := testNamePrefix + string(uuid.NewUUID()) _, err = controllerClient.CreateVolumeWithCaps(volName, map[string]string{ - common.ParameterKeyEnableMultiZoneProvisioning: "true", - common.ParameterKeyType: "hyperdisk-ml", + parameters.ParameterKeyEnableMultiZoneProvisioning: "true", + parameters.ParameterKeyType: "hyperdisk-ml", }, defaultHdmlSizeGb, &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: zones[0]}, + Segments: map[string]string{constants.TopologyKeyZone: zones[0]}, }, { - Segments: map[string]string{common.TopologyKeyZone: zones[1]}, + Segments: map[string]string{constants.TopologyKeyZone: zones[1]}, }, }, }, @@ -698,8 +700,8 @@ var _ = Describe("GCE PD CSI Driver Multi-Zone", func() { Expect(err).To(BeNil(), "Failed to get disk %v/%v", zones[1], volName) // Validate disks have multi-zone labels - Expect(disk1.Labels[common.MultiZoneLabel]).To(Equal("true")) - Expect(disk2.Labels[common.MultiZoneLabel]).To(Equal("true")) + Expect(disk1.Labels[constants.MultiZoneLabel]).To(Equal("true")) + Expect(disk2.Labels[constants.MultiZoneLabel]).To(Equal("true")) // Validate disks are ROX Expect(disk1.AccessMode).To(Equal("READ_ONLY_MANY")) @@ -750,16 +752,16 @@ var _ = Describe("GCE PD CSI Driver Multi-Zone", func() { // Create Disk volName := testNamePrefix + string(uuid.NewUUID()) _, err := controllerClient.CreateVolumeWithCaps(volName, map[string]string{ - common.ParameterKeyEnableMultiZoneProvisioning: "true", - common.ParameterKeyType: "hyperdisk-ml", + parameters.ParameterKeyEnableMultiZoneProvisioning: "true", + parameters.ParameterKeyType: "hyperdisk-ml", }, defaultHdmlSizeGb, &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: zones[0]}, + Segments: map[string]string{constants.TopologyKeyZone: zones[0]}, }, { - Segments: map[string]string{common.TopologyKeyZone: zones[1]}, + Segments: map[string]string{constants.TopologyKeyZone: zones[1]}, }, }, }, @@ -795,8 +797,8 @@ var _ = Describe("GCE PD CSI Driver Multi-Zone", func() { Expect(err).To(BeNil(), "Failed to get disk %v/%v", zones[1], volName) // Validate disks have multi-zone labels - Expect(disk1.Labels[common.MultiZoneLabel]).To(Equal("true")) - Expect(disk2.Labels[common.MultiZoneLabel]).To(Equal("true")) + Expect(disk1.Labels[constants.MultiZoneLabel]).To(Equal("true")) + Expect(disk2.Labels[constants.MultiZoneLabel]).To(Equal("true")) // Validate disks are RWO Expect(disk1.AccessMode).To(Equal("READ_WRITE_SINGLE")) @@ -866,16 +868,16 @@ var _ = Describe("GCE PD CSI Driver Multi-Zone", func() { // Create Disk volName := testNamePrefix + string(uuid.NewUUID()) _, err := controllerClient.CreateVolumeWithCaps(volName, map[string]string{ - common.ParameterKeyEnableMultiZoneProvisioning: "true", - common.ParameterKeyType: "hyperdisk-ml", + parameters.ParameterKeyEnableMultiZoneProvisioning: "true", + parameters.ParameterKeyType: "hyperdisk-ml", }, defaultHdmlSizeGb, &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: zones[0]}, + Segments: map[string]string{constants.TopologyKeyZone: zones[0]}, }, { - Segments: map[string]string{common.TopologyKeyZone: zones[1]}, + Segments: map[string]string{constants.TopologyKeyZone: zones[1]}, }, }, }, @@ -911,8 +913,8 @@ var _ = Describe("GCE PD CSI Driver Multi-Zone", func() { Expect(err).To(BeNil(), "Failed to get disk %v/%v", zones[1], volName) // Validate disks have multi-zone labels - Expect(disk1.Labels[common.MultiZoneLabel]).To(Equal("true")) - Expect(disk2.Labels[common.MultiZoneLabel]).To(Equal("true")) + Expect(disk1.Labels[constants.MultiZoneLabel]).To(Equal("true")) + Expect(disk2.Labels[constants.MultiZoneLabel]).To(Equal("true")) // Validate disks are RWO Expect(disk1.AccessMode).To(Equal("READ_WRITE_SINGLE")) @@ -976,12 +978,12 @@ var _ = Describe("GCE PD CSI Driver Multi-Zone", func() { // Create Disk volName := testNamePrefix + string(uuid.NewUUID()) _, err := controllerClient.CreateVolumeWithCaps(volName, map[string]string{ - common.ParameterKeyType: "hyperdisk-ml", + parameters.ParameterKeyType: "hyperdisk-ml", }, defaultHdmlSizeGb, &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: zones[0]}, + Segments: map[string]string{constants.TopologyKeyZone: zones[0]}, }, }, }, @@ -1066,14 +1068,14 @@ var _ = Describe("GCE PD CSI Driver Multi-Zone", func() { // Create Disk volName := testNamePrefix + string(uuid.NewUUID()) volume, err := controllerClient.CreateVolume(volName, map[string]string{ - common.ParameterKeyReplicationType: "regional-pd", + parameters.ParameterKeyReplicationType: "regional-pd", }, defaultRepdSizeGb, &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: zones[0]}, + Segments: map[string]string{constants.TopologyKeyZone: zones[0]}, }, { - Segments: map[string]string{common.TopologyKeyZone: zones[1]}, + Segments: map[string]string{constants.TopologyKeyZone: zones[1]}, }, }, }, nil) @@ -1149,15 +1151,15 @@ var _ = Describe("GCE PD CSI Driver Multi-Zone", func() { // Create Disk volName := testNamePrefix + string(uuid.NewUUID()) volume, err := controllerClient.CreateVolume(volName, map[string]string{ - common.ParameterKeyReplicationType: "regional-pd", - common.ParameterAvailabilityClass: common.ParameterRegionalHardFailoverClass, + parameters.ParameterKeyReplicationType: "regional-pd", + parameters.ParameterAvailabilityClass: parameters.ParameterRegionalHardFailoverClass, }, defaultRepdSizeGb, &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: zones[0]}, + Segments: map[string]string{constants.TopologyKeyZone: zones[0]}, }, { - Segments: map[string]string{common.TopologyKeyZone: zones[1]}, + Segments: map[string]string{constants.TopologyKeyZone: zones[1]}, }, }, }, nil) @@ -1233,8 +1235,6 @@ var _ = Describe("GCE PD CSI Driver Multi-Zone", func() { }) It("Should successfully run through entire lifecycle of a HdHA volume on instances in 2 zones", func() { - Skip("Flaking on GCP errors. Google internal bug: 463743704") - // Create new driver and client Expect(hyperdiskTestContexts).NotTo(BeEmpty()) @@ -1270,16 +1270,16 @@ var _ = Describe("GCE PD CSI Driver Multi-Zone", func() { volName := testNamePrefix + string(uuid.NewUUID()) wantIOPs, wantThroughput := int64(7000), int64(250) volume, err := controllerClient.CreateVolume(volName, map[string]string{ - common.ParameterKeyType: common.DiskTypeHdHA, - common.ParameterKeyProvisionedIOPSOnCreate: strconv.FormatInt(wantIOPs, 10), - common.ParameterKeyProvisionedThroughputOnCreate: strconv.FormatInt(wantThroughput, 10) + "Mi", + parameters.ParameterKeyType: parameters.DiskTypeHdHA, + parameters.ParameterKeyProvisionedIOPSOnCreate: strconv.FormatInt(wantIOPs, 10), + parameters.ParameterKeyProvisionedThroughputOnCreate: strconv.FormatInt(wantThroughput, 10) + "Mi", }, defaultRepdSizeGb, &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: zones[0]}, + Segments: map[string]string{constants.TopologyKeyZone: zones[0]}, }, { - Segments: map[string]string{common.TopologyKeyZone: zones[1]}, + Segments: map[string]string{constants.TopologyKeyZone: zones[1]}, }, }, }, nil) @@ -1322,8 +1322,6 @@ var _ = Describe("GCE PD CSI Driver Multi-Zone", func() { }) It("Should create a HdHA instance, write to it, force-attach it to another instance, and read the same data", func() { - Skip("Flaking on GCP errors. Google internal bug: 463743704") - Expect(hyperdiskTestContexts).NotTo(BeEmpty()) zoneToContext := map[string]*remote.TestContext{} @@ -1355,15 +1353,15 @@ var _ = Describe("GCE PD CSI Driver Multi-Zone", func() { // Create Disk volName := testNamePrefix + string(uuid.NewUUID()) volume, err := controllerClient.CreateVolume(volName, map[string]string{ - common.ParameterKeyType: common.DiskTypeHdHA, - common.ParameterAvailabilityClass: common.ParameterRegionalHardFailoverClass, + parameters.ParameterKeyType: parameters.DiskTypeHdHA, + parameters.ParameterAvailabilityClass: parameters.ParameterRegionalHardFailoverClass, }, defaultRepdSizeGb, &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: zones[0]}, + Segments: map[string]string{constants.TopologyKeyZone: zones[0]}, }, { - Segments: map[string]string{common.TopologyKeyZone: zones[1]}, + Segments: map[string]string{constants.TopologyKeyZone: zones[1]}, }, }, }, nil) diff --git a/test/e2e/tests/resize_e2e_test.go b/test/e2e/tests/resize_e2e_test.go index fc4d87558..c370c237e 100644 --- a/test/e2e/tests/resize_e2e_test.go +++ b/test/e2e/tests/resize_e2e_test.go @@ -24,6 +24,7 @@ import ( "k8s.io/apimachinery/pkg/util/uuid" "k8s.io/klog/v2" "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/common" + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/constants" gce "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/gce-cloud-provider/compute" testutils "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/test/e2e/utils" ) @@ -42,7 +43,7 @@ var _ = Describe("GCE PD CSI Driver", func() { &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: z}, + Segments: map[string]string{constants.TopologyKeyZone: z}, }, }, }, nil) @@ -149,7 +150,7 @@ var _ = Describe("GCE PD CSI Driver", func() { &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: z}, + Segments: map[string]string{constants.TopologyKeyZone: z}, }, }, }, nil) @@ -256,7 +257,7 @@ var _ = Describe("GCE PD CSI Driver", func() { &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: z}, + Segments: map[string]string{constants.TopologyKeyZone: z}, }, }, }, nil) diff --git a/test/e2e/tests/setup_e2e_test.go b/test/e2e/tests/setup_e2e_test.go index 6e49c1910..b9ffebcfa 100644 --- a/test/e2e/tests/setup_e2e_test.go +++ b/test/e2e/tests/setup_e2e_test.go @@ -33,18 +33,22 @@ import ( compute "google.golang.org/api/compute/v1" "k8s.io/klog/v2" "k8s.io/utils/strings/slices" - "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/common" + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/constants" testutils "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/test/e2e/utils" remote "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/test/remote" ) +const ( + noMachineType = "none" +) + var ( project = flag.String("project", "", "Project to run tests in") serviceAccount = flag.String("service-account", "", "Service account to bring up instance with") vmNamePrefix = flag.String("vm-name-prefix", "gce-pd-csi-e2e", "VM name prefix") architecture = flag.String("arch", "amd64", "Architecture pd csi driver build on") - minCpuPlatform = flag.String("min-cpu-platform", "rome", "Minimum CPU architecture") - mwMinCpuPlatform = flag.String("min-cpu-platform-mw", "sapphirerapids", "Minimum CPU architecture for multiwriter tests") + minCpuPlatform = flag.String("min-cpu-platform", "AMD Rome", "Minimum CPU architecture") + mwMinCpuPlatform = flag.String("min-cpu-platform-mw", "Intel Sapphire Rapids", "Minimum CPU architecture for multiwriter tests") zones = flag.String("zones", "us-east4-a,us-east4-c", "Zones to run tests in. If there are multiple zones, separate each by comma") machineType = flag.String("machine-type", "n2d-standard-4", "Type of machine to provision instance on") imageURL = flag.String("image-url", "projects/ubuntu-os-cloud/global/images/family/ubuntu-minimal-2404-lts-amd64", "OS image url to get image from") @@ -55,11 +59,14 @@ var ( enableConfidentialCompute = flag.Bool("enable-confidential-compute", false, "Create VMs with confidential compute mode. This uses NVMe devices") // Multi-writer is only supported on M3, C3, and N4 // https://cloud.google.com/compute/docs/disks/sharing-disks-between-vms#hd-multi-writer - hdMachineType = flag.String("hyperdisk-machine-type", "c3-standard-4", "Type of machine to provision instance on") + hdMachineType = flag.String("hyperdisk-machine-type", "c3-standard-4", "Type of machine to provision instance on, or `none' to skip") hdMinCpuPlatform = flag.String("hyperdisk-min-cpu-platform", "Intel Sapphire Rapids", "Minimum CPU architecture") - testContexts = []*remote.TestContext{} - hyperdiskTestContexts = []*remote.TestContext{} + // Some architectures don't have local ssd. Give way to opt out of tests like datacache. + skipLocalSsdTests = flag.Bool("skip-local-ssd-tests", false, "Skip local ssd tests like datacache") + + testContexts []*remote.TestContext + hyperdiskTestContexts []*remote.TestContext computeService *compute.Service computeAlphaService *computealpha.Service computeBetaService *computebeta.Service @@ -80,10 +87,6 @@ var _ = BeforeSuite(func() { var err error numberOfInstancesPerZone := 2 zones := strings.Split(*zones, ",") - tcc := make(chan *remote.TestContext, len(zones)*numberOfInstancesPerZone) - hdtcc := make(chan *remote.TestContext, len(zones)) - defer close(tcc) - defer close(hdtcc) rand.Seed(time.Now().UnixNano()) @@ -109,40 +112,40 @@ var _ = BeforeSuite(func() { klog.Infof("Running in project %v with service account %v", *project, *serviceAccount) - setupContext := func(zone string) { - var wg sync.WaitGroup + testContexts = make([]*remote.TestContext, numberOfInstancesPerZone*len(zones)) + if *hdMachineType != noMachineType { + hyperdiskTestContexts = make([]*remote.TestContext, len(zones)) + } + var wg sync.WaitGroup + setupContext := func(idx int, zone string) { // Create 2 instances for each zone as we need 2 instances each zone for certain test cases for j := 0; j < numberOfInstancesPerZone; j++ { wg.Add(1) go func(curZone string, randInt int) { defer GinkgoRecover() defer wg.Done() - tcc <- NewDefaultTestContext(curZone, strconv.Itoa(randInt)) + tc := NewDefaultTestContext(curZone, strconv.Itoa(randInt)) + k := j + idx*numberOfInstancesPerZone + testContexts[k] = tc + klog.Infof("Added TestContext for node %s at %d", tc.Instance.GetName(), k) }(zone, j) } - wg.Add(1) - go func(curZone string) { - defer GinkgoRecover() - defer wg.Done() - hdtcc <- NewTestContext(curZone, *hdMinCpuPlatform, *hdMachineType, "0") - }(zone) - wg.Wait() - } - - for _, zone := range zones { - setupContext(zone) + if hyperdiskTestContexts != nil { + wg.Add(1) + go func(curZone string) { + defer GinkgoRecover() + defer wg.Done() + tc := NewTestContext(curZone, *hdMinCpuPlatform, *hdMachineType, "0") + hyperdiskTestContexts[idx] = tc + klog.Infof("Added hyperdisk TestContext for node %s at %d", tc.Instance.GetName(), idx) + }(zone) + } } - for i := 0; i < len(zones)*numberOfInstancesPerZone; i++ { - tc := <-tcc - testContexts = append(testContexts, tc) - klog.Infof("Added TestContext for node %s", tc.Instance.GetName()) - } - for i := 0; i < len(zones); i++ { - tc := <-hdtcc - hyperdiskTestContexts = append(hyperdiskTestContexts, tc) - klog.Infof("Added TestContext for node %s", tc.Instance.GetName()) + for i, zone := range zones { + setupContext(i, zone) } + wg.Wait() }) var _ = AfterSuite(func() { @@ -177,6 +180,13 @@ func NewDefaultTestContext(zone string, instanceNumber string) *remote.TestConte return NewTestContext(zone, *minCpuPlatform, *machineType, instanceNumber) } +func getLocalSsdCount() int64 { + if *skipLocalSsdTests { + return 0 + } + return constants.LocalSSDCountForDataCache +} + func NewTestContext(zone, minCpuPlatform, machineType string, instanceNumber string) *remote.TestContext { nodeID := fmt.Sprintf("%s-%s-%s-%s", *vmNamePrefix, zone, machineType, instanceNumber) klog.Infof("Setting up node %s", nodeID) @@ -193,7 +203,7 @@ func NewTestContext(zone, minCpuPlatform, machineType string, instanceNumber str CloudtopHost: *cloudtopHost, EnableConfidentialCompute: *enableConfidentialCompute, ComputeService: computeService, - LocalSSDCount: common.LocalSSDCountForDataCache, + LocalSSDCount: getLocalSsdCount(), } if machineType == *hdMachineType { diff --git a/test/e2e/tests/single_zone_e2e_test.go b/test/e2e/tests/single_zone_e2e_test.go index 4366cd832..6e35b601f 100644 --- a/test/e2e/tests/single_zone_e2e_test.go +++ b/test/e2e/tests/single_zone_e2e_test.go @@ -28,8 +28,10 @@ import ( "k8s.io/apimachinery/pkg/util/wait" "k8s.io/klog/v2" "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/common" + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/constants" "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/deviceutils" gce "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/gce-cloud-provider/compute" + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/parameters" testutils "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/test/e2e/utils" "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/test/remote" @@ -268,7 +270,7 @@ var _ = Describe("GCE PD CSI Driver", func() { topReq := &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: zone}, + Segments: map[string]string{constants.TopologyKeyZone: zone}, }, }, } @@ -298,7 +300,7 @@ var _ = Describe("GCE PD CSI Driver", func() { topReq := &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "us-central1-c"}, + Segments: map[string]string{constants.TopologyKeyZone: "us-central1-c"}, }, }, } @@ -314,7 +316,7 @@ var _ = Describe("GCE PD CSI Driver", func() { Expect(volume.AccessibleTopology).ToNot(BeEmpty(), "Volume should have accessible topologies") Expect(volume.AccessibleTopology).To(HaveLen(1), "Expected exactly one accessible topology") // Zonal clusters have a single Topology. segments := volume.AccessibleTopology[0].Segments - Expect(segments).To(HaveKeyWithValue(common.TopologyKeyZone, "us-central1-c"), "Topology should include zone segment with value 'us-central1-c'") + Expect(segments).To(HaveKeyWithValue(constants.TopologyKeyZone, "us-central1-c"), "Topology should include zone segment with value 'us-central1-c'") Expect(segments).To(HaveKeyWithValue(common.DiskTypeLabelKey(hdbDiskType), "true"), "Topology should include disk type label with value 'true'") }) @@ -331,7 +333,7 @@ var _ = Describe("GCE PD CSI Driver", func() { // topReq := &csi.TopologyRequirement{ // Requisite: []*csi.Topology{ // { - // Segments: map[string]string{common.TopologyKeyZone: zone}, + // Segments: map[string]string{constants.TopologyKeyZone: zone}, // }, // }, // } @@ -431,7 +433,7 @@ var _ = Describe("GCE PD CSI Driver", func() { // Create Disk volName := testNamePrefix + string(uuid.NewUUID()) volume, err := controllerClient.CreateVolume(volName, map[string]string{ - common.ParameterKeyReplicationType: "regional-pd", + parameters.ParameterKeyReplicationType: "regional-pd", }, defaultRepdSizeGb, nil, nil) Expect(err).To(BeNil(), "CreateVolume failed with error: %v", err) @@ -513,7 +515,7 @@ var _ = Describe("GCE PD CSI Driver", func() { // Create Disk diskParams := map[string]string{ - common.ParameterKeyType: diskType, + parameters.ParameterKeyType: diskType, } volName := testNamePrefix + string(uuid.NewUUID()) @@ -557,7 +559,7 @@ var _ = Describe("GCE PD CSI Driver", func() { disk := typeToDisk[diskType] volName := testNamePrefix + string(uuid.NewUUID()) params := merge(disk.params, map[string]string{ - common.ParameterKeyLabels: "key1=value1,key2=value2", + parameters.ParameterKeyLabels: "key1=value1,key2=value2", }) diskSize := defaultSizeGb @@ -684,12 +686,12 @@ var _ = Describe("GCE PD CSI Driver", func() { disk := typeToDisk[diskType] volName := testNamePrefix + string(uuid.NewUUID()) params := merge(disk.params, map[string]string{ - common.ParameterKeyDiskEncryptionKmsKey: key.Name, + parameters.ParameterKeyDiskEncryptionKmsKey: key.Name, }) topology := &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: z}, + Segments: map[string]string{constants.TopologyKeyZone: z}, }, }, } @@ -814,7 +816,7 @@ var _ = Describe("GCE PD CSI Driver", func() { // Create Disk volName := testNamePrefix + string(uuid.NewUUID()) volume, err := controllerClient.CreateVolume(volName, map[string]string{ - common.ParameterKeyReplicationType: "regional-pd", + parameters.ParameterKeyReplicationType: "regional-pd", }, defaultRepdSizeGb, nil, nil) Expect(err).To(BeNil(), "CreateVolume failed with error: %v", err) @@ -1028,9 +1030,9 @@ var _ = Describe("GCE PD CSI Driver", func() { disk := typeToDisk[diskType] volName := testNamePrefix + string(uuid.NewUUID()) params := merge(disk.params, map[string]string{ - common.ParameterKeyPVCName: "test-pvc", - common.ParameterKeyPVCNamespace: "test-pvc-namespace", - common.ParameterKeyPVName: "test-pv-name", + parameters.ParameterKeyPVCName: "test-pvc", + parameters.ParameterKeyPVCNamespace: "test-pvc-namespace", + parameters.ParameterKeyPVName: "test-pv-name", }) volume, err := controllerClient.CreateVolume(volName, params, diskSize, nil /* topReq */, nil) Expect(err).To(BeNil(), "CreateVolume failed with error: %v", err) @@ -1076,10 +1078,10 @@ var _ = Describe("GCE PD CSI Driver", func() { snapshotLocation := z[:len(z)-2] snapshotParams := map[string]string{ - common.ParameterKeyStorageLocations: snapshotLocation, - common.ParameterKeyVolumeSnapshotName: "test-volumesnapshot-name", - common.ParameterKeyVolumeSnapshotNamespace: "test-volumesnapshot-namespace", - common.ParameterKeyVolumeSnapshotContentName: "test-volumesnapshotcontent-name", + parameters.ParameterKeyStorageLocations: snapshotLocation, + parameters.ParameterKeyVolumeSnapshotName: "test-volumesnapshot-name", + parameters.ParameterKeyVolumeSnapshotNamespace: "test-volumesnapshot-namespace", + parameters.ParameterKeyVolumeSnapshotContentName: "test-volumesnapshotcontent-name", } snapshotID, err := client.CreateSnapshot(snapshotName, volID, snapshotParams) Expect(err).To(BeNil(), "CreateSnapshot failed with error: %v", err) @@ -1137,7 +1139,7 @@ var _ = Describe("GCE PD CSI Driver", func() { snapshotName := testNamePrefix + string(uuid.NewUUID()) testImageFamily := "test-family" - snapshotParams := map[string]string{common.ParameterKeySnapshotType: common.DiskImageType, common.ParameterKeyImageFamily: testImageFamily} + snapshotParams := map[string]string{parameters.ParameterKeySnapshotType: parameters.DiskImageType, parameters.ParameterKeyImageFamily: testImageFamily} snapshotID, err := client.CreateSnapshot(snapshotName, volID, snapshotParams) Expect(err).To(BeNil(), "CreateSnapshot failed with error: %v", err) @@ -1161,7 +1163,7 @@ var _ = Describe("GCE PD CSI Driver", func() { Expect(err).To(BeNil(), "Could not get snapshot from cloud directly") _, snapshotType, _, err := common.SnapshotIDToProjectKey(cleanSelfLink(snapshot.SelfLink)) Expect(err).To(BeNil(), "Failed to parse snapshot ID") - Expect(snapshotType).To(Equal(common.DiskImageType), "Expected images type in snapshot ID") + Expect(snapshotType).To(Equal(parameters.DiskImageType), "Expected images type in snapshot ID") snapshots, err := client.ListSnapshots() Expect(err).To(BeNil(), "Could not list snapshots") @@ -1201,12 +1203,12 @@ var _ = Describe("GCE PD CSI Driver", func() { // Create Disk volName := testNamePrefix + string(uuid.NewUUID()) volume, err := controllerClient.CreateVolume(volName, map[string]string{ - common.ParameterKeyReplicationType: "none", + parameters.ParameterKeyReplicationType: "none", }, defaultSizeGb, &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: z}, + Segments: map[string]string{constants.TopologyKeyZone: z}, }, }, }, @@ -1257,12 +1259,12 @@ var _ = Describe("GCE PD CSI Driver", func() { // Create Source Disk srcVolName := testNamePrefix + string(uuid.NewUUID()) srcVolume, err := controllerClient.CreateVolume(srcVolName, map[string]string{ - common.ParameterKeyReplicationType: "none", + parameters.ParameterKeyReplicationType: "none", }, defaultRepdSizeGb, nil, nil) // Create Disk volName := testNamePrefix + string(uuid.NewUUID()) volume, err := controllerClient.CreateVolume(volName, map[string]string{ - common.ParameterKeyReplicationType: "regional-pd", + parameters.ParameterKeyReplicationType: "regional-pd", }, defaultRepdSizeGb, nil, &csi.VolumeContentSource{ Type: &csi.VolumeContentSource_Volume{ @@ -1322,12 +1324,12 @@ var _ = Describe("GCE PD CSI Driver", func() { // Create Source Disk srcVolName := testNamePrefix + string(uuid.NewUUID()) srcVolume, err := controllerClient.CreateVolume(srcVolName, map[string]string{ - common.ParameterKeyReplicationType: "regional-pd", + parameters.ParameterKeyReplicationType: "regional-pd", }, defaultRepdSizeGb, nil, nil) // Create Disk volName := testNamePrefix + string(uuid.NewUUID()) volume, err := controllerClient.CreateVolume(volName, map[string]string{ - common.ParameterKeyReplicationType: "regional-pd", + parameters.ParameterKeyReplicationType: "regional-pd", }, defaultRepdSizeGb, nil, &csi.VolumeContentSource{ Type: &csi.VolumeContentSource_Volume{ @@ -1483,6 +1485,9 @@ var _ = Describe("GCE PD CSI Driver", func() { It("Should create disks, attach them to instance with local ssd, setup caching between LSSD->detach->reattach to same instance", func() { Expect(testContexts).ToNot(BeEmpty()) testContext := getRandomTestContext() + if testContext.Instance.GetLocalSSD() == 0 { + Skip("Skipping data cache as no local ssd in context") + } p, z, _ := testContext.Instance.GetIdentity() client := testContext.Client @@ -1663,6 +1668,94 @@ var _ = Describe("GCE PD CSI Driver", func() { Expect(err).To(BeNil(), "Failed to rm file path %s: %v", fp, err) }) + It("Should mount if udev disabled, and remount if it's enabled again", func() { + testContext := getRandomTestContext() + p, z, _ := testContext.Instance.GetIdentity() + client := testContext.Client + instance := testContext.Instance + + klog.Infof("Disabling udev") + err := instance.DisableUdev() + Expect(err).To(BeNil(), "Failed to disable udev") + + // Create Disk + volName, volID := createAndValidateUniqueZonalDisk(client, p, z, standardDiskType) + vol2Name, vol2ID := createAndValidateUniqueZonalDisk(client, p, z, standardDiskType) + + defer func() { + // Delete Disks + err := client.DeleteVolume(volID) + Expect(err).To(BeNil(), "DeleteVolume failed") + + err = client.DeleteVolume(vol2ID) + Expect(err).To(BeNil(), "DeleteVolume failed") + + // Validate Disks Deleted + _, err = computeService.Disks.Get(p, z, volName).Do() + Expect(gce.IsGCEError(err, "notFound")).To(BeTrue(), "Expected disk to not be found") + _, err = computeService.Disks.Get(p, z, vol2Name).Do() + Expect(gce.IsGCEError(err, "notFound")).To(BeTrue(), "Expected disk to not be found") + }() + + // Attach & detach disk. We retry as we expect the udev repair to take a little bit of time. + klog.Infof("Starting attach & detach with disabled udev") + err = wait.Poll(10*time.Second, 5*time.Minute, func() (bool, error) { + err = testAttachWriteReadDetach(volID, volName, instance, client, false /* readOnly */, false /* detachAndReattach */, false /* setupDataCache */) + if err != nil { + klog.Infof("Initial udev error, retrying: %v", err) + } + return err == nil, nil + }) + Expect(err).To(BeNil(), "Failed to go through volume lifecycle") + + // Attach a different disk. The conflicting udev paths should not cause a problem. + klog.Infof("Starting second attach & detach with disabled udev") + err = wait.Poll(10*time.Second, 5*time.Minute, func() (bool, error) { + err = testAttachWriteReadDetach(vol2ID, vol2Name, instance, client, false /* readOnly */, false /* detachAndReattach */, false /* setupDataCache */) + if err != nil { + klog.Infof("second disk udev error, retrying: %v", err) + } + return err == nil, nil + }) + Expect(err).To(BeNil(), "Failed to go through second volume lifecycle") + + // Attach, reenable udev, go through lifecycle of second disk, detach first + klog.Infof("Starting attach & udev re-enable") + var detacher func() + var args *verifyArgs + err = wait.Poll(10*time.Second, 5*time.Minute, func() (bool, error) { + err, detacher, args = testAttachAndMount(volID, volName, instance, client, attachAndMountArgs{}) + if err != nil { + klog.Infof("attach before reenable failed, retrying: %v", err) + } + return err == nil, nil + }) + Expect(err).To(BeNil(), "Failed second attach") + defer detacher() + + klog.Infof("Re-enabling udev") + err = instance.EnableUdev() + Expect(err).To(BeNil(), "Failed to enable udev") + + // After udev is enabled we expect everything to succeed on the first try. + + klog.Infof("Testing attach & detach with re-enabled udev") + err = testAttachWriteReadDetach(vol2ID, vol2Name, instance, client, false /* readOnly */, false /* detachAndReattach */, false /* setupDataCache */) + Expect(err).To(BeNil(), "Failed to go through nested volume lifecycle with enabled") + + klog.Infof("Testing detach with re-enabled udev") + err = client.NodeUnpublishVolume(volID, args.publishDir) + Expect(err).To(BeNil(), "Failed to unpublish first") + + err = client.NodeUnstageVolume(volID, args.stageDir) + Expect(err).To(BeNil(), "Failed to unstage first") + + // Go through complete lifecycle again, with udev enabled. + klog.Infof("Testing final lifecycle enabled udev") + err = testAttachWriteReadDetach(volID, volName, instance, client, false /* readOnly */, false /* detachAndReattach */, false /* setupDataCache */) + Expect(err).To(BeNil(), "Failed to go through volume lifecycle with udev enabled") + }) + type multiZoneTestConfig struct { diskType string readOnly bool @@ -1686,7 +1779,7 @@ var _ = Describe("GCE PD CSI Driver", func() { if cfg.hasMultiZoneLabel { labelsMap := map[string]string{ - common.MultiZoneLabel: "true", + constants.MultiZoneLabel: "true", } disk, err := computeService.Disks.Get(p, z, volName).Do() Expect(err).To(BeNil(), "Could not get disk") @@ -1828,7 +1921,7 @@ func createAndValidateZonalDisk(client *remote.CsiClient, project, zone string, &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: zone}, + Segments: map[string]string{constants.TopologyKeyZone: zone}, }, }, }, nil) @@ -1861,13 +1954,13 @@ func createAndValidateUniqueZonalMultiWriterDisk(client *remote.CsiClient, proje // Create Disk disk := typeToDisk[diskType] - disk.params[common.ParameterAccessMode] = "READ_WRITE_MANY" + disk.params[parameters.ParameterAccessMode] = "READ_WRITE_MANY" volName := testNamePrefix + string(uuid.NewUUID()) volume, err := client.CreateVolumeWithCaps(volName, disk.params, defaultMwSizeGb, &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: zone}, + Segments: map[string]string{constants.TopologyKeyZone: zone}, }, }, }, @@ -1968,7 +2061,7 @@ type disk struct { var typeToDisk = map[string]*disk{ standardDiskType: { params: map[string]string{ - common.ParameterKeyType: standardDiskType, + parameters.ParameterKeyType: standardDiskType, }, validate: func(disk *compute.Disk) { Expect(disk.Type).To(ContainSubstring(standardDiskType)) @@ -1976,8 +2069,8 @@ var typeToDisk = map[string]*disk{ }, extremeDiskType: { params: map[string]string{ - common.ParameterKeyType: extremeDiskType, - common.ParameterKeyProvisionedIOPSOnCreate: provisionedIOPSOnCreate, + parameters.ParameterKeyType: extremeDiskType, + parameters.ParameterKeyProvisionedIOPSOnCreate: provisionedIOPSOnCreate, }, validate: func(disk *compute.Disk) { Expect(disk.Type).To(ContainSubstring(extremeDiskType)) @@ -1986,9 +2079,9 @@ var typeToDisk = map[string]*disk{ }, hdbDiskType: { params: map[string]string{ - common.ParameterKeyType: hdbDiskType, - common.ParameterKeyProvisionedIOPSOnCreate: provisionedIOPSOnCreateHdb, - common.ParameterKeyProvisionedThroughputOnCreate: provisionedThroughputOnCreateHdb, + parameters.ParameterKeyType: hdbDiskType, + parameters.ParameterKeyProvisionedIOPSOnCreate: provisionedIOPSOnCreateHdb, + parameters.ParameterKeyProvisionedThroughputOnCreate: provisionedThroughputOnCreateHdb, }, validate: func(disk *compute.Disk) { Expect(disk.Type).To(ContainSubstring(hdbDiskType)) @@ -1998,8 +2091,8 @@ var typeToDisk = map[string]*disk{ }, hdxDiskType: { params: map[string]string{ - common.ParameterKeyType: hdxDiskType, - common.ParameterKeyProvisionedIOPSOnCreate: provisionedIOPSOnCreateHdx, + parameters.ParameterKeyType: hdxDiskType, + parameters.ParameterKeyProvisionedIOPSOnCreate: provisionedIOPSOnCreateHdx, }, validate: func(disk *compute.Disk) { Expect(disk.Type).To(ContainSubstring(hdxDiskType)) @@ -2008,8 +2101,8 @@ var typeToDisk = map[string]*disk{ }, hdtDiskType: { params: map[string]string{ - common.ParameterKeyType: hdtDiskType, - common.ParameterKeyProvisionedThroughputOnCreate: provisionedThroughputOnCreate, + parameters.ParameterKeyType: hdtDiskType, + parameters.ParameterKeyProvisionedThroughputOnCreate: provisionedThroughputOnCreate, }, validate: func(disk *compute.Disk) { Expect(disk.Type).To(ContainSubstring(hdtDiskType)) @@ -2018,7 +2111,7 @@ var typeToDisk = map[string]*disk{ }, ssdDiskType: { params: map[string]string{ - common.ParameterKeyType: ssdDiskType, + parameters.ParameterKeyType: ssdDiskType, }, validate: func(disk *compute.Disk) { Expect(disk.Type).To(ContainSubstring(ssdDiskType)) @@ -2026,7 +2119,7 @@ var typeToDisk = map[string]*disk{ }, "hyperdisk-ml": { params: map[string]string{ - common.ParameterKeyType: "hyperdisk-ml", + parameters.ParameterKeyType: "hyperdisk-ml", }, validate: func(disk *compute.Disk) { Expect(disk.Type).To(ContainSubstring("hyperdisk-ml")) diff --git a/test/e2e/utils/utils.go b/test/e2e/utils/utils.go index 01bad4513..0f4fb828a 100644 --- a/test/e2e/utils/utils.go +++ b/test/e2e/utils/utils.go @@ -31,6 +31,7 @@ import ( boskosclient "sigs.k8s.io/boskos/client" "sigs.k8s.io/boskos/common" utilcommon "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/common" + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/constants" remote "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/test/remote" ) @@ -74,7 +75,7 @@ func GCEClientAndDriverSetup(instance *remote.InstanceInfo, driverConfig DriverC "--disk-topology=true", } - extra_flags = append(extra_flags, fmt.Sprintf("--node-name=%s", utilcommon.TestNode)) + extra_flags = append(extra_flags, fmt.Sprintf("--node-name=%s", constants.TestNode)) if instance.GetLocalSSD() > 0 { extra_flags = append(extra_flags, "--enable-data-cache") } diff --git a/test/k8s-integration/cluster.go b/test/k8s-integration/cluster.go index 6f87050d7..6618f1e49 100644 --- a/test/k8s-integration/cluster.go +++ b/test/k8s-integration/cluster.go @@ -1,6 +1,7 @@ package main import ( + "bufio" "encoding/json" "errors" "fmt" @@ -9,6 +10,7 @@ import ( "path/filepath" "strconv" "strings" + "time" apimachineryversion "k8s.io/apimachinery/pkg/version" "k8s.io/client-go/kubernetes" @@ -254,6 +256,17 @@ func clusterUpGKE(gceZone, gceRegion string, numNodes int, numWindowsNodes int, return fmt.Errorf("failed to bring up kubernetes e2e cluster on gke: %v", err.Error()) } + // To avoid unexpected GKE maintenance, create a 4-hour maintenance exclusion window. + startExclusionTime := time.Now().UTC() + cmd = exec.Command("gcloud", "container", "clusters", "update", *gkeTestClusterName, locationArg, locationVal, "--quiet", + "--add-maintenance-exclusion-name", "no-upgrades-during-test", + "--add-maintenance-exclusion-start", startExclusionTime.Format(time.RFC3339), + "--add-maintenance-exclusion-end", startExclusionTime.Add(2*time.Hour).Format(time.RFC3339), + "--add-maintenance-exclusion-scope", "no_upgrades") + if err := runCommand("Updating Cluster with maintenance window", cmd); err != nil { + return fmt.Errorf("failed to update cluster with maintenance window: %w", err) + } + // Because gcloud cannot disable addons on cluster create, the deployment has // to be disabled on update. clusterVersion := mustGetKubeClusterVersion() @@ -268,6 +281,26 @@ func clusterUpGKE(gceZone, gceRegion string, numNodes int, numWindowsNodes int, } } + cmd = exec.Command("gcloud", "container", "clusters", "describe", *gkeTestClusterName, locationArg, locationVal) + out, err = cmd.CombinedOutput() + if err != nil { + return fmt.Errorf("failed to list cluster: %v %s", err, out) + } + scanner := bufio.NewScanner(strings.NewReader(string(out))) + printedHash := false + for scanner.Scan() { + line := scanner.Text() + if strings.HasPrefix(line, "id: ") { + klog.Infof("GKE cluster: %s %s", *gkeTestClusterName, locationVal) + klog.Infof("GKE cluster hash %s", line) + printedHash = true + break + } + } + if !printedHash { + return fmt.Errorf("failed to find cluster hash in cluster describe: %s", out) + } + return nil } diff --git a/test/remote/client-wrappers.go b/test/remote/client-wrappers.go index 9f8696233..8531b046c 100644 --- a/test/remote/client-wrappers.go +++ b/test/remote/client-wrappers.go @@ -23,6 +23,7 @@ import ( "google.golang.org/grpc" "k8s.io/klog/v2" "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/common" + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/constants" "k8s.io/apimachinery/pkg/util/wait" ) @@ -57,7 +58,7 @@ const ( contextForceAttach = "force-attach" defaultLocalSsdCacheSize = "200" - defaultDataCacheMode = common.DataCacheModeWriteThrough + defaultDataCacheMode = constants.DataCacheModeWriteThrough ) type CsiClient struct { @@ -198,8 +199,8 @@ func (c *CsiClient) NodeStageBlockVolume(volId, stageDir string, setupDataCache func (c *CsiClient) NodeStageVolume(volId string, stageDir string, volumeCap *csipb.VolumeCapability, setupDataCache bool) error { publishContext := map[string]string{} if setupDataCache { - publishContext[common.ContextDataCacheSize] = defaultLocalSsdCacheSize - publishContext[common.ContextDataCacheMode] = defaultDataCacheMode + publishContext[constants.ContextDataCacheSize] = defaultLocalSsdCacheSize + publishContext[constants.ContextDataCacheMode] = defaultDataCacheMode } nodeStageReq := &csipb.NodeStageVolumeRequest{ VolumeId: volId, diff --git a/test/remote/instance.go b/test/remote/instance.go index 84c56625f..13ed1c058 100644 --- a/test/remote/instance.go +++ b/test/remote/instance.go @@ -92,7 +92,7 @@ func machineTypeMismatch(curInst *compute.Instance, newInst *compute.Instance) b // Ideally we could compare to see if the new instance has a greater minCpuPlatfor // For now we just check it was set and it's different. if curInst.MinCpuPlatform != "" && curInst.MinCpuPlatform != newInst.MinCpuPlatform { - klog.Infof("CPU Platform mismatch") + klog.Infof("CPU Platform mismatch: cur: %v; new: %v", curInst.MinCpuPlatform, newInst.MinCpuPlatform) return true } if (curInst.ConfidentialInstanceConfig != nil && newInst.ConfidentialInstanceConfig == nil) || @@ -102,7 +102,7 @@ func machineTypeMismatch(curInst *compute.Instance, newInst *compute.Instance) b return true } if curInst.SourceMachineImage != newInst.SourceMachineImage { - klog.Infof("Source Machine Mismatch") + klog.Infof("Source Machine Mismatch: cur: %v; new: %v", curInst.SourceMachineImage, newInst.SourceMachineImage) return true } return false @@ -131,7 +131,8 @@ func (i *InstanceInfo) CreateOrGetInstance(localSSDCount int) error { Type: "ONE_TO_ONE_NAT", Name: "External NAT", }, - }}, + }, + }, }, Disks: []*compute.AttachedDisk{ { @@ -248,9 +249,9 @@ func (i *InstanceInfo) CreateOrGetInstance(localSSDCount int) error { i.externalIP = externalIP } - if sshOut, err := i.SSHCheckAlive(); err != nil { + if err := i.SSHCheckAlive(); err != nil { err = fmt.Errorf("Instance %v in state RUNNING but not available by SSH: %v", i.cfg.Name, err.Error()) - klog.Warningf("SSH encountered an error: %v, output: %v", err, sshOut) + klog.Warningf("SSH encountered an error: %v", err) return false, nil } klog.V(4).Infof("Instance %v in state RUNNING and available by SSH", i.cfg.Name) diff --git a/test/remote/ssh.go b/test/remote/ssh.go index 521b25196..07c6b84f8 100644 --- a/test/remote/ssh.go +++ b/test/remote/ssh.go @@ -22,7 +22,9 @@ import ( "os/exec" "os/user" "strings" + "time" + "k8s.io/apimachinery/pkg/util/wait" "k8s.io/klog/v2" ) @@ -88,8 +90,56 @@ func (i *InstanceInfo) SSHNoSudo(cmd ...string) (string, error) { } // SSHCheckAlive just pings the server quickly to check whether it is reachable by SSH -func (i *InstanceInfo) SSHCheckAlive() (string, error) { - return runSSHCommand("ssh", []string{i.GetSSHTarget(), "-o", "ConnectTimeout=10", "--", "echo"}...) +func (i *InstanceInfo) SSHCheckAlive() error { + return wait.Poll(5*time.Second, time.Minute, func() (bool, error) { + out, err := runSSHCommand("ssh", []string{i.GetSSHTarget(), "-o", "ConnectTimeout=10", "--", "echo"}...) + if err != nil { + klog.V(2).Infof("ssh error, retrying: %v, %s", err, out) + } + return err == nil, nil + }) +} + +func (i *InstanceInfo) DisableUdev() error { + return wait.Poll(5*time.Second, time.Minute, func() (bool, error) { + _, err := i.SSH("systemctl", "stop", "systemd-udevd") + if err != nil { + klog.V(2).Infof("(will retry) failed to stop systemd-udevd: %v", err) + return false, nil + } + _, err = i.SSH("systemctl", "stop", "systemd-udevd-kernel.socket") + if err != nil { + klog.V(2).Infof("(will retry) failed to stop systemd-udevd-kernel.socket: %v", err) + return false, nil + } + _, err = i.SSH("systemctl", "stop", "systemd-udevd-control.socket") + if err != nil { + klog.V(2).Infof("(will retry) failed to stop systemd-udevd-control.socket: %v", err) + return false, nil + } + return true, nil + }) +} + +func (i *InstanceInfo) EnableUdev() error { + return wait.Poll(5*time.Second, time.Minute, func() (bool, error) { + _, err := i.SSH("systemctl", "start", "systemd-udevd") + if err != nil { + klog.V(2).Infof("(will retry) failed to start systemd-udevd: %v", err) + return false, nil + } + _, err = i.SSH("systemctl", "start", "systemd-udevd-kernel.socket") + if err != nil { + klog.V(2).Infof("(will retry) failed to start systemd-udevd-kernel.socket: %v", err) + return false, nil + } + _, err = i.SSH("systemctl", "start", "systemd-udevd-control.socket") + if err != nil { + klog.V(2).Infof("(will retry) failed to start systemd-udevd-control.socket: %v", err) + return false, nil + } + return true, nil + }) } // runSSHCommand executes the ssh or scp command, adding the flag provided --ssh-options diff --git a/test/run-k8s-integration.sh b/test/run-k8s-integration.sh index d165d6cfd..5e5dc9a96 100755 --- a/test/run-k8s-integration.sh +++ b/test/run-k8s-integration.sh @@ -14,10 +14,10 @@ readonly PKGDIR=${GOPATH}/src/sigs.k8s.io/gcp-compute-persistent-disk-csi-driver readonly overlay_name="${GCE_PD_OVERLAY_NAME:-stable-master}" readonly boskos_resource_type="${GCE_PD_BOSKOS_RESOURCE_TYPE:-gce-project}" readonly do_driver_build="${GCE_PD_DO_DRIVER_BUILD:-true}" -readonly do_k8s_build="${GCE_PD_DO_K8S_BUILD:-false}" +readonly do_k8s_build="${GCE_PD_DO_K8S_BUILD:-true}" readonly deployment_strategy=${DEPLOYMENT_STRATEGY:-gce} readonly gke_cluster_version=${GKE_CLUSTER_VERSION:-latest} -readonly kube_version=${GCE_PD_KUBE_VERSION:-latest} +readonly kube_version=${GCE_PD_KUBE_VERSION:-master} readonly test_version=${TEST_VERSION:-latest} readonly gce_zone=${GCE_CLUSTER_ZONE:-us-central1-b} readonly gce_region=${GCE_CLUSTER_REGION:-} diff --git a/test/sanity/sanity_test.go b/test/sanity/sanity_test.go index 5ce72493c..ae0460a79 100644 --- a/test/sanity/sanity_test.go +++ b/test/sanity/sanity_test.go @@ -35,6 +35,7 @@ import ( driver "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/gce-pd-csi-driver" "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/linkcache" mountmanager "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/mount-manager" + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/parameters" ) func TestSanity(t *testing.T) { @@ -128,9 +129,9 @@ func TestSanity(t *testing.T) { IDGen: newPDIDGenerator(project, zone), TestVolumeSize: common.GbToBytes(200), TestVolumeParameters: map[string]string{ - common.ParameterKeyType: "hyperdisk-balanced", - common.ParameterKeyProvisionedIOPSOnCreate: "3000", - common.ParameterKeyProvisionedThroughputOnCreate: "150Mi", + parameters.ParameterKeyType: "hyperdisk-balanced", + parameters.ParameterKeyProvisionedIOPSOnCreate: "3000", + parameters.ParameterKeyProvisionedThroughputOnCreate: "150Mi", }, TestVolumeMutableParameters: map[string]string{"iops": "3013", "throughput": "151"}, } diff --git a/vendor/github.com/Masterminds/semver/v3/.gitignore b/vendor/github.com/Masterminds/semver/v3/.gitignore new file mode 100644 index 000000000..6b061e617 --- /dev/null +++ b/vendor/github.com/Masterminds/semver/v3/.gitignore @@ -0,0 +1 @@ +_fuzz/ \ No newline at end of file diff --git a/vendor/github.com/Masterminds/semver/v3/.golangci.yml b/vendor/github.com/Masterminds/semver/v3/.golangci.yml new file mode 100644 index 000000000..fbc633259 --- /dev/null +++ b/vendor/github.com/Masterminds/semver/v3/.golangci.yml @@ -0,0 +1,27 @@ +run: + deadline: 2m + +linters: + disable-all: true + enable: + - misspell + - govet + - staticcheck + - errcheck + - unparam + - ineffassign + - nakedret + - gocyclo + - dupl + - goimports + - revive + - gosec + - gosimple + - typecheck + - unused + +linters-settings: + gofmt: + simplify: true + dupl: + threshold: 600 diff --git a/vendor/github.com/Masterminds/semver/v3/CHANGELOG.md b/vendor/github.com/Masterminds/semver/v3/CHANGELOG.md new file mode 100644 index 000000000..fabe5e43d --- /dev/null +++ b/vendor/github.com/Masterminds/semver/v3/CHANGELOG.md @@ -0,0 +1,268 @@ +# Changelog + +## 3.4.0 (2025-06-27) + +### Added + +- #268: Added property to Constraints to include prereleases for Check and Validate + +### Changed + +- #263: Updated Go testing for 1.24, 1.23, and 1.22 +- #269: Updated the error message handling for message case and wrapping errors +- #266: Restore the ability to have leading 0's when parsing with NewVersion. + Opt-out of this by setting CoerceNewVersion to false. + +### Fixed + +- #257: Fixed the CodeQL link (thanks @dmitris) +- #262: Restored detailed errors when failed to parse with NewVersion. Opt-out + of this by setting DetailedNewVersionErrors to false for faster performance. +- #267: Handle pre-releases for an "and" group if one constraint includes them + +## 3.3.1 (2024-11-19) + +### Fixed + +- #253: Fix for allowing some version that were invalid + +## 3.3.0 (2024-08-27) + +### Added + +- #238: Add LessThanEqual and GreaterThanEqual functions (thanks @grosser) +- #213: nil version equality checking (thanks @KnutZuidema) + +### Changed + +- #241: Simplify StrictNewVersion parsing (thanks @grosser) +- Testing support up through Go 1.23 +- Minimum version set to 1.21 as this is what's tested now +- Fuzz testing now supports caching + +## 3.2.1 (2023-04-10) + +### Changed + +- #198: Improved testing around pre-release names +- #200: Improved code scanning with addition of CodeQL +- #201: Testing now includes Go 1.20. Go 1.17 has been dropped +- #202: Migrated Fuzz testing to Go built-in Fuzzing. CI runs daily +- #203: Docs updated for security details + +### Fixed + +- #199: Fixed issue with range transformations + +## 3.2.0 (2022-11-28) + +### Added + +- #190: Added text marshaling and unmarshaling +- #167: Added JSON marshalling for constraints (thanks @SimonTheLeg) +- #173: Implement encoding.TextMarshaler and encoding.TextUnmarshaler on Version (thanks @MarkRosemaker) +- #179: Added New() version constructor (thanks @kazhuravlev) + +### Changed + +- #182/#183: Updated CI testing setup + +### Fixed + +- #186: Fixing issue where validation of constraint section gave false positives +- #176: Fix constraints check with *-0 (thanks @mtt0) +- #181: Fixed Caret operator (^) gives unexpected results when the minor version in constraint is 0 (thanks @arshchimni) +- #161: Fixed godoc (thanks @afirth) + +## 3.1.1 (2020-11-23) + +### Fixed + +- #158: Fixed issue with generated regex operation order that could cause problem + +## 3.1.0 (2020-04-15) + +### Added + +- #131: Add support for serializing/deserializing SQL (thanks @ryancurrah) + +### Changed + +- #148: More accurate validation messages on constraints + +## 3.0.3 (2019-12-13) + +### Fixed + +- #141: Fixed issue with <= comparison + +## 3.0.2 (2019-11-14) + +### Fixed + +- #134: Fixed broken constraint checking with ^0.0 (thanks @krmichelos) + +## 3.0.1 (2019-09-13) + +### Fixed + +- #125: Fixes issue with module path for v3 + +## 3.0.0 (2019-09-12) + +This is a major release of the semver package which includes API changes. The Go +API is compatible with ^1. The Go API was not changed because many people are using +`go get` without Go modules for their applications and API breaking changes cause +errors which we have or would need to support. + +The changes in this release are the handling based on the data passed into the +functions. These are described in the added and changed sections below. + +### Added + +- StrictNewVersion function. This is similar to NewVersion but will return an + error if the version passed in is not a strict semantic version. For example, + 1.2.3 would pass but v1.2.3 or 1.2 would fail because they are not strictly + speaking semantic versions. This function is faster, performs fewer operations, + and uses fewer allocations than NewVersion. +- Fuzzing has been performed on NewVersion, StrictNewVersion, and NewConstraint. + The Makefile contains the operations used. For more information on you can start + on Wikipedia at https://en.wikipedia.org/wiki/Fuzzing +- Now using Go modules + +### Changed + +- NewVersion has proper prerelease and metadata validation with error messages + to signal an issue with either of them +- ^ now operates using a similar set of rules to npm/js and Rust/Cargo. If the + version is >=1 the ^ ranges works the same as v1. For major versions of 0 the + rules have changed. The minor version is treated as the stable version unless + a patch is specified and then it is equivalent to =. One difference from npm/js + is that prereleases there are only to a specific version (e.g. 1.2.3). + Prereleases here look over multiple versions and follow semantic version + ordering rules. This pattern now follows along with the expected and requested + handling of this packaged by numerous users. + +## 1.5.0 (2019-09-11) + +### Added + +- #103: Add basic fuzzing for `NewVersion()` (thanks @jesse-c) + +### Changed + +- #82: Clarify wildcard meaning in range constraints and update tests for it (thanks @greysteil) +- #83: Clarify caret operator range for pre-1.0.0 dependencies (thanks @greysteil) +- #72: Adding docs comment pointing to vert for a cli +- #71: Update the docs on pre-release comparator handling +- #89: Test with new go versions (thanks @thedevsaddam) +- #87: Added $ to ValidPrerelease for better validation (thanks @jeremycarroll) + +### Fixed + +- #78: Fix unchecked error in example code (thanks @ravron) +- #70: Fix the handling of pre-releases and the 0.0.0 release edge case +- #97: Fixed copyright file for proper display on GitHub +- #107: Fix handling prerelease when sorting alphanum and num +- #109: Fixed where Validate sometimes returns wrong message on error + +## 1.4.2 (2018-04-10) + +### Changed + +- #72: Updated the docs to point to vert for a console appliaction +- #71: Update the docs on pre-release comparator handling + +### Fixed + +- #70: Fix the handling of pre-releases and the 0.0.0 release edge case + +## 1.4.1 (2018-04-02) + +### Fixed + +- Fixed #64: Fix pre-release precedence issue (thanks @uudashr) + +## 1.4.0 (2017-10-04) + +### Changed + +- #61: Update NewVersion to parse ints with a 64bit int size (thanks @zknill) + +## 1.3.1 (2017-07-10) + +### Fixed + +- Fixed #57: number comparisons in prerelease sometimes inaccurate + +## 1.3.0 (2017-05-02) + +### Added + +- #45: Added json (un)marshaling support (thanks @mh-cbon) +- Stability marker. See https://masterminds.github.io/stability/ + +### Fixed + +- #51: Fix handling of single digit tilde constraint (thanks @dgodd) + +### Changed + +- #55: The godoc icon moved from png to svg + +## 1.2.3 (2017-04-03) + +### Fixed + +- #46: Fixed 0.x.x and 0.0.x in constraints being treated as * + +## Release 1.2.2 (2016-12-13) + +### Fixed + +- #34: Fixed issue where hyphen range was not working with pre-release parsing. + +## Release 1.2.1 (2016-11-28) + +### Fixed + +- #24: Fixed edge case issue where constraint "> 0" does not handle "0.0.1-alpha" + properly. + +## Release 1.2.0 (2016-11-04) + +### Added + +- #20: Added MustParse function for versions (thanks @adamreese) +- #15: Added increment methods on versions (thanks @mh-cbon) + +### Fixed + +- Issue #21: Per the SemVer spec (section 9) a pre-release is unstable and + might not satisfy the intended compatibility. The change here ignores pre-releases + on constraint checks (e.g., ~ or ^) when a pre-release is not part of the + constraint. For example, `^1.2.3` will ignore pre-releases while + `^1.2.3-alpha` will include them. + +## Release 1.1.1 (2016-06-30) + +### Changed + +- Issue #9: Speed up version comparison performance (thanks @sdboyer) +- Issue #8: Added benchmarks (thanks @sdboyer) +- Updated Go Report Card URL to new location +- Updated Readme to add code snippet formatting (thanks @mh-cbon) +- Updating tagging to v[SemVer] structure for compatibility with other tools. + +## Release 1.1.0 (2016-03-11) + +- Issue #2: Implemented validation to provide reasons a versions failed a + constraint. + +## Release 1.0.1 (2015-12-31) + +- Fixed #1: * constraint failing on valid versions. + +## Release 1.0.0 (2015-10-20) + +- Initial release diff --git a/vendor/github.com/Masterminds/semver/v3/LICENSE.txt b/vendor/github.com/Masterminds/semver/v3/LICENSE.txt new file mode 100644 index 000000000..9ff7da9c4 --- /dev/null +++ b/vendor/github.com/Masterminds/semver/v3/LICENSE.txt @@ -0,0 +1,19 @@ +Copyright (C) 2014-2019, Matt Butcher and Matt Farina + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/github.com/Masterminds/semver/v3/Makefile b/vendor/github.com/Masterminds/semver/v3/Makefile new file mode 100644 index 000000000..9ca87a2c7 --- /dev/null +++ b/vendor/github.com/Masterminds/semver/v3/Makefile @@ -0,0 +1,31 @@ +GOPATH=$(shell go env GOPATH) +GOLANGCI_LINT=$(GOPATH)/bin/golangci-lint + +.PHONY: lint +lint: $(GOLANGCI_LINT) + @echo "==> Linting codebase" + @$(GOLANGCI_LINT) run + +.PHONY: test +test: + @echo "==> Running tests" + GO111MODULE=on go test -v + +.PHONY: test-cover +test-cover: + @echo "==> Running Tests with coverage" + GO111MODULE=on go test -cover . + +.PHONY: fuzz +fuzz: + @echo "==> Running Fuzz Tests" + go env GOCACHE + go test -fuzz=FuzzNewVersion -fuzztime=15s . + go test -fuzz=FuzzStrictNewVersion -fuzztime=15s . + go test -fuzz=FuzzNewConstraint -fuzztime=15s . + +$(GOLANGCI_LINT): + # Install golangci-lint. The configuration for it is in the .golangci.yml + # file in the root of the repository + echo ${GOPATH} + curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh -s -- -b $(GOPATH)/bin v1.56.2 diff --git a/vendor/github.com/Masterminds/semver/v3/README.md b/vendor/github.com/Masterminds/semver/v3/README.md new file mode 100644 index 000000000..2f56c676a --- /dev/null +++ b/vendor/github.com/Masterminds/semver/v3/README.md @@ -0,0 +1,274 @@ +# SemVer + +The `semver` package provides the ability to work with [Semantic Versions](http://semver.org) in Go. Specifically it provides the ability to: + +* Parse semantic versions +* Sort semantic versions +* Check if a semantic version fits within a set of constraints +* Optionally work with a `v` prefix + +[![Stability: +Active](https://masterminds.github.io/stability/active.svg)](https://masterminds.github.io/stability/active.html) +[![](https://github.com/Masterminds/semver/workflows/Tests/badge.svg)](https://github.com/Masterminds/semver/actions) +[![GoDoc](https://img.shields.io/static/v1?label=godoc&message=reference&color=blue)](https://pkg.go.dev/github.com/Masterminds/semver/v3) +[![Go Report Card](https://goreportcard.com/badge/github.com/Masterminds/semver)](https://goreportcard.com/report/github.com/Masterminds/semver) + +## Package Versions + +Note, import `github.com/Masterminds/semver/v3` to use the latest version. + +There are three major versions fo the `semver` package. + +* 3.x.x is the stable and active version. This version is focused on constraint + compatibility for range handling in other tools from other languages. It has + a similar API to the v1 releases. The development of this version is on the master + branch. The documentation for this version is below. +* 2.x was developed primarily for [dep](https://github.com/golang/dep). There are + no tagged releases and the development was performed by [@sdboyer](https://github.com/sdboyer). + There are API breaking changes from v1. This version lives on the [2.x branch](https://github.com/Masterminds/semver/tree/2.x). +* 1.x.x is the original release. It is no longer maintained. You should use the + v3 release instead. You can read the documentation for the 1.x.x release + [here](https://github.com/Masterminds/semver/blob/release-1/README.md). + +## Parsing Semantic Versions + +There are two functions that can parse semantic versions. The `StrictNewVersion` +function only parses valid version 2 semantic versions as outlined in the +specification. The `NewVersion` function attempts to coerce a version into a +semantic version and parse it. For example, if there is a leading v or a version +listed without all 3 parts (e.g. `v1.2`) it will attempt to coerce it into a valid +semantic version (e.g., 1.2.0). In both cases a `Version` object is returned +that can be sorted, compared, and used in constraints. + +When parsing a version an error is returned if there is an issue parsing the +version. For example, + + v, err := semver.NewVersion("1.2.3-beta.1+build345") + +The version object has methods to get the parts of the version, compare it to +other versions, convert the version back into a string, and get the original +string. Getting the original string is useful if the semantic version was coerced +into a valid form. + +There are package level variables that affect how `NewVersion` handles parsing. + +- `CoerceNewVersion` is `true` by default. When set to `true` it coerces non-compliant + versions into SemVer. For example, allowing a leading 0 in a major, minor, or patch + part. This enables the use of CalVer in versions even when not compliant with SemVer. + When set to `false` less coercion work is done. +- `DetailedNewVersionErrors` provides more detailed errors. It only has an affect when + `CoerceNewVersion` is set to `false`. When `DetailedNewVersionErrors` is set to `true` + it can provide some more insight into why a version is invalid. Setting + `DetailedNewVersionErrors` to `false` is faster on performance but provides less + detailed error messages if a version fails to parse. + +## Sorting Semantic Versions + +A set of versions can be sorted using the `sort` package from the standard library. +For example, + +```go +raw := []string{"1.2.3", "1.0", "1.3", "2", "0.4.2",} +vs := make([]*semver.Version, len(raw)) +for i, r := range raw { + v, err := semver.NewVersion(r) + if err != nil { + t.Errorf("Error parsing version: %s", err) + } + + vs[i] = v +} + +sort.Sort(semver.Collection(vs)) +``` + +## Checking Version Constraints + +There are two methods for comparing versions. One uses comparison methods on +`Version` instances and the other uses `Constraints`. There are some important +differences to notes between these two methods of comparison. + +1. When two versions are compared using functions such as `Compare`, `LessThan`, + and others it will follow the specification and always include pre-releases + within the comparison. It will provide an answer that is valid with the + comparison section of the spec at https://semver.org/#spec-item-11 +2. When constraint checking is used for checks or validation it will follow a + different set of rules that are common for ranges with tools like npm/js + and Rust/Cargo. This includes considering pre-releases to be invalid if the + ranges does not include one. If you want to have it include pre-releases a + simple solution is to include `-0` in your range. +3. Constraint ranges can have some complex rules including the shorthand use of + ~ and ^. For more details on those see the options below. + +There are differences between the two methods or checking versions because the +comparison methods on `Version` follow the specification while comparison ranges +are not part of the specification. Different packages and tools have taken it +upon themselves to come up with range rules. This has resulted in differences. +For example, npm/js and Cargo/Rust follow similar patterns while PHP has a +different pattern for ^. The comparison features in this package follow the +npm/js and Cargo/Rust lead because applications using it have followed similar +patters with their versions. + +Checking a version against version constraints is one of the most featureful +parts of the package. + +```go +c, err := semver.NewConstraint(">= 1.2.3") +if err != nil { + // Handle constraint not being parsable. +} + +v, err := semver.NewVersion("1.3") +if err != nil { + // Handle version not being parsable. +} +// Check if the version meets the constraints. The variable a will be true. +a := c.Check(v) +``` + +### Basic Comparisons + +There are two elements to the comparisons. First, a comparison string is a list +of space or comma separated AND comparisons. These are then separated by || (OR) +comparisons. For example, `">= 1.2 < 3.0.0 || >= 4.2.3"` is looking for a +comparison that's greater than or equal to 1.2 and less than 3.0.0 or is +greater than or equal to 4.2.3. + +The basic comparisons are: + +* `=`: equal (aliased to no operator) +* `!=`: not equal +* `>`: greater than +* `<`: less than +* `>=`: greater than or equal to +* `<=`: less than or equal to + +### Working With Prerelease Versions + +Pre-releases, for those not familiar with them, are used for software releases +prior to stable or generally available releases. Examples of pre-releases include +development, alpha, beta, and release candidate releases. A pre-release may be +a version such as `1.2.3-beta.1` while the stable release would be `1.2.3`. In the +order of precedence, pre-releases come before their associated releases. In this +example `1.2.3-beta.1 < 1.2.3`. + +According to the Semantic Version specification, pre-releases may not be +API compliant with their release counterpart. It says, + +> A pre-release version indicates that the version is unstable and might not satisfy the intended compatibility requirements as denoted by its associated normal version. + +SemVer's comparisons using constraints without a pre-release comparator will skip +pre-release versions. For example, `>=1.2.3` will skip pre-releases when looking +at a list of releases while `>=1.2.3-0` will evaluate and find pre-releases. + +The reason for the `0` as a pre-release version in the example comparison is +because pre-releases can only contain ASCII alphanumerics and hyphens (along with +`.` separators), per the spec. Sorting happens in ASCII sort order, again per the +spec. The lowest character is a `0` in ASCII sort order +(see an [ASCII Table](http://www.asciitable.com/)) + +Understanding ASCII sort ordering is important because A-Z comes before a-z. That +means `>=1.2.3-BETA` will return `1.2.3-alpha`. What you might expect from case +sensitivity doesn't apply here. This is due to ASCII sort ordering which is what +the spec specifies. + +The `Constraints` instance returned from `semver.NewConstraint()` has a property +`IncludePrerelease` that, when set to true, will return prerelease versions when calls +to `Check()` and `Validate()` are made. + +### Hyphen Range Comparisons + +There are multiple methods to handle ranges and the first is hyphens ranges. +These look like: + +* `1.2 - 1.4.5` which is equivalent to `>= 1.2 <= 1.4.5` +* `2.3.4 - 4.5` which is equivalent to `>= 2.3.4 <= 4.5` + +Note that `1.2-1.4.5` without whitespace is parsed completely differently; it's +parsed as a single constraint `1.2.0` with _prerelease_ `1.4.5`. + +### Wildcards In Comparisons + +The `x`, `X`, and `*` characters can be used as a wildcard character. This works +for all comparison operators. When used on the `=` operator it falls +back to the patch level comparison (see tilde below). For example, + +* `1.2.x` is equivalent to `>= 1.2.0, < 1.3.0` +* `>= 1.2.x` is equivalent to `>= 1.2.0` +* `<= 2.x` is equivalent to `< 3` +* `*` is equivalent to `>= 0.0.0` + +### Tilde Range Comparisons (Patch) + +The tilde (`~`) comparison operator is for patch level ranges when a minor +version is specified and major level changes when the minor number is missing. +For example, + +* `~1.2.3` is equivalent to `>= 1.2.3, < 1.3.0` +* `~1` is equivalent to `>= 1, < 2` +* `~2.3` is equivalent to `>= 2.3, < 2.4` +* `~1.2.x` is equivalent to `>= 1.2.0, < 1.3.0` +* `~1.x` is equivalent to `>= 1, < 2` + +### Caret Range Comparisons (Major) + +The caret (`^`) comparison operator is for major level changes once a stable +(1.0.0) release has occurred. Prior to a 1.0.0 release the minor versions acts +as the API stability level. This is useful when comparisons of API versions as a +major change is API breaking. For example, + +* `^1.2.3` is equivalent to `>= 1.2.3, < 2.0.0` +* `^1.2.x` is equivalent to `>= 1.2.0, < 2.0.0` +* `^2.3` is equivalent to `>= 2.3, < 3` +* `^2.x` is equivalent to `>= 2.0.0, < 3` +* `^0.2.3` is equivalent to `>=0.2.3 <0.3.0` +* `^0.2` is equivalent to `>=0.2.0 <0.3.0` +* `^0.0.3` is equivalent to `>=0.0.3 <0.0.4` +* `^0.0` is equivalent to `>=0.0.0 <0.1.0` +* `^0` is equivalent to `>=0.0.0 <1.0.0` + +## Validation + +In addition to testing a version against a constraint, a version can be validated +against a constraint. When validation fails a slice of errors containing why a +version didn't meet the constraint is returned. For example, + +```go +c, err := semver.NewConstraint("<= 1.2.3, >= 1.4") +if err != nil { + // Handle constraint not being parseable. +} + +v, err := semver.NewVersion("1.3") +if err != nil { + // Handle version not being parseable. +} + +// Validate a version against a constraint. +a, msgs := c.Validate(v) +// a is false +for _, m := range msgs { + fmt.Println(m) + + // Loops over the errors which would read + // "1.3 is greater than 1.2.3" + // "1.3 is less than 1.4" +} +``` + +## Contribute + +If you find an issue or want to contribute please file an [issue](https://github.com/Masterminds/semver/issues) +or [create a pull request](https://github.com/Masterminds/semver/pulls). + +## Security + +Security is an important consideration for this project. The project currently +uses the following tools to help discover security issues: + +* [CodeQL](https://codeql.github.com) +* [gosec](https://github.com/securego/gosec) +* Daily Fuzz testing + +If you believe you have found a security vulnerability you can privately disclose +it through the [GitHub security page](https://github.com/Masterminds/semver/security). diff --git a/vendor/github.com/Masterminds/semver/v3/SECURITY.md b/vendor/github.com/Masterminds/semver/v3/SECURITY.md new file mode 100644 index 000000000..a30a66b1f --- /dev/null +++ b/vendor/github.com/Masterminds/semver/v3/SECURITY.md @@ -0,0 +1,19 @@ +# Security Policy + +## Supported Versions + +The following versions of semver are currently supported: + +| Version | Supported | +| ------- | ------------------ | +| 3.x | :white_check_mark: | +| 2.x | :x: | +| 1.x | :x: | + +Fixes are only released for the latest minor version in the form of a patch release. + +## Reporting a Vulnerability + +You can privately disclose a vulnerability through GitHubs +[private vulnerability reporting](https://github.com/Masterminds/semver/security/advisories) +mechanism. diff --git a/vendor/github.com/Masterminds/semver/v3/collection.go b/vendor/github.com/Masterminds/semver/v3/collection.go new file mode 100644 index 000000000..a78235895 --- /dev/null +++ b/vendor/github.com/Masterminds/semver/v3/collection.go @@ -0,0 +1,24 @@ +package semver + +// Collection is a collection of Version instances and implements the sort +// interface. See the sort package for more details. +// https://golang.org/pkg/sort/ +type Collection []*Version + +// Len returns the length of a collection. The number of Version instances +// on the slice. +func (c Collection) Len() int { + return len(c) +} + +// Less is needed for the sort interface to compare two Version objects on the +// slice. If checks if one is less than the other. +func (c Collection) Less(i, j int) bool { + return c[i].LessThan(c[j]) +} + +// Swap is needed for the sort interface to replace the Version objects +// at two different positions in the slice. +func (c Collection) Swap(i, j int) { + c[i], c[j] = c[j], c[i] +} diff --git a/vendor/github.com/Masterminds/semver/v3/constraints.go b/vendor/github.com/Masterminds/semver/v3/constraints.go new file mode 100644 index 000000000..8b7a10f83 --- /dev/null +++ b/vendor/github.com/Masterminds/semver/v3/constraints.go @@ -0,0 +1,601 @@ +package semver + +import ( + "bytes" + "errors" + "fmt" + "regexp" + "strings" +) + +// Constraints is one or more constraint that a semantic version can be +// checked against. +type Constraints struct { + constraints [][]*constraint + containsPre []bool + + // IncludePrerelease specifies if pre-releases should be included in + // the results. Note, if a constraint range has a prerelease than + // prereleases will be included for that AND group even if this is + // set to false. + IncludePrerelease bool +} + +// NewConstraint returns a Constraints instance that a Version instance can +// be checked against. If there is a parse error it will be returned. +func NewConstraint(c string) (*Constraints, error) { + + // Rewrite - ranges into a comparison operation. + c = rewriteRange(c) + + ors := strings.Split(c, "||") + lenors := len(ors) + or := make([][]*constraint, lenors) + hasPre := make([]bool, lenors) + for k, v := range ors { + // Validate the segment + if !validConstraintRegex.MatchString(v) { + return nil, fmt.Errorf("improper constraint: %s", v) + } + + cs := findConstraintRegex.FindAllString(v, -1) + if cs == nil { + cs = append(cs, v) + } + result := make([]*constraint, len(cs)) + for i, s := range cs { + pc, err := parseConstraint(s) + if err != nil { + return nil, err + } + + // If one of the constraints has a prerelease record this. + // This information is used when checking all in an "and" + // group to ensure they all check for prereleases. + if pc.con.pre != "" { + hasPre[k] = true + } + + result[i] = pc + } + or[k] = result + } + + o := &Constraints{ + constraints: or, + containsPre: hasPre, + } + return o, nil +} + +// Check tests if a version satisfies the constraints. +func (cs Constraints) Check(v *Version) bool { + // TODO(mattfarina): For v4 of this library consolidate the Check and Validate + // functions as the underlying functions make that possible now. + // loop over the ORs and check the inner ANDs + for i, o := range cs.constraints { + joy := true + for _, c := range o { + if check, _ := c.check(v, (cs.IncludePrerelease || cs.containsPre[i])); !check { + joy = false + break + } + } + + if joy { + return true + } + } + + return false +} + +// Validate checks if a version satisfies a constraint. If not a slice of +// reasons for the failure are returned in addition to a bool. +func (cs Constraints) Validate(v *Version) (bool, []error) { + // loop over the ORs and check the inner ANDs + var e []error + + // Capture the prerelease message only once. When it happens the first time + // this var is marked + var prerelesase bool + for i, o := range cs.constraints { + joy := true + for _, c := range o { + // Before running the check handle the case there the version is + // a prerelease and the check is not searching for prereleases. + if !(cs.IncludePrerelease || cs.containsPre[i]) && v.pre != "" { + if !prerelesase { + em := fmt.Errorf("%s is a prerelease version and the constraint is only looking for release versions", v) + e = append(e, em) + prerelesase = true + } + joy = false + + } else { + + if _, err := c.check(v, (cs.IncludePrerelease || cs.containsPre[i])); err != nil { + e = append(e, err) + joy = false + } + } + } + + if joy { + return true, []error{} + } + } + + return false, e +} + +func (cs Constraints) String() string { + buf := make([]string, len(cs.constraints)) + var tmp bytes.Buffer + + for k, v := range cs.constraints { + tmp.Reset() + vlen := len(v) + for kk, c := range v { + tmp.WriteString(c.string()) + + // Space separate the AND conditions + if vlen > 1 && kk < vlen-1 { + tmp.WriteString(" ") + } + } + buf[k] = tmp.String() + } + + return strings.Join(buf, " || ") +} + +// UnmarshalText implements the encoding.TextUnmarshaler interface. +func (cs *Constraints) UnmarshalText(text []byte) error { + temp, err := NewConstraint(string(text)) + if err != nil { + return err + } + + *cs = *temp + + return nil +} + +// MarshalText implements the encoding.TextMarshaler interface. +func (cs Constraints) MarshalText() ([]byte, error) { + return []byte(cs.String()), nil +} + +var constraintOps map[string]cfunc +var constraintRegex *regexp.Regexp +var constraintRangeRegex *regexp.Regexp + +// Used to find individual constraints within a multi-constraint string +var findConstraintRegex *regexp.Regexp + +// Used to validate an segment of ANDs is valid +var validConstraintRegex *regexp.Regexp + +const cvRegex string = `v?([0-9|x|X|\*]+)(\.[0-9|x|X|\*]+)?(\.[0-9|x|X|\*]+)?` + + `(-([0-9A-Za-z\-]+(\.[0-9A-Za-z\-]+)*))?` + + `(\+([0-9A-Za-z\-]+(\.[0-9A-Za-z\-]+)*))?` + +func init() { + constraintOps = map[string]cfunc{ + "": constraintTildeOrEqual, + "=": constraintTildeOrEqual, + "!=": constraintNotEqual, + ">": constraintGreaterThan, + "<": constraintLessThan, + ">=": constraintGreaterThanEqual, + "=>": constraintGreaterThanEqual, + "<=": constraintLessThanEqual, + "=<": constraintLessThanEqual, + "~": constraintTilde, + "~>": constraintTilde, + "^": constraintCaret, + } + + ops := `=||!=|>|<|>=|=>|<=|=<|~|~>|\^` + + constraintRegex = regexp.MustCompile(fmt.Sprintf( + `^\s*(%s)\s*(%s)\s*$`, + ops, + cvRegex)) + + constraintRangeRegex = regexp.MustCompile(fmt.Sprintf( + `\s*(%s)\s+-\s+(%s)\s*`, + cvRegex, cvRegex)) + + findConstraintRegex = regexp.MustCompile(fmt.Sprintf( + `(%s)\s*(%s)`, + ops, + cvRegex)) + + // The first time a constraint shows up will look slightly different from + // future times it shows up due to a leading space or comma in a given + // string. + validConstraintRegex = regexp.MustCompile(fmt.Sprintf( + `^(\s*(%s)\s*(%s)\s*)((?:\s+|,\s*)(%s)\s*(%s)\s*)*$`, + ops, + cvRegex, + ops, + cvRegex)) +} + +// An individual constraint +type constraint struct { + // The version used in the constraint check. For example, if a constraint + // is '<= 2.0.0' the con a version instance representing 2.0.0. + con *Version + + // The original parsed version (e.g., 4.x from != 4.x) + orig string + + // The original operator for the constraint + origfunc string + + // When an x is used as part of the version (e.g., 1.x) + minorDirty bool + dirty bool + patchDirty bool +} + +// Check if a version meets the constraint +func (c *constraint) check(v *Version, includePre bool) (bool, error) { + return constraintOps[c.origfunc](v, c, includePre) +} + +// String prints an individual constraint into a string +func (c *constraint) string() string { + return c.origfunc + c.orig +} + +type cfunc func(v *Version, c *constraint, includePre bool) (bool, error) + +func parseConstraint(c string) (*constraint, error) { + if len(c) > 0 { + m := constraintRegex.FindStringSubmatch(c) + if m == nil { + return nil, fmt.Errorf("improper constraint: %s", c) + } + + cs := &constraint{ + orig: m[2], + origfunc: m[1], + } + + ver := m[2] + minorDirty := false + patchDirty := false + dirty := false + if isX(m[3]) || m[3] == "" { + ver = fmt.Sprintf("0.0.0%s", m[6]) + dirty = true + } else if isX(strings.TrimPrefix(m[4], ".")) || m[4] == "" { + minorDirty = true + dirty = true + ver = fmt.Sprintf("%s.0.0%s", m[3], m[6]) + } else if isX(strings.TrimPrefix(m[5], ".")) || m[5] == "" { + dirty = true + patchDirty = true + ver = fmt.Sprintf("%s%s.0%s", m[3], m[4], m[6]) + } + + con, err := NewVersion(ver) + if err != nil { + + // The constraintRegex should catch any regex parsing errors. So, + // we should never get here. + return nil, errors.New("constraint parser error") + } + + cs.con = con + cs.minorDirty = minorDirty + cs.patchDirty = patchDirty + cs.dirty = dirty + + return cs, nil + } + + // The rest is the special case where an empty string was passed in which + // is equivalent to * or >=0.0.0 + con, err := StrictNewVersion("0.0.0") + if err != nil { + + // The constraintRegex should catch any regex parsing errors. So, + // we should never get here. + return nil, errors.New("constraint parser error") + } + + cs := &constraint{ + con: con, + orig: c, + origfunc: "", + minorDirty: false, + patchDirty: false, + dirty: true, + } + return cs, nil +} + +// Constraint functions +func constraintNotEqual(v *Version, c *constraint, includePre bool) (bool, error) { + // The existence of prereleases is checked at the group level and passed in. + // Exit early if the version has a prerelease but those are to be ignored. + if v.Prerelease() != "" && !includePre { + return false, fmt.Errorf("%s is a prerelease version and the constraint is only looking for release versions", v) + } + + if c.dirty { + if c.con.Major() != v.Major() { + return true, nil + } + if c.con.Minor() != v.Minor() && !c.minorDirty { + return true, nil + } else if c.minorDirty { + return false, fmt.Errorf("%s is equal to %s", v, c.orig) + } else if c.con.Patch() != v.Patch() && !c.patchDirty { + return true, nil + } else if c.patchDirty { + // Need to handle prereleases if present + if v.Prerelease() != "" || c.con.Prerelease() != "" { + eq := comparePrerelease(v.Prerelease(), c.con.Prerelease()) != 0 + if eq { + return true, nil + } + return false, fmt.Errorf("%s is equal to %s", v, c.orig) + } + return false, fmt.Errorf("%s is equal to %s", v, c.orig) + } + } + + eq := v.Equal(c.con) + if eq { + return false, fmt.Errorf("%s is equal to %s", v, c.orig) + } + + return true, nil +} + +func constraintGreaterThan(v *Version, c *constraint, includePre bool) (bool, error) { + + // The existence of prereleases is checked at the group level and passed in. + // Exit early if the version has a prerelease but those are to be ignored. + if v.Prerelease() != "" && !includePre { + return false, fmt.Errorf("%s is a prerelease version and the constraint is only looking for release versions", v) + } + + var eq bool + + if !c.dirty { + eq = v.Compare(c.con) == 1 + if eq { + return true, nil + } + return false, fmt.Errorf("%s is less than or equal to %s", v, c.orig) + } + + if v.Major() > c.con.Major() { + return true, nil + } else if v.Major() < c.con.Major() { + return false, fmt.Errorf("%s is less than or equal to %s", v, c.orig) + } else if c.minorDirty { + // This is a range case such as >11. When the version is something like + // 11.1.0 is it not > 11. For that we would need 12 or higher + return false, fmt.Errorf("%s is less than or equal to %s", v, c.orig) + } else if c.patchDirty { + // This is for ranges such as >11.1. A version of 11.1.1 is not greater + // which one of 11.2.1 is greater + eq = v.Minor() > c.con.Minor() + if eq { + return true, nil + } + return false, fmt.Errorf("%s is less than or equal to %s", v, c.orig) + } + + // If we have gotten here we are not comparing pre-preleases and can use the + // Compare function to accomplish that. + eq = v.Compare(c.con) == 1 + if eq { + return true, nil + } + return false, fmt.Errorf("%s is less than or equal to %s", v, c.orig) +} + +func constraintLessThan(v *Version, c *constraint, includePre bool) (bool, error) { + // The existence of prereleases is checked at the group level and passed in. + // Exit early if the version has a prerelease but those are to be ignored. + if v.Prerelease() != "" && !includePre { + return false, fmt.Errorf("%s is a prerelease version and the constraint is only looking for release versions", v) + } + + eq := v.Compare(c.con) < 0 + if eq { + return true, nil + } + return false, fmt.Errorf("%s is greater than or equal to %s", v, c.orig) +} + +func constraintGreaterThanEqual(v *Version, c *constraint, includePre bool) (bool, error) { + + // The existence of prereleases is checked at the group level and passed in. + // Exit early if the version has a prerelease but those are to be ignored. + if v.Prerelease() != "" && !includePre { + return false, fmt.Errorf("%s is a prerelease version and the constraint is only looking for release versions", v) + } + + eq := v.Compare(c.con) >= 0 + if eq { + return true, nil + } + return false, fmt.Errorf("%s is less than %s", v, c.orig) +} + +func constraintLessThanEqual(v *Version, c *constraint, includePre bool) (bool, error) { + // The existence of prereleases is checked at the group level and passed in. + // Exit early if the version has a prerelease but those are to be ignored. + if v.Prerelease() != "" && !includePre { + return false, fmt.Errorf("%s is a prerelease version and the constraint is only looking for release versions", v) + } + + var eq bool + + if !c.dirty { + eq = v.Compare(c.con) <= 0 + if eq { + return true, nil + } + return false, fmt.Errorf("%s is greater than %s", v, c.orig) + } + + if v.Major() > c.con.Major() { + return false, fmt.Errorf("%s is greater than %s", v, c.orig) + } else if v.Major() == c.con.Major() && v.Minor() > c.con.Minor() && !c.minorDirty { + return false, fmt.Errorf("%s is greater than %s", v, c.orig) + } + + return true, nil +} + +// ~*, ~>* --> >= 0.0.0 (any) +// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0, <3.0.0 +// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0, <2.1.0 +// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0, <1.3.0 +// ~1.2.3, ~>1.2.3 --> >=1.2.3, <1.3.0 +// ~1.2.0, ~>1.2.0 --> >=1.2.0, <1.3.0 +func constraintTilde(v *Version, c *constraint, includePre bool) (bool, error) { + // The existence of prereleases is checked at the group level and passed in. + // Exit early if the version has a prerelease but those are to be ignored. + if v.Prerelease() != "" && !includePre { + return false, fmt.Errorf("%s is a prerelease version and the constraint is only looking for release versions", v) + } + + if v.LessThan(c.con) { + return false, fmt.Errorf("%s is less than %s", v, c.orig) + } + + // ~0.0.0 is a special case where all constraints are accepted. It's + // equivalent to >= 0.0.0. + if c.con.Major() == 0 && c.con.Minor() == 0 && c.con.Patch() == 0 && + !c.minorDirty && !c.patchDirty { + return true, nil + } + + if v.Major() != c.con.Major() { + return false, fmt.Errorf("%s does not have same major version as %s", v, c.orig) + } + + if v.Minor() != c.con.Minor() && !c.minorDirty { + return false, fmt.Errorf("%s does not have same major and minor version as %s", v, c.orig) + } + + return true, nil +} + +// When there is a .x (dirty) status it automatically opts in to ~. Otherwise +// it's a straight = +func constraintTildeOrEqual(v *Version, c *constraint, includePre bool) (bool, error) { + // The existence of prereleases is checked at the group level and passed in. + // Exit early if the version has a prerelease but those are to be ignored. + if v.Prerelease() != "" && !includePre { + return false, fmt.Errorf("%s is a prerelease version and the constraint is only looking for release versions", v) + } + + if c.dirty { + return constraintTilde(v, c, includePre) + } + + eq := v.Equal(c.con) + if eq { + return true, nil + } + + return false, fmt.Errorf("%s is not equal to %s", v, c.orig) +} + +// ^* --> (any) +// ^1.2.3 --> >=1.2.3 <2.0.0 +// ^1.2 --> >=1.2.0 <2.0.0 +// ^1 --> >=1.0.0 <2.0.0 +// ^0.2.3 --> >=0.2.3 <0.3.0 +// ^0.2 --> >=0.2.0 <0.3.0 +// ^0.0.3 --> >=0.0.3 <0.0.4 +// ^0.0 --> >=0.0.0 <0.1.0 +// ^0 --> >=0.0.0 <1.0.0 +func constraintCaret(v *Version, c *constraint, includePre bool) (bool, error) { + // The existence of prereleases is checked at the group level and passed in. + // Exit early if the version has a prerelease but those are to be ignored. + if v.Prerelease() != "" && !includePre { + return false, fmt.Errorf("%s is a prerelease version and the constraint is only looking for release versions", v) + } + + // This less than handles prereleases + if v.LessThan(c.con) { + return false, fmt.Errorf("%s is less than %s", v, c.orig) + } + + var eq bool + + // ^ when the major > 0 is >=x.y.z < x+1 + if c.con.Major() > 0 || c.minorDirty { + + // ^ has to be within a major range for > 0. Everything less than was + // filtered out with the LessThan call above. This filters out those + // that greater but not within the same major range. + eq = v.Major() == c.con.Major() + if eq { + return true, nil + } + return false, fmt.Errorf("%s does not have same major version as %s", v, c.orig) + } + + // ^ when the major is 0 and minor > 0 is >=0.y.z < 0.y+1 + if c.con.Major() == 0 && v.Major() > 0 { + return false, fmt.Errorf("%s does not have same major version as %s", v, c.orig) + } + // If the con Minor is > 0 it is not dirty + if c.con.Minor() > 0 || c.patchDirty { + eq = v.Minor() == c.con.Minor() + if eq { + return true, nil + } + return false, fmt.Errorf("%s does not have same minor version as %s. Expected minor versions to match when constraint major version is 0", v, c.orig) + } + // ^ when the minor is 0 and minor > 0 is =0.0.z + if c.con.Minor() == 0 && v.Minor() > 0 { + return false, fmt.Errorf("%s does not have same minor version as %s", v, c.orig) + } + + // At this point the major is 0 and the minor is 0 and not dirty. The patch + // is not dirty so we need to check if they are equal. If they are not equal + eq = c.con.Patch() == v.Patch() + if eq { + return true, nil + } + return false, fmt.Errorf("%s does not equal %s. Expect version and constraint to equal when major and minor versions are 0", v, c.orig) +} + +func isX(x string) bool { + switch x { + case "x", "*", "X": + return true + default: + return false + } +} + +func rewriteRange(i string) string { + m := constraintRangeRegex.FindAllStringSubmatch(i, -1) + if m == nil { + return i + } + o := i + for _, v := range m { + t := fmt.Sprintf(">= %s, <= %s ", v[1], v[11]) + o = strings.Replace(o, v[0], t, 1) + } + + return o +} diff --git a/vendor/github.com/Masterminds/semver/v3/doc.go b/vendor/github.com/Masterminds/semver/v3/doc.go new file mode 100644 index 000000000..74f97caa5 --- /dev/null +++ b/vendor/github.com/Masterminds/semver/v3/doc.go @@ -0,0 +1,184 @@ +/* +Package semver provides the ability to work with Semantic Versions (http://semver.org) in Go. + +Specifically it provides the ability to: + + - Parse semantic versions + - Sort semantic versions + - Check if a semantic version fits within a set of constraints + - Optionally work with a `v` prefix + +# Parsing Semantic Versions + +There are two functions that can parse semantic versions. The `StrictNewVersion` +function only parses valid version 2 semantic versions as outlined in the +specification. The `NewVersion` function attempts to coerce a version into a +semantic version and parse it. For example, if there is a leading v or a version +listed without all 3 parts (e.g. 1.2) it will attempt to coerce it into a valid +semantic version (e.g., 1.2.0). In both cases a `Version` object is returned +that can be sorted, compared, and used in constraints. + +When parsing a version an optional error can be returned if there is an issue +parsing the version. For example, + + v, err := semver.NewVersion("1.2.3-beta.1+b345") + +The version object has methods to get the parts of the version, compare it to +other versions, convert the version back into a string, and get the original +string. For more details please see the documentation +at https://godoc.org/github.com/Masterminds/semver. + +# Sorting Semantic Versions + +A set of versions can be sorted using the `sort` package from the standard library. +For example, + + raw := []string{"1.2.3", "1.0", "1.3", "2", "0.4.2",} + vs := make([]*semver.Version, len(raw)) + for i, r := range raw { + v, err := semver.NewVersion(r) + if err != nil { + t.Errorf("Error parsing version: %s", err) + } + + vs[i] = v + } + + sort.Sort(semver.Collection(vs)) + +# Checking Version Constraints and Comparing Versions + +There are two methods for comparing versions. One uses comparison methods on +`Version` instances and the other is using Constraints. There are some important +differences to notes between these two methods of comparison. + + 1. When two versions are compared using functions such as `Compare`, `LessThan`, + and others it will follow the specification and always include prereleases + within the comparison. It will provide an answer valid with the comparison + spec section at https://semver.org/#spec-item-11 + 2. When constraint checking is used for checks or validation it will follow a + different set of rules that are common for ranges with tools like npm/js + and Rust/Cargo. This includes considering prereleases to be invalid if the + ranges does not include on. If you want to have it include pre-releases a + simple solution is to include `-0` in your range. + 3. Constraint ranges can have some complex rules including the shorthard use of + ~ and ^. For more details on those see the options below. + +There are differences between the two methods or checking versions because the +comparison methods on `Version` follow the specification while comparison ranges +are not part of the specification. Different packages and tools have taken it +upon themselves to come up with range rules. This has resulted in differences. +For example, npm/js and Cargo/Rust follow similar patterns which PHP has a +different pattern for ^. The comparison features in this package follow the +npm/js and Cargo/Rust lead because applications using it have followed similar +patters with their versions. + +Checking a version against version constraints is one of the most featureful +parts of the package. + + c, err := semver.NewConstraint(">= 1.2.3") + if err != nil { + // Handle constraint not being parsable. + } + + v, err := semver.NewVersion("1.3") + if err != nil { + // Handle version not being parsable. + } + // Check if the version meets the constraints. The a variable will be true. + a := c.Check(v) + +# Basic Comparisons + +There are two elements to the comparisons. First, a comparison string is a list +of comma or space separated AND comparisons. These are then separated by || (OR) +comparisons. For example, `">= 1.2 < 3.0.0 || >= 4.2.3"` is looking for a +comparison that's greater than or equal to 1.2 and less than 3.0.0 or is +greater than or equal to 4.2.3. This can also be written as +`">= 1.2, < 3.0.0 || >= 4.2.3"` + +The basic comparisons are: + + - `=`: equal (aliased to no operator) + - `!=`: not equal + - `>`: greater than + - `<`: less than + - `>=`: greater than or equal to + - `<=`: less than or equal to + +# Hyphen Range Comparisons + +There are multiple methods to handle ranges and the first is hyphens ranges. +These look like: + + - `1.2 - 1.4.5` which is equivalent to `>= 1.2, <= 1.4.5` + - `2.3.4 - 4.5` which is equivalent to `>= 2.3.4 <= 4.5` + +# Wildcards In Comparisons + +The `x`, `X`, and `*` characters can be used as a wildcard character. This works +for all comparison operators. When used on the `=` operator it falls +back to the tilde operation. For example, + + - `1.2.x` is equivalent to `>= 1.2.0 < 1.3.0` + - `>= 1.2.x` is equivalent to `>= 1.2.0` + - `<= 2.x` is equivalent to `<= 3` + - `*` is equivalent to `>= 0.0.0` + +Tilde Range Comparisons (Patch) + +The tilde (`~`) comparison operator is for patch level ranges when a minor +version is specified and major level changes when the minor number is missing. +For example, + + - `~1.2.3` is equivalent to `>= 1.2.3 < 1.3.0` + - `~1` is equivalent to `>= 1, < 2` + - `~2.3` is equivalent to `>= 2.3 < 2.4` + - `~1.2.x` is equivalent to `>= 1.2.0 < 1.3.0` + - `~1.x` is equivalent to `>= 1 < 2` + +Caret Range Comparisons (Major) + +The caret (`^`) comparison operator is for major level changes once a stable +(1.0.0) release has occurred. Prior to a 1.0.0 release the minor versions acts +as the API stability level. This is useful when comparisons of API versions as a +major change is API breaking. For example, + + - `^1.2.3` is equivalent to `>= 1.2.3, < 2.0.0` + - `^1.2.x` is equivalent to `>= 1.2.0, < 2.0.0` + - `^2.3` is equivalent to `>= 2.3, < 3` + - `^2.x` is equivalent to `>= 2.0.0, < 3` + - `^0.2.3` is equivalent to `>=0.2.3 <0.3.0` + - `^0.2` is equivalent to `>=0.2.0 <0.3.0` + - `^0.0.3` is equivalent to `>=0.0.3 <0.0.4` + - `^0.0` is equivalent to `>=0.0.0 <0.1.0` + - `^0` is equivalent to `>=0.0.0 <1.0.0` + +# Validation + +In addition to testing a version against a constraint, a version can be validated +against a constraint. When validation fails a slice of errors containing why a +version didn't meet the constraint is returned. For example, + + c, err := semver.NewConstraint("<= 1.2.3, >= 1.4") + if err != nil { + // Handle constraint not being parseable. + } + + v, _ := semver.NewVersion("1.3") + if err != nil { + // Handle version not being parseable. + } + + // Validate a version against a constraint. + a, msgs := c.Validate(v) + // a is false + for _, m := range msgs { + fmt.Println(m) + + // Loops over the errors which would read + // "1.3 is greater than 1.2.3" + // "1.3 is less than 1.4" + } +*/ +package semver diff --git a/vendor/github.com/Masterminds/semver/v3/version.go b/vendor/github.com/Masterminds/semver/v3/version.go new file mode 100644 index 000000000..7a3ba7388 --- /dev/null +++ b/vendor/github.com/Masterminds/semver/v3/version.go @@ -0,0 +1,788 @@ +package semver + +import ( + "bytes" + "database/sql/driver" + "encoding/json" + "errors" + "fmt" + "regexp" + "strconv" + "strings" +) + +// The compiled version of the regex created at init() is cached here so it +// only needs to be created once. +var versionRegex *regexp.Regexp +var looseVersionRegex *regexp.Regexp + +// CoerceNewVersion sets if leading 0's are allowd in the version part. Leading 0's are +// not allowed in a valid semantic version. When set to true, NewVersion will coerce +// leading 0's into a valid version. +var CoerceNewVersion = true + +// DetailedNewVersionErrors specifies if detailed errors are returned from the NewVersion +// function. This is used when CoerceNewVersion is set to false. If set to false +// ErrInvalidSemVer is returned for an invalid version. This does not apply to +// StrictNewVersion. Setting this function to false returns errors more quickly. +var DetailedNewVersionErrors = true + +var ( + // ErrInvalidSemVer is returned a version is found to be invalid when + // being parsed. + ErrInvalidSemVer = errors.New("invalid semantic version") + + // ErrEmptyString is returned when an empty string is passed in for parsing. + ErrEmptyString = errors.New("version string empty") + + // ErrInvalidCharacters is returned when invalid characters are found as + // part of a version + ErrInvalidCharacters = errors.New("invalid characters in version") + + // ErrSegmentStartsZero is returned when a version segment starts with 0. + // This is invalid in SemVer. + ErrSegmentStartsZero = errors.New("version segment starts with 0") + + // ErrInvalidMetadata is returned when the metadata is an invalid format + ErrInvalidMetadata = errors.New("invalid metadata string") + + // ErrInvalidPrerelease is returned when the pre-release is an invalid format + ErrInvalidPrerelease = errors.New("invalid prerelease string") +) + +// semVerRegex is the regular expression used to parse a semantic version. +// This is not the official regex from the semver spec. It has been modified to allow for loose handling +// where versions like 2.1 are detected. +const semVerRegex string = `v?(0|[1-9]\d*)(?:\.(0|[1-9]\d*))?(?:\.(0|[1-9]\d*))?` + + `(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?` + + `(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?` + +// looseSemVerRegex is a regular expression that lets invalid semver expressions through +// with enough detail that certain errors can be checked for. +const looseSemVerRegex string = `v?([0-9]+)(\.[0-9]+)?(\.[0-9]+)?` + + `(-([0-9A-Za-z\-]+(\.[0-9A-Za-z\-]+)*))?` + + `(\+([0-9A-Za-z\-]+(\.[0-9A-Za-z\-]+)*))?` + +// Version represents a single semantic version. +type Version struct { + major, minor, patch uint64 + pre string + metadata string + original string +} + +func init() { + versionRegex = regexp.MustCompile("^" + semVerRegex + "$") + looseVersionRegex = regexp.MustCompile("^" + looseSemVerRegex + "$") +} + +const ( + num string = "0123456789" + allowed string = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-" + num +) + +// StrictNewVersion parses a given version and returns an instance of Version or +// an error if unable to parse the version. Only parses valid semantic versions. +// Performs checking that can find errors within the version. +// If you want to coerce a version such as 1 or 1.2 and parse it as the 1.x +// releases of semver did, use the NewVersion() function. +func StrictNewVersion(v string) (*Version, error) { + // Parsing here does not use RegEx in order to increase performance and reduce + // allocations. + + if len(v) == 0 { + return nil, ErrEmptyString + } + + // Split the parts into [0]major, [1]minor, and [2]patch,prerelease,build + parts := strings.SplitN(v, ".", 3) + if len(parts) != 3 { + return nil, ErrInvalidSemVer + } + + sv := &Version{ + original: v, + } + + // Extract build metadata + if strings.Contains(parts[2], "+") { + extra := strings.SplitN(parts[2], "+", 2) + sv.metadata = extra[1] + parts[2] = extra[0] + if err := validateMetadata(sv.metadata); err != nil { + return nil, err + } + } + + // Extract build prerelease + if strings.Contains(parts[2], "-") { + extra := strings.SplitN(parts[2], "-", 2) + sv.pre = extra[1] + parts[2] = extra[0] + if err := validatePrerelease(sv.pre); err != nil { + return nil, err + } + } + + // Validate the number segments are valid. This includes only having positive + // numbers and no leading 0's. + for _, p := range parts { + if !containsOnly(p, num) { + return nil, ErrInvalidCharacters + } + + if len(p) > 1 && p[0] == '0' { + return nil, ErrSegmentStartsZero + } + } + + // Extract major, minor, and patch + var err error + sv.major, err = strconv.ParseUint(parts[0], 10, 64) + if err != nil { + return nil, err + } + + sv.minor, err = strconv.ParseUint(parts[1], 10, 64) + if err != nil { + return nil, err + } + + sv.patch, err = strconv.ParseUint(parts[2], 10, 64) + if err != nil { + return nil, err + } + + return sv, nil +} + +// NewVersion parses a given version and returns an instance of Version or +// an error if unable to parse the version. If the version is SemVer-ish it +// attempts to convert it to SemVer. If you want to validate it was a strict +// semantic version at parse time see StrictNewVersion(). +func NewVersion(v string) (*Version, error) { + if CoerceNewVersion { + return coerceNewVersion(v) + } + m := versionRegex.FindStringSubmatch(v) + if m == nil { + + // Disabling detailed errors is first so that it is in the fast path. + if !DetailedNewVersionErrors { + return nil, ErrInvalidSemVer + } + + // Check for specific errors with the semver string and return a more detailed + // error. + m = looseVersionRegex.FindStringSubmatch(v) + if m == nil { + return nil, ErrInvalidSemVer + } + err := validateVersion(m) + if err != nil { + return nil, err + } + return nil, ErrInvalidSemVer + } + + sv := &Version{ + metadata: m[5], + pre: m[4], + original: v, + } + + var err error + sv.major, err = strconv.ParseUint(m[1], 10, 64) + if err != nil { + return nil, fmt.Errorf("error parsing version segment: %w", err) + } + + if m[2] != "" { + sv.minor, err = strconv.ParseUint(m[2], 10, 64) + if err != nil { + return nil, fmt.Errorf("error parsing version segment: %w", err) + } + } else { + sv.minor = 0 + } + + if m[3] != "" { + sv.patch, err = strconv.ParseUint(m[3], 10, 64) + if err != nil { + return nil, fmt.Errorf("error parsing version segment: %w", err) + } + } else { + sv.patch = 0 + } + + // Perform some basic due diligence on the extra parts to ensure they are + // valid. + + if sv.pre != "" { + if err = validatePrerelease(sv.pre); err != nil { + return nil, err + } + } + + if sv.metadata != "" { + if err = validateMetadata(sv.metadata); err != nil { + return nil, err + } + } + + return sv, nil +} + +func coerceNewVersion(v string) (*Version, error) { + m := looseVersionRegex.FindStringSubmatch(v) + if m == nil { + return nil, ErrInvalidSemVer + } + + sv := &Version{ + metadata: m[8], + pre: m[5], + original: v, + } + + var err error + sv.major, err = strconv.ParseUint(m[1], 10, 64) + if err != nil { + return nil, fmt.Errorf("error parsing version segment: %w", err) + } + + if m[2] != "" { + sv.minor, err = strconv.ParseUint(strings.TrimPrefix(m[2], "."), 10, 64) + if err != nil { + return nil, fmt.Errorf("error parsing version segment: %w", err) + } + } else { + sv.minor = 0 + } + + if m[3] != "" { + sv.patch, err = strconv.ParseUint(strings.TrimPrefix(m[3], "."), 10, 64) + if err != nil { + return nil, fmt.Errorf("error parsing version segment: %w", err) + } + } else { + sv.patch = 0 + } + + // Perform some basic due diligence on the extra parts to ensure they are + // valid. + + if sv.pre != "" { + if err = validatePrerelease(sv.pre); err != nil { + return nil, err + } + } + + if sv.metadata != "" { + if err = validateMetadata(sv.metadata); err != nil { + return nil, err + } + } + + return sv, nil +} + +// New creates a new instance of Version with each of the parts passed in as +// arguments instead of parsing a version string. +func New(major, minor, patch uint64, pre, metadata string) *Version { + v := Version{ + major: major, + minor: minor, + patch: patch, + pre: pre, + metadata: metadata, + original: "", + } + + v.original = v.String() + + return &v +} + +// MustParse parses a given version and panics on error. +func MustParse(v string) *Version { + sv, err := NewVersion(v) + if err != nil { + panic(err) + } + return sv +} + +// String converts a Version object to a string. +// Note, if the original version contained a leading v this version will not. +// See the Original() method to retrieve the original value. Semantic Versions +// don't contain a leading v per the spec. Instead it's optional on +// implementation. +func (v Version) String() string { + var buf bytes.Buffer + + fmt.Fprintf(&buf, "%d.%d.%d", v.major, v.minor, v.patch) + if v.pre != "" { + fmt.Fprintf(&buf, "-%s", v.pre) + } + if v.metadata != "" { + fmt.Fprintf(&buf, "+%s", v.metadata) + } + + return buf.String() +} + +// Original returns the original value passed in to be parsed. +func (v *Version) Original() string { + return v.original +} + +// Major returns the major version. +func (v Version) Major() uint64 { + return v.major +} + +// Minor returns the minor version. +func (v Version) Minor() uint64 { + return v.minor +} + +// Patch returns the patch version. +func (v Version) Patch() uint64 { + return v.patch +} + +// Prerelease returns the pre-release version. +func (v Version) Prerelease() string { + return v.pre +} + +// Metadata returns the metadata on the version. +func (v Version) Metadata() string { + return v.metadata +} + +// originalVPrefix returns the original 'v' prefix if any. +func (v Version) originalVPrefix() string { + // Note, only lowercase v is supported as a prefix by the parser. + if v.original != "" && v.original[:1] == "v" { + return v.original[:1] + } + return "" +} + +// IncPatch produces the next patch version. +// If the current version does not have prerelease/metadata information, +// it unsets metadata and prerelease values, increments patch number. +// If the current version has any of prerelease or metadata information, +// it unsets both values and keeps current patch value +func (v Version) IncPatch() Version { + vNext := v + // according to http://semver.org/#spec-item-9 + // Pre-release versions have a lower precedence than the associated normal version. + // according to http://semver.org/#spec-item-10 + // Build metadata SHOULD be ignored when determining version precedence. + if v.pre != "" { + vNext.metadata = "" + vNext.pre = "" + } else { + vNext.metadata = "" + vNext.pre = "" + vNext.patch = v.patch + 1 + } + vNext.original = v.originalVPrefix() + "" + vNext.String() + return vNext +} + +// IncMinor produces the next minor version. +// Sets patch to 0. +// Increments minor number. +// Unsets metadata. +// Unsets prerelease status. +func (v Version) IncMinor() Version { + vNext := v + vNext.metadata = "" + vNext.pre = "" + vNext.patch = 0 + vNext.minor = v.minor + 1 + vNext.original = v.originalVPrefix() + "" + vNext.String() + return vNext +} + +// IncMajor produces the next major version. +// Sets patch to 0. +// Sets minor to 0. +// Increments major number. +// Unsets metadata. +// Unsets prerelease status. +func (v Version) IncMajor() Version { + vNext := v + vNext.metadata = "" + vNext.pre = "" + vNext.patch = 0 + vNext.minor = 0 + vNext.major = v.major + 1 + vNext.original = v.originalVPrefix() + "" + vNext.String() + return vNext +} + +// SetPrerelease defines the prerelease value. +// Value must not include the required 'hyphen' prefix. +func (v Version) SetPrerelease(prerelease string) (Version, error) { + vNext := v + if len(prerelease) > 0 { + if err := validatePrerelease(prerelease); err != nil { + return vNext, err + } + } + vNext.pre = prerelease + vNext.original = v.originalVPrefix() + "" + vNext.String() + return vNext, nil +} + +// SetMetadata defines metadata value. +// Value must not include the required 'plus' prefix. +func (v Version) SetMetadata(metadata string) (Version, error) { + vNext := v + if len(metadata) > 0 { + if err := validateMetadata(metadata); err != nil { + return vNext, err + } + } + vNext.metadata = metadata + vNext.original = v.originalVPrefix() + "" + vNext.String() + return vNext, nil +} + +// LessThan tests if one version is less than another one. +func (v *Version) LessThan(o *Version) bool { + return v.Compare(o) < 0 +} + +// LessThanEqual tests if one version is less or equal than another one. +func (v *Version) LessThanEqual(o *Version) bool { + return v.Compare(o) <= 0 +} + +// GreaterThan tests if one version is greater than another one. +func (v *Version) GreaterThan(o *Version) bool { + return v.Compare(o) > 0 +} + +// GreaterThanEqual tests if one version is greater or equal than another one. +func (v *Version) GreaterThanEqual(o *Version) bool { + return v.Compare(o) >= 0 +} + +// Equal tests if two versions are equal to each other. +// Note, versions can be equal with different metadata since metadata +// is not considered part of the comparable version. +func (v *Version) Equal(o *Version) bool { + if v == o { + return true + } + if v == nil || o == nil { + return false + } + return v.Compare(o) == 0 +} + +// Compare compares this version to another one. It returns -1, 0, or 1 if +// the version smaller, equal, or larger than the other version. +// +// Versions are compared by X.Y.Z. Build metadata is ignored. Prerelease is +// lower than the version without a prerelease. Compare always takes into account +// prereleases. If you want to work with ranges using typical range syntaxes that +// skip prereleases if the range is not looking for them use constraints. +func (v *Version) Compare(o *Version) int { + // Compare the major, minor, and patch version for differences. If a + // difference is found return the comparison. + if d := compareSegment(v.Major(), o.Major()); d != 0 { + return d + } + if d := compareSegment(v.Minor(), o.Minor()); d != 0 { + return d + } + if d := compareSegment(v.Patch(), o.Patch()); d != 0 { + return d + } + + // At this point the major, minor, and patch versions are the same. + ps := v.pre + po := o.Prerelease() + + if ps == "" && po == "" { + return 0 + } + if ps == "" { + return 1 + } + if po == "" { + return -1 + } + + return comparePrerelease(ps, po) +} + +// UnmarshalJSON implements JSON.Unmarshaler interface. +func (v *Version) UnmarshalJSON(b []byte) error { + var s string + if err := json.Unmarshal(b, &s); err != nil { + return err + } + temp, err := NewVersion(s) + if err != nil { + return err + } + v.major = temp.major + v.minor = temp.minor + v.patch = temp.patch + v.pre = temp.pre + v.metadata = temp.metadata + v.original = temp.original + return nil +} + +// MarshalJSON implements JSON.Marshaler interface. +func (v Version) MarshalJSON() ([]byte, error) { + return json.Marshal(v.String()) +} + +// UnmarshalText implements the encoding.TextUnmarshaler interface. +func (v *Version) UnmarshalText(text []byte) error { + temp, err := NewVersion(string(text)) + if err != nil { + return err + } + + *v = *temp + + return nil +} + +// MarshalText implements the encoding.TextMarshaler interface. +func (v Version) MarshalText() ([]byte, error) { + return []byte(v.String()), nil +} + +// Scan implements the SQL.Scanner interface. +func (v *Version) Scan(value interface{}) error { + var s string + s, _ = value.(string) + temp, err := NewVersion(s) + if err != nil { + return err + } + v.major = temp.major + v.minor = temp.minor + v.patch = temp.patch + v.pre = temp.pre + v.metadata = temp.metadata + v.original = temp.original + return nil +} + +// Value implements the Driver.Valuer interface. +func (v Version) Value() (driver.Value, error) { + return v.String(), nil +} + +func compareSegment(v, o uint64) int { + if v < o { + return -1 + } + if v > o { + return 1 + } + + return 0 +} + +func comparePrerelease(v, o string) int { + // split the prelease versions by their part. The separator, per the spec, + // is a . + sparts := strings.Split(v, ".") + oparts := strings.Split(o, ".") + + // Find the longer length of the parts to know how many loop iterations to + // go through. + slen := len(sparts) + olen := len(oparts) + + l := slen + if olen > slen { + l = olen + } + + // Iterate over each part of the prereleases to compare the differences. + for i := 0; i < l; i++ { + // Since the lentgh of the parts can be different we need to create + // a placeholder. This is to avoid out of bounds issues. + stemp := "" + if i < slen { + stemp = sparts[i] + } + + otemp := "" + if i < olen { + otemp = oparts[i] + } + + d := comparePrePart(stemp, otemp) + if d != 0 { + return d + } + } + + // Reaching here means two versions are of equal value but have different + // metadata (the part following a +). They are not identical in string form + // but the version comparison finds them to be equal. + return 0 +} + +func comparePrePart(s, o string) int { + // Fastpath if they are equal + if s == o { + return 0 + } + + // When s or o are empty we can use the other in an attempt to determine + // the response. + if s == "" { + if o != "" { + return -1 + } + return 1 + } + + if o == "" { + if s != "" { + return 1 + } + return -1 + } + + // When comparing strings "99" is greater than "103". To handle + // cases like this we need to detect numbers and compare them. According + // to the semver spec, numbers are always positive. If there is a - at the + // start like -99 this is to be evaluated as an alphanum. numbers always + // have precedence over alphanum. Parsing as Uints because negative numbers + // are ignored. + + oi, n1 := strconv.ParseUint(o, 10, 64) + si, n2 := strconv.ParseUint(s, 10, 64) + + // The case where both are strings compare the strings + if n1 != nil && n2 != nil { + if s > o { + return 1 + } + return -1 + } else if n1 != nil { + // o is a string and s is a number + return -1 + } else if n2 != nil { + // s is a string and o is a number + return 1 + } + // Both are numbers + if si > oi { + return 1 + } + return -1 +} + +// Like strings.ContainsAny but does an only instead of any. +func containsOnly(s string, comp string) bool { + return strings.IndexFunc(s, func(r rune) bool { + return !strings.ContainsRune(comp, r) + }) == -1 +} + +// From the spec, "Identifiers MUST comprise only +// ASCII alphanumerics and hyphen [0-9A-Za-z-]. Identifiers MUST NOT be empty. +// Numeric identifiers MUST NOT include leading zeroes.". These segments can +// be dot separated. +func validatePrerelease(p string) error { + eparts := strings.Split(p, ".") + for _, p := range eparts { + if p == "" { + return ErrInvalidPrerelease + } else if containsOnly(p, num) { + if len(p) > 1 && p[0] == '0' { + return ErrSegmentStartsZero + } + } else if !containsOnly(p, allowed) { + return ErrInvalidPrerelease + } + } + + return nil +} + +// From the spec, "Build metadata MAY be denoted by +// appending a plus sign and a series of dot separated identifiers immediately +// following the patch or pre-release version. Identifiers MUST comprise only +// ASCII alphanumerics and hyphen [0-9A-Za-z-]. Identifiers MUST NOT be empty." +func validateMetadata(m string) error { + eparts := strings.Split(m, ".") + for _, p := range eparts { + if p == "" { + return ErrInvalidMetadata + } else if !containsOnly(p, allowed) { + return ErrInvalidMetadata + } + } + return nil +} + +// validateVersion checks for common validation issues but may not catch all errors +func validateVersion(m []string) error { + var err error + var v string + if m[1] != "" { + if len(m[1]) > 1 && m[1][0] == '0' { + return ErrSegmentStartsZero + } + _, err = strconv.ParseUint(m[1], 10, 64) + if err != nil { + return fmt.Errorf("error parsing version segment: %w", err) + } + } + + if m[2] != "" { + v = strings.TrimPrefix(m[2], ".") + if len(v) > 1 && v[0] == '0' { + return ErrSegmentStartsZero + } + _, err = strconv.ParseUint(v, 10, 64) + if err != nil { + return fmt.Errorf("error parsing version segment: %w", err) + } + } + + if m[3] != "" { + v = strings.TrimPrefix(m[3], ".") + if len(v) > 1 && v[0] == '0' { + return ErrSegmentStartsZero + } + _, err = strconv.ParseUint(v, 10, 64) + if err != nil { + return fmt.Errorf("error parsing version segment: %w", err) + } + } + + if m[5] != "" { + if err = validatePrerelease(m[5]); err != nil { + return err + } + } + + if m[8] != "" { + if err = validateMetadata(m[8]); err != nil { + return err + } + } + + return nil +} diff --git a/vendor/github.com/bombsimon/logrusr/v4/.gitignore b/vendor/github.com/bombsimon/logrusr/v4/.gitignore new file mode 100644 index 000000000..c6dd83b34 --- /dev/null +++ b/vendor/github.com/bombsimon/logrusr/v4/.gitignore @@ -0,0 +1,81 @@ + +# Created by https://www.gitignore.io/api/vim,macOS,IntelliJ+allb,go +# Edit at https://www.gitignore.io/?templates=vim,macOS,IntelliJ+allb,go + +### Go ### +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib + +# Test binary, built with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + +# Dependency directories (remove the comment below to include it) +# vendor/ + +### Go Patch ### +/vendor/ +/Godeps/ + +#!! ERROR: intellij+allb is undefined. Use list command to see defined gitignore types !!# + +### macOS ### +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### Vim ### +# Swap +[._]*.s[a-v][a-z] +[._]*.sw[a-p] +[._]s[a-rt-v][a-z] +[._]ss[a-gi-z] +[._]sw[a-p] + +# Session +Session.vim +Sessionx.vim + +# Temporary +.netrwhist +*~ + +# Auto-generated tag files +tags + +# Persistent undo +[._]*.un~ + +# Coc configuration directory +.vim + +# End of https://www.gitignore.io/api/vim,macOS,IntelliJ+allb,go diff --git a/vendor/github.com/bombsimon/logrusr/v4/LICENSE b/vendor/github.com/bombsimon/logrusr/v4/LICENSE new file mode 100644 index 000000000..ba46c0cd1 --- /dev/null +++ b/vendor/github.com/bombsimon/logrusr/v4/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Simon Sawert + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/bombsimon/logrusr/v4/README.md b/vendor/github.com/bombsimon/logrusr/v4/README.md new file mode 100644 index 000000000..7ce274951 --- /dev/null +++ b/vendor/github.com/bombsimon/logrusr/v4/README.md @@ -0,0 +1,35 @@ +# Logrusr + +[![Go Reference](https://pkg.go.dev/badge/github.com/bombsimon/logrusr.svg)](https://pkg.go.dev/github.com/bombsimon/logrusr/v4) +[![GitHub Actions](https://github.com/bombsimon/logrusr/actions/workflows/go.yml/badge.svg)](https://github.com/bombsimon/logrusr/actions/workflows/go.yml) +[![Coverage Status](https://coveralls.io/repos/github/bombsimon/logrusr/badge.svg?branch=main)](https://coveralls.io/github/bombsimon/logrusr?branch=main) +[![Go Report Card](https://goreportcard.com/badge/github.com/bombsimon/logrusr)](https://goreportcard.com/report/github.com/bombsimon/logrusr) + +A [logr](https://github.com/go-logr/logr) implementation using +[logrus](https://github.com/sirupsen/logrus). + +## Usage + +```go +import ( + "github.com/bombsimon/logrusr/v4" + "github.com/go-logr/logr" + "github.com/sirupsen/logrus" +) + +func main() { + logrusLog := logrus.New() + log := logrusr.New(logrusLog) + + log = log.WithName("MyName").WithValues("user", "you") + log.Info("Logr in action!", "the answer", 42) +} +``` + +For more details, see [example](example/main.go). + +## Implementation details + +The New method takes a `logrus.FieldLogger` interface as input which means +this works with both `logrus.Logger` and `logrus.Entry`. This is currently a +quite naive implementation in early state. Use with caution. diff --git a/vendor/github.com/bombsimon/logrusr/v4/logrusr.go b/vendor/github.com/bombsimon/logrusr/v4/logrusr.go new file mode 100644 index 000000000..3c1519969 --- /dev/null +++ b/vendor/github.com/bombsimon/logrusr/v4/logrusr.go @@ -0,0 +1,249 @@ +package logrusr + +import ( + "encoding/json" + "fmt" + "path/filepath" + "runtime" + "strings" + + "github.com/go-logr/logr" + "github.com/sirupsen/logrus" +) + +// According to the specification of the Logger interface calling the InfoLogger +// directly on the logger should be the same as calling them on V(0). Since +// logrus level 0 is PanicLevel and Infolevel doesn't start until V(4) we use +// this constant to be able to calculate what V(n) values should mean. +const logrusDiffToInfo = 4 + +// FormatFunc is the function to format log values with for non primitive data. +// If this is not set (default) all unknown types will be JSON marshaled and +// added as a string. +type FormatFunc func(interface{}) interface{} + +// Option is options to give when construction a logrusr logger. +type Option func(l *logrusr) + +// WithFormatter will set the FormatFunc to use. If you only want to format a +// specific type that is yours, prefer using the logr.Marshaler interface +// instead. The `FormatFunc` is better suited for types that are not yours such +// as external types, maps or slices. +func WithFormatter(f FormatFunc) Option { + return func(l *logrusr) { + l.formatter = f + } +} + +// WithReportCaller will enable reporting of the caller. +func WithReportCaller() Option { + return func(l *logrusr) { + l.reportCaller = true + } +} + +// WithName will set an initial name instead of having to call `WithName` on the +// logger itself after constructing it. +func WithName(name ...string) Option { + return func(l *logrusr) { + l.name = name + + l.logger = l.logger.WithField( + "logger", strings.Join(l.name, "."), + ) + } +} + +type logrusr struct { + name []string + depth int + reportCaller bool + logger *logrus.Entry + formatter FormatFunc +} + +// New will return a new logr.Logger created from a logrus.FieldLogger. +func New(l logrus.FieldLogger, opts ...Option) logr.Logger { + // Immediately convert the FieldLogger to an Entry so we don't have to type + // cast and can use methods that exist on the Entry but not the FieldLogger + // interface. + logger := &logrusr{ + depth: 0, + logger: l.WithFields(logrus.Fields{}), + } + + for _, o := range opts { + o(logger) + } + + return logr.New(logger) +} + +// Init receives optional information about the library. +func (l *logrusr) Init(ri logr.RuntimeInfo) { + // By default `CallDepth` is set to 1 which means one of the frames is + // skipped by default. This was originally missed in this library making the + // default behavior and `WithCallDepth(0)` behave differently. + // To be backwards compatible without affecting anyone manually setting the + // call depth we reduce 1 from the default depth instead of not adding it. + // See https://github.com/bombsimon/logrusr/issues/19 for more info. + l.depth = ri.CallDepth - 1 +} + +// Enabled tests whether this Logger is enabled. It will return true if the +// logrus.Logger has a level set to logrus.InfoLevel or higher (Warn/Panic). +// According to the documentation, level V(0) should be equivalent as calling +// Info() directly on the logger. To ensure this the constant `logrusDiffToInfo` +// will be added to all passed values so that V(0) creates a logger with level +// logrus.InfoLevel and V(2) would create a logger with level logrus.TraceLevel. +// This menas that if logrus is set to logrus.InfoLevel or **higher** this +// method will return true, otherwise false. +func (l *logrusr) Enabled(level int) bool { + // logrus.InfoLevel has value 4 so if the level on the logger is set to 0 we + // should only be seen as enabled if the logrus logger has a severity of + // info or higher. + return l.logger.Logger.IsLevelEnabled(logrus.Level(level + logrusDiffToInfo)) +} + +// Info logs info messages if the logger is enabled, that is if the level on the +// logger is set to logrus.InfoLevel or less. +func (l *logrusr) Info(level int, msg string, keysAndValues ...interface{}) { + log := l.logger + if c := l.caller(); c != "" { + log = log.WithField("caller", c) + } + + log. + WithFields(listToLogrusFields(l.formatter, keysAndValues...)). + Log(logrus.Level(level+logrusDiffToInfo), msg) +} + +// Error logs error messages. Since the log will be written with `Error` level +// it won't show if the severity of the underlying logrus logger is less than +// Error. +func (l *logrusr) Error(err error, msg string, keysAndValues ...interface{}) { + log := l.logger + if c := l.caller(); c != "" { + log = log.WithField("caller", c) + } + + log. + WithFields(listToLogrusFields(l.formatter, keysAndValues...)). + WithError(err). + Error(msg) +} + +// WithValues returns a new logger with additional key/values pairs. This is +// equivalent to logrus WithFields() but takes a list of even arguments +// (key/value pairs) instead of a map as input. If an odd number of arguments +// are sent all values will be discarded. +func (l *logrusr) WithValues(keysAndValues ...interface{}) logr.LogSink { + newLogger := l.copyLogger() + newLogger.logger = newLogger.logger.WithFields( + listToLogrusFields(l.formatter, keysAndValues...), + ) + + return newLogger +} + +// WithName is a part of the Logger interface. This will set the key "logger" as +// a logrus field to identify the instance. +func (l *logrusr) WithName(name string) logr.LogSink { + newLogger := l.copyLogger() + newLogger.name = append(newLogger.name, name) + + newLogger.logger = newLogger.logger.WithField( + "logger", strings.Join(newLogger.name, "."), + ) + + return newLogger +} + +// listToLogrusFields converts a list of arbitrary length to key/value paris. +func listToLogrusFields(formatter FormatFunc, keysAndValues ...interface{}) logrus.Fields { + f := make(logrus.Fields) + + // Skip all fields if it's not an even length list. + if len(keysAndValues)%2 != 0 { + return f + } + + for i := 0; i < len(keysAndValues); i += 2 { + k, v := keysAndValues[i], keysAndValues[i+1] + + s, ok := k.(string) + if !ok { + continue + } + + if v, ok := v.(logr.Marshaler); ok { + f[s] = v.MarshalLog() + continue + } + + // Try to avoid marshaling known types. + switch vVal := v.(type) { + case int, int8, int16, int32, int64, + uint, uint8, uint16, uint32, uint64, + float32, float64, complex64, complex128, + string, bool: + f[s] = vVal + + case []byte: + f[s] = string(vVal) + + default: + if formatter != nil { + f[s] = formatter(v) + } else { + j, _ := json.Marshal(vVal) + f[s] = string(j) + } + } + } + + return f +} + +// copyLogger copies the logger creating a new slice of the name but preserving +// the formatter and actual logrus logger. +func (l *logrusr) copyLogger() *logrusr { + newLogger := &logrusr{ + name: make([]string, len(l.name)), + depth: l.depth, + reportCaller: l.reportCaller, + logger: l.logger.Dup(), + formatter: l.formatter, + } + + copy(newLogger.name, l.name) + + return newLogger +} + +// WithCallDepth implements the optional WithCallDepth to offset the call stack +// when reporting caller. +func (l *logrusr) WithCallDepth(depth int) logr.LogSink { + newLogger := l.copyLogger() + newLogger.depth += depth + + return newLogger +} + +// caller will return the caller of the logging method. +func (l *logrusr) caller() string { + // Check if we should even report the caller. + if !l.reportCaller { + return "" + } + + // +1 for this frame. + // +1 for frame calling here (Info/Error) + // +1 for logr frame + _, file, line, ok := runtime.Caller(l.depth + 3) + if !ok { + return "" + } + + return fmt.Sprintf("%s:%d", filepath.Base(file), line) +} diff --git a/vendor/github.com/container-storage-interface/spec/lib/go/csi/csi.pb.go b/vendor/github.com/container-storage-interface/spec/lib/go/csi/csi.pb.go index e763bc3ea..82904b38b 100644 --- a/vendor/github.com/container-storage-interface/spec/lib/go/csi/csi.pb.go +++ b/vendor/github.com/container-storage-interface/spec/lib/go/csi/csi.pb.go @@ -386,6 +386,9 @@ const ( // Indicates the SP supports modifying volume with mutable // parameters. See ControllerModifyVolume for details. ControllerServiceCapability_RPC_MODIFY_VOLUME ControllerServiceCapability_RPC_Type = 14 + // Indicates the SP supports the GetSnapshot RPC. + // This enables COs to fetch an existing snapshot. + ControllerServiceCapability_RPC_GET_SNAPSHOT ControllerServiceCapability_RPC_Type = 15 ) // Enum value maps for ControllerServiceCapability_RPC_Type. @@ -406,6 +409,7 @@ var ( 12: "GET_VOLUME", 13: "SINGLE_NODE_MULTI_WRITER", 14: "MODIFY_VOLUME", + 15: "GET_SNAPSHOT", } ControllerServiceCapability_RPC_Type_value = map[string]int32{ "UNKNOWN": 0, @@ -423,6 +427,7 @@ var ( "GET_VOLUME": 12, "SINGLE_NODE_MULTI_WRITER": 13, "MODIFY_VOLUME": 14, + "GET_SNAPSHOT": 15, } ) @@ -499,7 +504,7 @@ func (x VolumeUsage_Unit) Number() protoreflect.EnumNumber { // Deprecated: Use VolumeUsage_Unit.Descriptor instead. func (VolumeUsage_Unit) EnumDescriptor() ([]byte, []int) { - return file_csi_proto_rawDescGZIP(), []int{53, 0} + return file_csi_proto_rawDescGZIP(), []int{55, 0} } type NodeServiceCapability_RPC_Type int32 @@ -587,7 +592,7 @@ func (x NodeServiceCapability_RPC_Type) Number() protoreflect.EnumNumber { // Deprecated: Use NodeServiceCapability_RPC_Type.Descriptor instead. func (NodeServiceCapability_RPC_Type) EnumDescriptor() ([]byte, []int) { - return file_csi_proto_rawDescGZIP(), []int{57, 0, 0} + return file_csi_proto_rawDescGZIP(), []int{59, 0, 0} } type GroupControllerServiceCapability_RPC_Type int32 @@ -636,7 +641,7 @@ func (x GroupControllerServiceCapability_RPC_Type) Number() protoreflect.EnumNum // Deprecated: Use GroupControllerServiceCapability_RPC_Type.Descriptor instead. func (GroupControllerServiceCapability_RPC_Type) EnumDescriptor() ([]byte, []int) { - return file_csi_proto_rawDescGZIP(), []int{64, 0, 0} + return file_csi_proto_rawDescGZIP(), []int{66, 0, 0} } type GetPluginInfoRequest struct { @@ -3663,6 +3668,114 @@ func (x *ListSnapshotsResponse) GetNextToken() string { return "" } +type GetSnapshotRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The ID of the snapshot to fetch current snapshot information for. + // This field is REQUIRED. + SnapshotId string `protobuf:"bytes,1,opt,name=snapshot_id,json=snapshotId,proto3" json:"snapshot_id,omitempty"` + // Secrets required by plugin to complete GetSnapshot request. + // This field is OPTIONAL. Refer to the `Secrets Requirements` + // section on how to use this field. + Secrets map[string]string `protobuf:"bytes,2,rep,name=secrets,proto3" json:"secrets,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *GetSnapshotRequest) Reset() { + *x = GetSnapshotRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_csi_proto_msgTypes[41] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetSnapshotRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetSnapshotRequest) ProtoMessage() {} + +func (x *GetSnapshotRequest) ProtoReflect() protoreflect.Message { + mi := &file_csi_proto_msgTypes[41] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetSnapshotRequest.ProtoReflect.Descriptor instead. +func (*GetSnapshotRequest) Descriptor() ([]byte, []int) { + return file_csi_proto_rawDescGZIP(), []int{41} +} + +func (x *GetSnapshotRequest) GetSnapshotId() string { + if x != nil { + return x.SnapshotId + } + return "" +} + +func (x *GetSnapshotRequest) GetSecrets() map[string]string { + if x != nil { + return x.Secrets + } + return nil +} + +type GetSnapshotResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // This field is REQUIRED + Snapshot *Snapshot `protobuf:"bytes,1,opt,name=snapshot,proto3" json:"snapshot,omitempty"` +} + +func (x *GetSnapshotResponse) Reset() { + *x = GetSnapshotResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_csi_proto_msgTypes[42] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetSnapshotResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetSnapshotResponse) ProtoMessage() {} + +func (x *GetSnapshotResponse) ProtoReflect() protoreflect.Message { + mi := &file_csi_proto_msgTypes[42] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetSnapshotResponse.ProtoReflect.Descriptor instead. +func (*GetSnapshotResponse) Descriptor() ([]byte, []int) { + return file_csi_proto_rawDescGZIP(), []int{42} +} + +func (x *GetSnapshotResponse) GetSnapshot() *Snapshot { + if x != nil { + return x.Snapshot + } + return nil +} + type ControllerExpandVolumeRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3689,7 +3802,7 @@ type ControllerExpandVolumeRequest struct { func (x *ControllerExpandVolumeRequest) Reset() { *x = ControllerExpandVolumeRequest{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[41] + mi := &file_csi_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3702,7 +3815,7 @@ func (x *ControllerExpandVolumeRequest) String() string { func (*ControllerExpandVolumeRequest) ProtoMessage() {} func (x *ControllerExpandVolumeRequest) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[41] + mi := &file_csi_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3715,7 +3828,7 @@ func (x *ControllerExpandVolumeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ControllerExpandVolumeRequest.ProtoReflect.Descriptor instead. func (*ControllerExpandVolumeRequest) Descriptor() ([]byte, []int) { - return file_csi_proto_rawDescGZIP(), []int{41} + return file_csi_proto_rawDescGZIP(), []int{43} } func (x *ControllerExpandVolumeRequest) GetVolumeId() string { @@ -3762,7 +3875,7 @@ type ControllerExpandVolumeResponse struct { func (x *ControllerExpandVolumeResponse) Reset() { *x = ControllerExpandVolumeResponse{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[42] + mi := &file_csi_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3775,7 +3888,7 @@ func (x *ControllerExpandVolumeResponse) String() string { func (*ControllerExpandVolumeResponse) ProtoMessage() {} func (x *ControllerExpandVolumeResponse) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[42] + mi := &file_csi_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3788,7 +3901,7 @@ func (x *ControllerExpandVolumeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ControllerExpandVolumeResponse.ProtoReflect.Descriptor instead. func (*ControllerExpandVolumeResponse) Descriptor() ([]byte, []int) { - return file_csi_proto_rawDescGZIP(), []int{42} + return file_csi_proto_rawDescGZIP(), []int{44} } func (x *ControllerExpandVolumeResponse) GetCapacityBytes() int64 { @@ -3851,7 +3964,7 @@ type NodeStageVolumeRequest struct { func (x *NodeStageVolumeRequest) Reset() { *x = NodeStageVolumeRequest{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[43] + mi := &file_csi_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3864,7 +3977,7 @@ func (x *NodeStageVolumeRequest) String() string { func (*NodeStageVolumeRequest) ProtoMessage() {} func (x *NodeStageVolumeRequest) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[43] + mi := &file_csi_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3877,7 +3990,7 @@ func (x *NodeStageVolumeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use NodeStageVolumeRequest.ProtoReflect.Descriptor instead. func (*NodeStageVolumeRequest) Descriptor() ([]byte, []int) { - return file_csi_proto_rawDescGZIP(), []int{43} + return file_csi_proto_rawDescGZIP(), []int{45} } func (x *NodeStageVolumeRequest) GetVolumeId() string { @@ -3931,7 +4044,7 @@ type NodeStageVolumeResponse struct { func (x *NodeStageVolumeResponse) Reset() { *x = NodeStageVolumeResponse{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[44] + mi := &file_csi_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3944,7 +4057,7 @@ func (x *NodeStageVolumeResponse) String() string { func (*NodeStageVolumeResponse) ProtoMessage() {} func (x *NodeStageVolumeResponse) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[44] + mi := &file_csi_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3957,7 +4070,7 @@ func (x *NodeStageVolumeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use NodeStageVolumeResponse.ProtoReflect.Descriptor instead. func (*NodeStageVolumeResponse) Descriptor() ([]byte, []int) { - return file_csi_proto_rawDescGZIP(), []int{44} + return file_csi_proto_rawDescGZIP(), []int{46} } type NodeUnstageVolumeRequest struct { @@ -3980,7 +4093,7 @@ type NodeUnstageVolumeRequest struct { func (x *NodeUnstageVolumeRequest) Reset() { *x = NodeUnstageVolumeRequest{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[45] + mi := &file_csi_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3993,7 +4106,7 @@ func (x *NodeUnstageVolumeRequest) String() string { func (*NodeUnstageVolumeRequest) ProtoMessage() {} func (x *NodeUnstageVolumeRequest) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[45] + mi := &file_csi_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4006,7 +4119,7 @@ func (x *NodeUnstageVolumeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use NodeUnstageVolumeRequest.ProtoReflect.Descriptor instead. func (*NodeUnstageVolumeRequest) Descriptor() ([]byte, []int) { - return file_csi_proto_rawDescGZIP(), []int{45} + return file_csi_proto_rawDescGZIP(), []int{47} } func (x *NodeUnstageVolumeRequest) GetVolumeId() string { @@ -4032,7 +4145,7 @@ type NodeUnstageVolumeResponse struct { func (x *NodeUnstageVolumeResponse) Reset() { *x = NodeUnstageVolumeResponse{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[46] + mi := &file_csi_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4045,7 +4158,7 @@ func (x *NodeUnstageVolumeResponse) String() string { func (*NodeUnstageVolumeResponse) ProtoMessage() {} func (x *NodeUnstageVolumeResponse) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[46] + mi := &file_csi_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4058,7 +4171,7 @@ func (x *NodeUnstageVolumeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use NodeUnstageVolumeResponse.ProtoReflect.Descriptor instead. func (*NodeUnstageVolumeResponse) Descriptor() ([]byte, []int) { - return file_csi_proto_rawDescGZIP(), []int{46} + return file_csi_proto_rawDescGZIP(), []int{48} } type NodePublishVolumeRequest struct { @@ -4124,7 +4237,7 @@ type NodePublishVolumeRequest struct { func (x *NodePublishVolumeRequest) Reset() { *x = NodePublishVolumeRequest{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[47] + mi := &file_csi_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4137,7 +4250,7 @@ func (x *NodePublishVolumeRequest) String() string { func (*NodePublishVolumeRequest) ProtoMessage() {} func (x *NodePublishVolumeRequest) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[47] + mi := &file_csi_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4150,7 +4263,7 @@ func (x *NodePublishVolumeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use NodePublishVolumeRequest.ProtoReflect.Descriptor instead. func (*NodePublishVolumeRequest) Descriptor() ([]byte, []int) { - return file_csi_proto_rawDescGZIP(), []int{47} + return file_csi_proto_rawDescGZIP(), []int{49} } func (x *NodePublishVolumeRequest) GetVolumeId() string { @@ -4218,7 +4331,7 @@ type NodePublishVolumeResponse struct { func (x *NodePublishVolumeResponse) Reset() { *x = NodePublishVolumeResponse{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[48] + mi := &file_csi_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4231,7 +4344,7 @@ func (x *NodePublishVolumeResponse) String() string { func (*NodePublishVolumeResponse) ProtoMessage() {} func (x *NodePublishVolumeResponse) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[48] + mi := &file_csi_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4244,7 +4357,7 @@ func (x *NodePublishVolumeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use NodePublishVolumeResponse.ProtoReflect.Descriptor instead. func (*NodePublishVolumeResponse) Descriptor() ([]byte, []int) { - return file_csi_proto_rawDescGZIP(), []int{48} + return file_csi_proto_rawDescGZIP(), []int{50} } type NodeUnpublishVolumeRequest struct { @@ -4268,7 +4381,7 @@ type NodeUnpublishVolumeRequest struct { func (x *NodeUnpublishVolumeRequest) Reset() { *x = NodeUnpublishVolumeRequest{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[49] + mi := &file_csi_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4281,7 +4394,7 @@ func (x *NodeUnpublishVolumeRequest) String() string { func (*NodeUnpublishVolumeRequest) ProtoMessage() {} func (x *NodeUnpublishVolumeRequest) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[49] + mi := &file_csi_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4294,7 +4407,7 @@ func (x *NodeUnpublishVolumeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use NodeUnpublishVolumeRequest.ProtoReflect.Descriptor instead. func (*NodeUnpublishVolumeRequest) Descriptor() ([]byte, []int) { - return file_csi_proto_rawDescGZIP(), []int{49} + return file_csi_proto_rawDescGZIP(), []int{51} } func (x *NodeUnpublishVolumeRequest) GetVolumeId() string { @@ -4320,7 +4433,7 @@ type NodeUnpublishVolumeResponse struct { func (x *NodeUnpublishVolumeResponse) Reset() { *x = NodeUnpublishVolumeResponse{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[50] + mi := &file_csi_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4333,7 +4446,7 @@ func (x *NodeUnpublishVolumeResponse) String() string { func (*NodeUnpublishVolumeResponse) ProtoMessage() {} func (x *NodeUnpublishVolumeResponse) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[50] + mi := &file_csi_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4346,7 +4459,7 @@ func (x *NodeUnpublishVolumeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use NodeUnpublishVolumeResponse.ProtoReflect.Descriptor instead. func (*NodeUnpublishVolumeResponse) Descriptor() ([]byte, []int) { - return file_csi_proto_rawDescGZIP(), []int{50} + return file_csi_proto_rawDescGZIP(), []int{52} } type NodeGetVolumeStatsRequest struct { @@ -4381,7 +4494,7 @@ type NodeGetVolumeStatsRequest struct { func (x *NodeGetVolumeStatsRequest) Reset() { *x = NodeGetVolumeStatsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[51] + mi := &file_csi_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4394,7 +4507,7 @@ func (x *NodeGetVolumeStatsRequest) String() string { func (*NodeGetVolumeStatsRequest) ProtoMessage() {} func (x *NodeGetVolumeStatsRequest) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[51] + mi := &file_csi_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4407,7 +4520,7 @@ func (x *NodeGetVolumeStatsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use NodeGetVolumeStatsRequest.ProtoReflect.Descriptor instead. func (*NodeGetVolumeStatsRequest) Descriptor() ([]byte, []int) { - return file_csi_proto_rawDescGZIP(), []int{51} + return file_csi_proto_rawDescGZIP(), []int{53} } func (x *NodeGetVolumeStatsRequest) GetVolumeId() string { @@ -4448,7 +4561,7 @@ type NodeGetVolumeStatsResponse struct { func (x *NodeGetVolumeStatsResponse) Reset() { *x = NodeGetVolumeStatsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[52] + mi := &file_csi_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4461,7 +4574,7 @@ func (x *NodeGetVolumeStatsResponse) String() string { func (*NodeGetVolumeStatsResponse) ProtoMessage() {} func (x *NodeGetVolumeStatsResponse) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[52] + mi := &file_csi_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4474,7 +4587,7 @@ func (x *NodeGetVolumeStatsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use NodeGetVolumeStatsResponse.ProtoReflect.Descriptor instead. func (*NodeGetVolumeStatsResponse) Descriptor() ([]byte, []int) { - return file_csi_proto_rawDescGZIP(), []int{52} + return file_csi_proto_rawDescGZIP(), []int{54} } func (x *NodeGetVolumeStatsResponse) GetUsage() []*VolumeUsage { @@ -4512,7 +4625,7 @@ type VolumeUsage struct { func (x *VolumeUsage) Reset() { *x = VolumeUsage{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[53] + mi := &file_csi_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4525,7 +4638,7 @@ func (x *VolumeUsage) String() string { func (*VolumeUsage) ProtoMessage() {} func (x *VolumeUsage) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[53] + mi := &file_csi_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4538,7 +4651,7 @@ func (x *VolumeUsage) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeUsage.ProtoReflect.Descriptor instead. func (*VolumeUsage) Descriptor() ([]byte, []int) { - return file_csi_proto_rawDescGZIP(), []int{53} + return file_csi_proto_rawDescGZIP(), []int{55} } func (x *VolumeUsage) GetAvailable() int64 { @@ -4587,7 +4700,7 @@ type VolumeCondition struct { func (x *VolumeCondition) Reset() { *x = VolumeCondition{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[54] + mi := &file_csi_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4600,7 +4713,7 @@ func (x *VolumeCondition) String() string { func (*VolumeCondition) ProtoMessage() {} func (x *VolumeCondition) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[54] + mi := &file_csi_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4613,7 +4726,7 @@ func (x *VolumeCondition) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeCondition.ProtoReflect.Descriptor instead. func (*VolumeCondition) Descriptor() ([]byte, []int) { - return file_csi_proto_rawDescGZIP(), []int{54} + return file_csi_proto_rawDescGZIP(), []int{56} } func (x *VolumeCondition) GetAbnormal() bool { @@ -4639,7 +4752,7 @@ type NodeGetCapabilitiesRequest struct { func (x *NodeGetCapabilitiesRequest) Reset() { *x = NodeGetCapabilitiesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[55] + mi := &file_csi_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4652,7 +4765,7 @@ func (x *NodeGetCapabilitiesRequest) String() string { func (*NodeGetCapabilitiesRequest) ProtoMessage() {} func (x *NodeGetCapabilitiesRequest) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[55] + mi := &file_csi_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4665,7 +4778,7 @@ func (x *NodeGetCapabilitiesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use NodeGetCapabilitiesRequest.ProtoReflect.Descriptor instead. func (*NodeGetCapabilitiesRequest) Descriptor() ([]byte, []int) { - return file_csi_proto_rawDescGZIP(), []int{55} + return file_csi_proto_rawDescGZIP(), []int{57} } type NodeGetCapabilitiesResponse struct { @@ -4681,7 +4794,7 @@ type NodeGetCapabilitiesResponse struct { func (x *NodeGetCapabilitiesResponse) Reset() { *x = NodeGetCapabilitiesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[56] + mi := &file_csi_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4694,7 +4807,7 @@ func (x *NodeGetCapabilitiesResponse) String() string { func (*NodeGetCapabilitiesResponse) ProtoMessage() {} func (x *NodeGetCapabilitiesResponse) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[56] + mi := &file_csi_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4707,7 +4820,7 @@ func (x *NodeGetCapabilitiesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use NodeGetCapabilitiesResponse.ProtoReflect.Descriptor instead. func (*NodeGetCapabilitiesResponse) Descriptor() ([]byte, []int) { - return file_csi_proto_rawDescGZIP(), []int{56} + return file_csi_proto_rawDescGZIP(), []int{58} } func (x *NodeGetCapabilitiesResponse) GetCapabilities() []*NodeServiceCapability { @@ -4732,7 +4845,7 @@ type NodeServiceCapability struct { func (x *NodeServiceCapability) Reset() { *x = NodeServiceCapability{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[57] + mi := &file_csi_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4745,7 +4858,7 @@ func (x *NodeServiceCapability) String() string { func (*NodeServiceCapability) ProtoMessage() {} func (x *NodeServiceCapability) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[57] + mi := &file_csi_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4758,7 +4871,7 @@ func (x *NodeServiceCapability) ProtoReflect() protoreflect.Message { // Deprecated: Use NodeServiceCapability.ProtoReflect.Descriptor instead. func (*NodeServiceCapability) Descriptor() ([]byte, []int) { - return file_csi_proto_rawDescGZIP(), []int{57} + return file_csi_proto_rawDescGZIP(), []int{59} } func (m *NodeServiceCapability) GetType() isNodeServiceCapability_Type { @@ -4795,7 +4908,7 @@ type NodeGetInfoRequest struct { func (x *NodeGetInfoRequest) Reset() { *x = NodeGetInfoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[58] + mi := &file_csi_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4808,7 +4921,7 @@ func (x *NodeGetInfoRequest) String() string { func (*NodeGetInfoRequest) ProtoMessage() {} func (x *NodeGetInfoRequest) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[58] + mi := &file_csi_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4821,7 +4934,7 @@ func (x *NodeGetInfoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use NodeGetInfoRequest.ProtoReflect.Descriptor instead. func (*NodeGetInfoRequest) Descriptor() ([]byte, []int) { - return file_csi_proto_rawDescGZIP(), []int{58} + return file_csi_proto_rawDescGZIP(), []int{60} } type NodeGetInfoResponse struct { @@ -4873,7 +4986,7 @@ type NodeGetInfoResponse struct { func (x *NodeGetInfoResponse) Reset() { *x = NodeGetInfoResponse{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[59] + mi := &file_csi_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4886,7 +4999,7 @@ func (x *NodeGetInfoResponse) String() string { func (*NodeGetInfoResponse) ProtoMessage() {} func (x *NodeGetInfoResponse) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[59] + mi := &file_csi_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4899,7 +5012,7 @@ func (x *NodeGetInfoResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use NodeGetInfoResponse.ProtoReflect.Descriptor instead. func (*NodeGetInfoResponse) Descriptor() ([]byte, []int) { - return file_csi_proto_rawDescGZIP(), []int{59} + return file_csi_proto_rawDescGZIP(), []int{61} } func (x *NodeGetInfoResponse) GetNodeId() string { @@ -4972,7 +5085,7 @@ type NodeExpandVolumeRequest struct { func (x *NodeExpandVolumeRequest) Reset() { *x = NodeExpandVolumeRequest{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[60] + mi := &file_csi_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4985,7 +5098,7 @@ func (x *NodeExpandVolumeRequest) String() string { func (*NodeExpandVolumeRequest) ProtoMessage() {} func (x *NodeExpandVolumeRequest) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[60] + mi := &file_csi_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4998,7 +5111,7 @@ func (x *NodeExpandVolumeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use NodeExpandVolumeRequest.ProtoReflect.Descriptor instead. func (*NodeExpandVolumeRequest) Descriptor() ([]byte, []int) { - return file_csi_proto_rawDescGZIP(), []int{60} + return file_csi_proto_rawDescGZIP(), []int{62} } func (x *NodeExpandVolumeRequest) GetVolumeId() string { @@ -5055,7 +5168,7 @@ type NodeExpandVolumeResponse struct { func (x *NodeExpandVolumeResponse) Reset() { *x = NodeExpandVolumeResponse{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[61] + mi := &file_csi_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5068,7 +5181,7 @@ func (x *NodeExpandVolumeResponse) String() string { func (*NodeExpandVolumeResponse) ProtoMessage() {} func (x *NodeExpandVolumeResponse) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[61] + mi := &file_csi_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5081,7 +5194,7 @@ func (x *NodeExpandVolumeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use NodeExpandVolumeResponse.ProtoReflect.Descriptor instead. func (*NodeExpandVolumeResponse) Descriptor() ([]byte, []int) { - return file_csi_proto_rawDescGZIP(), []int{61} + return file_csi_proto_rawDescGZIP(), []int{63} } func (x *NodeExpandVolumeResponse) GetCapacityBytes() int64 { @@ -5100,7 +5213,7 @@ type GroupControllerGetCapabilitiesRequest struct { func (x *GroupControllerGetCapabilitiesRequest) Reset() { *x = GroupControllerGetCapabilitiesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[62] + mi := &file_csi_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5113,7 +5226,7 @@ func (x *GroupControllerGetCapabilitiesRequest) String() string { func (*GroupControllerGetCapabilitiesRequest) ProtoMessage() {} func (x *GroupControllerGetCapabilitiesRequest) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[62] + mi := &file_csi_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5126,7 +5239,7 @@ func (x *GroupControllerGetCapabilitiesRequest) ProtoReflect() protoreflect.Mess // Deprecated: Use GroupControllerGetCapabilitiesRequest.ProtoReflect.Descriptor instead. func (*GroupControllerGetCapabilitiesRequest) Descriptor() ([]byte, []int) { - return file_csi_proto_rawDescGZIP(), []int{62} + return file_csi_proto_rawDescGZIP(), []int{64} } type GroupControllerGetCapabilitiesResponse struct { @@ -5142,7 +5255,7 @@ type GroupControllerGetCapabilitiesResponse struct { func (x *GroupControllerGetCapabilitiesResponse) Reset() { *x = GroupControllerGetCapabilitiesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[63] + mi := &file_csi_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5155,7 +5268,7 @@ func (x *GroupControllerGetCapabilitiesResponse) String() string { func (*GroupControllerGetCapabilitiesResponse) ProtoMessage() {} func (x *GroupControllerGetCapabilitiesResponse) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[63] + mi := &file_csi_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5168,7 +5281,7 @@ func (x *GroupControllerGetCapabilitiesResponse) ProtoReflect() protoreflect.Mes // Deprecated: Use GroupControllerGetCapabilitiesResponse.ProtoReflect.Descriptor instead. func (*GroupControllerGetCapabilitiesResponse) Descriptor() ([]byte, []int) { - return file_csi_proto_rawDescGZIP(), []int{63} + return file_csi_proto_rawDescGZIP(), []int{65} } func (x *GroupControllerGetCapabilitiesResponse) GetCapabilities() []*GroupControllerServiceCapability { @@ -5193,7 +5306,7 @@ type GroupControllerServiceCapability struct { func (x *GroupControllerServiceCapability) Reset() { *x = GroupControllerServiceCapability{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[64] + mi := &file_csi_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5206,7 +5319,7 @@ func (x *GroupControllerServiceCapability) String() string { func (*GroupControllerServiceCapability) ProtoMessage() {} func (x *GroupControllerServiceCapability) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[64] + mi := &file_csi_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5219,7 +5332,7 @@ func (x *GroupControllerServiceCapability) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupControllerServiceCapability.ProtoReflect.Descriptor instead. func (*GroupControllerServiceCapability) Descriptor() ([]byte, []int) { - return file_csi_proto_rawDescGZIP(), []int{64} + return file_csi_proto_rawDescGZIP(), []int{66} } func (m *GroupControllerServiceCapability) GetType() isGroupControllerServiceCapability_Type { @@ -5278,7 +5391,7 @@ type CreateVolumeGroupSnapshotRequest struct { func (x *CreateVolumeGroupSnapshotRequest) Reset() { *x = CreateVolumeGroupSnapshotRequest{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[65] + mi := &file_csi_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5291,7 +5404,7 @@ func (x *CreateVolumeGroupSnapshotRequest) String() string { func (*CreateVolumeGroupSnapshotRequest) ProtoMessage() {} func (x *CreateVolumeGroupSnapshotRequest) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[65] + mi := &file_csi_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5304,7 +5417,7 @@ func (x *CreateVolumeGroupSnapshotRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateVolumeGroupSnapshotRequest.ProtoReflect.Descriptor instead. func (*CreateVolumeGroupSnapshotRequest) Descriptor() ([]byte, []int) { - return file_csi_proto_rawDescGZIP(), []int{65} + return file_csi_proto_rawDescGZIP(), []int{67} } func (x *CreateVolumeGroupSnapshotRequest) GetName() string { @@ -5348,7 +5461,7 @@ type CreateVolumeGroupSnapshotResponse struct { func (x *CreateVolumeGroupSnapshotResponse) Reset() { *x = CreateVolumeGroupSnapshotResponse{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[66] + mi := &file_csi_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5361,7 +5474,7 @@ func (x *CreateVolumeGroupSnapshotResponse) String() string { func (*CreateVolumeGroupSnapshotResponse) ProtoMessage() {} func (x *CreateVolumeGroupSnapshotResponse) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[66] + mi := &file_csi_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5374,7 +5487,7 @@ func (x *CreateVolumeGroupSnapshotResponse) ProtoReflect() protoreflect.Message // Deprecated: Use CreateVolumeGroupSnapshotResponse.ProtoReflect.Descriptor instead. func (*CreateVolumeGroupSnapshotResponse) Descriptor() ([]byte, []int) { - return file_csi_proto_rawDescGZIP(), []int{66} + return file_csi_proto_rawDescGZIP(), []int{68} } func (x *CreateVolumeGroupSnapshotResponse) GetGroupSnapshot() *VolumeGroupSnapshot { @@ -5420,7 +5533,7 @@ type VolumeGroupSnapshot struct { func (x *VolumeGroupSnapshot) Reset() { *x = VolumeGroupSnapshot{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[67] + mi := &file_csi_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5433,7 +5546,7 @@ func (x *VolumeGroupSnapshot) String() string { func (*VolumeGroupSnapshot) ProtoMessage() {} func (x *VolumeGroupSnapshot) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[67] + mi := &file_csi_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5446,7 +5559,7 @@ func (x *VolumeGroupSnapshot) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeGroupSnapshot.ProtoReflect.Descriptor instead. func (*VolumeGroupSnapshot) Descriptor() ([]byte, []int) { - return file_csi_proto_rawDescGZIP(), []int{67} + return file_csi_proto_rawDescGZIP(), []int{69} } func (x *VolumeGroupSnapshot) GetGroupSnapshotId() string { @@ -5507,7 +5620,7 @@ type DeleteVolumeGroupSnapshotRequest struct { func (x *DeleteVolumeGroupSnapshotRequest) Reset() { *x = DeleteVolumeGroupSnapshotRequest{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[68] + mi := &file_csi_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5520,7 +5633,7 @@ func (x *DeleteVolumeGroupSnapshotRequest) String() string { func (*DeleteVolumeGroupSnapshotRequest) ProtoMessage() {} func (x *DeleteVolumeGroupSnapshotRequest) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[68] + mi := &file_csi_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5533,7 +5646,7 @@ func (x *DeleteVolumeGroupSnapshotRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteVolumeGroupSnapshotRequest.ProtoReflect.Descriptor instead. func (*DeleteVolumeGroupSnapshotRequest) Descriptor() ([]byte, []int) { - return file_csi_proto_rawDescGZIP(), []int{68} + return file_csi_proto_rawDescGZIP(), []int{70} } func (x *DeleteVolumeGroupSnapshotRequest) GetGroupSnapshotId() string { @@ -5566,7 +5679,7 @@ type DeleteVolumeGroupSnapshotResponse struct { func (x *DeleteVolumeGroupSnapshotResponse) Reset() { *x = DeleteVolumeGroupSnapshotResponse{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[69] + mi := &file_csi_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5579,7 +5692,7 @@ func (x *DeleteVolumeGroupSnapshotResponse) String() string { func (*DeleteVolumeGroupSnapshotResponse) ProtoMessage() {} func (x *DeleteVolumeGroupSnapshotResponse) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[69] + mi := &file_csi_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5592,7 +5705,7 @@ func (x *DeleteVolumeGroupSnapshotResponse) ProtoReflect() protoreflect.Message // Deprecated: Use DeleteVolumeGroupSnapshotResponse.ProtoReflect.Descriptor instead. func (*DeleteVolumeGroupSnapshotResponse) Descriptor() ([]byte, []int) { - return file_csi_proto_rawDescGZIP(), []int{69} + return file_csi_proto_rawDescGZIP(), []int{71} } type GetVolumeGroupSnapshotRequest struct { @@ -5626,7 +5739,7 @@ type GetVolumeGroupSnapshotRequest struct { func (x *GetVolumeGroupSnapshotRequest) Reset() { *x = GetVolumeGroupSnapshotRequest{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[70] + mi := &file_csi_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5639,7 +5752,7 @@ func (x *GetVolumeGroupSnapshotRequest) String() string { func (*GetVolumeGroupSnapshotRequest) ProtoMessage() {} func (x *GetVolumeGroupSnapshotRequest) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[70] + mi := &file_csi_proto_msgTypes[72] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5652,7 +5765,7 @@ func (x *GetVolumeGroupSnapshotRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetVolumeGroupSnapshotRequest.ProtoReflect.Descriptor instead. func (*GetVolumeGroupSnapshotRequest) Descriptor() ([]byte, []int) { - return file_csi_proto_rawDescGZIP(), []int{70} + return file_csi_proto_rawDescGZIP(), []int{72} } func (x *GetVolumeGroupSnapshotRequest) GetGroupSnapshotId() string { @@ -5688,7 +5801,7 @@ type GetVolumeGroupSnapshotResponse struct { func (x *GetVolumeGroupSnapshotResponse) Reset() { *x = GetVolumeGroupSnapshotResponse{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[71] + mi := &file_csi_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5701,7 +5814,7 @@ func (x *GetVolumeGroupSnapshotResponse) String() string { func (*GetVolumeGroupSnapshotResponse) ProtoMessage() {} func (x *GetVolumeGroupSnapshotResponse) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[71] + mi := &file_csi_proto_msgTypes[73] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5714,7 +5827,7 @@ func (x *GetVolumeGroupSnapshotResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetVolumeGroupSnapshotResponse.ProtoReflect.Descriptor instead. func (*GetVolumeGroupSnapshotResponse) Descriptor() ([]byte, []int) { - return file_csi_proto_rawDescGZIP(), []int{71} + return file_csi_proto_rawDescGZIP(), []int{73} } func (x *GetVolumeGroupSnapshotResponse) GetGroupSnapshot() *VolumeGroupSnapshot { @@ -5743,7 +5856,7 @@ type BlockMetadata struct { func (x *BlockMetadata) Reset() { *x = BlockMetadata{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[72] + mi := &file_csi_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5756,7 +5869,7 @@ func (x *BlockMetadata) String() string { func (*BlockMetadata) ProtoMessage() {} func (x *BlockMetadata) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[72] + mi := &file_csi_proto_msgTypes[74] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5769,7 +5882,7 @@ func (x *BlockMetadata) ProtoReflect() protoreflect.Message { // Deprecated: Use BlockMetadata.ProtoReflect.Descriptor instead. func (*BlockMetadata) Descriptor() ([]byte, []int) { - return file_csi_proto_rawDescGZIP(), []int{72} + return file_csi_proto_rawDescGZIP(), []int{74} } func (x *BlockMetadata) GetByteOffset() int64 { @@ -5828,7 +5941,7 @@ type GetMetadataAllocatedRequest struct { func (x *GetMetadataAllocatedRequest) Reset() { *x = GetMetadataAllocatedRequest{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[73] + mi := &file_csi_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5841,7 +5954,7 @@ func (x *GetMetadataAllocatedRequest) String() string { func (*GetMetadataAllocatedRequest) ProtoMessage() {} func (x *GetMetadataAllocatedRequest) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[73] + mi := &file_csi_proto_msgTypes[75] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5854,7 +5967,7 @@ func (x *GetMetadataAllocatedRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetMetadataAllocatedRequest.ProtoReflect.Descriptor instead. func (*GetMetadataAllocatedRequest) Descriptor() ([]byte, []int) { - return file_csi_proto_rawDescGZIP(), []int{73} + return file_csi_proto_rawDescGZIP(), []int{75} } func (x *GetMetadataAllocatedRequest) GetSnapshotId() string { @@ -5924,7 +6037,7 @@ type GetMetadataAllocatedResponse struct { func (x *GetMetadataAllocatedResponse) Reset() { *x = GetMetadataAllocatedResponse{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[74] + mi := &file_csi_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5937,7 +6050,7 @@ func (x *GetMetadataAllocatedResponse) String() string { func (*GetMetadataAllocatedResponse) ProtoMessage() {} func (x *GetMetadataAllocatedResponse) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[74] + mi := &file_csi_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5950,7 +6063,7 @@ func (x *GetMetadataAllocatedResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetMetadataAllocatedResponse.ProtoReflect.Descriptor instead. func (*GetMetadataAllocatedResponse) Descriptor() ([]byte, []int) { - return file_csi_proto_rawDescGZIP(), []int{74} + return file_csi_proto_rawDescGZIP(), []int{76} } func (x *GetMetadataAllocatedResponse) GetBlockMetadataType() BlockMetadataType { @@ -6019,7 +6132,7 @@ type GetMetadataDeltaRequest struct { func (x *GetMetadataDeltaRequest) Reset() { *x = GetMetadataDeltaRequest{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[75] + mi := &file_csi_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6032,7 +6145,7 @@ func (x *GetMetadataDeltaRequest) String() string { func (*GetMetadataDeltaRequest) ProtoMessage() {} func (x *GetMetadataDeltaRequest) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[75] + mi := &file_csi_proto_msgTypes[77] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6045,7 +6158,7 @@ func (x *GetMetadataDeltaRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetMetadataDeltaRequest.ProtoReflect.Descriptor instead. func (*GetMetadataDeltaRequest) Descriptor() ([]byte, []int) { - return file_csi_proto_rawDescGZIP(), []int{75} + return file_csi_proto_rawDescGZIP(), []int{77} } func (x *GetMetadataDeltaRequest) GetBaseSnapshotId() string { @@ -6123,7 +6236,7 @@ type GetMetadataDeltaResponse struct { func (x *GetMetadataDeltaResponse) Reset() { *x = GetMetadataDeltaResponse{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[76] + mi := &file_csi_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6136,7 +6249,7 @@ func (x *GetMetadataDeltaResponse) String() string { func (*GetMetadataDeltaResponse) ProtoMessage() {} func (x *GetMetadataDeltaResponse) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[76] + mi := &file_csi_proto_msgTypes[78] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6149,7 +6262,7 @@ func (x *GetMetadataDeltaResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetMetadataDeltaResponse.ProtoReflect.Descriptor instead. func (*GetMetadataDeltaResponse) Descriptor() ([]byte, []int) { - return file_csi_proto_rawDescGZIP(), []int{76} + return file_csi_proto_rawDescGZIP(), []int{78} } func (x *GetMetadataDeltaResponse) GetBlockMetadataType() BlockMetadataType { @@ -6184,7 +6297,7 @@ type PluginCapability_Service struct { func (x *PluginCapability_Service) Reset() { *x = PluginCapability_Service{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[78] + mi := &file_csi_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6197,7 +6310,7 @@ func (x *PluginCapability_Service) String() string { func (*PluginCapability_Service) ProtoMessage() {} func (x *PluginCapability_Service) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[78] + mi := &file_csi_proto_msgTypes[80] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6231,7 +6344,7 @@ type PluginCapability_VolumeExpansion struct { func (x *PluginCapability_VolumeExpansion) Reset() { *x = PluginCapability_VolumeExpansion{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[79] + mi := &file_csi_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6244,7 +6357,7 @@ func (x *PluginCapability_VolumeExpansion) String() string { func (*PluginCapability_VolumeExpansion) ProtoMessage() {} func (x *PluginCapability_VolumeExpansion) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[79] + mi := &file_csi_proto_msgTypes[81] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6282,7 +6395,7 @@ type VolumeContentSource_SnapshotSource struct { func (x *VolumeContentSource_SnapshotSource) Reset() { *x = VolumeContentSource_SnapshotSource{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[83] + mi := &file_csi_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6295,7 +6408,7 @@ func (x *VolumeContentSource_SnapshotSource) String() string { func (*VolumeContentSource_SnapshotSource) ProtoMessage() {} func (x *VolumeContentSource_SnapshotSource) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[83] + mi := &file_csi_proto_msgTypes[85] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6332,7 +6445,7 @@ type VolumeContentSource_VolumeSource struct { func (x *VolumeContentSource_VolumeSource) Reset() { *x = VolumeContentSource_VolumeSource{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[84] + mi := &file_csi_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6345,7 +6458,7 @@ func (x *VolumeContentSource_VolumeSource) String() string { func (*VolumeContentSource_VolumeSource) ProtoMessage() {} func (x *VolumeContentSource_VolumeSource) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[84] + mi := &file_csi_proto_msgTypes[86] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6378,7 +6491,7 @@ type VolumeCapability_BlockVolume struct { func (x *VolumeCapability_BlockVolume) Reset() { *x = VolumeCapability_BlockVolume{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[85] + mi := &file_csi_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6391,7 +6504,7 @@ func (x *VolumeCapability_BlockVolume) String() string { func (*VolumeCapability_BlockVolume) ProtoMessage() {} func (x *VolumeCapability_BlockVolume) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[85] + mi := &file_csi_proto_msgTypes[87] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6439,7 +6552,7 @@ type VolumeCapability_MountVolume struct { func (x *VolumeCapability_MountVolume) Reset() { *x = VolumeCapability_MountVolume{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[86] + mi := &file_csi_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6452,7 +6565,7 @@ func (x *VolumeCapability_MountVolume) String() string { func (*VolumeCapability_MountVolume) ProtoMessage() {} func (x *VolumeCapability_MountVolume) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[86] + mi := &file_csi_proto_msgTypes[88] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6502,7 +6615,7 @@ type VolumeCapability_AccessMode struct { func (x *VolumeCapability_AccessMode) Reset() { *x = VolumeCapability_AccessMode{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[87] + mi := &file_csi_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6515,7 +6628,7 @@ func (x *VolumeCapability_AccessMode) String() string { func (*VolumeCapability_AccessMode) ProtoMessage() {} func (x *VolumeCapability_AccessMode) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[87] + mi := &file_csi_proto_msgTypes[89] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6560,7 +6673,7 @@ type ValidateVolumeCapabilitiesResponse_Confirmed struct { func (x *ValidateVolumeCapabilitiesResponse_Confirmed) Reset() { *x = ValidateVolumeCapabilitiesResponse_Confirmed{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[99] + mi := &file_csi_proto_msgTypes[101] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6573,7 +6686,7 @@ func (x *ValidateVolumeCapabilitiesResponse_Confirmed) String() string { func (*ValidateVolumeCapabilitiesResponse_Confirmed) ProtoMessage() {} func (x *ValidateVolumeCapabilitiesResponse_Confirmed) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[99] + mi := &file_csi_proto_msgTypes[101] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6643,7 +6756,7 @@ type ListVolumesResponse_VolumeStatus struct { func (x *ListVolumesResponse_VolumeStatus) Reset() { *x = ListVolumesResponse_VolumeStatus{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[103] + mi := &file_csi_proto_msgTypes[105] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6656,7 +6769,7 @@ func (x *ListVolumesResponse_VolumeStatus) String() string { func (*ListVolumesResponse_VolumeStatus) ProtoMessage() {} func (x *ListVolumesResponse_VolumeStatus) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[103] + mi := &file_csi_proto_msgTypes[105] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6702,7 +6815,7 @@ type ListVolumesResponse_Entry struct { func (x *ListVolumesResponse_Entry) Reset() { *x = ListVolumesResponse_Entry{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[104] + mi := &file_csi_proto_msgTypes[106] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6715,7 +6828,7 @@ func (x *ListVolumesResponse_Entry) String() string { func (*ListVolumesResponse_Entry) ProtoMessage() {} func (x *ListVolumesResponse_Entry) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[104] + mi := &file_csi_proto_msgTypes[106] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6768,7 +6881,7 @@ type ControllerGetVolumeResponse_VolumeStatus struct { func (x *ControllerGetVolumeResponse_VolumeStatus) Reset() { *x = ControllerGetVolumeResponse_VolumeStatus{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[105] + mi := &file_csi_proto_msgTypes[107] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6781,7 +6894,7 @@ func (x *ControllerGetVolumeResponse_VolumeStatus) String() string { func (*ControllerGetVolumeResponse_VolumeStatus) ProtoMessage() {} func (x *ControllerGetVolumeResponse_VolumeStatus) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[105] + mi := &file_csi_proto_msgTypes[107] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6822,7 +6935,7 @@ type ControllerServiceCapability_RPC struct { func (x *ControllerServiceCapability_RPC) Reset() { *x = ControllerServiceCapability_RPC{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[109] + mi := &file_csi_proto_msgTypes[111] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6835,7 +6948,7 @@ func (x *ControllerServiceCapability_RPC) String() string { func (*ControllerServiceCapability_RPC) ProtoMessage() {} func (x *ControllerServiceCapability_RPC) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[109] + mi := &file_csi_proto_msgTypes[111] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6869,7 +6982,7 @@ type ListSnapshotsResponse_Entry struct { func (x *ListSnapshotsResponse_Entry) Reset() { *x = ListSnapshotsResponse_Entry{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[114] + mi := &file_csi_proto_msgTypes[116] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6882,7 +6995,7 @@ func (x *ListSnapshotsResponse_Entry) String() string { func (*ListSnapshotsResponse_Entry) ProtoMessage() {} func (x *ListSnapshotsResponse_Entry) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[114] + mi := &file_csi_proto_msgTypes[116] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6916,7 +7029,7 @@ type NodeServiceCapability_RPC struct { func (x *NodeServiceCapability_RPC) Reset() { *x = NodeServiceCapability_RPC{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[122] + mi := &file_csi_proto_msgTypes[125] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6929,7 +7042,7 @@ func (x *NodeServiceCapability_RPC) String() string { func (*NodeServiceCapability_RPC) ProtoMessage() {} func (x *NodeServiceCapability_RPC) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[122] + mi := &file_csi_proto_msgTypes[125] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6942,7 +7055,7 @@ func (x *NodeServiceCapability_RPC) ProtoReflect() protoreflect.Message { // Deprecated: Use NodeServiceCapability_RPC.ProtoReflect.Descriptor instead. func (*NodeServiceCapability_RPC) Descriptor() ([]byte, []int) { - return file_csi_proto_rawDescGZIP(), []int{57, 0} + return file_csi_proto_rawDescGZIP(), []int{59, 0} } func (x *NodeServiceCapability_RPC) GetType() NodeServiceCapability_RPC_Type { @@ -6963,7 +7076,7 @@ type GroupControllerServiceCapability_RPC struct { func (x *GroupControllerServiceCapability_RPC) Reset() { *x = GroupControllerServiceCapability_RPC{} if protoimpl.UnsafeEnabled { - mi := &file_csi_proto_msgTypes[124] + mi := &file_csi_proto_msgTypes[127] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6976,7 +7089,7 @@ func (x *GroupControllerServiceCapability_RPC) String() string { func (*GroupControllerServiceCapability_RPC) ProtoMessage() {} func (x *GroupControllerServiceCapability_RPC) ProtoReflect() protoreflect.Message { - mi := &file_csi_proto_msgTypes[124] + mi := &file_csi_proto_msgTypes[127] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6989,7 +7102,7 @@ func (x *GroupControllerServiceCapability_RPC) ProtoReflect() protoreflect.Messa // Deprecated: Use GroupControllerServiceCapability_RPC.ProtoReflect.Descriptor instead. func (*GroupControllerServiceCapability_RPC) Descriptor() ([]byte, []int) { - return file_csi_proto_rawDescGZIP(), []int{64, 0} + return file_csi_proto_rawDescGZIP(), []int{66, 0} } func (x *GroupControllerServiceCapability_RPC) GetType() GroupControllerServiceCapability_RPC_Type { @@ -7195,7 +7308,7 @@ var file_csi_proto_rawDesc = []byte{ 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x22, - 0x9e, 0x06, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x99, 0x06, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3c, 0x0a, 0x0e, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, @@ -7226,1192 +7339,1213 @@ var file_csi_proto_rawDesc = []byte{ 0x1b, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x19, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x69, - 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x66, 0x0a, 0x12, 0x6d, 0x75, 0x74, 0x61, 0x62, + 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x61, 0x0a, 0x12, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, - 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x03, 0xa0, 0x42, 0x01, 0x52, 0x11, 0x6d, 0x75, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x1a, - 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3a, - 0x0a, 0x0c, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x4d, 0x75, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x8b, 0x02, 0x0a, 0x13, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x48, 0x0a, 0x08, 0x73, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x63, 0x73, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, - 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x00, 0x52, 0x08, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, - 0x6f, 0x74, 0x12, 0x42, 0x0a, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x00, 0x52, 0x06, - 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x1a, 0x31, 0x0a, 0x0e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, - 0x6f, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, - 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x49, 0x64, 0x1a, 0x2b, 0x0a, 0x0c, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3e, - 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x22, 0x9f, - 0x05, 0x0a, 0x10, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, - 0x69, 0x74, 0x79, 0x12, 0x3c, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x2e, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x48, 0x00, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x12, 0x3c, 0x0a, 0x05, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x24, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x48, 0x00, 0x52, 0x05, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x44, 0x0a, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x2e, 0x41, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0a, 0x61, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x1a, 0x0d, 0x0a, 0x0b, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x1a, 0x75, 0x0a, 0x0b, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x66, 0x73, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, - 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x0a, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x2c, 0x0a, - 0x12, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x76, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x1a, 0xb3, 0x02, 0x0a, 0x0a, - 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x3c, 0x0a, 0x04, 0x6d, 0x6f, - 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, - 0x74, 0x79, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x2e, 0x4d, 0x6f, - 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0xe6, 0x01, 0x0a, 0x04, 0x4d, 0x6f, 0x64, - 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x16, - 0x0a, 0x12, 0x53, 0x49, 0x4e, 0x47, 0x4c, 0x45, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x57, 0x52, - 0x49, 0x54, 0x45, 0x52, 0x10, 0x01, 0x12, 0x1b, 0x0a, 0x17, 0x53, 0x49, 0x4e, 0x47, 0x4c, 0x45, - 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x4f, 0x4e, 0x4c, - 0x59, 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x5f, 0x4e, 0x4f, 0x44, - 0x45, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x03, 0x12, - 0x1c, 0x0a, 0x18, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x49, - 0x4e, 0x47, 0x4c, 0x45, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x52, 0x10, 0x04, 0x12, 0x1b, 0x0a, - 0x17, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x4d, 0x55, 0x4c, 0x54, - 0x49, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x52, 0x10, 0x05, 0x12, 0x22, 0x0a, 0x19, 0x53, 0x49, - 0x4e, 0x47, 0x4c, 0x45, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x49, 0x4e, 0x47, 0x4c, 0x45, - 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x52, 0x10, 0x06, 0x1a, 0x03, 0xa0, 0x42, 0x01, 0x12, 0x21, - 0x0a, 0x18, 0x53, 0x49, 0x4e, 0x47, 0x4c, 0x45, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x4d, 0x55, - 0x4c, 0x54, 0x49, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x52, 0x10, 0x07, 0x1a, 0x03, 0xa0, 0x42, - 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x22, 0x57, 0x0a, 0x0d, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x61, 0x6e, 0x67, - 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x62, 0x79, - 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x72, 0x65, 0x71, 0x75, 0x69, - 0x72, 0x65, 0x64, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x22, 0xdf, 0x02, 0x0a, 0x06, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, - 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x63, 0x61, - 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x76, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x48, 0x0a, 0x0e, 0x76, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x21, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0d, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x78, 0x74, 0x12, 0x42, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x73, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x13, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x05, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x70, - 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x52, 0x12, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x69, 0x62, 0x6c, - 0x65, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x1a, 0x40, 0x0a, 0x12, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3a, 0x0a, 0x0c, 0x53, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x4d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x75, 0x0a, 0x13, 0x54, - 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x09, 0x72, 0x65, 0x71, 0x75, 0x69, 0x73, 0x69, 0x74, 0x65, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, - 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x69, 0x73, 0x69, - 0x74, 0x65, 0x12, 0x2e, 0x0a, 0x09, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, - 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x52, 0x09, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, - 0x65, 0x64, 0x22, 0x83, 0x01, 0x0a, 0x08, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x12, - 0x3a, 0x0a, 0x08, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, - 0x6f, 0x67, 0x79, 0x2e, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x08, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x53, - 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb7, 0x01, 0x0a, 0x13, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x47, 0x0a, - 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, - 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x65, 0x63, 0x72, - 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x03, 0x98, 0x42, 0x01, 0x52, 0x07, 0x73, - 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x1a, 0x3a, 0x0a, 0x0c, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x16, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xed, 0x03, 0x0a, 0x1e, 0x43, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, - 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, - 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, - 0x65, 0x49, 0x64, 0x12, 0x45, 0x0a, 0x11, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x61, - 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, - 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x10, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, - 0x61, 0x64, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, - 0x61, 0x64, 0x6f, 0x6e, 0x6c, 0x79, 0x12, 0x52, 0x0a, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, - 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, - 0x73, 0x68, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, - 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x03, 0x98, 0x42, - 0x01, 0x52, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x60, 0x0a, 0x0e, 0x76, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x06, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x76, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x1a, 0x3a, 0x0a, 0x0c, - 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x40, 0x0a, 0x12, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xca, 0x01, 0x0a, 0x1f, 0x43, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, - 0x0a, 0x0f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, - 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, - 0x73, 0x68, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x78, 0x74, 0x1a, 0x41, 0x0a, 0x13, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xea, 0x01, 0x0a, 0x20, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x55, 0x6e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, - 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, - 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, - 0x49, 0x64, 0x12, 0x54, 0x0a, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x55, 0x6e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x65, - 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x03, 0x98, 0x42, 0x01, 0x52, - 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x1a, 0x3a, 0x0a, 0x0c, 0x53, 0x65, 0x63, 0x72, - 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0x23, 0x0a, 0x21, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, - 0x65, 0x72, 0x55, 0x6e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9b, 0x06, 0x0a, 0x21, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x70, 0x61, - 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x63, 0x0a, 0x0e, - 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x70, 0x61, - 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x0d, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, - 0x74, 0x12, 0x49, 0x0a, 0x13, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x61, 0x70, 0x61, - 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, - 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x12, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x59, 0x0a, 0x0a, - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x39, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, - 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x61, 0x72, - 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x55, 0x0a, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, - 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x42, 0x03, 0x98, 0x42, 0x01, 0x52, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x74, - 0x0a, 0x12, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, - 0x74, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x63, 0x73, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x03, 0xa0, 0x42, - 0x01, 0x52, 0x11, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, - 0x74, 0x65, 0x72, 0x73, 0x1a, 0x40, 0x0a, 0x12, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x8b, 0x02, 0x0a, 0x13, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x12, 0x48, 0x0a, 0x08, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x48, 0x00, 0x52, 0x08, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x42, 0x0a, + 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, + 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x00, 0x52, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x1a, 0x31, 0x0a, 0x0e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x49, 0x64, 0x1a, 0x2b, 0x0a, 0x0c, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, + 0x64, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3e, 0x0a, 0x14, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x26, 0x0a, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x52, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x22, 0x9f, 0x05, 0x0a, 0x10, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x3c, + 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, + 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x70, + 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x48, 0x00, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x3c, 0x0a, 0x05, + 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x73, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, + 0x69, 0x6c, 0x69, 0x74, 0x79, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x48, 0x00, 0x52, 0x05, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x44, 0x0a, 0x0b, 0x61, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x23, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, + 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0a, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, + 0x1a, 0x0d, 0x0a, 0x0b, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x1a, + 0x75, 0x0a, 0x0b, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x17, + 0x0a, 0x07, 0x66, 0x73, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x66, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x6f, 0x75, 0x6e, 0x74, + 0x5f, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x6f, + 0x75, 0x6e, 0x74, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x5f, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4d, 0x6f, 0x75, 0x6e, + 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x1a, 0xb3, 0x02, 0x0a, 0x0a, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x3c, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x2e, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, + 0x6f, 0x64, 0x65, 0x22, 0xe6, 0x01, 0x0a, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0b, 0x0a, 0x07, + 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x49, 0x4e, + 0x47, 0x4c, 0x45, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x52, 0x10, + 0x01, 0x12, 0x1b, 0x0a, 0x17, 0x53, 0x49, 0x4e, 0x47, 0x4c, 0x45, 0x5f, 0x4e, 0x4f, 0x44, 0x45, + 0x5f, 0x52, 0x45, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x02, 0x12, 0x1a, + 0x0a, 0x16, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x52, 0x45, 0x41, + 0x44, 0x45, 0x52, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x03, 0x12, 0x1c, 0x0a, 0x18, 0x4d, 0x55, + 0x4c, 0x54, 0x49, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x49, 0x4e, 0x47, 0x4c, 0x45, 0x5f, + 0x57, 0x52, 0x49, 0x54, 0x45, 0x52, 0x10, 0x04, 0x12, 0x1b, 0x0a, 0x17, 0x4d, 0x55, 0x4c, 0x54, + 0x49, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x5f, 0x57, 0x52, 0x49, + 0x54, 0x45, 0x52, 0x10, 0x05, 0x12, 0x22, 0x0a, 0x19, 0x53, 0x49, 0x4e, 0x47, 0x4c, 0x45, 0x5f, + 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x49, 0x4e, 0x47, 0x4c, 0x45, 0x5f, 0x57, 0x52, 0x49, 0x54, + 0x45, 0x52, 0x10, 0x06, 0x1a, 0x03, 0xa0, 0x42, 0x01, 0x12, 0x21, 0x0a, 0x18, 0x53, 0x49, 0x4e, + 0x47, 0x4c, 0x45, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x5f, 0x57, + 0x52, 0x49, 0x54, 0x45, 0x52, 0x10, 0x07, 0x1a, 0x03, 0xa0, 0x42, 0x01, 0x42, 0x0d, 0x0a, 0x0b, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, 0x57, 0x0a, 0x0d, 0x43, + 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x25, 0x0a, 0x0e, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x42, 0x79, + 0x74, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x62, 0x79, 0x74, + 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x42, + 0x79, 0x74, 0x65, 0x73, 0x22, 0xdf, 0x02, 0x0a, 0x06, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, + 0x25, 0x0a, 0x0e, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x62, 0x79, 0x74, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, + 0x79, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x49, 0x64, 0x12, 0x48, 0x0a, 0x0e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x73, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x2e, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, + 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x42, 0x0a, + 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x12, 0x41, 0x0a, 0x13, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x5f, + 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, + 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, + 0x52, 0x12, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x54, 0x6f, 0x70, 0x6f, + 0x6c, 0x6f, 0x67, 0x79, 0x1a, 0x40, 0x0a, 0x12, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, - 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3a, 0x0a, 0x0c, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x4d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x89, 0x06, 0x0a, 0x22, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, - 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x52, - 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x34, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, - 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, - 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0xf4, 0x04, 0x0a, - 0x09, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x12, 0x6e, 0x0a, 0x0e, 0x76, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, - 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x76, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x49, 0x0a, 0x13, 0x76, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, - 0x79, 0x52, 0x12, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, - 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x64, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, - 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x63, 0x73, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x2e, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x7f, 0x0a, 0x12, 0x6d, - 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, - 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x4b, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, - 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x2e, 0x4d, 0x75, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x42, 0x03, 0xa0, 0x42, 0x01, 0x52, 0x11, 0x6d, 0x75, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x40, 0x0a, 0x12, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3d, - 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x75, 0x0a, 0x13, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, + 0x67, 0x79, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2e, 0x0a, + 0x09, 0x72, 0x65, 0x71, 0x75, 0x69, 0x73, 0x69, 0x74, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x10, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, + 0x67, 0x79, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x69, 0x73, 0x69, 0x74, 0x65, 0x12, 0x2e, 0x0a, + 0x09, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x10, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, + 0x67, 0x79, 0x52, 0x09, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x22, 0x83, 0x01, + 0x0a, 0x08, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x12, 0x3a, 0x0a, 0x08, 0x73, 0x65, + 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, + 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x2e, 0x53, + 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, + 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0xb7, 0x01, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x76, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x47, 0x0a, 0x07, 0x73, 0x65, 0x63, 0x72, + 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x73, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x42, 0x03, 0x98, 0x42, 0x01, 0x52, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x73, 0x1a, 0x3a, 0x0a, 0x0c, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, - 0x16, 0x4d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, - 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x16, 0x0a, + 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xed, 0x03, 0x0a, 0x1e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x6c, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x45, + 0x0a, 0x11, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, + 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x73, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, + 0x69, 0x74, 0x79, 0x52, 0x10, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, + 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x6e, 0x6c, + 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x6e, 0x6c, + 0x79, 0x12, 0x52, 0x0a, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, + 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x03, 0x98, 0x42, 0x01, 0x52, 0x07, 0x73, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x60, 0x0a, 0x0e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, + 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, + 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x1a, 0x3a, 0x0a, 0x0c, 0x53, 0x65, 0x63, 0x72, 0x65, + 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0x5c, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, - 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, - 0x6d, 0x61, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x22, 0xec, 0x02, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x07, 0x65, 0x6e, 0x74, - 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x73, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x65, - 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x65, 0x78, 0x74, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x1a, 0x85, 0x01, 0x0a, 0x0c, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, - 0x68, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x10, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x4e, 0x6f, 0x64, - 0x65, 0x49, 0x64, 0x73, 0x12, 0x47, 0x0a, 0x10, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, - 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, - 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x03, 0xa0, 0x42, 0x01, 0x52, 0x0f, 0x76, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x71, 0x0a, - 0x05, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x26, 0x0a, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x40, - 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, - 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x22, 0x3e, 0x0a, 0x1a, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x47, 0x65, - 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, - 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x3a, 0x03, 0xa0, 0x42, 0x01, - 0x22, 0x97, 0x02, 0x0a, 0x1b, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x47, - 0x65, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x26, 0x0a, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0e, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x52, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x48, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x47, 0x65, 0x74, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x1a, 0x80, 0x01, 0x0a, 0x0c, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, - 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x10, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x64, - 0x73, 0x12, 0x42, 0x0a, 0x10, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x64, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x73, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x64, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x03, 0xa0, 0x42, 0x01, 0x22, 0x83, 0x03, 0x0a, 0x1d, 0x43, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, - 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x51, 0x0a, 0x07, 0x73, 0x65, 0x63, - 0x72, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x63, 0x73, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x4d, 0x6f, - 0x64, 0x69, 0x66, 0x79, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x03, - 0x98, 0x42, 0x01, 0x52, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x6b, 0x0a, 0x12, - 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, - 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x69, - 0x66, 0x79, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, - 0x4d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x3a, 0x0a, 0x0c, 0x53, 0x65, 0x63, - 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x02, 0x38, 0x01, 0x1a, 0x40, 0x0a, 0x12, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x4d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xca, 0x01, 0x0a, 0x1f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x6c, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, 0x0a, 0x0f, 0x70, 0x75, 0x62, + 0x6c, 0x69, 0x73, 0x68, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x50, 0x75, 0x62, 0x6c, + 0x69, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x1a, + 0x41, 0x0a, 0x13, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, + 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0xea, 0x01, 0x0a, 0x20, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, + 0x72, 0x55, 0x6e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x54, 0x0a, + 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, + 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, + 0x65, 0x72, 0x55, 0x6e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x03, 0x98, 0x42, 0x01, 0x52, 0x07, 0x73, 0x65, 0x63, 0x72, + 0x65, 0x74, 0x73, 0x1a, 0x3a, 0x0a, 0x0c, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x23, 0x0a, 0x21, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x55, 0x6e, 0x70, + 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x96, 0x06, 0x0a, 0x21, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, + 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x63, 0x0a, 0x0e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x3c, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, + 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x76, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x49, 0x0a, 0x13, + 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, + 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x73, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, + 0x69, 0x74, 0x79, 0x52, 0x12, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, + 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x59, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x63, 0x73, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x12, 0x55, 0x0a, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, 0x05, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, + 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, + 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x03, 0x98, 0x42, 0x01, + 0x52, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x6f, 0x0a, 0x12, 0x6d, 0x75, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, + 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x70, + 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x2e, 0x4d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x40, 0x0a, 0x12, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x3a, 0x03, 0xa0, 0x42, 0x01, - 0x22, 0x25, 0x0a, 0x1e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x4d, 0x6f, - 0x64, 0x69, 0x66, 0x79, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x3a, 0x03, 0xa0, 0x42, 0x01, 0x22, 0xad, 0x02, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, - 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x49, - 0x0a, 0x13, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, - 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x73, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, - 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x12, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x70, - 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x4a, 0x0a, 0x0a, 0x70, 0x61, 0x72, - 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, - 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, - 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, - 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, - 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x41, 0x0a, 0x13, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x69, - 0x62, 0x6c, 0x65, 0x5f, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x70, 0x6f, - 0x6c, 0x6f, 0x67, 0x79, 0x52, 0x12, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, - 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3a, 0x0a, 0x0c, 0x53, + 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xe3, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x43, - 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x2d, 0x0a, 0x12, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x61, 0x70, - 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x61, 0x76, 0x61, - 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x4b, - 0x0a, 0x13, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, - 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x11, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, - 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x50, 0x0a, 0x13, 0x6d, - 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x69, - 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x36, 0x34, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x03, 0xa0, 0x42, 0x01, 0x52, 0x11, 0x6d, 0x69, 0x6e, 0x69, - 0x6d, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x22, 0x0a, - 0x20, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x47, 0x65, 0x74, 0x43, 0x61, - 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x22, 0x6c, 0x0a, 0x21, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x47, - 0x65, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, - 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, - 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, - 0x79, 0x52, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x22, - 0x96, 0x04, 0x0a, 0x1b, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, - 0x3b, 0x0a, 0x03, 0x72, 0x70, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, - 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, - 0x79, 0x2e, 0x52, 0x50, 0x43, 0x48, 0x00, 0x52, 0x03, 0x72, 0x70, 0x63, 0x1a, 0xb1, 0x03, 0x0a, - 0x03, 0x52, 0x50, 0x43, 0x12, 0x40, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x61, 0x70, - 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x2e, 0x52, 0x50, 0x43, 0x2e, 0x54, 0x79, 0x70, 0x65, - 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0xe7, 0x02, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, - 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x5f, 0x56, 0x4f, - 0x4c, 0x55, 0x4d, 0x45, 0x10, 0x01, 0x12, 0x1c, 0x0a, 0x18, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x53, - 0x48, 0x5f, 0x55, 0x4e, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x53, 0x48, 0x5f, 0x56, 0x4f, 0x4c, 0x55, - 0x4d, 0x45, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x56, 0x4f, 0x4c, - 0x55, 0x4d, 0x45, 0x53, 0x10, 0x03, 0x12, 0x10, 0x0a, 0x0c, 0x47, 0x45, 0x54, 0x5f, 0x43, 0x41, - 0x50, 0x41, 0x43, 0x49, 0x54, 0x59, 0x10, 0x04, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x52, 0x45, 0x41, - 0x54, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x5f, 0x53, 0x4e, 0x41, 0x50, 0x53, 0x48, - 0x4f, 0x54, 0x10, 0x05, 0x12, 0x12, 0x0a, 0x0e, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x53, 0x4e, 0x41, - 0x50, 0x53, 0x48, 0x4f, 0x54, 0x53, 0x10, 0x06, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x4c, 0x4f, 0x4e, - 0x45, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x10, 0x07, 0x12, 0x14, 0x0a, 0x10, 0x50, 0x55, - 0x42, 0x4c, 0x49, 0x53, 0x48, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x08, - 0x12, 0x11, 0x0a, 0x0d, 0x45, 0x58, 0x50, 0x41, 0x4e, 0x44, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, - 0x45, 0x10, 0x09, 0x12, 0x20, 0x0a, 0x1c, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x56, 0x4f, 0x4c, 0x55, - 0x4d, 0x45, 0x53, 0x5f, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x53, 0x48, 0x45, 0x44, 0x5f, 0x4e, 0x4f, - 0x44, 0x45, 0x53, 0x10, 0x0a, 0x12, 0x19, 0x0a, 0x10, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x5f, - 0x43, 0x4f, 0x4e, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x0b, 0x1a, 0x03, 0xa0, 0x42, 0x01, - 0x12, 0x13, 0x0a, 0x0a, 0x47, 0x45, 0x54, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x10, 0x0c, - 0x1a, 0x03, 0xa0, 0x42, 0x01, 0x12, 0x21, 0x0a, 0x18, 0x53, 0x49, 0x4e, 0x47, 0x4c, 0x45, 0x5f, - 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, - 0x52, 0x10, 0x0d, 0x1a, 0x03, 0xa0, 0x42, 0x01, 0x12, 0x16, 0x0a, 0x0d, 0x4d, 0x4f, 0x44, 0x49, - 0x46, 0x59, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x10, 0x0e, 0x1a, 0x03, 0xa0, 0x42, 0x01, - 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0xea, 0x02, 0x0a, 0x15, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x76, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x49, 0x0a, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2a, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x03, 0x98, - 0x42, 0x01, 0x52, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x4d, 0x0a, 0x0a, 0x70, - 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x2d, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, - 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x3a, 0x0a, 0x0c, 0x53, 0x65, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x4d, 0x75, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x84, 0x06, + 0x0a, 0x22, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x52, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, + 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x52, 0x09, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x1a, 0xef, 0x04, 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, + 0x12, 0x6e, 0x0a, 0x0e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x78, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x2e, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0d, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, + 0x12, 0x49, 0x0a, 0x13, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x62, + 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x70, + 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x12, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, + 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x64, 0x0a, 0x0a, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x44, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, + 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x72, 0x6d, 0x65, 0x64, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x12, 0x7a, 0x0a, 0x12, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x4b, 0x2e, + 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, + 0x6d, 0x65, 0x64, 0x2e, 0x4d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x6d, 0x75, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x40, 0x0a, + 0x12, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, + 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, + 0x0a, 0x16, 0x4d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x5c, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x61, + 0x78, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0a, 0x6d, 0x61, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x22, 0xec, 0x02, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x07, 0x65, 0x6e, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x73, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, + 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x65, 0x78, 0x74, 0x5f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x65, 0x78, + 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x1a, 0x85, 0x01, 0x0a, 0x0c, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x73, 0x68, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x10, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x4e, 0x6f, + 0x64, 0x65, 0x49, 0x64, 0x73, 0x12, 0x47, 0x0a, 0x10, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, + 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, + 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x03, 0xa0, 0x42, 0x01, 0x52, 0x0f, 0x76, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x71, + 0x0a, 0x05, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x26, 0x0a, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, + 0x40, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x28, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x22, 0x3e, 0x0a, 0x1a, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x47, + 0x65, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x3a, 0x03, 0xa0, 0x42, + 0x01, 0x22, 0x97, 0x02, 0x0a, 0x1b, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, + 0x47, 0x65, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x26, 0x0a, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x52, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x48, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x63, 0x73, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x47, 0x65, 0x74, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x1a, 0x80, 0x01, 0x0a, 0x0c, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, + 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x10, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x49, + 0x64, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, + 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x03, 0xa0, 0x42, 0x01, 0x22, 0xfe, 0x02, 0x0a, 0x1d, + 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, + 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x51, 0x0a, 0x07, 0x73, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x63, 0x73, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x4d, + 0x6f, 0x64, 0x69, 0x66, 0x79, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, + 0x03, 0x98, 0x42, 0x01, 0x52, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x6b, 0x0a, + 0x12, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x63, 0x73, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x4d, 0x6f, 0x64, + 0x69, 0x66, 0x79, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x2e, 0x4d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x6d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x3a, 0x0a, 0x0c, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, - 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x46, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, - 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x2c, 0x0a, 0x08, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, - 0x68, 0x6f, 0x74, 0x52, 0x08, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x22, 0x83, 0x02, - 0x0a, 0x08, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x69, - 0x7a, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, - 0x73, 0x69, 0x7a, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6e, 0x61, - 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x49, 0x64, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x74, - 0x6f, 0x5f, 0x75, 0x73, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x72, 0x65, 0x61, - 0x64, 0x79, 0x54, 0x6f, 0x55, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x67, 0x72, 0x6f, 0x75, 0x70, - 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, - 0x74, 0x49, 0x64, 0x22, 0xbf, 0x01, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x6e, - 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, - 0x0b, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x49, 0x64, 0x12, 0x49, - 0x0a, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x2a, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x4d, 0x75, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x20, 0x0a, 0x1e, + 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xad, + 0x02, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x49, 0x0a, 0x13, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, + 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x12, 0x76, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, + 0x12, 0x4a, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x41, 0x0a, 0x13, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x74, 0x6f, 0x70, 0x6f, 0x6c, + 0x6f, 0x67, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x73, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x52, 0x12, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x1a, + 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xe3, + 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x11, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x61, 0x70, + 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, + 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x11, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x69, + 0x7a, 0x65, 0x12, 0x50, 0x0a, 0x13, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x76, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x03, 0xa0, 0x42, + 0x01, 0x52, 0x11, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x53, 0x69, 0x7a, 0x65, 0x22, 0x22, 0x0a, 0x20, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, + 0x65, 0x72, 0x47, 0x65, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x6c, 0x0a, 0x21, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x47, 0x65, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, + 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, + 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x61, + 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, + 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x22, 0xa8, 0x04, 0x0a, 0x1b, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x61, 0x70, 0x61, + 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x3b, 0x0a, 0x03, 0x72, 0x70, 0x63, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x61, + 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x2e, 0x52, 0x50, 0x43, 0x48, 0x00, 0x52, 0x03, + 0x72, 0x70, 0x63, 0x1a, 0xc3, 0x03, 0x0a, 0x03, 0x52, 0x50, 0x43, 0x12, 0x40, 0x0a, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x63, 0x73, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x2e, 0x52, + 0x50, 0x43, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0xf9, 0x02, + 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, + 0x4e, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x45, + 0x4c, 0x45, 0x54, 0x45, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x10, 0x01, 0x12, 0x1c, 0x0a, + 0x18, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x53, 0x48, 0x5f, 0x55, 0x4e, 0x50, 0x55, 0x42, 0x4c, 0x49, + 0x53, 0x48, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x4c, + 0x49, 0x53, 0x54, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x53, 0x10, 0x03, 0x12, 0x10, 0x0a, + 0x0c, 0x47, 0x45, 0x54, 0x5f, 0x43, 0x41, 0x50, 0x41, 0x43, 0x49, 0x54, 0x59, 0x10, 0x04, 0x12, + 0x1a, 0x0a, 0x16, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, + 0x5f, 0x53, 0x4e, 0x41, 0x50, 0x53, 0x48, 0x4f, 0x54, 0x10, 0x05, 0x12, 0x12, 0x0a, 0x0e, 0x4c, + 0x49, 0x53, 0x54, 0x5f, 0x53, 0x4e, 0x41, 0x50, 0x53, 0x48, 0x4f, 0x54, 0x53, 0x10, 0x06, 0x12, + 0x10, 0x0a, 0x0c, 0x43, 0x4c, 0x4f, 0x4e, 0x45, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x10, + 0x07, 0x12, 0x14, 0x0a, 0x10, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x53, 0x48, 0x5f, 0x52, 0x45, 0x41, + 0x44, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x08, 0x12, 0x11, 0x0a, 0x0d, 0x45, 0x58, 0x50, 0x41, 0x4e, + 0x44, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x10, 0x09, 0x12, 0x20, 0x0a, 0x1c, 0x4c, 0x49, + 0x53, 0x54, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x53, 0x5f, 0x50, 0x55, 0x42, 0x4c, 0x49, + 0x53, 0x48, 0x45, 0x44, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x53, 0x10, 0x0a, 0x12, 0x19, 0x0a, 0x10, + 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, + 0x10, 0x0b, 0x1a, 0x03, 0xa0, 0x42, 0x01, 0x12, 0x13, 0x0a, 0x0a, 0x47, 0x45, 0x54, 0x5f, 0x56, + 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x10, 0x0c, 0x1a, 0x03, 0xa0, 0x42, 0x01, 0x12, 0x21, 0x0a, 0x18, + 0x53, 0x49, 0x4e, 0x47, 0x4c, 0x45, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x4d, 0x55, 0x4c, 0x54, + 0x49, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x52, 0x10, 0x0d, 0x1a, 0x03, 0xa0, 0x42, 0x01, 0x12, + 0x11, 0x0a, 0x0d, 0x4d, 0x4f, 0x44, 0x49, 0x46, 0x59, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, + 0x10, 0x0e, 0x12, 0x15, 0x0a, 0x0c, 0x47, 0x45, 0x54, 0x5f, 0x53, 0x4e, 0x41, 0x50, 0x53, 0x48, + 0x4f, 0x54, 0x10, 0x0f, 0x1a, 0x03, 0xa0, 0x42, 0x01, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x22, 0xea, 0x02, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x49, 0x0a, 0x07, 0x73, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x63, 0x73, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x03, 0x98, 0x42, 0x01, 0x52, 0x07, 0x73, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x73, 0x12, 0x4d, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x73, 0x1a, 0x3a, 0x0a, 0x0c, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, + 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x46, + 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x08, 0x73, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x73, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x08, 0x73, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x22, 0x83, 0x02, 0x0a, 0x08, 0x53, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x79, 0x74, + 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x76, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x3f, 0x0a, + 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x20, + 0x0a, 0x0c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x74, 0x6f, 0x5f, 0x75, 0x73, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x79, 0x54, 0x6f, 0x55, 0x73, 0x65, + 0x12, 0x2a, 0x0a, 0x11, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x49, 0x64, 0x22, 0xbf, 0x01, 0x0a, + 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x49, 0x64, 0x12, 0x49, 0x0a, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, + 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x42, 0x03, 0x98, 0x42, 0x01, 0x52, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, + 0x74, 0x73, 0x1a, 0x3a, 0x0a, 0x0c, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x18, + 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xaf, 0x02, 0x0a, 0x14, 0x4c, 0x69, 0x73, + 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x49, 0x64, 0x12, 0x48, 0x0a, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x42, 0x03, 0x98, 0x42, 0x01, 0x52, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x1a, 0x3a, + 0x0a, 0x0c, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xac, 0x01, 0x0a, 0x15, 0x4c, + 0x69, 0x73, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, + 0x69, 0x65, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x1a, 0x35, 0x0a, 0x05, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x2c, 0x0a, 0x08, 0x73, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, + 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, + 0x08, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x22, 0xbe, 0x01, 0x0a, 0x12, 0x47, 0x65, + 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x49, + 0x64, 0x12, 0x46, 0x0a, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x03, 0x98, 0x42, 0x01, 0x52, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x1a, 0x3a, 0x0a, 0x0c, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x18, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, - 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0xaf, 0x02, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, - 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6d, - 0x61, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x12, 0x28, 0x0a, 0x10, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6e, - 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x49, 0x64, 0x12, 0x48, 0x0a, 0x07, 0x73, - 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x63, - 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, - 0x6f, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, - 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x03, 0x98, 0x42, 0x01, 0x52, 0x07, 0x73, 0x65, - 0x63, 0x72, 0x65, 0x74, 0x73, 0x1a, 0x3a, 0x0a, 0x0c, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0xac, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, - 0x6f, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x07, 0x65, - 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, - 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, - 0x6f, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x65, - 0x78, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x6e, 0x65, 0x78, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x1a, 0x35, 0x0a, 0x05, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x2c, 0x0a, 0x08, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, - 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x08, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, - 0x22, 0xd0, 0x02, 0x0a, 0x1d, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x45, - 0x78, 0x70, 0x61, 0x6e, 0x64, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x12, - 0x3c, 0x0a, 0x0e, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x72, 0x61, 0x6e, 0x67, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0d, - 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x51, 0x0a, - 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, - 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, - 0x65, 0x72, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x3a, 0x03, 0xa0, 0x42, 0x01, 0x22, 0x48, 0x0a, 0x13, 0x47, 0x65, + 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x2c, 0x0a, 0x08, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x08, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x3a, + 0x03, 0xa0, 0x42, 0x01, 0x22, 0xd0, 0x02, 0x0a, 0x1d, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x6c, 0x65, 0x72, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x49, 0x64, 0x12, 0x3c, 0x0a, 0x0e, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, + 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x73, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x61, 0x6e, + 0x67, 0x65, 0x52, 0x0d, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x61, 0x6e, 0x67, + 0x65, 0x12, 0x51, 0x0a, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x03, 0x98, 0x42, 0x01, 0x52, 0x07, 0x73, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x73, 0x12, 0x45, 0x0a, 0x11, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, + 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x18, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, + 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x10, 0x76, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x1a, 0x3a, 0x0a, 0x0c, 0x53, + 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x7f, 0x0a, 0x1e, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x61, 0x70, + 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x0d, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x42, 0x79, 0x74, 0x65, 0x73, + 0x12, 0x36, 0x0a, 0x17, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x15, 0x6e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0xf0, 0x04, 0x0a, 0x16, 0x4e, 0x6f, 0x64, + 0x65, 0x53, 0x74, 0x61, 0x67, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, + 0x12, 0x5b, 0x0a, 0x0f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x63, 0x73, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x67, 0x65, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, + 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x70, + 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x2e, 0x0a, + 0x13, 0x73, 0x74, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, + 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x74, 0x61, 0x67, + 0x69, 0x6e, 0x67, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x12, 0x45, 0x0a, + 0x11, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, + 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, + 0x74, 0x79, 0x52, 0x10, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, + 0x6c, 0x69, 0x74, 0x79, 0x12, 0x4a, 0x0a, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, + 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x67, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x03, 0x98, 0x42, 0x01, 0x52, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, - 0x12, 0x45, 0x0a, 0x11, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x62, - 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x73, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, - 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x10, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x70, - 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x1a, 0x3a, 0x0a, 0x0c, 0x53, 0x65, 0x63, 0x72, 0x65, - 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0x7f, 0x0a, 0x1e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, - 0x72, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, - 0x79, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x63, - 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x36, 0x0a, 0x17, - 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x72, - 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x6e, - 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x69, 0x72, 0x65, 0x64, 0x22, 0xf0, 0x04, 0x0a, 0x16, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, - 0x67, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x5b, 0x0a, 0x0f, - 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, - 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x67, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x70, 0x75, 0x62, 0x6c, 0x69, - 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x74, 0x61, - 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x74, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x12, 0x45, 0x0a, 0x11, 0x76, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x10, - 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, - 0x12, 0x4a, 0x0a, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2b, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, - 0x74, 0x61, 0x67, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x03, - 0x98, 0x42, 0x01, 0x52, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x58, 0x0a, 0x0e, - 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x06, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, - 0x64, 0x65, 0x53, 0x74, 0x61, 0x67, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x1a, 0x41, 0x0a, 0x13, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, - 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x12, 0x58, 0x0a, 0x0e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x78, 0x74, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x67, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x76, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x1a, 0x41, 0x0a, 0x13, 0x50, 0x75, + 0x62, 0x6c, 0x69, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3a, 0x0a, + 0x0c, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3a, 0x0a, 0x0c, 0x53, 0x65, 0x63, - 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x40, 0x0a, 0x12, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x6f, 0x64, 0x65, 0x53, - 0x74, 0x61, 0x67, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x67, 0x0a, 0x18, 0x4e, 0x6f, 0x64, 0x65, 0x55, 0x6e, 0x73, 0x74, 0x61, 0x67, - 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, - 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x73, - 0x74, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x61, - 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x74, 0x61, 0x67, 0x69, 0x6e, - 0x67, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x22, 0x1b, 0x0a, 0x19, 0x4e, - 0x6f, 0x64, 0x65, 0x55, 0x6e, 0x73, 0x74, 0x61, 0x67, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb5, 0x05, 0x0a, 0x18, 0x4e, 0x6f, 0x64, - 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x49, 0x64, 0x12, 0x5d, 0x0a, 0x0f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x5f, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x63, 0x73, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x75, - 0x62, 0x6c, 0x69, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, - 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x74, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, - 0x73, 0x74, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x50, 0x61, 0x74, - 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x50, 0x61, - 0x74, 0x68, 0x12, 0x45, 0x0a, 0x11, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x61, 0x70, - 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x70, - 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x10, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, - 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x61, - 0x64, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, - 0x64, 0x6f, 0x6e, 0x6c, 0x79, 0x12, 0x4c, 0x0a, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, - 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x03, 0x98, 0x42, 0x01, 0x52, 0x07, 0x73, 0x65, 0x63, 0x72, - 0x65, 0x74, 0x73, 0x12, 0x5a, 0x0a, 0x0e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x63, 0x73, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x0d, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x1a, - 0x41, 0x0a, 0x13, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, - 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x40, 0x0a, 0x12, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, + 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x67, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x67, 0x0a, 0x18, 0x4e, 0x6f, 0x64, 0x65, 0x55, 0x6e, + 0x73, 0x74, 0x61, 0x67, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x12, + 0x2e, 0x0a, 0x13, 0x73, 0x74, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x74, + 0x61, 0x67, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x22, + 0x1b, 0x0a, 0x19, 0x4e, 0x6f, 0x64, 0x65, 0x55, 0x6e, 0x73, 0x74, 0x61, 0x67, 0x65, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb5, 0x05, 0x0a, + 0x18, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x5d, 0x0a, 0x0f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, + 0x68, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x34, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x75, 0x62, + 0x6c, 0x69, 0x73, 0x68, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x74, 0x61, 0x67, 0x69, 0x6e, 0x67, + 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x11, 0x73, 0x74, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, + 0x70, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x12, 0x45, 0x0a, 0x11, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x5f, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x10, 0x76, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x1a, 0x0a, + 0x08, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x08, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x6e, 0x6c, 0x79, 0x12, 0x4c, 0x0a, 0x07, 0x73, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x63, 0x73, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x03, 0x98, 0x42, 0x01, 0x52, 0x07, + 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x5a, 0x0a, 0x0e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x33, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x75, 0x62, + 0x6c, 0x69, 0x73, 0x68, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x1a, 0x41, 0x0a, 0x13, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3a, 0x0a, 0x0c, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x1a, 0x3a, 0x0a, 0x0c, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x40, - 0x0a, 0x12, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x1b, 0x0a, 0x19, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5a, 0x0a, - 0x1a, 0x4e, 0x6f, 0x64, 0x65, 0x55, 0x6e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x76, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x22, 0x1d, 0x0a, 0x1b, 0x4e, 0x6f, 0x64, - 0x65, 0x55, 0x6e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x89, 0x01, 0x0a, 0x19, 0x4e, 0x6f, 0x64, - 0x65, 0x47, 0x65, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x70, 0x61, - 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x50, 0x61, 0x74, 0x68, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x74, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x11, 0x73, 0x74, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x50, 0x61, 0x74, 0x68, 0x22, 0x90, 0x01, 0x0a, 0x1a, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x74, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x05, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x55, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x75, 0x73, 0x61, 0x67, 0x65, 0x12, 0x47, - 0x0a, 0x10, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x42, 0x03, 0xa0, 0x42, 0x01, 0x52, 0x0f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, - 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xaf, 0x01, 0x0a, 0x0b, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x76, 0x61, 0x69, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x61, 0x76, 0x61, 0x69, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x75, - 0x73, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x75, 0x73, 0x65, 0x64, 0x12, - 0x2c, 0x0a, 0x04, 0x75, 0x6e, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, - 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x55, 0x73, 0x61, - 0x67, 0x65, 0x2e, 0x55, 0x6e, 0x69, 0x74, 0x52, 0x04, 0x75, 0x6e, 0x69, 0x74, 0x22, 0x2a, 0x0a, - 0x04, 0x55, 0x6e, 0x69, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, - 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x42, 0x59, 0x54, 0x45, 0x53, 0x10, 0x01, 0x12, 0x0a, 0x0a, - 0x06, 0x49, 0x4e, 0x4f, 0x44, 0x45, 0x53, 0x10, 0x02, 0x22, 0x4c, 0x0a, 0x0f, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, - 0x61, 0x62, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, - 0x61, 0x62, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x3a, 0x03, 0xa0, 0x42, 0x01, 0x22, 0x1c, 0x0a, 0x1a, 0x4e, 0x6f, 0x64, 0x65, 0x47, - 0x65, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x60, 0x0a, 0x1b, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x74, - 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, - 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x63, 0x73, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, - 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, - 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x22, 0xc9, 0x02, 0x0a, 0x15, 0x4e, 0x6f, 0x64, 0x65, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, - 0x79, 0x12, 0x35, 0x0a, 0x03, 0x72, 0x70, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, - 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x2e, 0x52, 0x50, - 0x43, 0x48, 0x00, 0x52, 0x03, 0x72, 0x70, 0x63, 0x1a, 0xf0, 0x01, 0x0a, 0x03, 0x52, 0x50, 0x43, - 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, - 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x2e, 0x52, 0x50, - 0x43, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0xac, 0x01, 0x0a, - 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, - 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x53, 0x54, 0x41, 0x47, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x54, - 0x41, 0x47, 0x45, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, - 0x47, 0x45, 0x54, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x53, - 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x45, 0x58, 0x50, 0x41, 0x4e, 0x44, 0x5f, 0x56, 0x4f, 0x4c, - 0x55, 0x4d, 0x45, 0x10, 0x03, 0x12, 0x19, 0x0a, 0x10, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x5f, - 0x43, 0x4f, 0x4e, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x04, 0x1a, 0x03, 0xa0, 0x42, 0x01, - 0x12, 0x21, 0x0a, 0x18, 0x53, 0x49, 0x4e, 0x47, 0x4c, 0x45, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, - 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x52, 0x10, 0x05, 0x1a, 0x03, - 0xa0, 0x42, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x5f, 0x4d, 0x4f, - 0x55, 0x4e, 0x54, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x10, 0x06, 0x42, 0x06, 0x0a, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x22, 0x14, 0x0a, 0x12, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x74, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa2, 0x01, 0x0a, 0x13, 0x4e, 0x6f, - 0x64, 0x65, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x14, 0x6d, 0x61, - 0x78, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6e, 0x6f, - 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x6d, 0x61, 0x78, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x73, 0x50, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x41, 0x0a, 0x13, 0x61, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, - 0x67, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x52, 0x12, 0x61, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x22, 0x98, - 0x03, 0x0a, 0x17, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, + 0x38, 0x01, 0x1a, 0x40, 0x0a, 0x12, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1b, 0x0a, 0x19, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x75, 0x62, 0x6c, + 0x69, 0x73, 0x68, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x5a, 0x0a, 0x1a, 0x4e, 0x6f, 0x64, 0x65, 0x55, 0x6e, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x73, 0x68, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x22, 0x1d, 0x0a, + 0x1b, 0x4e, 0x6f, 0x64, 0x65, 0x55, 0x6e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x89, 0x01, 0x0a, + 0x19, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x74, + 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x76, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x3c, 0x0a, 0x0e, 0x63, 0x61, 0x70, 0x61, - 0x63, 0x69, 0x74, 0x79, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x15, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, - 0x74, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0d, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, - 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x74, 0x61, 0x67, 0x69, 0x6e, - 0x67, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x74, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x12, 0x45, 0x0a, 0x11, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x5f, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x10, 0x76, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x4e, 0x0a, - 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, - 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x61, - 0x6e, 0x64, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, - 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x06, 0x98, 0x42, - 0x01, 0xa0, 0x42, 0x01, 0x52, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x1a, 0x3a, 0x0a, - 0x0c, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x41, 0x0a, 0x18, 0x4e, 0x6f, 0x64, - 0x65, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, - 0x79, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x63, - 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x42, 0x79, 0x74, 0x65, 0x73, 0x22, 0x27, 0x0a, 0x25, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x47, - 0x65, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x76, 0x0a, 0x26, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x47, 0x65, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, - 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x4c, 0x0a, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, - 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x22, 0xfd, 0x01, - 0x0a, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, - 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, - 0x74, 0x79, 0x12, 0x40, 0x0a, 0x03, 0x72, 0x70, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x2c, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, - 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x2e, 0x52, 0x50, 0x43, 0x48, 0x00, 0x52, - 0x03, 0x72, 0x70, 0x63, 0x1a, 0x8e, 0x01, 0x0a, 0x03, 0x52, 0x50, 0x43, 0x12, 0x45, 0x0a, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x31, 0x2e, 0x63, 0x73, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x6c, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, - 0x6c, 0x69, 0x74, 0x79, 0x2e, 0x52, 0x50, 0x43, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x22, 0x40, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, - 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x2b, 0x0a, 0x27, 0x43, 0x52, 0x45, 0x41, - 0x54, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x5f, 0x47, 0x45, 0x54, 0x5f, 0x56, 0x4f, - 0x4c, 0x55, 0x4d, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x53, 0x4e, 0x41, 0x50, 0x53, - 0x48, 0x4f, 0x54, 0x10, 0x01, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x8d, 0x03, - 0x0a, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x0f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, - 0x64, 0x73, 0x12, 0x54, 0x0a, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x6e, - 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x65, - 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x03, 0x98, 0x42, 0x01, 0x52, - 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, - 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x63, - 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, - 0x72, 0x73, 0x1a, 0x3a, 0x0a, 0x0c, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3d, - 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x6c, 0x75, 0x6d, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x74, 0x61, 0x67, + 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x74, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x54, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x22, 0x90, 0x01, 0x0a, 0x1a, 0x4e, 0x6f, 0x64, + 0x65, 0x47, 0x65, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x05, 0x75, 0x73, 0x61, 0x67, 0x65, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x55, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x75, 0x73, 0x61, + 0x67, 0x65, 0x12, 0x47, 0x0a, 0x10, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, + 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x03, 0xa0, 0x42, 0x01, 0x52, 0x0f, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xaf, 0x01, 0x0a, 0x0b, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, + 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, + 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x75, + 0x73, 0x65, 0x64, 0x12, 0x2c, 0x0a, 0x04, 0x75, 0x6e, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x18, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x55, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x6e, 0x69, 0x74, 0x52, 0x04, 0x75, 0x6e, 0x69, + 0x74, 0x22, 0x2a, 0x0a, 0x04, 0x55, 0x6e, 0x69, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, + 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x42, 0x59, 0x54, 0x45, 0x53, 0x10, + 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x49, 0x4e, 0x4f, 0x44, 0x45, 0x53, 0x10, 0x02, 0x22, 0x4c, 0x0a, + 0x0f, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x62, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x08, 0x61, 0x62, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x12, 0x18, 0x0a, 0x07, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x03, 0xa0, 0x42, 0x01, 0x22, 0x1c, 0x0a, 0x1a, 0x4e, + 0x6f, 0x64, 0x65, 0x47, 0x65, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x60, 0x0a, 0x1b, 0x4e, 0x6f, 0x64, + 0x65, 0x47, 0x65, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x0c, 0x63, 0x61, 0x70, 0x61, + 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x0c, 0x63, + 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x22, 0xc9, 0x02, 0x0a, 0x15, + 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, + 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x35, 0x0a, 0x03, 0x72, 0x70, 0x63, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, + 0x79, 0x2e, 0x52, 0x50, 0x43, 0x48, 0x00, 0x52, 0x03, 0x72, 0x70, 0x63, 0x1a, 0xf0, 0x01, 0x0a, + 0x03, 0x52, 0x50, 0x43, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, + 0x79, 0x2e, 0x52, 0x50, 0x43, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x22, 0xac, 0x01, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, + 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x53, 0x54, 0x41, 0x47, 0x45, 0x5f, + 0x55, 0x4e, 0x53, 0x54, 0x41, 0x47, 0x45, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x10, 0x01, + 0x12, 0x14, 0x0a, 0x10, 0x47, 0x45, 0x54, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x53, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x45, 0x58, 0x50, 0x41, 0x4e, 0x44, + 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x10, 0x03, 0x12, 0x19, 0x0a, 0x10, 0x56, 0x4f, 0x4c, + 0x55, 0x4d, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x04, 0x1a, + 0x03, 0xa0, 0x42, 0x01, 0x12, 0x21, 0x0a, 0x18, 0x53, 0x49, 0x4e, 0x47, 0x4c, 0x45, 0x5f, 0x4e, + 0x4f, 0x44, 0x45, 0x5f, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x52, + 0x10, 0x05, 0x1a, 0x03, 0xa0, 0x42, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x56, 0x4f, 0x4c, 0x55, 0x4d, + 0x45, 0x5f, 0x4d, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x10, 0x06, 0x42, + 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x14, 0x0a, 0x12, 0x4e, 0x6f, 0x64, 0x65, 0x47, + 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa2, 0x01, + 0x0a, 0x13, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x2f, + 0x0a, 0x14, 0x6d, 0x61, 0x78, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x5f, 0x70, 0x65, + 0x72, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x6d, 0x61, + 0x78, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x50, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x12, + 0x41, 0x0a, 0x13, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x74, 0x6f, + 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, + 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x52, 0x12, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, + 0x67, 0x79, 0x22, 0x98, 0x03, 0x0a, 0x17, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x61, 0x6e, + 0x64, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, + 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x76, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x3c, 0x0a, 0x0e, + 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, + 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0d, 0x63, 0x61, 0x70, + 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x74, + 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x61, 0x74, + 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x74, 0x61, 0x67, 0x69, 0x6e, 0x67, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x12, 0x45, 0x0a, 0x11, 0x76, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, + 0x10, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, + 0x79, 0x12, 0x4e, 0x0a, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, + 0x45, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x42, 0x06, 0x98, 0x42, 0x01, 0xa0, 0x42, 0x01, 0x52, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x73, 0x1a, 0x3a, 0x0a, 0x0c, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x67, 0x0a, - 0x21, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x42, 0x0a, 0x0e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x73, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, - 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x0d, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x6e, - 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x22, 0xd4, 0x01, 0x0a, 0x13, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x2a, - 0x0a, 0x11, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x67, 0x72, 0x6f, 0x75, 0x70, - 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x09, 0x73, 0x6e, - 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, - 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, - 0x09, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0c, 0x72, - 0x65, 0x61, 0x64, 0x79, 0x5f, 0x74, 0x6f, 0x5f, 0x75, 0x73, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x79, 0x54, 0x6f, 0x55, 0x73, 0x65, 0x22, 0x83, 0x02, - 0x0a, 0x20, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x49, 0x64, 0x12, 0x21, - 0x0a, 0x0c, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x49, 0x64, - 0x73, 0x12, 0x54, 0x0a, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x6e, 0x61, - 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x65, 0x63, - 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x03, 0x98, 0x42, 0x01, 0x52, 0x07, - 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x1a, 0x3a, 0x0a, 0x0c, 0x53, 0x65, 0x63, 0x72, 0x65, - 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0x23, 0x0a, 0x21, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xfd, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x6e, 0x61, 0x70, 0x73, - 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, - 0x6f, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x6e, - 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x49, 0x64, 0x73, 0x12, 0x51, 0x0a, 0x07, 0x73, 0x65, 0x63, - 0x72, 0x65, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x63, 0x73, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x41, 0x0a, + 0x18, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x61, 0x70, + 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x0d, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x42, 0x79, 0x74, 0x65, 0x73, + 0x22, 0x27, 0x0a, 0x25, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x6c, 0x65, 0x72, 0x47, 0x65, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x76, 0x0a, 0x26, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x47, 0x65, 0x74, 0x43, + 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, + 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x73, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, + 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, + 0x69, 0x74, 0x79, 0x52, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, + 0x73, 0x22, 0xfd, 0x01, 0x0a, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x61, 0x70, 0x61, + 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x40, 0x0a, 0x03, 0x72, 0x70, 0x63, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x2e, 0x52, 0x50, + 0x43, 0x48, 0x00, 0x52, 0x03, 0x72, 0x70, 0x63, 0x1a, 0x8e, 0x01, 0x0a, 0x03, 0x52, 0x50, 0x43, + 0x12, 0x45, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x31, + 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x61, + 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x2e, 0x52, 0x50, 0x43, 0x2e, 0x54, 0x79, 0x70, + 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x40, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x2b, 0x0a, 0x27, + 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x5f, 0x47, 0x45, + 0x54, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x53, + 0x4e, 0x41, 0x50, 0x53, 0x48, 0x4f, 0x54, 0x10, 0x01, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x8d, 0x03, 0x0a, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x49, 0x64, 0x73, 0x12, 0x54, 0x0a, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x03, - 0x98, 0x42, 0x01, 0x52, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x1a, 0x3a, 0x0a, 0x0c, - 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x64, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x56, + 0x98, 0x42, 0x01, 0x52, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x58, 0x0a, 0x0a, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x38, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x3a, 0x0a, 0x0c, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x67, 0x0a, 0x21, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x0e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, + 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x0d, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x22, 0xd4, 0x01, 0x0a, 0x13, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, - 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x0e, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, + 0x6f, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x49, 0x64, 0x12, 0x2e, + 0x0a, 0x09, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x52, 0x09, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x12, 0x3f, + 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x12, + 0x20, 0x0a, 0x0c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x74, 0x6f, 0x5f, 0x75, 0x73, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x79, 0x54, 0x6f, 0x55, 0x73, + 0x65, 0x22, 0x83, 0x02, 0x0a, 0x20, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, - 0x0d, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x22, 0x4f, - 0x0a, 0x0d, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, - 0x1f, 0x0a, 0x0b, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x62, 0x79, 0x74, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, - 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x22, - 0x95, 0x02, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x41, - 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1f, 0x0a, 0x0b, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x49, 0x64, - 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x6f, 0x66, 0x66, - 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x69, 0x6e, 0x67, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, - 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, - 0x6d, 0x61, 0x78, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x4f, 0x0a, 0x07, 0x73, 0x65, - 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x63, 0x73, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, + 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x69, + 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x49, 0x64, 0x73, 0x12, 0x54, 0x0a, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x03, 0x98, 0x42, 0x01, 0x52, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x1a, 0x3a, 0x0a, 0x0c, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xdb, 0x01, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x13, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, - 0x52, 0x11, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x61, - 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x13, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, - 0x74, 0x79, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x0e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x0d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0xc4, 0x02, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x28, 0x0a, 0x10, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, - 0x6f, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x62, 0x61, 0x73, - 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x12, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, - 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x4f, 0x66, 0x66, 0x73, - 0x65, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x73, 0x12, 0x4b, 0x0a, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, 0x05, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x52, 0x65, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x23, 0x0a, 0x21, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xfd, 0x01, 0x0a, + 0x1d, 0x47, 0x65, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, + 0x0a, 0x11, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x0b, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x49, 0x64, 0x73, 0x12, 0x51, 0x0a, + 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, + 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x03, 0x98, 0x42, 0x01, 0x52, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x1a, 0x3a, 0x0a, 0x0c, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd7, 0x01, 0x0a, - 0x18, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, 0x65, 0x6c, 0x74, - 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x13, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, - 0x65, 0x52, 0x11, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, - 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x13, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x70, 0x61, 0x63, - 0x69, 0x74, 0x79, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x0e, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x15, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x0d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2a, 0x47, 0x0a, 0x11, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, - 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x46, 0x49, 0x58, 0x45, - 0x44, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x56, 0x41, - 0x52, 0x49, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x10, 0x02, 0x32, - 0xfa, 0x01, 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x4e, 0x0a, 0x0d, - 0x47, 0x65, 0x74, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x2e, - 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x63, 0x73, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x15, - 0x47, 0x65, 0x74, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, - 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, - 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x63, 0x73, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, - 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x36, 0x0a, 0x05, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x12, 0x14, 0x2e, - 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, - 0x62, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x32, 0xbb, 0x0a, 0x0a, - 0x0a, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x12, 0x4b, 0x0a, 0x0c, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x1b, 0x2e, 0x63, 0x73, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x1b, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x6c, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x12, 0x26, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x6c, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, - 0x69, 0x73, 0x68, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, - 0x72, 0x55, 0x6e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x12, 0x28, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x6c, 0x65, 0x72, 0x55, 0x6e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x73, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x55, 0x6e, - 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x75, 0x0a, 0x1a, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, - 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x29, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x64, 0x0a, 0x1e, + 0x47, 0x65, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, + 0x0a, 0x0e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x52, 0x0d, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x22, 0x4f, 0x0a, 0x0d, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x6f, 0x66, 0x66, 0x73, + 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x62, 0x79, 0x74, 0x65, 0x4f, 0x66, + 0x66, 0x73, 0x65, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x62, 0x79, 0x74, + 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x79, + 0x74, 0x65, 0x73, 0x22, 0x95, 0x02, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, + 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x1f, 0x0a, + 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x4f, + 0x0a, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x30, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x42, 0x03, 0x98, 0x42, 0x01, 0x52, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x1a, + 0x3a, 0x0a, 0x0c, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xdb, 0x01, 0x0a, 0x1c, + 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x41, 0x6c, 0x6c, 0x6f, 0x63, + 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x13, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x63, 0x73, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x54, 0x79, 0x70, 0x65, 0x52, 0x11, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x76, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, + 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x0e, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x0d, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0xc4, 0x02, 0x0a, 0x17, 0x47, 0x65, + 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x73, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x62, 0x61, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x49, 0x64, 0x12, + 0x2c, 0x0a, 0x12, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x49, 0x64, 0x12, 0x27, 0x0a, + 0x0f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, + 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6d, 0x61, 0x78, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x4b, 0x0a, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, + 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, 0x65, 0x6c, + 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x03, 0x98, 0x42, 0x01, 0x52, 0x07, 0x73, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x73, 0x1a, 0x3a, 0x0a, 0x0c, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0xd7, 0x01, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x44, 0x65, 0x6c, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, + 0x13, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x63, 0x73, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x54, 0x79, 0x70, 0x65, 0x52, 0x11, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x62, 0x79, 0x74, 0x65, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, + 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x0e, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x0d, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2a, 0x47, 0x0a, 0x11, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, + 0x46, 0x49, 0x58, 0x45, 0x44, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x10, 0x01, 0x12, 0x13, + 0x0a, 0x0f, 0x56, 0x41, 0x52, 0x49, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, + 0x48, 0x10, 0x02, 0x32, 0xfa, 0x01, 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x12, 0x4e, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x1c, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6c, + 0x75, 0x67, 0x69, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1d, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x75, 0x67, + 0x69, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x66, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x70, + 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x63, 0x73, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x70, 0x61, + 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x25, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x75, 0x67, + 0x69, 0x6e, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x36, 0x0a, 0x05, 0x50, 0x72, 0x6f, 0x62, + 0x65, 0x12, 0x14, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x62, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x32, 0x85, 0x0b, 0x0a, 0x0a, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x12, + 0x4b, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, + 0x1b, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x63, + 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0c, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x1b, 0x2e, 0x63, + 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x63, 0x73, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x17, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x26, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x63, + 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, + 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x55, 0x6e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x28, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x55, 0x6e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, + 0x68, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, + 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, + 0x65, 0x72, 0x55, 0x6e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x75, 0x0a, 0x1a, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x70, - 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2a, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, - 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, - 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x12, 0x1a, 0x2e, + 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x29, 0x2e, 0x63, 0x73, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x61, 0x70, 0x61, + 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x73, 0x12, 0x1a, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x63, 0x73, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x43, - 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x1a, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x65, 0x74, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x72, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, - 0x47, 0x65, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, - 0x28, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x6c, 0x65, 0x72, 0x47, 0x65, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x73, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x47, 0x65, 0x74, - 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x1d, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x1d, 0x2e, 0x63, 0x73, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, - 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x63, 0x73, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, - 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0d, - 0x4c, 0x69, 0x73, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x12, 0x1c, 0x2e, - 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, - 0x68, 0x6f, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x63, 0x73, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, - 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, 0x0a, 0x16, - 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x64, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x25, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x64, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0b, + 0x47, 0x65, 0x74, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x1a, 0x2e, 0x63, 0x73, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x6c, 0x65, 0x72, 0x47, 0x65, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, + 0x69, 0x65, 0x73, 0x12, 0x28, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x47, 0x65, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, + 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, - 0x72, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x13, 0x43, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x47, 0x65, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x22, + 0x72, 0x47, 0x65, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x1d, 0x2e, 0x63, + 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x63, 0x73, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, + 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, + 0x1d, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, + 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x4e, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x73, 0x12, 0x1c, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1d, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x4b, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, + 0x1a, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x63, 0x73, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0xa0, 0x42, 0x01, 0x12, 0x69, 0x0a, + 0x16, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x45, 0x78, 0x70, 0x61, 0x6e, + 0x64, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x25, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x45, 0x78, 0x70, 0x61, 0x6e, + 0x64, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, - 0x65, 0x72, 0x47, 0x65, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x47, 0x65, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0xa0, 0x42, 0x01, 0x12, 0x6c, 0x0a, 0x16, - 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x25, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, - 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, - 0x72, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0xa0, 0x42, 0x01, 0x32, 0xe8, 0x03, 0x0a, 0x0f, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x12, 0x81, - 0x01, 0x0a, 0x1e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, - 0x65, 0x72, 0x47, 0x65, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, - 0x73, 0x12, 0x2d, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x47, 0x65, 0x74, 0x43, 0x61, 0x70, - 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2e, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x47, 0x65, 0x74, 0x43, 0x61, 0x70, 0x61, - 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x72, 0x0a, 0x19, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, - 0x28, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, - 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x73, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x19, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x6e, 0x61, 0x70, 0x73, - 0x68, 0x6f, 0x74, 0x12, 0x28, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x6e, - 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, - 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x56, 0x6f, 0x6c, + 0x65, 0x72, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x13, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x47, 0x65, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, + 0x22, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x6c, 0x65, 0x72, 0x47, 0x65, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x47, 0x65, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0xa0, 0x42, 0x01, 0x12, 0x69, 0x0a, + 0x16, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x69, 0x66, + 0x79, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x25, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x69, 0x66, + 0x79, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, + 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, + 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x32, 0xe8, 0x03, 0x0a, 0x0f, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x12, 0x81, 0x01, 0x0a, + 0x1e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, + 0x47, 0x65, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, + 0x2d, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x47, 0x65, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, + 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, + 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x47, 0x65, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, + 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x72, 0x0a, 0x19, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x28, 0x2e, + 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, 0x0a, 0x16, 0x47, 0x65, - 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x12, 0x25, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x63, 0x73, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x32, 0xd9, 0x01, 0x0a, 0x10, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, - 0x6f, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x65, 0x0a, 0x14, 0x47, 0x65, - 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, - 0x65, 0x64, 0x12, 0x23, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4d, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x19, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x12, 0x28, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x73, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x12, 0x25, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x63, 0x73, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x32, 0xd9, 0x01, 0x0a, 0x10, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x65, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x41, 0x6c, 0x6c, 0x6f, - 0x63, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, - 0x01, 0x12, 0x59, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x44, 0x65, 0x6c, 0x74, 0x61, 0x12, 0x1f, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, 0x65, 0x6c, 0x74, 0x61, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x1a, 0x03, 0xa0, 0x42, - 0x01, 0x32, 0xda, 0x05, 0x0a, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x54, 0x0a, 0x0f, 0x4e, 0x6f, - 0x64, 0x65, 0x53, 0x74, 0x61, 0x67, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x1e, 0x2e, - 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x67, 0x65, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, - 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x67, 0x65, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x5a, 0x0a, 0x11, 0x4e, 0x6f, 0x64, 0x65, 0x55, 0x6e, 0x73, 0x74, 0x61, 0x67, 0x65, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x20, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, + 0x12, 0x23, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, + 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, + 0x59, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, 0x65, + 0x6c, 0x74, 0x61, 0x12, 0x1f, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x1a, 0x03, 0xa0, 0x42, 0x01, 0x32, + 0xda, 0x05, 0x0a, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x54, 0x0a, 0x0f, 0x4e, 0x6f, 0x64, 0x65, + 0x53, 0x74, 0x61, 0x67, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x1e, 0x2e, 0x63, 0x73, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x67, 0x65, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x63, 0x73, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x67, 0x65, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, + 0x0a, 0x11, 0x4e, 0x6f, 0x64, 0x65, 0x55, 0x6e, 0x73, 0x74, 0x61, 0x67, 0x65, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x12, 0x20, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, + 0x65, 0x55, 0x6e, 0x73, 0x74, 0x61, 0x67, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x55, 0x6e, 0x73, 0x74, 0x61, 0x67, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x55, 0x6e, 0x73, 0x74, 0x61, 0x67, 0x65, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x11, - 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x12, 0x20, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, - 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, - 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x13, 0x4e, 0x6f, 0x64, 0x65, - 0x55, 0x6e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, - 0x22, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x55, 0x6e, 0x70, - 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, - 0x65, 0x55, 0x6e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x12, 0x4e, 0x6f, - 0x64, 0x65, 0x47, 0x65, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, - 0x12, 0x21, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x65, - 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, - 0x65, 0x47, 0x65, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x10, 0x4e, 0x6f, 0x64, - 0x65, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x1f, 0x2e, - 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x61, 0x6e, - 0x64, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, - 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x61, - 0x6e, 0x64, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x60, 0x0a, 0x13, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x74, 0x43, 0x61, 0x70, - 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x63, 0x73, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, - 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, - 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x74, 0x43, 0x61, - 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0b, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, - 0x65, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1b, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x74, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x3a, 0x3c, - 0x0a, 0x0a, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x1c, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x09, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x45, 0x6e, 0x75, 0x6d, 0x3a, 0x4c, 0x0a, 0x10, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x12, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x3d, 0x0a, 0x0a, 0x63, 0x73, - 0x69, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, - 0x63, 0x73, 0x69, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x3a, 0x3f, 0x0a, 0x0b, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x3a, 0x45, 0x0a, 0x0d, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x3a, 0x42, 0x0a, 0x0c, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, - 0x64, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x4d, - 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3a, 0x45, 0x0a, 0x0d, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, 0x38, 0x5a, 0x36, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x2d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2d, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x70, 0x65, 0x63, 0x2f, 0x6c, 0x69, 0x62, 0x2f, - 0x67, 0x6f, 0x2f, 0x63, 0x73, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x11, 0x4e, 0x6f, + 0x64, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, + 0x20, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x75, 0x62, + 0x6c, 0x69, 0x73, 0x68, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x21, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, + 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x13, 0x4e, 0x6f, 0x64, 0x65, 0x55, 0x6e, + 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x22, 0x2e, + 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x55, 0x6e, 0x70, 0x75, 0x62, + 0x6c, 0x69, 0x73, 0x68, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x55, + 0x6e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x12, 0x4e, 0x6f, 0x64, 0x65, + 0x47, 0x65, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x21, + 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x74, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x22, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, + 0x65, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x10, 0x4e, 0x6f, 0x64, 0x65, 0x45, + 0x78, 0x70, 0x61, 0x6e, 0x64, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x1f, 0x2e, 0x63, 0x73, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x63, + 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x64, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x60, 0x0a, 0x13, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, + 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, + 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x73, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x74, 0x43, 0x61, 0x70, 0x61, + 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0b, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x1a, 0x2e, 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, + 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, + 0x63, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x65, 0x74, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x3a, 0x3c, 0x0a, 0x0a, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, + 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x09, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x45, 0x6e, 0x75, 0x6d, 0x3a, 0x4c, 0x0a, 0x10, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x45, + 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x3d, 0x0a, 0x0a, 0x63, 0x73, 0x69, 0x5f, + 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x73, + 0x69, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x3a, 0x3f, 0x0a, 0x0b, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x3a, 0x45, 0x0a, 0x0d, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, + 0x42, 0x0a, 0x0c, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, + 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x4d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x3a, 0x45, 0x0a, 0x0d, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, 0x38, 0x5a, 0x36, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x2d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x66, 0x61, 0x63, 0x65, 0x2f, 0x73, 0x70, 0x65, 0x63, 0x2f, 0x6c, 0x69, 0x62, 0x2f, 0x67, 0x6f, + 0x2f, 0x63, 0x73, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -8427,7 +8561,7 @@ func file_csi_proto_rawDescGZIP() []byte { } var file_csi_proto_enumTypes = make([]protoimpl.EnumInfo, 8) -var file_csi_proto_msgTypes = make([]protoimpl.MessageInfo, 131) +var file_csi_proto_msgTypes = make([]protoimpl.MessageInfo, 134) var file_csi_proto_goTypes = []interface{}{ (BlockMetadataType)(0), // 0: csi.v1.BlockMetadataType (PluginCapability_Service_Type)(0), // 1: csi.v1.PluginCapability.Service.Type @@ -8478,287 +8612,294 @@ var file_csi_proto_goTypes = []interface{}{ (*DeleteSnapshotResponse)(nil), // 46: csi.v1.DeleteSnapshotResponse (*ListSnapshotsRequest)(nil), // 47: csi.v1.ListSnapshotsRequest (*ListSnapshotsResponse)(nil), // 48: csi.v1.ListSnapshotsResponse - (*ControllerExpandVolumeRequest)(nil), // 49: csi.v1.ControllerExpandVolumeRequest - (*ControllerExpandVolumeResponse)(nil), // 50: csi.v1.ControllerExpandVolumeResponse - (*NodeStageVolumeRequest)(nil), // 51: csi.v1.NodeStageVolumeRequest - (*NodeStageVolumeResponse)(nil), // 52: csi.v1.NodeStageVolumeResponse - (*NodeUnstageVolumeRequest)(nil), // 53: csi.v1.NodeUnstageVolumeRequest - (*NodeUnstageVolumeResponse)(nil), // 54: csi.v1.NodeUnstageVolumeResponse - (*NodePublishVolumeRequest)(nil), // 55: csi.v1.NodePublishVolumeRequest - (*NodePublishVolumeResponse)(nil), // 56: csi.v1.NodePublishVolumeResponse - (*NodeUnpublishVolumeRequest)(nil), // 57: csi.v1.NodeUnpublishVolumeRequest - (*NodeUnpublishVolumeResponse)(nil), // 58: csi.v1.NodeUnpublishVolumeResponse - (*NodeGetVolumeStatsRequest)(nil), // 59: csi.v1.NodeGetVolumeStatsRequest - (*NodeGetVolumeStatsResponse)(nil), // 60: csi.v1.NodeGetVolumeStatsResponse - (*VolumeUsage)(nil), // 61: csi.v1.VolumeUsage - (*VolumeCondition)(nil), // 62: csi.v1.VolumeCondition - (*NodeGetCapabilitiesRequest)(nil), // 63: csi.v1.NodeGetCapabilitiesRequest - (*NodeGetCapabilitiesResponse)(nil), // 64: csi.v1.NodeGetCapabilitiesResponse - (*NodeServiceCapability)(nil), // 65: csi.v1.NodeServiceCapability - (*NodeGetInfoRequest)(nil), // 66: csi.v1.NodeGetInfoRequest - (*NodeGetInfoResponse)(nil), // 67: csi.v1.NodeGetInfoResponse - (*NodeExpandVolumeRequest)(nil), // 68: csi.v1.NodeExpandVolumeRequest - (*NodeExpandVolumeResponse)(nil), // 69: csi.v1.NodeExpandVolumeResponse - (*GroupControllerGetCapabilitiesRequest)(nil), // 70: csi.v1.GroupControllerGetCapabilitiesRequest - (*GroupControllerGetCapabilitiesResponse)(nil), // 71: csi.v1.GroupControllerGetCapabilitiesResponse - (*GroupControllerServiceCapability)(nil), // 72: csi.v1.GroupControllerServiceCapability - (*CreateVolumeGroupSnapshotRequest)(nil), // 73: csi.v1.CreateVolumeGroupSnapshotRequest - (*CreateVolumeGroupSnapshotResponse)(nil), // 74: csi.v1.CreateVolumeGroupSnapshotResponse - (*VolumeGroupSnapshot)(nil), // 75: csi.v1.VolumeGroupSnapshot - (*DeleteVolumeGroupSnapshotRequest)(nil), // 76: csi.v1.DeleteVolumeGroupSnapshotRequest - (*DeleteVolumeGroupSnapshotResponse)(nil), // 77: csi.v1.DeleteVolumeGroupSnapshotResponse - (*GetVolumeGroupSnapshotRequest)(nil), // 78: csi.v1.GetVolumeGroupSnapshotRequest - (*GetVolumeGroupSnapshotResponse)(nil), // 79: csi.v1.GetVolumeGroupSnapshotResponse - (*BlockMetadata)(nil), // 80: csi.v1.BlockMetadata - (*GetMetadataAllocatedRequest)(nil), // 81: csi.v1.GetMetadataAllocatedRequest - (*GetMetadataAllocatedResponse)(nil), // 82: csi.v1.GetMetadataAllocatedResponse - (*GetMetadataDeltaRequest)(nil), // 83: csi.v1.GetMetadataDeltaRequest - (*GetMetadataDeltaResponse)(nil), // 84: csi.v1.GetMetadataDeltaResponse - nil, // 85: csi.v1.GetPluginInfoResponse.ManifestEntry - (*PluginCapability_Service)(nil), // 86: csi.v1.PluginCapability.Service - (*PluginCapability_VolumeExpansion)(nil), // 87: csi.v1.PluginCapability.VolumeExpansion - nil, // 88: csi.v1.CreateVolumeRequest.ParametersEntry - nil, // 89: csi.v1.CreateVolumeRequest.SecretsEntry - nil, // 90: csi.v1.CreateVolumeRequest.MutableParametersEntry - (*VolumeContentSource_SnapshotSource)(nil), // 91: csi.v1.VolumeContentSource.SnapshotSource - (*VolumeContentSource_VolumeSource)(nil), // 92: csi.v1.VolumeContentSource.VolumeSource - (*VolumeCapability_BlockVolume)(nil), // 93: csi.v1.VolumeCapability.BlockVolume - (*VolumeCapability_MountVolume)(nil), // 94: csi.v1.VolumeCapability.MountVolume - (*VolumeCapability_AccessMode)(nil), // 95: csi.v1.VolumeCapability.AccessMode - nil, // 96: csi.v1.Volume.VolumeContextEntry - nil, // 97: csi.v1.Topology.SegmentsEntry - nil, // 98: csi.v1.DeleteVolumeRequest.SecretsEntry - nil, // 99: csi.v1.ControllerPublishVolumeRequest.SecretsEntry - nil, // 100: csi.v1.ControllerPublishVolumeRequest.VolumeContextEntry - nil, // 101: csi.v1.ControllerPublishVolumeResponse.PublishContextEntry - nil, // 102: csi.v1.ControllerUnpublishVolumeRequest.SecretsEntry - nil, // 103: csi.v1.ValidateVolumeCapabilitiesRequest.VolumeContextEntry - nil, // 104: csi.v1.ValidateVolumeCapabilitiesRequest.ParametersEntry - nil, // 105: csi.v1.ValidateVolumeCapabilitiesRequest.SecretsEntry - nil, // 106: csi.v1.ValidateVolumeCapabilitiesRequest.MutableParametersEntry - (*ValidateVolumeCapabilitiesResponse_Confirmed)(nil), // 107: csi.v1.ValidateVolumeCapabilitiesResponse.Confirmed - nil, // 108: csi.v1.ValidateVolumeCapabilitiesResponse.Confirmed.VolumeContextEntry - nil, // 109: csi.v1.ValidateVolumeCapabilitiesResponse.Confirmed.ParametersEntry - nil, // 110: csi.v1.ValidateVolumeCapabilitiesResponse.Confirmed.MutableParametersEntry - (*ListVolumesResponse_VolumeStatus)(nil), // 111: csi.v1.ListVolumesResponse.VolumeStatus - (*ListVolumesResponse_Entry)(nil), // 112: csi.v1.ListVolumesResponse.Entry - (*ControllerGetVolumeResponse_VolumeStatus)(nil), // 113: csi.v1.ControllerGetVolumeResponse.VolumeStatus - nil, // 114: csi.v1.ControllerModifyVolumeRequest.SecretsEntry - nil, // 115: csi.v1.ControllerModifyVolumeRequest.MutableParametersEntry - nil, // 116: csi.v1.GetCapacityRequest.ParametersEntry - (*ControllerServiceCapability_RPC)(nil), // 117: csi.v1.ControllerServiceCapability.RPC - nil, // 118: csi.v1.CreateSnapshotRequest.SecretsEntry - nil, // 119: csi.v1.CreateSnapshotRequest.ParametersEntry - nil, // 120: csi.v1.DeleteSnapshotRequest.SecretsEntry - nil, // 121: csi.v1.ListSnapshotsRequest.SecretsEntry - (*ListSnapshotsResponse_Entry)(nil), // 122: csi.v1.ListSnapshotsResponse.Entry - nil, // 123: csi.v1.ControllerExpandVolumeRequest.SecretsEntry - nil, // 124: csi.v1.NodeStageVolumeRequest.PublishContextEntry - nil, // 125: csi.v1.NodeStageVolumeRequest.SecretsEntry - nil, // 126: csi.v1.NodeStageVolumeRequest.VolumeContextEntry - nil, // 127: csi.v1.NodePublishVolumeRequest.PublishContextEntry - nil, // 128: csi.v1.NodePublishVolumeRequest.SecretsEntry - nil, // 129: csi.v1.NodePublishVolumeRequest.VolumeContextEntry - (*NodeServiceCapability_RPC)(nil), // 130: csi.v1.NodeServiceCapability.RPC - nil, // 131: csi.v1.NodeExpandVolumeRequest.SecretsEntry - (*GroupControllerServiceCapability_RPC)(nil), // 132: csi.v1.GroupControllerServiceCapability.RPC - nil, // 133: csi.v1.CreateVolumeGroupSnapshotRequest.SecretsEntry - nil, // 134: csi.v1.CreateVolumeGroupSnapshotRequest.ParametersEntry - nil, // 135: csi.v1.DeleteVolumeGroupSnapshotRequest.SecretsEntry - nil, // 136: csi.v1.GetVolumeGroupSnapshotRequest.SecretsEntry - nil, // 137: csi.v1.GetMetadataAllocatedRequest.SecretsEntry - nil, // 138: csi.v1.GetMetadataDeltaRequest.SecretsEntry - (*wrapperspb.BoolValue)(nil), // 139: google.protobuf.BoolValue - (*wrapperspb.Int64Value)(nil), // 140: google.protobuf.Int64Value - (*timestamppb.Timestamp)(nil), // 141: google.protobuf.Timestamp - (*descriptorpb.EnumOptions)(nil), // 142: google.protobuf.EnumOptions - (*descriptorpb.EnumValueOptions)(nil), // 143: google.protobuf.EnumValueOptions - (*descriptorpb.FieldOptions)(nil), // 144: google.protobuf.FieldOptions - (*descriptorpb.MessageOptions)(nil), // 145: google.protobuf.MessageOptions - (*descriptorpb.MethodOptions)(nil), // 146: google.protobuf.MethodOptions - (*descriptorpb.ServiceOptions)(nil), // 147: google.protobuf.ServiceOptions + (*GetSnapshotRequest)(nil), // 49: csi.v1.GetSnapshotRequest + (*GetSnapshotResponse)(nil), // 50: csi.v1.GetSnapshotResponse + (*ControllerExpandVolumeRequest)(nil), // 51: csi.v1.ControllerExpandVolumeRequest + (*ControllerExpandVolumeResponse)(nil), // 52: csi.v1.ControllerExpandVolumeResponse + (*NodeStageVolumeRequest)(nil), // 53: csi.v1.NodeStageVolumeRequest + (*NodeStageVolumeResponse)(nil), // 54: csi.v1.NodeStageVolumeResponse + (*NodeUnstageVolumeRequest)(nil), // 55: csi.v1.NodeUnstageVolumeRequest + (*NodeUnstageVolumeResponse)(nil), // 56: csi.v1.NodeUnstageVolumeResponse + (*NodePublishVolumeRequest)(nil), // 57: csi.v1.NodePublishVolumeRequest + (*NodePublishVolumeResponse)(nil), // 58: csi.v1.NodePublishVolumeResponse + (*NodeUnpublishVolumeRequest)(nil), // 59: csi.v1.NodeUnpublishVolumeRequest + (*NodeUnpublishVolumeResponse)(nil), // 60: csi.v1.NodeUnpublishVolumeResponse + (*NodeGetVolumeStatsRequest)(nil), // 61: csi.v1.NodeGetVolumeStatsRequest + (*NodeGetVolumeStatsResponse)(nil), // 62: csi.v1.NodeGetVolumeStatsResponse + (*VolumeUsage)(nil), // 63: csi.v1.VolumeUsage + (*VolumeCondition)(nil), // 64: csi.v1.VolumeCondition + (*NodeGetCapabilitiesRequest)(nil), // 65: csi.v1.NodeGetCapabilitiesRequest + (*NodeGetCapabilitiesResponse)(nil), // 66: csi.v1.NodeGetCapabilitiesResponse + (*NodeServiceCapability)(nil), // 67: csi.v1.NodeServiceCapability + (*NodeGetInfoRequest)(nil), // 68: csi.v1.NodeGetInfoRequest + (*NodeGetInfoResponse)(nil), // 69: csi.v1.NodeGetInfoResponse + (*NodeExpandVolumeRequest)(nil), // 70: csi.v1.NodeExpandVolumeRequest + (*NodeExpandVolumeResponse)(nil), // 71: csi.v1.NodeExpandVolumeResponse + (*GroupControllerGetCapabilitiesRequest)(nil), // 72: csi.v1.GroupControllerGetCapabilitiesRequest + (*GroupControllerGetCapabilitiesResponse)(nil), // 73: csi.v1.GroupControllerGetCapabilitiesResponse + (*GroupControllerServiceCapability)(nil), // 74: csi.v1.GroupControllerServiceCapability + (*CreateVolumeGroupSnapshotRequest)(nil), // 75: csi.v1.CreateVolumeGroupSnapshotRequest + (*CreateVolumeGroupSnapshotResponse)(nil), // 76: csi.v1.CreateVolumeGroupSnapshotResponse + (*VolumeGroupSnapshot)(nil), // 77: csi.v1.VolumeGroupSnapshot + (*DeleteVolumeGroupSnapshotRequest)(nil), // 78: csi.v1.DeleteVolumeGroupSnapshotRequest + (*DeleteVolumeGroupSnapshotResponse)(nil), // 79: csi.v1.DeleteVolumeGroupSnapshotResponse + (*GetVolumeGroupSnapshotRequest)(nil), // 80: csi.v1.GetVolumeGroupSnapshotRequest + (*GetVolumeGroupSnapshotResponse)(nil), // 81: csi.v1.GetVolumeGroupSnapshotResponse + (*BlockMetadata)(nil), // 82: csi.v1.BlockMetadata + (*GetMetadataAllocatedRequest)(nil), // 83: csi.v1.GetMetadataAllocatedRequest + (*GetMetadataAllocatedResponse)(nil), // 84: csi.v1.GetMetadataAllocatedResponse + (*GetMetadataDeltaRequest)(nil), // 85: csi.v1.GetMetadataDeltaRequest + (*GetMetadataDeltaResponse)(nil), // 86: csi.v1.GetMetadataDeltaResponse + nil, // 87: csi.v1.GetPluginInfoResponse.ManifestEntry + (*PluginCapability_Service)(nil), // 88: csi.v1.PluginCapability.Service + (*PluginCapability_VolumeExpansion)(nil), // 89: csi.v1.PluginCapability.VolumeExpansion + nil, // 90: csi.v1.CreateVolumeRequest.ParametersEntry + nil, // 91: csi.v1.CreateVolumeRequest.SecretsEntry + nil, // 92: csi.v1.CreateVolumeRequest.MutableParametersEntry + (*VolumeContentSource_SnapshotSource)(nil), // 93: csi.v1.VolumeContentSource.SnapshotSource + (*VolumeContentSource_VolumeSource)(nil), // 94: csi.v1.VolumeContentSource.VolumeSource + (*VolumeCapability_BlockVolume)(nil), // 95: csi.v1.VolumeCapability.BlockVolume + (*VolumeCapability_MountVolume)(nil), // 96: csi.v1.VolumeCapability.MountVolume + (*VolumeCapability_AccessMode)(nil), // 97: csi.v1.VolumeCapability.AccessMode + nil, // 98: csi.v1.Volume.VolumeContextEntry + nil, // 99: csi.v1.Topology.SegmentsEntry + nil, // 100: csi.v1.DeleteVolumeRequest.SecretsEntry + nil, // 101: csi.v1.ControllerPublishVolumeRequest.SecretsEntry + nil, // 102: csi.v1.ControllerPublishVolumeRequest.VolumeContextEntry + nil, // 103: csi.v1.ControllerPublishVolumeResponse.PublishContextEntry + nil, // 104: csi.v1.ControllerUnpublishVolumeRequest.SecretsEntry + nil, // 105: csi.v1.ValidateVolumeCapabilitiesRequest.VolumeContextEntry + nil, // 106: csi.v1.ValidateVolumeCapabilitiesRequest.ParametersEntry + nil, // 107: csi.v1.ValidateVolumeCapabilitiesRequest.SecretsEntry + nil, // 108: csi.v1.ValidateVolumeCapabilitiesRequest.MutableParametersEntry + (*ValidateVolumeCapabilitiesResponse_Confirmed)(nil), // 109: csi.v1.ValidateVolumeCapabilitiesResponse.Confirmed + nil, // 110: csi.v1.ValidateVolumeCapabilitiesResponse.Confirmed.VolumeContextEntry + nil, // 111: csi.v1.ValidateVolumeCapabilitiesResponse.Confirmed.ParametersEntry + nil, // 112: csi.v1.ValidateVolumeCapabilitiesResponse.Confirmed.MutableParametersEntry + (*ListVolumesResponse_VolumeStatus)(nil), // 113: csi.v1.ListVolumesResponse.VolumeStatus + (*ListVolumesResponse_Entry)(nil), // 114: csi.v1.ListVolumesResponse.Entry + (*ControllerGetVolumeResponse_VolumeStatus)(nil), // 115: csi.v1.ControllerGetVolumeResponse.VolumeStatus + nil, // 116: csi.v1.ControllerModifyVolumeRequest.SecretsEntry + nil, // 117: csi.v1.ControllerModifyVolumeRequest.MutableParametersEntry + nil, // 118: csi.v1.GetCapacityRequest.ParametersEntry + (*ControllerServiceCapability_RPC)(nil), // 119: csi.v1.ControllerServiceCapability.RPC + nil, // 120: csi.v1.CreateSnapshotRequest.SecretsEntry + nil, // 121: csi.v1.CreateSnapshotRequest.ParametersEntry + nil, // 122: csi.v1.DeleteSnapshotRequest.SecretsEntry + nil, // 123: csi.v1.ListSnapshotsRequest.SecretsEntry + (*ListSnapshotsResponse_Entry)(nil), // 124: csi.v1.ListSnapshotsResponse.Entry + nil, // 125: csi.v1.GetSnapshotRequest.SecretsEntry + nil, // 126: csi.v1.ControllerExpandVolumeRequest.SecretsEntry + nil, // 127: csi.v1.NodeStageVolumeRequest.PublishContextEntry + nil, // 128: csi.v1.NodeStageVolumeRequest.SecretsEntry + nil, // 129: csi.v1.NodeStageVolumeRequest.VolumeContextEntry + nil, // 130: csi.v1.NodePublishVolumeRequest.PublishContextEntry + nil, // 131: csi.v1.NodePublishVolumeRequest.SecretsEntry + nil, // 132: csi.v1.NodePublishVolumeRequest.VolumeContextEntry + (*NodeServiceCapability_RPC)(nil), // 133: csi.v1.NodeServiceCapability.RPC + nil, // 134: csi.v1.NodeExpandVolumeRequest.SecretsEntry + (*GroupControllerServiceCapability_RPC)(nil), // 135: csi.v1.GroupControllerServiceCapability.RPC + nil, // 136: csi.v1.CreateVolumeGroupSnapshotRequest.SecretsEntry + nil, // 137: csi.v1.CreateVolumeGroupSnapshotRequest.ParametersEntry + nil, // 138: csi.v1.DeleteVolumeGroupSnapshotRequest.SecretsEntry + nil, // 139: csi.v1.GetVolumeGroupSnapshotRequest.SecretsEntry + nil, // 140: csi.v1.GetMetadataAllocatedRequest.SecretsEntry + nil, // 141: csi.v1.GetMetadataDeltaRequest.SecretsEntry + (*wrapperspb.BoolValue)(nil), // 142: google.protobuf.BoolValue + (*wrapperspb.Int64Value)(nil), // 143: google.protobuf.Int64Value + (*timestamppb.Timestamp)(nil), // 144: google.protobuf.Timestamp + (*descriptorpb.EnumOptions)(nil), // 145: google.protobuf.EnumOptions + (*descriptorpb.EnumValueOptions)(nil), // 146: google.protobuf.EnumValueOptions + (*descriptorpb.FieldOptions)(nil), // 147: google.protobuf.FieldOptions + (*descriptorpb.MessageOptions)(nil), // 148: google.protobuf.MessageOptions + (*descriptorpb.MethodOptions)(nil), // 149: google.protobuf.MethodOptions + (*descriptorpb.ServiceOptions)(nil), // 150: google.protobuf.ServiceOptions } var file_csi_proto_depIdxs = []int32{ - 85, // 0: csi.v1.GetPluginInfoResponse.manifest:type_name -> csi.v1.GetPluginInfoResponse.ManifestEntry + 87, // 0: csi.v1.GetPluginInfoResponse.manifest:type_name -> csi.v1.GetPluginInfoResponse.ManifestEntry 12, // 1: csi.v1.GetPluginCapabilitiesResponse.capabilities:type_name -> csi.v1.PluginCapability - 86, // 2: csi.v1.PluginCapability.service:type_name -> csi.v1.PluginCapability.Service - 87, // 3: csi.v1.PluginCapability.volume_expansion:type_name -> csi.v1.PluginCapability.VolumeExpansion - 139, // 4: csi.v1.ProbeResponse.ready:type_name -> google.protobuf.BoolValue + 88, // 2: csi.v1.PluginCapability.service:type_name -> csi.v1.PluginCapability.Service + 89, // 3: csi.v1.PluginCapability.volume_expansion:type_name -> csi.v1.PluginCapability.VolumeExpansion + 142, // 4: csi.v1.ProbeResponse.ready:type_name -> google.protobuf.BoolValue 19, // 5: csi.v1.CreateVolumeRequest.capacity_range:type_name -> csi.v1.CapacityRange 18, // 6: csi.v1.CreateVolumeRequest.volume_capabilities:type_name -> csi.v1.VolumeCapability - 88, // 7: csi.v1.CreateVolumeRequest.parameters:type_name -> csi.v1.CreateVolumeRequest.ParametersEntry - 89, // 8: csi.v1.CreateVolumeRequest.secrets:type_name -> csi.v1.CreateVolumeRequest.SecretsEntry + 90, // 7: csi.v1.CreateVolumeRequest.parameters:type_name -> csi.v1.CreateVolumeRequest.ParametersEntry + 91, // 8: csi.v1.CreateVolumeRequest.secrets:type_name -> csi.v1.CreateVolumeRequest.SecretsEntry 16, // 9: csi.v1.CreateVolumeRequest.volume_content_source:type_name -> csi.v1.VolumeContentSource 21, // 10: csi.v1.CreateVolumeRequest.accessibility_requirements:type_name -> csi.v1.TopologyRequirement - 90, // 11: csi.v1.CreateVolumeRequest.mutable_parameters:type_name -> csi.v1.CreateVolumeRequest.MutableParametersEntry - 91, // 12: csi.v1.VolumeContentSource.snapshot:type_name -> csi.v1.VolumeContentSource.SnapshotSource - 92, // 13: csi.v1.VolumeContentSource.volume:type_name -> csi.v1.VolumeContentSource.VolumeSource + 92, // 11: csi.v1.CreateVolumeRequest.mutable_parameters:type_name -> csi.v1.CreateVolumeRequest.MutableParametersEntry + 93, // 12: csi.v1.VolumeContentSource.snapshot:type_name -> csi.v1.VolumeContentSource.SnapshotSource + 94, // 13: csi.v1.VolumeContentSource.volume:type_name -> csi.v1.VolumeContentSource.VolumeSource 20, // 14: csi.v1.CreateVolumeResponse.volume:type_name -> csi.v1.Volume - 93, // 15: csi.v1.VolumeCapability.block:type_name -> csi.v1.VolumeCapability.BlockVolume - 94, // 16: csi.v1.VolumeCapability.mount:type_name -> csi.v1.VolumeCapability.MountVolume - 95, // 17: csi.v1.VolumeCapability.access_mode:type_name -> csi.v1.VolumeCapability.AccessMode - 96, // 18: csi.v1.Volume.volume_context:type_name -> csi.v1.Volume.VolumeContextEntry + 95, // 15: csi.v1.VolumeCapability.block:type_name -> csi.v1.VolumeCapability.BlockVolume + 96, // 16: csi.v1.VolumeCapability.mount:type_name -> csi.v1.VolumeCapability.MountVolume + 97, // 17: csi.v1.VolumeCapability.access_mode:type_name -> csi.v1.VolumeCapability.AccessMode + 98, // 18: csi.v1.Volume.volume_context:type_name -> csi.v1.Volume.VolumeContextEntry 16, // 19: csi.v1.Volume.content_source:type_name -> csi.v1.VolumeContentSource 22, // 20: csi.v1.Volume.accessible_topology:type_name -> csi.v1.Topology 22, // 21: csi.v1.TopologyRequirement.requisite:type_name -> csi.v1.Topology 22, // 22: csi.v1.TopologyRequirement.preferred:type_name -> csi.v1.Topology - 97, // 23: csi.v1.Topology.segments:type_name -> csi.v1.Topology.SegmentsEntry - 98, // 24: csi.v1.DeleteVolumeRequest.secrets:type_name -> csi.v1.DeleteVolumeRequest.SecretsEntry + 99, // 23: csi.v1.Topology.segments:type_name -> csi.v1.Topology.SegmentsEntry + 100, // 24: csi.v1.DeleteVolumeRequest.secrets:type_name -> csi.v1.DeleteVolumeRequest.SecretsEntry 18, // 25: csi.v1.ControllerPublishVolumeRequest.volume_capability:type_name -> csi.v1.VolumeCapability - 99, // 26: csi.v1.ControllerPublishVolumeRequest.secrets:type_name -> csi.v1.ControllerPublishVolumeRequest.SecretsEntry - 100, // 27: csi.v1.ControllerPublishVolumeRequest.volume_context:type_name -> csi.v1.ControllerPublishVolumeRequest.VolumeContextEntry - 101, // 28: csi.v1.ControllerPublishVolumeResponse.publish_context:type_name -> csi.v1.ControllerPublishVolumeResponse.PublishContextEntry - 102, // 29: csi.v1.ControllerUnpublishVolumeRequest.secrets:type_name -> csi.v1.ControllerUnpublishVolumeRequest.SecretsEntry - 103, // 30: csi.v1.ValidateVolumeCapabilitiesRequest.volume_context:type_name -> csi.v1.ValidateVolumeCapabilitiesRequest.VolumeContextEntry + 101, // 26: csi.v1.ControllerPublishVolumeRequest.secrets:type_name -> csi.v1.ControllerPublishVolumeRequest.SecretsEntry + 102, // 27: csi.v1.ControllerPublishVolumeRequest.volume_context:type_name -> csi.v1.ControllerPublishVolumeRequest.VolumeContextEntry + 103, // 28: csi.v1.ControllerPublishVolumeResponse.publish_context:type_name -> csi.v1.ControllerPublishVolumeResponse.PublishContextEntry + 104, // 29: csi.v1.ControllerUnpublishVolumeRequest.secrets:type_name -> csi.v1.ControllerUnpublishVolumeRequest.SecretsEntry + 105, // 30: csi.v1.ValidateVolumeCapabilitiesRequest.volume_context:type_name -> csi.v1.ValidateVolumeCapabilitiesRequest.VolumeContextEntry 18, // 31: csi.v1.ValidateVolumeCapabilitiesRequest.volume_capabilities:type_name -> csi.v1.VolumeCapability - 104, // 32: csi.v1.ValidateVolumeCapabilitiesRequest.parameters:type_name -> csi.v1.ValidateVolumeCapabilitiesRequest.ParametersEntry - 105, // 33: csi.v1.ValidateVolumeCapabilitiesRequest.secrets:type_name -> csi.v1.ValidateVolumeCapabilitiesRequest.SecretsEntry - 106, // 34: csi.v1.ValidateVolumeCapabilitiesRequest.mutable_parameters:type_name -> csi.v1.ValidateVolumeCapabilitiesRequest.MutableParametersEntry - 107, // 35: csi.v1.ValidateVolumeCapabilitiesResponse.confirmed:type_name -> csi.v1.ValidateVolumeCapabilitiesResponse.Confirmed - 112, // 36: csi.v1.ListVolumesResponse.entries:type_name -> csi.v1.ListVolumesResponse.Entry + 106, // 32: csi.v1.ValidateVolumeCapabilitiesRequest.parameters:type_name -> csi.v1.ValidateVolumeCapabilitiesRequest.ParametersEntry + 107, // 33: csi.v1.ValidateVolumeCapabilitiesRequest.secrets:type_name -> csi.v1.ValidateVolumeCapabilitiesRequest.SecretsEntry + 108, // 34: csi.v1.ValidateVolumeCapabilitiesRequest.mutable_parameters:type_name -> csi.v1.ValidateVolumeCapabilitiesRequest.MutableParametersEntry + 109, // 35: csi.v1.ValidateVolumeCapabilitiesResponse.confirmed:type_name -> csi.v1.ValidateVolumeCapabilitiesResponse.Confirmed + 114, // 36: csi.v1.ListVolumesResponse.entries:type_name -> csi.v1.ListVolumesResponse.Entry 20, // 37: csi.v1.ControllerGetVolumeResponse.volume:type_name -> csi.v1.Volume - 113, // 38: csi.v1.ControllerGetVolumeResponse.status:type_name -> csi.v1.ControllerGetVolumeResponse.VolumeStatus - 114, // 39: csi.v1.ControllerModifyVolumeRequest.secrets:type_name -> csi.v1.ControllerModifyVolumeRequest.SecretsEntry - 115, // 40: csi.v1.ControllerModifyVolumeRequest.mutable_parameters:type_name -> csi.v1.ControllerModifyVolumeRequest.MutableParametersEntry + 115, // 38: csi.v1.ControllerGetVolumeResponse.status:type_name -> csi.v1.ControllerGetVolumeResponse.VolumeStatus + 116, // 39: csi.v1.ControllerModifyVolumeRequest.secrets:type_name -> csi.v1.ControllerModifyVolumeRequest.SecretsEntry + 117, // 40: csi.v1.ControllerModifyVolumeRequest.mutable_parameters:type_name -> csi.v1.ControllerModifyVolumeRequest.MutableParametersEntry 18, // 41: csi.v1.GetCapacityRequest.volume_capabilities:type_name -> csi.v1.VolumeCapability - 116, // 42: csi.v1.GetCapacityRequest.parameters:type_name -> csi.v1.GetCapacityRequest.ParametersEntry + 118, // 42: csi.v1.GetCapacityRequest.parameters:type_name -> csi.v1.GetCapacityRequest.ParametersEntry 22, // 43: csi.v1.GetCapacityRequest.accessible_topology:type_name -> csi.v1.Topology - 140, // 44: csi.v1.GetCapacityResponse.maximum_volume_size:type_name -> google.protobuf.Int64Value - 140, // 45: csi.v1.GetCapacityResponse.minimum_volume_size:type_name -> google.protobuf.Int64Value + 143, // 44: csi.v1.GetCapacityResponse.maximum_volume_size:type_name -> google.protobuf.Int64Value + 143, // 45: csi.v1.GetCapacityResponse.minimum_volume_size:type_name -> google.protobuf.Int64Value 41, // 46: csi.v1.ControllerGetCapabilitiesResponse.capabilities:type_name -> csi.v1.ControllerServiceCapability - 117, // 47: csi.v1.ControllerServiceCapability.rpc:type_name -> csi.v1.ControllerServiceCapability.RPC - 118, // 48: csi.v1.CreateSnapshotRequest.secrets:type_name -> csi.v1.CreateSnapshotRequest.SecretsEntry - 119, // 49: csi.v1.CreateSnapshotRequest.parameters:type_name -> csi.v1.CreateSnapshotRequest.ParametersEntry + 119, // 47: csi.v1.ControllerServiceCapability.rpc:type_name -> csi.v1.ControllerServiceCapability.RPC + 120, // 48: csi.v1.CreateSnapshotRequest.secrets:type_name -> csi.v1.CreateSnapshotRequest.SecretsEntry + 121, // 49: csi.v1.CreateSnapshotRequest.parameters:type_name -> csi.v1.CreateSnapshotRequest.ParametersEntry 44, // 50: csi.v1.CreateSnapshotResponse.snapshot:type_name -> csi.v1.Snapshot - 141, // 51: csi.v1.Snapshot.creation_time:type_name -> google.protobuf.Timestamp - 120, // 52: csi.v1.DeleteSnapshotRequest.secrets:type_name -> csi.v1.DeleteSnapshotRequest.SecretsEntry - 121, // 53: csi.v1.ListSnapshotsRequest.secrets:type_name -> csi.v1.ListSnapshotsRequest.SecretsEntry - 122, // 54: csi.v1.ListSnapshotsResponse.entries:type_name -> csi.v1.ListSnapshotsResponse.Entry - 19, // 55: csi.v1.ControllerExpandVolumeRequest.capacity_range:type_name -> csi.v1.CapacityRange - 123, // 56: csi.v1.ControllerExpandVolumeRequest.secrets:type_name -> csi.v1.ControllerExpandVolumeRequest.SecretsEntry - 18, // 57: csi.v1.ControllerExpandVolumeRequest.volume_capability:type_name -> csi.v1.VolumeCapability - 124, // 58: csi.v1.NodeStageVolumeRequest.publish_context:type_name -> csi.v1.NodeStageVolumeRequest.PublishContextEntry - 18, // 59: csi.v1.NodeStageVolumeRequest.volume_capability:type_name -> csi.v1.VolumeCapability - 125, // 60: csi.v1.NodeStageVolumeRequest.secrets:type_name -> csi.v1.NodeStageVolumeRequest.SecretsEntry - 126, // 61: csi.v1.NodeStageVolumeRequest.volume_context:type_name -> csi.v1.NodeStageVolumeRequest.VolumeContextEntry - 127, // 62: csi.v1.NodePublishVolumeRequest.publish_context:type_name -> csi.v1.NodePublishVolumeRequest.PublishContextEntry - 18, // 63: csi.v1.NodePublishVolumeRequest.volume_capability:type_name -> csi.v1.VolumeCapability - 128, // 64: csi.v1.NodePublishVolumeRequest.secrets:type_name -> csi.v1.NodePublishVolumeRequest.SecretsEntry - 129, // 65: csi.v1.NodePublishVolumeRequest.volume_context:type_name -> csi.v1.NodePublishVolumeRequest.VolumeContextEntry - 61, // 66: csi.v1.NodeGetVolumeStatsResponse.usage:type_name -> csi.v1.VolumeUsage - 62, // 67: csi.v1.NodeGetVolumeStatsResponse.volume_condition:type_name -> csi.v1.VolumeCondition - 5, // 68: csi.v1.VolumeUsage.unit:type_name -> csi.v1.VolumeUsage.Unit - 65, // 69: csi.v1.NodeGetCapabilitiesResponse.capabilities:type_name -> csi.v1.NodeServiceCapability - 130, // 70: csi.v1.NodeServiceCapability.rpc:type_name -> csi.v1.NodeServiceCapability.RPC - 22, // 71: csi.v1.NodeGetInfoResponse.accessible_topology:type_name -> csi.v1.Topology - 19, // 72: csi.v1.NodeExpandVolumeRequest.capacity_range:type_name -> csi.v1.CapacityRange - 18, // 73: csi.v1.NodeExpandVolumeRequest.volume_capability:type_name -> csi.v1.VolumeCapability - 131, // 74: csi.v1.NodeExpandVolumeRequest.secrets:type_name -> csi.v1.NodeExpandVolumeRequest.SecretsEntry - 72, // 75: csi.v1.GroupControllerGetCapabilitiesResponse.capabilities:type_name -> csi.v1.GroupControllerServiceCapability - 132, // 76: csi.v1.GroupControllerServiceCapability.rpc:type_name -> csi.v1.GroupControllerServiceCapability.RPC - 133, // 77: csi.v1.CreateVolumeGroupSnapshotRequest.secrets:type_name -> csi.v1.CreateVolumeGroupSnapshotRequest.SecretsEntry - 134, // 78: csi.v1.CreateVolumeGroupSnapshotRequest.parameters:type_name -> csi.v1.CreateVolumeGroupSnapshotRequest.ParametersEntry - 75, // 79: csi.v1.CreateVolumeGroupSnapshotResponse.group_snapshot:type_name -> csi.v1.VolumeGroupSnapshot - 44, // 80: csi.v1.VolumeGroupSnapshot.snapshots:type_name -> csi.v1.Snapshot - 141, // 81: csi.v1.VolumeGroupSnapshot.creation_time:type_name -> google.protobuf.Timestamp - 135, // 82: csi.v1.DeleteVolumeGroupSnapshotRequest.secrets:type_name -> csi.v1.DeleteVolumeGroupSnapshotRequest.SecretsEntry - 136, // 83: csi.v1.GetVolumeGroupSnapshotRequest.secrets:type_name -> csi.v1.GetVolumeGroupSnapshotRequest.SecretsEntry - 75, // 84: csi.v1.GetVolumeGroupSnapshotResponse.group_snapshot:type_name -> csi.v1.VolumeGroupSnapshot - 137, // 85: csi.v1.GetMetadataAllocatedRequest.secrets:type_name -> csi.v1.GetMetadataAllocatedRequest.SecretsEntry - 0, // 86: csi.v1.GetMetadataAllocatedResponse.block_metadata_type:type_name -> csi.v1.BlockMetadataType - 80, // 87: csi.v1.GetMetadataAllocatedResponse.block_metadata:type_name -> csi.v1.BlockMetadata - 138, // 88: csi.v1.GetMetadataDeltaRequest.secrets:type_name -> csi.v1.GetMetadataDeltaRequest.SecretsEntry - 0, // 89: csi.v1.GetMetadataDeltaResponse.block_metadata_type:type_name -> csi.v1.BlockMetadataType - 80, // 90: csi.v1.GetMetadataDeltaResponse.block_metadata:type_name -> csi.v1.BlockMetadata - 1, // 91: csi.v1.PluginCapability.Service.type:type_name -> csi.v1.PluginCapability.Service.Type - 2, // 92: csi.v1.PluginCapability.VolumeExpansion.type:type_name -> csi.v1.PluginCapability.VolumeExpansion.Type - 3, // 93: csi.v1.VolumeCapability.AccessMode.mode:type_name -> csi.v1.VolumeCapability.AccessMode.Mode - 108, // 94: csi.v1.ValidateVolumeCapabilitiesResponse.Confirmed.volume_context:type_name -> csi.v1.ValidateVolumeCapabilitiesResponse.Confirmed.VolumeContextEntry - 18, // 95: csi.v1.ValidateVolumeCapabilitiesResponse.Confirmed.volume_capabilities:type_name -> csi.v1.VolumeCapability - 109, // 96: csi.v1.ValidateVolumeCapabilitiesResponse.Confirmed.parameters:type_name -> csi.v1.ValidateVolumeCapabilitiesResponse.Confirmed.ParametersEntry - 110, // 97: csi.v1.ValidateVolumeCapabilitiesResponse.Confirmed.mutable_parameters:type_name -> csi.v1.ValidateVolumeCapabilitiesResponse.Confirmed.MutableParametersEntry - 62, // 98: csi.v1.ListVolumesResponse.VolumeStatus.volume_condition:type_name -> csi.v1.VolumeCondition - 20, // 99: csi.v1.ListVolumesResponse.Entry.volume:type_name -> csi.v1.Volume - 111, // 100: csi.v1.ListVolumesResponse.Entry.status:type_name -> csi.v1.ListVolumesResponse.VolumeStatus - 62, // 101: csi.v1.ControllerGetVolumeResponse.VolumeStatus.volume_condition:type_name -> csi.v1.VolumeCondition - 4, // 102: csi.v1.ControllerServiceCapability.RPC.type:type_name -> csi.v1.ControllerServiceCapability.RPC.Type - 44, // 103: csi.v1.ListSnapshotsResponse.Entry.snapshot:type_name -> csi.v1.Snapshot - 6, // 104: csi.v1.NodeServiceCapability.RPC.type:type_name -> csi.v1.NodeServiceCapability.RPC.Type - 7, // 105: csi.v1.GroupControllerServiceCapability.RPC.type:type_name -> csi.v1.GroupControllerServiceCapability.RPC.Type - 142, // 106: csi.v1.alpha_enum:extendee -> google.protobuf.EnumOptions - 143, // 107: csi.v1.alpha_enum_value:extendee -> google.protobuf.EnumValueOptions - 144, // 108: csi.v1.csi_secret:extendee -> google.protobuf.FieldOptions - 144, // 109: csi.v1.alpha_field:extendee -> google.protobuf.FieldOptions - 145, // 110: csi.v1.alpha_message:extendee -> google.protobuf.MessageOptions - 146, // 111: csi.v1.alpha_method:extendee -> google.protobuf.MethodOptions - 147, // 112: csi.v1.alpha_service:extendee -> google.protobuf.ServiceOptions - 8, // 113: csi.v1.Identity.GetPluginInfo:input_type -> csi.v1.GetPluginInfoRequest - 10, // 114: csi.v1.Identity.GetPluginCapabilities:input_type -> csi.v1.GetPluginCapabilitiesRequest - 13, // 115: csi.v1.Identity.Probe:input_type -> csi.v1.ProbeRequest - 15, // 116: csi.v1.Controller.CreateVolume:input_type -> csi.v1.CreateVolumeRequest - 23, // 117: csi.v1.Controller.DeleteVolume:input_type -> csi.v1.DeleteVolumeRequest - 25, // 118: csi.v1.Controller.ControllerPublishVolume:input_type -> csi.v1.ControllerPublishVolumeRequest - 27, // 119: csi.v1.Controller.ControllerUnpublishVolume:input_type -> csi.v1.ControllerUnpublishVolumeRequest - 29, // 120: csi.v1.Controller.ValidateVolumeCapabilities:input_type -> csi.v1.ValidateVolumeCapabilitiesRequest - 31, // 121: csi.v1.Controller.ListVolumes:input_type -> csi.v1.ListVolumesRequest - 37, // 122: csi.v1.Controller.GetCapacity:input_type -> csi.v1.GetCapacityRequest - 39, // 123: csi.v1.Controller.ControllerGetCapabilities:input_type -> csi.v1.ControllerGetCapabilitiesRequest - 42, // 124: csi.v1.Controller.CreateSnapshot:input_type -> csi.v1.CreateSnapshotRequest - 45, // 125: csi.v1.Controller.DeleteSnapshot:input_type -> csi.v1.DeleteSnapshotRequest - 47, // 126: csi.v1.Controller.ListSnapshots:input_type -> csi.v1.ListSnapshotsRequest - 49, // 127: csi.v1.Controller.ControllerExpandVolume:input_type -> csi.v1.ControllerExpandVolumeRequest - 33, // 128: csi.v1.Controller.ControllerGetVolume:input_type -> csi.v1.ControllerGetVolumeRequest - 35, // 129: csi.v1.Controller.ControllerModifyVolume:input_type -> csi.v1.ControllerModifyVolumeRequest - 70, // 130: csi.v1.GroupController.GroupControllerGetCapabilities:input_type -> csi.v1.GroupControllerGetCapabilitiesRequest - 73, // 131: csi.v1.GroupController.CreateVolumeGroupSnapshot:input_type -> csi.v1.CreateVolumeGroupSnapshotRequest - 76, // 132: csi.v1.GroupController.DeleteVolumeGroupSnapshot:input_type -> csi.v1.DeleteVolumeGroupSnapshotRequest - 78, // 133: csi.v1.GroupController.GetVolumeGroupSnapshot:input_type -> csi.v1.GetVolumeGroupSnapshotRequest - 81, // 134: csi.v1.SnapshotMetadata.GetMetadataAllocated:input_type -> csi.v1.GetMetadataAllocatedRequest - 83, // 135: csi.v1.SnapshotMetadata.GetMetadataDelta:input_type -> csi.v1.GetMetadataDeltaRequest - 51, // 136: csi.v1.Node.NodeStageVolume:input_type -> csi.v1.NodeStageVolumeRequest - 53, // 137: csi.v1.Node.NodeUnstageVolume:input_type -> csi.v1.NodeUnstageVolumeRequest - 55, // 138: csi.v1.Node.NodePublishVolume:input_type -> csi.v1.NodePublishVolumeRequest - 57, // 139: csi.v1.Node.NodeUnpublishVolume:input_type -> csi.v1.NodeUnpublishVolumeRequest - 59, // 140: csi.v1.Node.NodeGetVolumeStats:input_type -> csi.v1.NodeGetVolumeStatsRequest - 68, // 141: csi.v1.Node.NodeExpandVolume:input_type -> csi.v1.NodeExpandVolumeRequest - 63, // 142: csi.v1.Node.NodeGetCapabilities:input_type -> csi.v1.NodeGetCapabilitiesRequest - 66, // 143: csi.v1.Node.NodeGetInfo:input_type -> csi.v1.NodeGetInfoRequest - 9, // 144: csi.v1.Identity.GetPluginInfo:output_type -> csi.v1.GetPluginInfoResponse - 11, // 145: csi.v1.Identity.GetPluginCapabilities:output_type -> csi.v1.GetPluginCapabilitiesResponse - 14, // 146: csi.v1.Identity.Probe:output_type -> csi.v1.ProbeResponse - 17, // 147: csi.v1.Controller.CreateVolume:output_type -> csi.v1.CreateVolumeResponse - 24, // 148: csi.v1.Controller.DeleteVolume:output_type -> csi.v1.DeleteVolumeResponse - 26, // 149: csi.v1.Controller.ControllerPublishVolume:output_type -> csi.v1.ControllerPublishVolumeResponse - 28, // 150: csi.v1.Controller.ControllerUnpublishVolume:output_type -> csi.v1.ControllerUnpublishVolumeResponse - 30, // 151: csi.v1.Controller.ValidateVolumeCapabilities:output_type -> csi.v1.ValidateVolumeCapabilitiesResponse - 32, // 152: csi.v1.Controller.ListVolumes:output_type -> csi.v1.ListVolumesResponse - 38, // 153: csi.v1.Controller.GetCapacity:output_type -> csi.v1.GetCapacityResponse - 40, // 154: csi.v1.Controller.ControllerGetCapabilities:output_type -> csi.v1.ControllerGetCapabilitiesResponse - 43, // 155: csi.v1.Controller.CreateSnapshot:output_type -> csi.v1.CreateSnapshotResponse - 46, // 156: csi.v1.Controller.DeleteSnapshot:output_type -> csi.v1.DeleteSnapshotResponse - 48, // 157: csi.v1.Controller.ListSnapshots:output_type -> csi.v1.ListSnapshotsResponse - 50, // 158: csi.v1.Controller.ControllerExpandVolume:output_type -> csi.v1.ControllerExpandVolumeResponse - 34, // 159: csi.v1.Controller.ControllerGetVolume:output_type -> csi.v1.ControllerGetVolumeResponse - 36, // 160: csi.v1.Controller.ControllerModifyVolume:output_type -> csi.v1.ControllerModifyVolumeResponse - 71, // 161: csi.v1.GroupController.GroupControllerGetCapabilities:output_type -> csi.v1.GroupControllerGetCapabilitiesResponse - 74, // 162: csi.v1.GroupController.CreateVolumeGroupSnapshot:output_type -> csi.v1.CreateVolumeGroupSnapshotResponse - 77, // 163: csi.v1.GroupController.DeleteVolumeGroupSnapshot:output_type -> csi.v1.DeleteVolumeGroupSnapshotResponse - 79, // 164: csi.v1.GroupController.GetVolumeGroupSnapshot:output_type -> csi.v1.GetVolumeGroupSnapshotResponse - 82, // 165: csi.v1.SnapshotMetadata.GetMetadataAllocated:output_type -> csi.v1.GetMetadataAllocatedResponse - 84, // 166: csi.v1.SnapshotMetadata.GetMetadataDelta:output_type -> csi.v1.GetMetadataDeltaResponse - 52, // 167: csi.v1.Node.NodeStageVolume:output_type -> csi.v1.NodeStageVolumeResponse - 54, // 168: csi.v1.Node.NodeUnstageVolume:output_type -> csi.v1.NodeUnstageVolumeResponse - 56, // 169: csi.v1.Node.NodePublishVolume:output_type -> csi.v1.NodePublishVolumeResponse - 58, // 170: csi.v1.Node.NodeUnpublishVolume:output_type -> csi.v1.NodeUnpublishVolumeResponse - 60, // 171: csi.v1.Node.NodeGetVolumeStats:output_type -> csi.v1.NodeGetVolumeStatsResponse - 69, // 172: csi.v1.Node.NodeExpandVolume:output_type -> csi.v1.NodeExpandVolumeResponse - 64, // 173: csi.v1.Node.NodeGetCapabilities:output_type -> csi.v1.NodeGetCapabilitiesResponse - 67, // 174: csi.v1.Node.NodeGetInfo:output_type -> csi.v1.NodeGetInfoResponse - 144, // [144:175] is the sub-list for method output_type - 113, // [113:144] is the sub-list for method input_type - 113, // [113:113] is the sub-list for extension type_name - 106, // [106:113] is the sub-list for extension extendee - 0, // [0:106] is the sub-list for field type_name + 144, // 51: csi.v1.Snapshot.creation_time:type_name -> google.protobuf.Timestamp + 122, // 52: csi.v1.DeleteSnapshotRequest.secrets:type_name -> csi.v1.DeleteSnapshotRequest.SecretsEntry + 123, // 53: csi.v1.ListSnapshotsRequest.secrets:type_name -> csi.v1.ListSnapshotsRequest.SecretsEntry + 124, // 54: csi.v1.ListSnapshotsResponse.entries:type_name -> csi.v1.ListSnapshotsResponse.Entry + 125, // 55: csi.v1.GetSnapshotRequest.secrets:type_name -> csi.v1.GetSnapshotRequest.SecretsEntry + 44, // 56: csi.v1.GetSnapshotResponse.snapshot:type_name -> csi.v1.Snapshot + 19, // 57: csi.v1.ControllerExpandVolumeRequest.capacity_range:type_name -> csi.v1.CapacityRange + 126, // 58: csi.v1.ControllerExpandVolumeRequest.secrets:type_name -> csi.v1.ControllerExpandVolumeRequest.SecretsEntry + 18, // 59: csi.v1.ControllerExpandVolumeRequest.volume_capability:type_name -> csi.v1.VolumeCapability + 127, // 60: csi.v1.NodeStageVolumeRequest.publish_context:type_name -> csi.v1.NodeStageVolumeRequest.PublishContextEntry + 18, // 61: csi.v1.NodeStageVolumeRequest.volume_capability:type_name -> csi.v1.VolumeCapability + 128, // 62: csi.v1.NodeStageVolumeRequest.secrets:type_name -> csi.v1.NodeStageVolumeRequest.SecretsEntry + 129, // 63: csi.v1.NodeStageVolumeRequest.volume_context:type_name -> csi.v1.NodeStageVolumeRequest.VolumeContextEntry + 130, // 64: csi.v1.NodePublishVolumeRequest.publish_context:type_name -> csi.v1.NodePublishVolumeRequest.PublishContextEntry + 18, // 65: csi.v1.NodePublishVolumeRequest.volume_capability:type_name -> csi.v1.VolumeCapability + 131, // 66: csi.v1.NodePublishVolumeRequest.secrets:type_name -> csi.v1.NodePublishVolumeRequest.SecretsEntry + 132, // 67: csi.v1.NodePublishVolumeRequest.volume_context:type_name -> csi.v1.NodePublishVolumeRequest.VolumeContextEntry + 63, // 68: csi.v1.NodeGetVolumeStatsResponse.usage:type_name -> csi.v1.VolumeUsage + 64, // 69: csi.v1.NodeGetVolumeStatsResponse.volume_condition:type_name -> csi.v1.VolumeCondition + 5, // 70: csi.v1.VolumeUsage.unit:type_name -> csi.v1.VolumeUsage.Unit + 67, // 71: csi.v1.NodeGetCapabilitiesResponse.capabilities:type_name -> csi.v1.NodeServiceCapability + 133, // 72: csi.v1.NodeServiceCapability.rpc:type_name -> csi.v1.NodeServiceCapability.RPC + 22, // 73: csi.v1.NodeGetInfoResponse.accessible_topology:type_name -> csi.v1.Topology + 19, // 74: csi.v1.NodeExpandVolumeRequest.capacity_range:type_name -> csi.v1.CapacityRange + 18, // 75: csi.v1.NodeExpandVolumeRequest.volume_capability:type_name -> csi.v1.VolumeCapability + 134, // 76: csi.v1.NodeExpandVolumeRequest.secrets:type_name -> csi.v1.NodeExpandVolumeRequest.SecretsEntry + 74, // 77: csi.v1.GroupControllerGetCapabilitiesResponse.capabilities:type_name -> csi.v1.GroupControllerServiceCapability + 135, // 78: csi.v1.GroupControllerServiceCapability.rpc:type_name -> csi.v1.GroupControllerServiceCapability.RPC + 136, // 79: csi.v1.CreateVolumeGroupSnapshotRequest.secrets:type_name -> csi.v1.CreateVolumeGroupSnapshotRequest.SecretsEntry + 137, // 80: csi.v1.CreateVolumeGroupSnapshotRequest.parameters:type_name -> csi.v1.CreateVolumeGroupSnapshotRequest.ParametersEntry + 77, // 81: csi.v1.CreateVolumeGroupSnapshotResponse.group_snapshot:type_name -> csi.v1.VolumeGroupSnapshot + 44, // 82: csi.v1.VolumeGroupSnapshot.snapshots:type_name -> csi.v1.Snapshot + 144, // 83: csi.v1.VolumeGroupSnapshot.creation_time:type_name -> google.protobuf.Timestamp + 138, // 84: csi.v1.DeleteVolumeGroupSnapshotRequest.secrets:type_name -> csi.v1.DeleteVolumeGroupSnapshotRequest.SecretsEntry + 139, // 85: csi.v1.GetVolumeGroupSnapshotRequest.secrets:type_name -> csi.v1.GetVolumeGroupSnapshotRequest.SecretsEntry + 77, // 86: csi.v1.GetVolumeGroupSnapshotResponse.group_snapshot:type_name -> csi.v1.VolumeGroupSnapshot + 140, // 87: csi.v1.GetMetadataAllocatedRequest.secrets:type_name -> csi.v1.GetMetadataAllocatedRequest.SecretsEntry + 0, // 88: csi.v1.GetMetadataAllocatedResponse.block_metadata_type:type_name -> csi.v1.BlockMetadataType + 82, // 89: csi.v1.GetMetadataAllocatedResponse.block_metadata:type_name -> csi.v1.BlockMetadata + 141, // 90: csi.v1.GetMetadataDeltaRequest.secrets:type_name -> csi.v1.GetMetadataDeltaRequest.SecretsEntry + 0, // 91: csi.v1.GetMetadataDeltaResponse.block_metadata_type:type_name -> csi.v1.BlockMetadataType + 82, // 92: csi.v1.GetMetadataDeltaResponse.block_metadata:type_name -> csi.v1.BlockMetadata + 1, // 93: csi.v1.PluginCapability.Service.type:type_name -> csi.v1.PluginCapability.Service.Type + 2, // 94: csi.v1.PluginCapability.VolumeExpansion.type:type_name -> csi.v1.PluginCapability.VolumeExpansion.Type + 3, // 95: csi.v1.VolumeCapability.AccessMode.mode:type_name -> csi.v1.VolumeCapability.AccessMode.Mode + 110, // 96: csi.v1.ValidateVolumeCapabilitiesResponse.Confirmed.volume_context:type_name -> csi.v1.ValidateVolumeCapabilitiesResponse.Confirmed.VolumeContextEntry + 18, // 97: csi.v1.ValidateVolumeCapabilitiesResponse.Confirmed.volume_capabilities:type_name -> csi.v1.VolumeCapability + 111, // 98: csi.v1.ValidateVolumeCapabilitiesResponse.Confirmed.parameters:type_name -> csi.v1.ValidateVolumeCapabilitiesResponse.Confirmed.ParametersEntry + 112, // 99: csi.v1.ValidateVolumeCapabilitiesResponse.Confirmed.mutable_parameters:type_name -> csi.v1.ValidateVolumeCapabilitiesResponse.Confirmed.MutableParametersEntry + 64, // 100: csi.v1.ListVolumesResponse.VolumeStatus.volume_condition:type_name -> csi.v1.VolumeCondition + 20, // 101: csi.v1.ListVolumesResponse.Entry.volume:type_name -> csi.v1.Volume + 113, // 102: csi.v1.ListVolumesResponse.Entry.status:type_name -> csi.v1.ListVolumesResponse.VolumeStatus + 64, // 103: csi.v1.ControllerGetVolumeResponse.VolumeStatus.volume_condition:type_name -> csi.v1.VolumeCondition + 4, // 104: csi.v1.ControllerServiceCapability.RPC.type:type_name -> csi.v1.ControllerServiceCapability.RPC.Type + 44, // 105: csi.v1.ListSnapshotsResponse.Entry.snapshot:type_name -> csi.v1.Snapshot + 6, // 106: csi.v1.NodeServiceCapability.RPC.type:type_name -> csi.v1.NodeServiceCapability.RPC.Type + 7, // 107: csi.v1.GroupControllerServiceCapability.RPC.type:type_name -> csi.v1.GroupControllerServiceCapability.RPC.Type + 145, // 108: csi.v1.alpha_enum:extendee -> google.protobuf.EnumOptions + 146, // 109: csi.v1.alpha_enum_value:extendee -> google.protobuf.EnumValueOptions + 147, // 110: csi.v1.csi_secret:extendee -> google.protobuf.FieldOptions + 147, // 111: csi.v1.alpha_field:extendee -> google.protobuf.FieldOptions + 148, // 112: csi.v1.alpha_message:extendee -> google.protobuf.MessageOptions + 149, // 113: csi.v1.alpha_method:extendee -> google.protobuf.MethodOptions + 150, // 114: csi.v1.alpha_service:extendee -> google.protobuf.ServiceOptions + 8, // 115: csi.v1.Identity.GetPluginInfo:input_type -> csi.v1.GetPluginInfoRequest + 10, // 116: csi.v1.Identity.GetPluginCapabilities:input_type -> csi.v1.GetPluginCapabilitiesRequest + 13, // 117: csi.v1.Identity.Probe:input_type -> csi.v1.ProbeRequest + 15, // 118: csi.v1.Controller.CreateVolume:input_type -> csi.v1.CreateVolumeRequest + 23, // 119: csi.v1.Controller.DeleteVolume:input_type -> csi.v1.DeleteVolumeRequest + 25, // 120: csi.v1.Controller.ControllerPublishVolume:input_type -> csi.v1.ControllerPublishVolumeRequest + 27, // 121: csi.v1.Controller.ControllerUnpublishVolume:input_type -> csi.v1.ControllerUnpublishVolumeRequest + 29, // 122: csi.v1.Controller.ValidateVolumeCapabilities:input_type -> csi.v1.ValidateVolumeCapabilitiesRequest + 31, // 123: csi.v1.Controller.ListVolumes:input_type -> csi.v1.ListVolumesRequest + 37, // 124: csi.v1.Controller.GetCapacity:input_type -> csi.v1.GetCapacityRequest + 39, // 125: csi.v1.Controller.ControllerGetCapabilities:input_type -> csi.v1.ControllerGetCapabilitiesRequest + 42, // 126: csi.v1.Controller.CreateSnapshot:input_type -> csi.v1.CreateSnapshotRequest + 45, // 127: csi.v1.Controller.DeleteSnapshot:input_type -> csi.v1.DeleteSnapshotRequest + 47, // 128: csi.v1.Controller.ListSnapshots:input_type -> csi.v1.ListSnapshotsRequest + 49, // 129: csi.v1.Controller.GetSnapshot:input_type -> csi.v1.GetSnapshotRequest + 51, // 130: csi.v1.Controller.ControllerExpandVolume:input_type -> csi.v1.ControllerExpandVolumeRequest + 33, // 131: csi.v1.Controller.ControllerGetVolume:input_type -> csi.v1.ControllerGetVolumeRequest + 35, // 132: csi.v1.Controller.ControllerModifyVolume:input_type -> csi.v1.ControllerModifyVolumeRequest + 72, // 133: csi.v1.GroupController.GroupControllerGetCapabilities:input_type -> csi.v1.GroupControllerGetCapabilitiesRequest + 75, // 134: csi.v1.GroupController.CreateVolumeGroupSnapshot:input_type -> csi.v1.CreateVolumeGroupSnapshotRequest + 78, // 135: csi.v1.GroupController.DeleteVolumeGroupSnapshot:input_type -> csi.v1.DeleteVolumeGroupSnapshotRequest + 80, // 136: csi.v1.GroupController.GetVolumeGroupSnapshot:input_type -> csi.v1.GetVolumeGroupSnapshotRequest + 83, // 137: csi.v1.SnapshotMetadata.GetMetadataAllocated:input_type -> csi.v1.GetMetadataAllocatedRequest + 85, // 138: csi.v1.SnapshotMetadata.GetMetadataDelta:input_type -> csi.v1.GetMetadataDeltaRequest + 53, // 139: csi.v1.Node.NodeStageVolume:input_type -> csi.v1.NodeStageVolumeRequest + 55, // 140: csi.v1.Node.NodeUnstageVolume:input_type -> csi.v1.NodeUnstageVolumeRequest + 57, // 141: csi.v1.Node.NodePublishVolume:input_type -> csi.v1.NodePublishVolumeRequest + 59, // 142: csi.v1.Node.NodeUnpublishVolume:input_type -> csi.v1.NodeUnpublishVolumeRequest + 61, // 143: csi.v1.Node.NodeGetVolumeStats:input_type -> csi.v1.NodeGetVolumeStatsRequest + 70, // 144: csi.v1.Node.NodeExpandVolume:input_type -> csi.v1.NodeExpandVolumeRequest + 65, // 145: csi.v1.Node.NodeGetCapabilities:input_type -> csi.v1.NodeGetCapabilitiesRequest + 68, // 146: csi.v1.Node.NodeGetInfo:input_type -> csi.v1.NodeGetInfoRequest + 9, // 147: csi.v1.Identity.GetPluginInfo:output_type -> csi.v1.GetPluginInfoResponse + 11, // 148: csi.v1.Identity.GetPluginCapabilities:output_type -> csi.v1.GetPluginCapabilitiesResponse + 14, // 149: csi.v1.Identity.Probe:output_type -> csi.v1.ProbeResponse + 17, // 150: csi.v1.Controller.CreateVolume:output_type -> csi.v1.CreateVolumeResponse + 24, // 151: csi.v1.Controller.DeleteVolume:output_type -> csi.v1.DeleteVolumeResponse + 26, // 152: csi.v1.Controller.ControllerPublishVolume:output_type -> csi.v1.ControllerPublishVolumeResponse + 28, // 153: csi.v1.Controller.ControllerUnpublishVolume:output_type -> csi.v1.ControllerUnpublishVolumeResponse + 30, // 154: csi.v1.Controller.ValidateVolumeCapabilities:output_type -> csi.v1.ValidateVolumeCapabilitiesResponse + 32, // 155: csi.v1.Controller.ListVolumes:output_type -> csi.v1.ListVolumesResponse + 38, // 156: csi.v1.Controller.GetCapacity:output_type -> csi.v1.GetCapacityResponse + 40, // 157: csi.v1.Controller.ControllerGetCapabilities:output_type -> csi.v1.ControllerGetCapabilitiesResponse + 43, // 158: csi.v1.Controller.CreateSnapshot:output_type -> csi.v1.CreateSnapshotResponse + 46, // 159: csi.v1.Controller.DeleteSnapshot:output_type -> csi.v1.DeleteSnapshotResponse + 48, // 160: csi.v1.Controller.ListSnapshots:output_type -> csi.v1.ListSnapshotsResponse + 50, // 161: csi.v1.Controller.GetSnapshot:output_type -> csi.v1.GetSnapshotResponse + 52, // 162: csi.v1.Controller.ControllerExpandVolume:output_type -> csi.v1.ControllerExpandVolumeResponse + 34, // 163: csi.v1.Controller.ControllerGetVolume:output_type -> csi.v1.ControllerGetVolumeResponse + 36, // 164: csi.v1.Controller.ControllerModifyVolume:output_type -> csi.v1.ControllerModifyVolumeResponse + 73, // 165: csi.v1.GroupController.GroupControllerGetCapabilities:output_type -> csi.v1.GroupControllerGetCapabilitiesResponse + 76, // 166: csi.v1.GroupController.CreateVolumeGroupSnapshot:output_type -> csi.v1.CreateVolumeGroupSnapshotResponse + 79, // 167: csi.v1.GroupController.DeleteVolumeGroupSnapshot:output_type -> csi.v1.DeleteVolumeGroupSnapshotResponse + 81, // 168: csi.v1.GroupController.GetVolumeGroupSnapshot:output_type -> csi.v1.GetVolumeGroupSnapshotResponse + 84, // 169: csi.v1.SnapshotMetadata.GetMetadataAllocated:output_type -> csi.v1.GetMetadataAllocatedResponse + 86, // 170: csi.v1.SnapshotMetadata.GetMetadataDelta:output_type -> csi.v1.GetMetadataDeltaResponse + 54, // 171: csi.v1.Node.NodeStageVolume:output_type -> csi.v1.NodeStageVolumeResponse + 56, // 172: csi.v1.Node.NodeUnstageVolume:output_type -> csi.v1.NodeUnstageVolumeResponse + 58, // 173: csi.v1.Node.NodePublishVolume:output_type -> csi.v1.NodePublishVolumeResponse + 60, // 174: csi.v1.Node.NodeUnpublishVolume:output_type -> csi.v1.NodeUnpublishVolumeResponse + 62, // 175: csi.v1.Node.NodeGetVolumeStats:output_type -> csi.v1.NodeGetVolumeStatsResponse + 71, // 176: csi.v1.Node.NodeExpandVolume:output_type -> csi.v1.NodeExpandVolumeResponse + 66, // 177: csi.v1.Node.NodeGetCapabilities:output_type -> csi.v1.NodeGetCapabilitiesResponse + 69, // 178: csi.v1.Node.NodeGetInfo:output_type -> csi.v1.NodeGetInfoResponse + 147, // [147:179] is the sub-list for method output_type + 115, // [115:147] is the sub-list for method input_type + 115, // [115:115] is the sub-list for extension type_name + 108, // [108:115] is the sub-list for extension extendee + 0, // [0:108] is the sub-list for field type_name } func init() { file_csi_proto_init() } @@ -9260,7 +9401,7 @@ func file_csi_proto_init() { } } file_csi_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ControllerExpandVolumeRequest); i { + switch v := v.(*GetSnapshotRequest); i { case 0: return &v.state case 1: @@ -9272,7 +9413,7 @@ func file_csi_proto_init() { } } file_csi_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ControllerExpandVolumeResponse); i { + switch v := v.(*GetSnapshotResponse); i { case 0: return &v.state case 1: @@ -9284,7 +9425,7 @@ func file_csi_proto_init() { } } file_csi_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeStageVolumeRequest); i { + switch v := v.(*ControllerExpandVolumeRequest); i { case 0: return &v.state case 1: @@ -9296,7 +9437,7 @@ func file_csi_proto_init() { } } file_csi_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeStageVolumeResponse); i { + switch v := v.(*ControllerExpandVolumeResponse); i { case 0: return &v.state case 1: @@ -9308,7 +9449,7 @@ func file_csi_proto_init() { } } file_csi_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeUnstageVolumeRequest); i { + switch v := v.(*NodeStageVolumeRequest); i { case 0: return &v.state case 1: @@ -9320,7 +9461,7 @@ func file_csi_proto_init() { } } file_csi_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeUnstageVolumeResponse); i { + switch v := v.(*NodeStageVolumeResponse); i { case 0: return &v.state case 1: @@ -9332,7 +9473,7 @@ func file_csi_proto_init() { } } file_csi_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodePublishVolumeRequest); i { + switch v := v.(*NodeUnstageVolumeRequest); i { case 0: return &v.state case 1: @@ -9344,7 +9485,7 @@ func file_csi_proto_init() { } } file_csi_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodePublishVolumeResponse); i { + switch v := v.(*NodeUnstageVolumeResponse); i { case 0: return &v.state case 1: @@ -9356,7 +9497,7 @@ func file_csi_proto_init() { } } file_csi_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeUnpublishVolumeRequest); i { + switch v := v.(*NodePublishVolumeRequest); i { case 0: return &v.state case 1: @@ -9368,7 +9509,7 @@ func file_csi_proto_init() { } } file_csi_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeUnpublishVolumeResponse); i { + switch v := v.(*NodePublishVolumeResponse); i { case 0: return &v.state case 1: @@ -9380,7 +9521,7 @@ func file_csi_proto_init() { } } file_csi_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeGetVolumeStatsRequest); i { + switch v := v.(*NodeUnpublishVolumeRequest); i { case 0: return &v.state case 1: @@ -9392,7 +9533,7 @@ func file_csi_proto_init() { } } file_csi_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeGetVolumeStatsResponse); i { + switch v := v.(*NodeUnpublishVolumeResponse); i { case 0: return &v.state case 1: @@ -9404,7 +9545,7 @@ func file_csi_proto_init() { } } file_csi_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeUsage); i { + switch v := v.(*NodeGetVolumeStatsRequest); i { case 0: return &v.state case 1: @@ -9416,7 +9557,7 @@ func file_csi_proto_init() { } } file_csi_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeCondition); i { + switch v := v.(*NodeGetVolumeStatsResponse); i { case 0: return &v.state case 1: @@ -9428,7 +9569,7 @@ func file_csi_proto_init() { } } file_csi_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeGetCapabilitiesRequest); i { + switch v := v.(*VolumeUsage); i { case 0: return &v.state case 1: @@ -9440,7 +9581,7 @@ func file_csi_proto_init() { } } file_csi_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeGetCapabilitiesResponse); i { + switch v := v.(*VolumeCondition); i { case 0: return &v.state case 1: @@ -9452,7 +9593,7 @@ func file_csi_proto_init() { } } file_csi_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeServiceCapability); i { + switch v := v.(*NodeGetCapabilitiesRequest); i { case 0: return &v.state case 1: @@ -9464,7 +9605,7 @@ func file_csi_proto_init() { } } file_csi_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeGetInfoRequest); i { + switch v := v.(*NodeGetCapabilitiesResponse); i { case 0: return &v.state case 1: @@ -9476,7 +9617,7 @@ func file_csi_proto_init() { } } file_csi_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeGetInfoResponse); i { + switch v := v.(*NodeServiceCapability); i { case 0: return &v.state case 1: @@ -9488,7 +9629,7 @@ func file_csi_proto_init() { } } file_csi_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeExpandVolumeRequest); i { + switch v := v.(*NodeGetInfoRequest); i { case 0: return &v.state case 1: @@ -9500,7 +9641,7 @@ func file_csi_proto_init() { } } file_csi_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeExpandVolumeResponse); i { + switch v := v.(*NodeGetInfoResponse); i { case 0: return &v.state case 1: @@ -9512,7 +9653,7 @@ func file_csi_proto_init() { } } file_csi_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GroupControllerGetCapabilitiesRequest); i { + switch v := v.(*NodeExpandVolumeRequest); i { case 0: return &v.state case 1: @@ -9524,7 +9665,7 @@ func file_csi_proto_init() { } } file_csi_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GroupControllerGetCapabilitiesResponse); i { + switch v := v.(*NodeExpandVolumeResponse); i { case 0: return &v.state case 1: @@ -9536,7 +9677,7 @@ func file_csi_proto_init() { } } file_csi_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GroupControllerServiceCapability); i { + switch v := v.(*GroupControllerGetCapabilitiesRequest); i { case 0: return &v.state case 1: @@ -9548,7 +9689,7 @@ func file_csi_proto_init() { } } file_csi_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateVolumeGroupSnapshotRequest); i { + switch v := v.(*GroupControllerGetCapabilitiesResponse); i { case 0: return &v.state case 1: @@ -9560,7 +9701,7 @@ func file_csi_proto_init() { } } file_csi_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateVolumeGroupSnapshotResponse); i { + switch v := v.(*GroupControllerServiceCapability); i { case 0: return &v.state case 1: @@ -9572,7 +9713,7 @@ func file_csi_proto_init() { } } file_csi_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeGroupSnapshot); i { + switch v := v.(*CreateVolumeGroupSnapshotRequest); i { case 0: return &v.state case 1: @@ -9584,7 +9725,7 @@ func file_csi_proto_init() { } } file_csi_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteVolumeGroupSnapshotRequest); i { + switch v := v.(*CreateVolumeGroupSnapshotResponse); i { case 0: return &v.state case 1: @@ -9596,7 +9737,7 @@ func file_csi_proto_init() { } } file_csi_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteVolumeGroupSnapshotResponse); i { + switch v := v.(*VolumeGroupSnapshot); i { case 0: return &v.state case 1: @@ -9608,7 +9749,7 @@ func file_csi_proto_init() { } } file_csi_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetVolumeGroupSnapshotRequest); i { + switch v := v.(*DeleteVolumeGroupSnapshotRequest); i { case 0: return &v.state case 1: @@ -9620,7 +9761,7 @@ func file_csi_proto_init() { } } file_csi_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetVolumeGroupSnapshotResponse); i { + switch v := v.(*DeleteVolumeGroupSnapshotResponse); i { case 0: return &v.state case 1: @@ -9632,7 +9773,7 @@ func file_csi_proto_init() { } } file_csi_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BlockMetadata); i { + switch v := v.(*GetVolumeGroupSnapshotRequest); i { case 0: return &v.state case 1: @@ -9644,7 +9785,7 @@ func file_csi_proto_init() { } } file_csi_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetMetadataAllocatedRequest); i { + switch v := v.(*GetVolumeGroupSnapshotResponse); i { case 0: return &v.state case 1: @@ -9656,7 +9797,7 @@ func file_csi_proto_init() { } } file_csi_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetMetadataAllocatedResponse); i { + switch v := v.(*BlockMetadata); i { case 0: return &v.state case 1: @@ -9668,7 +9809,7 @@ func file_csi_proto_init() { } } file_csi_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetMetadataDeltaRequest); i { + switch v := v.(*GetMetadataAllocatedRequest); i { case 0: return &v.state case 1: @@ -9680,7 +9821,19 @@ func file_csi_proto_init() { } } file_csi_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetMetadataDeltaResponse); i { + switch v := v.(*GetMetadataAllocatedResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_csi_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetMetadataDeltaRequest); i { case 0: return &v.state case 1: @@ -9692,6 +9845,18 @@ func file_csi_proto_init() { } } file_csi_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetMetadataDeltaResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_csi_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PluginCapability_Service); i { case 0: return &v.state @@ -9703,7 +9868,7 @@ func file_csi_proto_init() { return nil } } - file_csi_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { + file_csi_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PluginCapability_VolumeExpansion); i { case 0: return &v.state @@ -9715,7 +9880,7 @@ func file_csi_proto_init() { return nil } } - file_csi_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { + file_csi_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolumeContentSource_SnapshotSource); i { case 0: return &v.state @@ -9727,7 +9892,7 @@ func file_csi_proto_init() { return nil } } - file_csi_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { + file_csi_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolumeContentSource_VolumeSource); i { case 0: return &v.state @@ -9739,7 +9904,7 @@ func file_csi_proto_init() { return nil } } - file_csi_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { + file_csi_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolumeCapability_BlockVolume); i { case 0: return &v.state @@ -9751,7 +9916,7 @@ func file_csi_proto_init() { return nil } } - file_csi_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { + file_csi_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolumeCapability_MountVolume); i { case 0: return &v.state @@ -9763,7 +9928,7 @@ func file_csi_proto_init() { return nil } } - file_csi_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { + file_csi_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolumeCapability_AccessMode); i { case 0: return &v.state @@ -9775,7 +9940,7 @@ func file_csi_proto_init() { return nil } } - file_csi_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} { + file_csi_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ValidateVolumeCapabilitiesResponse_Confirmed); i { case 0: return &v.state @@ -9787,7 +9952,7 @@ func file_csi_proto_init() { return nil } } - file_csi_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { + file_csi_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListVolumesResponse_VolumeStatus); i { case 0: return &v.state @@ -9799,7 +9964,7 @@ func file_csi_proto_init() { return nil } } - file_csi_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} { + file_csi_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListVolumesResponse_Entry); i { case 0: return &v.state @@ -9811,7 +9976,7 @@ func file_csi_proto_init() { return nil } } - file_csi_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} { + file_csi_proto_msgTypes[107].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ControllerGetVolumeResponse_VolumeStatus); i { case 0: return &v.state @@ -9823,7 +9988,7 @@ func file_csi_proto_init() { return nil } } - file_csi_proto_msgTypes[109].Exporter = func(v interface{}, i int) interface{} { + file_csi_proto_msgTypes[111].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ControllerServiceCapability_RPC); i { case 0: return &v.state @@ -9835,7 +10000,7 @@ func file_csi_proto_init() { return nil } } - file_csi_proto_msgTypes[114].Exporter = func(v interface{}, i int) interface{} { + file_csi_proto_msgTypes[116].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListSnapshotsResponse_Entry); i { case 0: return &v.state @@ -9847,7 +10012,7 @@ func file_csi_proto_init() { return nil } } - file_csi_proto_msgTypes[122].Exporter = func(v interface{}, i int) interface{} { + file_csi_proto_msgTypes[125].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NodeServiceCapability_RPC); i { case 0: return &v.state @@ -9859,7 +10024,7 @@ func file_csi_proto_init() { return nil } } - file_csi_proto_msgTypes[124].Exporter = func(v interface{}, i int) interface{} { + file_csi_proto_msgTypes[127].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GroupControllerServiceCapability_RPC); i { case 0: return &v.state @@ -9887,10 +10052,10 @@ func file_csi_proto_init() { file_csi_proto_msgTypes[33].OneofWrappers = []interface{}{ (*ControllerServiceCapability_Rpc)(nil), } - file_csi_proto_msgTypes[57].OneofWrappers = []interface{}{ + file_csi_proto_msgTypes[59].OneofWrappers = []interface{}{ (*NodeServiceCapability_Rpc)(nil), } - file_csi_proto_msgTypes[64].OneofWrappers = []interface{}{ + file_csi_proto_msgTypes[66].OneofWrappers = []interface{}{ (*GroupControllerServiceCapability_Rpc)(nil), } type x struct{} @@ -9899,7 +10064,7 @@ func file_csi_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_csi_proto_rawDesc, NumEnums: 8, - NumMessages: 131, + NumMessages: 134, NumExtensions: 7, NumServices: 5, }, diff --git a/vendor/github.com/container-storage-interface/spec/lib/go/csi/csi_grpc.pb.go b/vendor/github.com/container-storage-interface/spec/lib/go/csi/csi_grpc.pb.go index 8d7091946..8b8197fec 100644 --- a/vendor/github.com/container-storage-interface/spec/lib/go/csi/csi_grpc.pb.go +++ b/vendor/github.com/container-storage-interface/spec/lib/go/csi/csi_grpc.pb.go @@ -196,6 +196,7 @@ const ( Controller_CreateSnapshot_FullMethodName = "/csi.v1.Controller/CreateSnapshot" Controller_DeleteSnapshot_FullMethodName = "/csi.v1.Controller/DeleteSnapshot" Controller_ListSnapshots_FullMethodName = "/csi.v1.Controller/ListSnapshots" + Controller_GetSnapshot_FullMethodName = "/csi.v1.Controller/GetSnapshot" Controller_ControllerExpandVolume_FullMethodName = "/csi.v1.Controller/ControllerExpandVolume" Controller_ControllerGetVolume_FullMethodName = "/csi.v1.Controller/ControllerGetVolume" Controller_ControllerModifyVolume_FullMethodName = "/csi.v1.Controller/ControllerModifyVolume" @@ -216,6 +217,7 @@ type ControllerClient interface { CreateSnapshot(ctx context.Context, in *CreateSnapshotRequest, opts ...grpc.CallOption) (*CreateSnapshotResponse, error) DeleteSnapshot(ctx context.Context, in *DeleteSnapshotRequest, opts ...grpc.CallOption) (*DeleteSnapshotResponse, error) ListSnapshots(ctx context.Context, in *ListSnapshotsRequest, opts ...grpc.CallOption) (*ListSnapshotsResponse, error) + GetSnapshot(ctx context.Context, in *GetSnapshotRequest, opts ...grpc.CallOption) (*GetSnapshotResponse, error) ControllerExpandVolume(ctx context.Context, in *ControllerExpandVolumeRequest, opts ...grpc.CallOption) (*ControllerExpandVolumeResponse, error) ControllerGetVolume(ctx context.Context, in *ControllerGetVolumeRequest, opts ...grpc.CallOption) (*ControllerGetVolumeResponse, error) ControllerModifyVolume(ctx context.Context, in *ControllerModifyVolumeRequest, opts ...grpc.CallOption) (*ControllerModifyVolumeResponse, error) @@ -328,6 +330,15 @@ func (c *controllerClient) ListSnapshots(ctx context.Context, in *ListSnapshotsR return out, nil } +func (c *controllerClient) GetSnapshot(ctx context.Context, in *GetSnapshotRequest, opts ...grpc.CallOption) (*GetSnapshotResponse, error) { + out := new(GetSnapshotResponse) + err := c.cc.Invoke(ctx, Controller_GetSnapshot_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *controllerClient) ControllerExpandVolume(ctx context.Context, in *ControllerExpandVolumeRequest, opts ...grpc.CallOption) (*ControllerExpandVolumeResponse, error) { out := new(ControllerExpandVolumeResponse) err := c.cc.Invoke(ctx, Controller_ControllerExpandVolume_FullMethodName, in, out, opts...) @@ -370,6 +381,7 @@ type ControllerServer interface { CreateSnapshot(context.Context, *CreateSnapshotRequest) (*CreateSnapshotResponse, error) DeleteSnapshot(context.Context, *DeleteSnapshotRequest) (*DeleteSnapshotResponse, error) ListSnapshots(context.Context, *ListSnapshotsRequest) (*ListSnapshotsResponse, error) + GetSnapshot(context.Context, *GetSnapshotRequest) (*GetSnapshotResponse, error) ControllerExpandVolume(context.Context, *ControllerExpandVolumeRequest) (*ControllerExpandVolumeResponse, error) ControllerGetVolume(context.Context, *ControllerGetVolumeRequest) (*ControllerGetVolumeResponse, error) ControllerModifyVolume(context.Context, *ControllerModifyVolumeRequest) (*ControllerModifyVolumeResponse, error) @@ -413,6 +425,9 @@ func (UnimplementedControllerServer) DeleteSnapshot(context.Context, *DeleteSnap func (UnimplementedControllerServer) ListSnapshots(context.Context, *ListSnapshotsRequest) (*ListSnapshotsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListSnapshots not implemented") } +func (UnimplementedControllerServer) GetSnapshot(context.Context, *GetSnapshotRequest) (*GetSnapshotResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetSnapshot not implemented") +} func (UnimplementedControllerServer) ControllerExpandVolume(context.Context, *ControllerExpandVolumeRequest) (*ControllerExpandVolumeResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ControllerExpandVolume not implemented") } @@ -633,6 +648,24 @@ func _Controller_ListSnapshots_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } +func _Controller_GetSnapshot_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetSnapshotRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControllerServer).GetSnapshot(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Controller_GetSnapshot_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControllerServer).GetSnapshot(ctx, req.(*GetSnapshotRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Controller_ControllerExpandVolume_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ControllerExpandVolumeRequest) if err := dec(in); err != nil { @@ -738,6 +771,10 @@ var Controller_ServiceDesc = grpc.ServiceDesc{ MethodName: "ListSnapshots", Handler: _Controller_ListSnapshots_Handler, }, + { + MethodName: "GetSnapshot", + Handler: _Controller_GetSnapshot_Handler, + }, { MethodName: "ControllerExpandVolume", Handler: _Controller_ControllerExpandVolume_Handler, diff --git a/vendor/github.com/evanphx/json-patch/v5/LICENSE b/vendor/github.com/evanphx/json-patch/v5/LICENSE new file mode 100644 index 000000000..df76d7d77 --- /dev/null +++ b/vendor/github.com/evanphx/json-patch/v5/LICENSE @@ -0,0 +1,25 @@ +Copyright (c) 2014, Evan Phoenix +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +* Neither the name of the Evan Phoenix nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/evanphx/json-patch/v5/errors.go b/vendor/github.com/evanphx/json-patch/v5/errors.go new file mode 100644 index 000000000..75304b443 --- /dev/null +++ b/vendor/github.com/evanphx/json-patch/v5/errors.go @@ -0,0 +1,38 @@ +package jsonpatch + +import "fmt" + +// AccumulatedCopySizeError is an error type returned when the accumulated size +// increase caused by copy operations in a patch operation has exceeded the +// limit. +type AccumulatedCopySizeError struct { + limit int64 + accumulated int64 +} + +// NewAccumulatedCopySizeError returns an AccumulatedCopySizeError. +func NewAccumulatedCopySizeError(l, a int64) *AccumulatedCopySizeError { + return &AccumulatedCopySizeError{limit: l, accumulated: a} +} + +// Error implements the error interface. +func (a *AccumulatedCopySizeError) Error() string { + return fmt.Sprintf("Unable to complete the copy, the accumulated size increase of copy is %d, exceeding the limit %d", a.accumulated, a.limit) +} + +// ArraySizeError is an error type returned when the array size has exceeded +// the limit. +type ArraySizeError struct { + limit int + size int +} + +// NewArraySizeError returns an ArraySizeError. +func NewArraySizeError(l, s int) *ArraySizeError { + return &ArraySizeError{limit: l, size: s} +} + +// Error implements the error interface. +func (a *ArraySizeError) Error() string { + return fmt.Sprintf("Unable to create array of size %d, limit is %d", a.size, a.limit) +} diff --git a/vendor/github.com/evanphx/json-patch/v5/internal/json/decode.go b/vendor/github.com/evanphx/json-patch/v5/internal/json/decode.go new file mode 100644 index 000000000..e9bb0efe7 --- /dev/null +++ b/vendor/github.com/evanphx/json-patch/v5/internal/json/decode.go @@ -0,0 +1,1385 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Represents JSON data structure using native Go types: booleans, floats, +// strings, arrays, and maps. + +package json + +import ( + "encoding" + "encoding/base64" + "fmt" + "reflect" + "strconv" + "strings" + "sync" + "unicode" + "unicode/utf16" + "unicode/utf8" +) + +// Unmarshal parses the JSON-encoded data and stores the result +// in the value pointed to by v. If v is nil or not a pointer, +// Unmarshal returns an InvalidUnmarshalError. +// +// Unmarshal uses the inverse of the encodings that +// Marshal uses, allocating maps, slices, and pointers as necessary, +// with the following additional rules: +// +// To unmarshal JSON into a pointer, Unmarshal first handles the case of +// the JSON being the JSON literal null. In that case, Unmarshal sets +// the pointer to nil. Otherwise, Unmarshal unmarshals the JSON into +// the value pointed at by the pointer. If the pointer is nil, Unmarshal +// allocates a new value for it to point to. +// +// To unmarshal JSON into a value implementing the Unmarshaler interface, +// Unmarshal calls that value's UnmarshalJSON method, including +// when the input is a JSON null. +// Otherwise, if the value implements encoding.TextUnmarshaler +// and the input is a JSON quoted string, Unmarshal calls that value's +// UnmarshalText method with the unquoted form of the string. +// +// To unmarshal JSON into a struct, Unmarshal matches incoming object +// keys to the keys used by Marshal (either the struct field name or its tag), +// preferring an exact match but also accepting a case-insensitive match. By +// default, object keys which don't have a corresponding struct field are +// ignored (see Decoder.DisallowUnknownFields for an alternative). +// +// To unmarshal JSON into an interface value, +// Unmarshal stores one of these in the interface value: +// +// bool, for JSON booleans +// float64, for JSON numbers +// string, for JSON strings +// []interface{}, for JSON arrays +// map[string]interface{}, for JSON objects +// nil for JSON null +// +// To unmarshal a JSON array into a slice, Unmarshal resets the slice length +// to zero and then appends each element to the slice. +// As a special case, to unmarshal an empty JSON array into a slice, +// Unmarshal replaces the slice with a new empty slice. +// +// To unmarshal a JSON array into a Go array, Unmarshal decodes +// JSON array elements into corresponding Go array elements. +// If the Go array is smaller than the JSON array, +// the additional JSON array elements are discarded. +// If the JSON array is smaller than the Go array, +// the additional Go array elements are set to zero values. +// +// To unmarshal a JSON object into a map, Unmarshal first establishes a map to +// use. If the map is nil, Unmarshal allocates a new map. Otherwise Unmarshal +// reuses the existing map, keeping existing entries. Unmarshal then stores +// key-value pairs from the JSON object into the map. The map's key type must +// either be any string type, an integer, implement json.Unmarshaler, or +// implement encoding.TextUnmarshaler. +// +// If the JSON-encoded data contain a syntax error, Unmarshal returns a SyntaxError. +// +// If a JSON value is not appropriate for a given target type, +// or if a JSON number overflows the target type, Unmarshal +// skips that field and completes the unmarshaling as best it can. +// If no more serious errors are encountered, Unmarshal returns +// an UnmarshalTypeError describing the earliest such error. In any +// case, it's not guaranteed that all the remaining fields following +// the problematic one will be unmarshaled into the target object. +// +// The JSON null value unmarshals into an interface, map, pointer, or slice +// by setting that Go value to nil. Because null is often used in JSON to mean +// “not present,” unmarshaling a JSON null into any other Go type has no effect +// on the value and produces no error. +// +// When unmarshaling quoted strings, invalid UTF-8 or +// invalid UTF-16 surrogate pairs are not treated as an error. +// Instead, they are replaced by the Unicode replacement +// character U+FFFD. +func Unmarshal(data []byte, v any) error { + // Check for well-formedness. + // Avoids filling out half a data structure + // before discovering a JSON syntax error. + d := ds.Get().(*decodeState) + defer ds.Put(d) + //var d decodeState + d.useNumber = true + err := checkValid(data, &d.scan) + if err != nil { + return err + } + + d.init(data) + return d.unmarshal(v) +} + +var ds = sync.Pool{ + New: func() any { + return new(decodeState) + }, +} + +func UnmarshalWithKeys(data []byte, v any) ([]string, error) { + // Check for well-formedness. + // Avoids filling out half a data structure + // before discovering a JSON syntax error. + + d := ds.Get().(*decodeState) + defer ds.Put(d) + //var d decodeState + d.useNumber = true + err := checkValid(data, &d.scan) + if err != nil { + return nil, err + } + + d.init(data) + err = d.unmarshal(v) + if err != nil { + return nil, err + } + + return d.lastKeys, nil +} + +func UnmarshalValid(data []byte, v any) error { + // Check for well-formedness. + // Avoids filling out half a data structure + // before discovering a JSON syntax error. + d := ds.Get().(*decodeState) + defer ds.Put(d) + //var d decodeState + d.useNumber = true + + d.init(data) + return d.unmarshal(v) +} + +func UnmarshalValidWithKeys(data []byte, v any) ([]string, error) { + // Check for well-formedness. + // Avoids filling out half a data structure + // before discovering a JSON syntax error. + + d := ds.Get().(*decodeState) + defer ds.Put(d) + //var d decodeState + d.useNumber = true + + d.init(data) + err := d.unmarshal(v) + if err != nil { + return nil, err + } + + return d.lastKeys, nil +} + +// Unmarshaler is the interface implemented by types +// that can unmarshal a JSON description of themselves. +// The input can be assumed to be a valid encoding of +// a JSON value. UnmarshalJSON must copy the JSON data +// if it wishes to retain the data after returning. +// +// By convention, to approximate the behavior of Unmarshal itself, +// Unmarshalers implement UnmarshalJSON([]byte("null")) as a no-op. +type Unmarshaler interface { + UnmarshalJSON([]byte) error +} + +// An UnmarshalTypeError describes a JSON value that was +// not appropriate for a value of a specific Go type. +type UnmarshalTypeError struct { + Value string // description of JSON value - "bool", "array", "number -5" + Type reflect.Type // type of Go value it could not be assigned to + Offset int64 // error occurred after reading Offset bytes + Struct string // name of the struct type containing the field + Field string // the full path from root node to the field +} + +func (e *UnmarshalTypeError) Error() string { + if e.Struct != "" || e.Field != "" { + return "json: cannot unmarshal " + e.Value + " into Go struct field " + e.Struct + "." + e.Field + " of type " + e.Type.String() + } + return "json: cannot unmarshal " + e.Value + " into Go value of type " + e.Type.String() +} + +// An UnmarshalFieldError describes a JSON object key that +// led to an unexported (and therefore unwritable) struct field. +// +// Deprecated: No longer used; kept for compatibility. +type UnmarshalFieldError struct { + Key string + Type reflect.Type + Field reflect.StructField +} + +func (e *UnmarshalFieldError) Error() string { + return "json: cannot unmarshal object key " + strconv.Quote(e.Key) + " into unexported field " + e.Field.Name + " of type " + e.Type.String() +} + +// An InvalidUnmarshalError describes an invalid argument passed to Unmarshal. +// (The argument to Unmarshal must be a non-nil pointer.) +type InvalidUnmarshalError struct { + Type reflect.Type +} + +func (e *InvalidUnmarshalError) Error() string { + if e.Type == nil { + return "json: Unmarshal(nil)" + } + + if e.Type.Kind() != reflect.Pointer { + return "json: Unmarshal(non-pointer " + e.Type.String() + ")" + } + return "json: Unmarshal(nil " + e.Type.String() + ")" +} + +func (d *decodeState) unmarshal(v any) error { + rv := reflect.ValueOf(v) + if rv.Kind() != reflect.Pointer || rv.IsNil() { + return &InvalidUnmarshalError{reflect.TypeOf(v)} + } + + d.scan.reset() + d.scanWhile(scanSkipSpace) + // We decode rv not rv.Elem because the Unmarshaler interface + // test must be applied at the top level of the value. + err := d.value(rv) + if err != nil { + return d.addErrorContext(err) + } + return d.savedError +} + +// A Number represents a JSON number literal. +type Number string + +// String returns the literal text of the number. +func (n Number) String() string { return string(n) } + +// Float64 returns the number as a float64. +func (n Number) Float64() (float64, error) { + return strconv.ParseFloat(string(n), 64) +} + +// Int64 returns the number as an int64. +func (n Number) Int64() (int64, error) { + return strconv.ParseInt(string(n), 10, 64) +} + +// An errorContext provides context for type errors during decoding. +type errorContext struct { + Struct reflect.Type + FieldStack []string +} + +// decodeState represents the state while decoding a JSON value. +type decodeState struct { + data []byte + off int // next read offset in data + opcode int // last read result + scan scanner + errorContext *errorContext + savedError error + useNumber bool + disallowUnknownFields bool + lastKeys []string +} + +// readIndex returns the position of the last byte read. +func (d *decodeState) readIndex() int { + return d.off - 1 +} + +// phasePanicMsg is used as a panic message when we end up with something that +// shouldn't happen. It can indicate a bug in the JSON decoder, or that +// something is editing the data slice while the decoder executes. +const phasePanicMsg = "JSON decoder out of sync - data changing underfoot?" + +func (d *decodeState) init(data []byte) *decodeState { + d.data = data + d.off = 0 + d.savedError = nil + if d.errorContext != nil { + d.errorContext.Struct = nil + // Reuse the allocated space for the FieldStack slice. + d.errorContext.FieldStack = d.errorContext.FieldStack[:0] + } + return d +} + +// saveError saves the first err it is called with, +// for reporting at the end of the unmarshal. +func (d *decodeState) saveError(err error) { + if d.savedError == nil { + d.savedError = d.addErrorContext(err) + } +} + +// addErrorContext returns a new error enhanced with information from d.errorContext +func (d *decodeState) addErrorContext(err error) error { + if d.errorContext != nil && (d.errorContext.Struct != nil || len(d.errorContext.FieldStack) > 0) { + switch err := err.(type) { + case *UnmarshalTypeError: + err.Struct = d.errorContext.Struct.Name() + err.Field = strings.Join(d.errorContext.FieldStack, ".") + } + } + return err +} + +// skip scans to the end of what was started. +func (d *decodeState) skip() { + s, data, i := &d.scan, d.data, d.off + depth := len(s.parseState) + for { + op := s.step(s, data[i]) + i++ + if len(s.parseState) < depth { + d.off = i + d.opcode = op + return + } + } +} + +// scanNext processes the byte at d.data[d.off]. +func (d *decodeState) scanNext() { + if d.off < len(d.data) { + d.opcode = d.scan.step(&d.scan, d.data[d.off]) + d.off++ + } else { + d.opcode = d.scan.eof() + d.off = len(d.data) + 1 // mark processed EOF with len+1 + } +} + +// scanWhile processes bytes in d.data[d.off:] until it +// receives a scan code not equal to op. +func (d *decodeState) scanWhile(op int) { + s, data, i := &d.scan, d.data, d.off + for i < len(data) { + newOp := s.step(s, data[i]) + i++ + if newOp != op { + d.opcode = newOp + d.off = i + return + } + } + + d.off = len(data) + 1 // mark processed EOF with len+1 + d.opcode = d.scan.eof() +} + +// rescanLiteral is similar to scanWhile(scanContinue), but it specialises the +// common case where we're decoding a literal. The decoder scans the input +// twice, once for syntax errors and to check the length of the value, and the +// second to perform the decoding. +// +// Only in the second step do we use decodeState to tokenize literals, so we +// know there aren't any syntax errors. We can take advantage of that knowledge, +// and scan a literal's bytes much more quickly. +func (d *decodeState) rescanLiteral() { + data, i := d.data, d.off +Switch: + switch data[i-1] { + case '"': // string + for ; i < len(data); i++ { + switch data[i] { + case '\\': + i++ // escaped char + case '"': + i++ // tokenize the closing quote too + break Switch + } + } + case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-': // number + for ; i < len(data); i++ { + switch data[i] { + case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '.', 'e', 'E', '+', '-': + default: + break Switch + } + } + case 't': // true + i += len("rue") + case 'f': // false + i += len("alse") + case 'n': // null + i += len("ull") + } + if i < len(data) { + d.opcode = stateEndValue(&d.scan, data[i]) + } else { + d.opcode = scanEnd + } + d.off = i + 1 +} + +// value consumes a JSON value from d.data[d.off-1:], decoding into v, and +// reads the following byte ahead. If v is invalid, the value is discarded. +// The first byte of the value has been read already. +func (d *decodeState) value(v reflect.Value) error { + switch d.opcode { + default: + panic(phasePanicMsg) + + case scanBeginArray: + if v.IsValid() { + if err := d.array(v); err != nil { + return err + } + } else { + d.skip() + } + d.scanNext() + + case scanBeginObject: + if v.IsValid() { + if err := d.object(v); err != nil { + return err + } + } else { + d.skip() + } + d.scanNext() + + case scanBeginLiteral: + // All bytes inside literal return scanContinue op code. + start := d.readIndex() + d.rescanLiteral() + + if v.IsValid() { + if err := d.literalStore(d.data[start:d.readIndex()], v, false); err != nil { + return err + } + } + } + return nil +} + +type unquotedValue struct{} + +// valueQuoted is like value but decodes a +// quoted string literal or literal null into an interface value. +// If it finds anything other than a quoted string literal or null, +// valueQuoted returns unquotedValue{}. +func (d *decodeState) valueQuoted() any { + switch d.opcode { + default: + panic(phasePanicMsg) + + case scanBeginArray, scanBeginObject: + d.skip() + d.scanNext() + + case scanBeginLiteral: + v := d.literalInterface() + switch v.(type) { + case nil, string: + return v + } + } + return unquotedValue{} +} + +// indirect walks down v allocating pointers as needed, +// until it gets to a non-pointer. +// If it encounters an Unmarshaler, indirect stops and returns that. +// If decodingNull is true, indirect stops at the first settable pointer so it +// can be set to nil. +func indirect(v reflect.Value, decodingNull bool) (Unmarshaler, encoding.TextUnmarshaler, reflect.Value) { + // Issue #24153 indicates that it is generally not a guaranteed property + // that you may round-trip a reflect.Value by calling Value.Addr().Elem() + // and expect the value to still be settable for values derived from + // unexported embedded struct fields. + // + // The logic below effectively does this when it first addresses the value + // (to satisfy possible pointer methods) and continues to dereference + // subsequent pointers as necessary. + // + // After the first round-trip, we set v back to the original value to + // preserve the original RW flags contained in reflect.Value. + v0 := v + haveAddr := false + + // If v is a named type and is addressable, + // start with its address, so that if the type has pointer methods, + // we find them. + if v.Kind() != reflect.Pointer && v.Type().Name() != "" && v.CanAddr() { + haveAddr = true + v = v.Addr() + } + for { + // Load value from interface, but only if the result will be + // usefully addressable. + if v.Kind() == reflect.Interface && !v.IsNil() { + e := v.Elem() + if e.Kind() == reflect.Pointer && !e.IsNil() && (!decodingNull || e.Elem().Kind() == reflect.Pointer) { + haveAddr = false + v = e + continue + } + } + + if v.Kind() != reflect.Pointer { + break + } + + if decodingNull && v.CanSet() { + break + } + + // Prevent infinite loop if v is an interface pointing to its own address: + // var v interface{} + // v = &v + if v.Elem().Kind() == reflect.Interface && v.Elem().Elem() == v { + v = v.Elem() + break + } + if v.IsNil() { + v.Set(reflect.New(v.Type().Elem())) + } + if v.Type().NumMethod() > 0 && v.CanInterface() { + if u, ok := v.Interface().(Unmarshaler); ok { + return u, nil, reflect.Value{} + } + if !decodingNull { + if u, ok := v.Interface().(encoding.TextUnmarshaler); ok { + return nil, u, reflect.Value{} + } + } + } + + if haveAddr { + v = v0 // restore original value after round-trip Value.Addr().Elem() + haveAddr = false + } else { + v = v.Elem() + } + } + return nil, nil, v +} + +// array consumes an array from d.data[d.off-1:], decoding into v. +// The first byte of the array ('[') has been read already. +func (d *decodeState) array(v reflect.Value) error { + // Check for unmarshaler. + u, ut, pv := indirect(v, false) + if u != nil { + start := d.readIndex() + d.skip() + return u.UnmarshalJSON(d.data[start:d.off]) + } + if ut != nil { + d.saveError(&UnmarshalTypeError{Value: "array", Type: v.Type(), Offset: int64(d.off)}) + d.skip() + return nil + } + v = pv + + // Check type of target. + switch v.Kind() { + case reflect.Interface: + if v.NumMethod() == 0 { + // Decoding into nil interface? Switch to non-reflect code. + ai := d.arrayInterface() + v.Set(reflect.ValueOf(ai)) + return nil + } + // Otherwise it's invalid. + fallthrough + default: + d.saveError(&UnmarshalTypeError{Value: "array", Type: v.Type(), Offset: int64(d.off)}) + d.skip() + return nil + case reflect.Array, reflect.Slice: + break + } + + i := 0 + for { + // Look ahead for ] - can only happen on first iteration. + d.scanWhile(scanSkipSpace) + if d.opcode == scanEndArray { + break + } + + // Get element of array, growing if necessary. + if v.Kind() == reflect.Slice { + // Grow slice if necessary + if i >= v.Cap() { + newcap := v.Cap() + v.Cap()/2 + if newcap < 4 { + newcap = 4 + } + newv := reflect.MakeSlice(v.Type(), v.Len(), newcap) + reflect.Copy(newv, v) + v.Set(newv) + } + if i >= v.Len() { + v.SetLen(i + 1) + } + } + + if i < v.Len() { + // Decode into element. + if err := d.value(v.Index(i)); err != nil { + return err + } + } else { + // Ran out of fixed array: skip. + if err := d.value(reflect.Value{}); err != nil { + return err + } + } + i++ + + // Next token must be , or ]. + if d.opcode == scanSkipSpace { + d.scanWhile(scanSkipSpace) + } + if d.opcode == scanEndArray { + break + } + if d.opcode != scanArrayValue { + panic(phasePanicMsg) + } + } + + if i < v.Len() { + if v.Kind() == reflect.Array { + // Array. Zero the rest. + z := reflect.Zero(v.Type().Elem()) + for ; i < v.Len(); i++ { + v.Index(i).Set(z) + } + } else { + v.SetLen(i) + } + } + if i == 0 && v.Kind() == reflect.Slice { + v.Set(reflect.MakeSlice(v.Type(), 0, 0)) + } + return nil +} + +var nullLiteral = []byte("null") +var textUnmarshalerType = reflect.TypeOf((*encoding.TextUnmarshaler)(nil)).Elem() + +// object consumes an object from d.data[d.off-1:], decoding into v. +// The first byte ('{') of the object has been read already. +func (d *decodeState) object(v reflect.Value) error { + // Check for unmarshaler. + u, ut, pv := indirect(v, false) + if u != nil { + start := d.readIndex() + d.skip() + return u.UnmarshalJSON(d.data[start:d.off]) + } + if ut != nil { + d.saveError(&UnmarshalTypeError{Value: "object", Type: v.Type(), Offset: int64(d.off)}) + d.skip() + return nil + } + v = pv + t := v.Type() + + // Decoding into nil interface? Switch to non-reflect code. + if v.Kind() == reflect.Interface && v.NumMethod() == 0 { + oi := d.objectInterface() + v.Set(reflect.ValueOf(oi)) + return nil + } + + var fields structFields + + // Check type of target: + // struct or + // map[T1]T2 where T1 is string, an integer type, + // or an encoding.TextUnmarshaler + switch v.Kind() { + case reflect.Map: + // Map key must either have string kind, have an integer kind, + // or be an encoding.TextUnmarshaler. + switch t.Key().Kind() { + case reflect.String, + reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, + reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + default: + if !reflect.PointerTo(t.Key()).Implements(textUnmarshalerType) { + d.saveError(&UnmarshalTypeError{Value: "object", Type: t, Offset: int64(d.off)}) + d.skip() + return nil + } + } + if v.IsNil() { + v.Set(reflect.MakeMap(t)) + } + case reflect.Struct: + fields = cachedTypeFields(t) + // ok + default: + d.saveError(&UnmarshalTypeError{Value: "object", Type: t, Offset: int64(d.off)}) + d.skip() + return nil + } + + var mapElem reflect.Value + var origErrorContext errorContext + if d.errorContext != nil { + origErrorContext = *d.errorContext + } + + var keys []string + + for { + // Read opening " of string key or closing }. + d.scanWhile(scanSkipSpace) + if d.opcode == scanEndObject { + // closing } - can only happen on first iteration. + break + } + if d.opcode != scanBeginLiteral { + panic(phasePanicMsg) + } + + // Read key. + start := d.readIndex() + d.rescanLiteral() + item := d.data[start:d.readIndex()] + key, ok := unquoteBytes(item) + if !ok { + panic(phasePanicMsg) + } + + keys = append(keys, string(key)) + + // Figure out field corresponding to key. + var subv reflect.Value + destring := false // whether the value is wrapped in a string to be decoded first + + if v.Kind() == reflect.Map { + elemType := t.Elem() + if !mapElem.IsValid() { + mapElem = reflect.New(elemType).Elem() + } else { + mapElem.Set(reflect.Zero(elemType)) + } + subv = mapElem + } else { + var f *field + if i, ok := fields.nameIndex[string(key)]; ok { + // Found an exact name match. + f = &fields.list[i] + } else { + // Fall back to the expensive case-insensitive + // linear search. + for i := range fields.list { + ff := &fields.list[i] + if ff.equalFold(ff.nameBytes, key) { + f = ff + break + } + } + } + if f != nil { + subv = v + destring = f.quoted + for _, i := range f.index { + if subv.Kind() == reflect.Pointer { + if subv.IsNil() { + // If a struct embeds a pointer to an unexported type, + // it is not possible to set a newly allocated value + // since the field is unexported. + // + // See https://golang.org/issue/21357 + if !subv.CanSet() { + d.saveError(fmt.Errorf("json: cannot set embedded pointer to unexported struct: %v", subv.Type().Elem())) + // Invalidate subv to ensure d.value(subv) skips over + // the JSON value without assigning it to subv. + subv = reflect.Value{} + destring = false + break + } + subv.Set(reflect.New(subv.Type().Elem())) + } + subv = subv.Elem() + } + subv = subv.Field(i) + } + if d.errorContext == nil { + d.errorContext = new(errorContext) + } + d.errorContext.FieldStack = append(d.errorContext.FieldStack, f.name) + d.errorContext.Struct = t + } else if d.disallowUnknownFields { + d.saveError(fmt.Errorf("json: unknown field %q", key)) + } + } + + // Read : before value. + if d.opcode == scanSkipSpace { + d.scanWhile(scanSkipSpace) + } + if d.opcode != scanObjectKey { + panic(phasePanicMsg) + } + d.scanWhile(scanSkipSpace) + + if destring { + switch qv := d.valueQuoted().(type) { + case nil: + if err := d.literalStore(nullLiteral, subv, false); err != nil { + return err + } + case string: + if err := d.literalStore([]byte(qv), subv, true); err != nil { + return err + } + default: + d.saveError(fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal unquoted value into %v", subv.Type())) + } + } else { + if err := d.value(subv); err != nil { + return err + } + } + + // Write value back to map; + // if using struct, subv points into struct already. + if v.Kind() == reflect.Map { + kt := t.Key() + var kv reflect.Value + switch { + case reflect.PointerTo(kt).Implements(textUnmarshalerType): + kv = reflect.New(kt) + if err := d.literalStore(item, kv, true); err != nil { + return err + } + kv = kv.Elem() + case kt.Kind() == reflect.String: + kv = reflect.ValueOf(key).Convert(kt) + default: + switch kt.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + s := string(key) + n, err := strconv.ParseInt(s, 10, 64) + if err != nil || reflect.Zero(kt).OverflowInt(n) { + d.saveError(&UnmarshalTypeError{Value: "number " + s, Type: kt, Offset: int64(start + 1)}) + break + } + kv = reflect.ValueOf(n).Convert(kt) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + s := string(key) + n, err := strconv.ParseUint(s, 10, 64) + if err != nil || reflect.Zero(kt).OverflowUint(n) { + d.saveError(&UnmarshalTypeError{Value: "number " + s, Type: kt, Offset: int64(start + 1)}) + break + } + kv = reflect.ValueOf(n).Convert(kt) + default: + panic("json: Unexpected key type") // should never occur + } + } + if kv.IsValid() { + v.SetMapIndex(kv, subv) + } + } + + // Next token must be , or }. + if d.opcode == scanSkipSpace { + d.scanWhile(scanSkipSpace) + } + if d.errorContext != nil { + // Reset errorContext to its original state. + // Keep the same underlying array for FieldStack, to reuse the + // space and avoid unnecessary allocs. + d.errorContext.FieldStack = d.errorContext.FieldStack[:len(origErrorContext.FieldStack)] + d.errorContext.Struct = origErrorContext.Struct + } + if d.opcode == scanEndObject { + break + } + if d.opcode != scanObjectValue { + panic(phasePanicMsg) + } + } + + if v.Kind() == reflect.Map { + d.lastKeys = keys + } + return nil +} + +// convertNumber converts the number literal s to a float64 or a Number +// depending on the setting of d.useNumber. +func (d *decodeState) convertNumber(s string) (any, error) { + if d.useNumber { + return Number(s), nil + } + f, err := strconv.ParseFloat(s, 64) + if err != nil { + return nil, &UnmarshalTypeError{Value: "number " + s, Type: reflect.TypeOf(0.0), Offset: int64(d.off)} + } + return f, nil +} + +var numberType = reflect.TypeOf(Number("")) + +// literalStore decodes a literal stored in item into v. +// +// fromQuoted indicates whether this literal came from unwrapping a +// string from the ",string" struct tag option. this is used only to +// produce more helpful error messages. +func (d *decodeState) literalStore(item []byte, v reflect.Value, fromQuoted bool) error { + // Check for unmarshaler. + if len(item) == 0 { + //Empty string given + d.saveError(fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type())) + return nil + } + isNull := item[0] == 'n' // null + u, ut, pv := indirect(v, isNull) + if u != nil { + return u.UnmarshalJSON(item) + } + if ut != nil { + if item[0] != '"' { + if fromQuoted { + d.saveError(fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type())) + return nil + } + val := "number" + switch item[0] { + case 'n': + val = "null" + case 't', 'f': + val = "bool" + } + d.saveError(&UnmarshalTypeError{Value: val, Type: v.Type(), Offset: int64(d.readIndex())}) + return nil + } + s, ok := unquoteBytes(item) + if !ok { + if fromQuoted { + return fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type()) + } + panic(phasePanicMsg) + } + return ut.UnmarshalText(s) + } + + v = pv + + switch c := item[0]; c { + case 'n': // null + // The main parser checks that only true and false can reach here, + // but if this was a quoted string input, it could be anything. + if fromQuoted && string(item) != "null" { + d.saveError(fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type())) + break + } + switch v.Kind() { + case reflect.Interface, reflect.Pointer, reflect.Map, reflect.Slice: + v.Set(reflect.Zero(v.Type())) + // otherwise, ignore null for primitives/string + } + case 't', 'f': // true, false + value := item[0] == 't' + // The main parser checks that only true and false can reach here, + // but if this was a quoted string input, it could be anything. + if fromQuoted && string(item) != "true" && string(item) != "false" { + d.saveError(fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type())) + break + } + switch v.Kind() { + default: + if fromQuoted { + d.saveError(fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type())) + } else { + d.saveError(&UnmarshalTypeError{Value: "bool", Type: v.Type(), Offset: int64(d.readIndex())}) + } + case reflect.Bool: + v.SetBool(value) + case reflect.Interface: + if v.NumMethod() == 0 { + v.Set(reflect.ValueOf(value)) + } else { + d.saveError(&UnmarshalTypeError{Value: "bool", Type: v.Type(), Offset: int64(d.readIndex())}) + } + } + + case '"': // string + s, ok := unquoteBytes(item) + if !ok { + if fromQuoted { + return fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type()) + } + panic(phasePanicMsg) + } + switch v.Kind() { + default: + d.saveError(&UnmarshalTypeError{Value: "string", Type: v.Type(), Offset: int64(d.readIndex())}) + case reflect.Slice: + if v.Type().Elem().Kind() != reflect.Uint8 { + d.saveError(&UnmarshalTypeError{Value: "string", Type: v.Type(), Offset: int64(d.readIndex())}) + break + } + b := make([]byte, base64.StdEncoding.DecodedLen(len(s))) + n, err := base64.StdEncoding.Decode(b, s) + if err != nil { + d.saveError(err) + break + } + v.SetBytes(b[:n]) + case reflect.String: + if v.Type() == numberType && !isValidNumber(string(s)) { + return fmt.Errorf("json: invalid number literal, trying to unmarshal %q into Number", item) + } + v.SetString(string(s)) + case reflect.Interface: + if v.NumMethod() == 0 { + v.Set(reflect.ValueOf(string(s))) + } else { + d.saveError(&UnmarshalTypeError{Value: "string", Type: v.Type(), Offset: int64(d.readIndex())}) + } + } + + default: // number + if c != '-' && (c < '0' || c > '9') { + if fromQuoted { + return fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type()) + } + panic(phasePanicMsg) + } + s := string(item) + switch v.Kind() { + default: + if v.Kind() == reflect.String && v.Type() == numberType { + // s must be a valid number, because it's + // already been tokenized. + v.SetString(s) + break + } + if fromQuoted { + return fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type()) + } + d.saveError(&UnmarshalTypeError{Value: "number", Type: v.Type(), Offset: int64(d.readIndex())}) + case reflect.Interface: + n, err := d.convertNumber(s) + if err != nil { + d.saveError(err) + break + } + if v.NumMethod() != 0 { + d.saveError(&UnmarshalTypeError{Value: "number", Type: v.Type(), Offset: int64(d.readIndex())}) + break + } + v.Set(reflect.ValueOf(n)) + + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + n, err := strconv.ParseInt(s, 10, 64) + if err != nil || v.OverflowInt(n) { + d.saveError(&UnmarshalTypeError{Value: "number " + s, Type: v.Type(), Offset: int64(d.readIndex())}) + break + } + v.SetInt(n) + + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + n, err := strconv.ParseUint(s, 10, 64) + if err != nil || v.OverflowUint(n) { + d.saveError(&UnmarshalTypeError{Value: "number " + s, Type: v.Type(), Offset: int64(d.readIndex())}) + break + } + v.SetUint(n) + + case reflect.Float32, reflect.Float64: + n, err := strconv.ParseFloat(s, v.Type().Bits()) + if err != nil || v.OverflowFloat(n) { + d.saveError(&UnmarshalTypeError{Value: "number " + s, Type: v.Type(), Offset: int64(d.readIndex())}) + break + } + v.SetFloat(n) + } + } + return nil +} + +// The xxxInterface routines build up a value to be stored +// in an empty interface. They are not strictly necessary, +// but they avoid the weight of reflection in this common case. + +// valueInterface is like value but returns interface{} +func (d *decodeState) valueInterface() (val any) { + switch d.opcode { + default: + panic(phasePanicMsg) + case scanBeginArray: + val = d.arrayInterface() + d.scanNext() + case scanBeginObject: + val = d.objectInterface() + d.scanNext() + case scanBeginLiteral: + val = d.literalInterface() + } + return +} + +// arrayInterface is like array but returns []interface{}. +func (d *decodeState) arrayInterface() []any { + var v = make([]any, 0) + for { + // Look ahead for ] - can only happen on first iteration. + d.scanWhile(scanSkipSpace) + if d.opcode == scanEndArray { + break + } + + v = append(v, d.valueInterface()) + + // Next token must be , or ]. + if d.opcode == scanSkipSpace { + d.scanWhile(scanSkipSpace) + } + if d.opcode == scanEndArray { + break + } + if d.opcode != scanArrayValue { + panic(phasePanicMsg) + } + } + return v +} + +// objectInterface is like object but returns map[string]interface{}. +func (d *decodeState) objectInterface() map[string]any { + m := make(map[string]any) + for { + // Read opening " of string key or closing }. + d.scanWhile(scanSkipSpace) + if d.opcode == scanEndObject { + // closing } - can only happen on first iteration. + break + } + if d.opcode != scanBeginLiteral { + panic(phasePanicMsg) + } + + // Read string key. + start := d.readIndex() + d.rescanLiteral() + item := d.data[start:d.readIndex()] + key, ok := unquote(item) + if !ok { + panic(phasePanicMsg) + } + + // Read : before value. + if d.opcode == scanSkipSpace { + d.scanWhile(scanSkipSpace) + } + if d.opcode != scanObjectKey { + panic(phasePanicMsg) + } + d.scanWhile(scanSkipSpace) + + // Read value. + m[key] = d.valueInterface() + + // Next token must be , or }. + if d.opcode == scanSkipSpace { + d.scanWhile(scanSkipSpace) + } + if d.opcode == scanEndObject { + break + } + if d.opcode != scanObjectValue { + panic(phasePanicMsg) + } + } + return m +} + +// literalInterface consumes and returns a literal from d.data[d.off-1:] and +// it reads the following byte ahead. The first byte of the literal has been +// read already (that's how the caller knows it's a literal). +func (d *decodeState) literalInterface() any { + // All bytes inside literal return scanContinue op code. + start := d.readIndex() + d.rescanLiteral() + + item := d.data[start:d.readIndex()] + + switch c := item[0]; c { + case 'n': // null + return nil + + case 't', 'f': // true, false + return c == 't' + + case '"': // string + s, ok := unquote(item) + if !ok { + panic(phasePanicMsg) + } + return s + + default: // number + if c != '-' && (c < '0' || c > '9') { + panic(phasePanicMsg) + } + n, err := d.convertNumber(string(item)) + if err != nil { + d.saveError(err) + } + return n + } +} + +// getu4 decodes \uXXXX from the beginning of s, returning the hex value, +// or it returns -1. +func getu4(s []byte) rune { + if len(s) < 6 || s[0] != '\\' || s[1] != 'u' { + return -1 + } + var r rune + for _, c := range s[2:6] { + switch { + case '0' <= c && c <= '9': + c = c - '0' + case 'a' <= c && c <= 'f': + c = c - 'a' + 10 + case 'A' <= c && c <= 'F': + c = c - 'A' + 10 + default: + return -1 + } + r = r*16 + rune(c) + } + return r +} + +// unquote converts a quoted JSON string literal s into an actual string t. +// The rules are different than for Go, so cannot use strconv.Unquote. +func unquote(s []byte) (t string, ok bool) { + s, ok = unquoteBytes(s) + t = string(s) + return +} + +func unquoteBytes(s []byte) (t []byte, ok bool) { + if len(s) < 2 || s[0] != '"' || s[len(s)-1] != '"' { + return + } + s = s[1 : len(s)-1] + + // Check for unusual characters. If there are none, + // then no unquoting is needed, so return a slice of the + // original bytes. + r := 0 + for r < len(s) { + c := s[r] + if c == '\\' || c == '"' || c < ' ' { + break + } + if c < utf8.RuneSelf { + r++ + continue + } + rr, size := utf8.DecodeRune(s[r:]) + if rr == utf8.RuneError && size == 1 { + break + } + r += size + } + if r == len(s) { + return s, true + } + + b := make([]byte, len(s)+2*utf8.UTFMax) + w := copy(b, s[0:r]) + for r < len(s) { + // Out of room? Can only happen if s is full of + // malformed UTF-8 and we're replacing each + // byte with RuneError. + if w >= len(b)-2*utf8.UTFMax { + nb := make([]byte, (len(b)+utf8.UTFMax)*2) + copy(nb, b[0:w]) + b = nb + } + switch c := s[r]; { + case c == '\\': + r++ + if r >= len(s) { + return + } + switch s[r] { + default: + return + case '"', '\\', '/', '\'': + b[w] = s[r] + r++ + w++ + case 'b': + b[w] = '\b' + r++ + w++ + case 'f': + b[w] = '\f' + r++ + w++ + case 'n': + b[w] = '\n' + r++ + w++ + case 'r': + b[w] = '\r' + r++ + w++ + case 't': + b[w] = '\t' + r++ + w++ + case 'u': + r-- + rr := getu4(s[r:]) + if rr < 0 { + return + } + r += 6 + if utf16.IsSurrogate(rr) { + rr1 := getu4(s[r:]) + if dec := utf16.DecodeRune(rr, rr1); dec != unicode.ReplacementChar { + // A valid pair; consume. + r += 6 + w += utf8.EncodeRune(b[w:], dec) + break + } + // Invalid surrogate; fall back to replacement rune. + rr = unicode.ReplacementChar + } + w += utf8.EncodeRune(b[w:], rr) + } + + // Quote, control characters are invalid. + case c == '"', c < ' ': + return + + // ASCII + case c < utf8.RuneSelf: + b[w] = c + r++ + w++ + + // Coerce to well-formed UTF-8. + default: + rr, size := utf8.DecodeRune(s[r:]) + r += size + w += utf8.EncodeRune(b[w:], rr) + } + } + return b[0:w], true +} diff --git a/vendor/github.com/evanphx/json-patch/v5/internal/json/encode.go b/vendor/github.com/evanphx/json-patch/v5/internal/json/encode.go new file mode 100644 index 000000000..2e6eca448 --- /dev/null +++ b/vendor/github.com/evanphx/json-patch/v5/internal/json/encode.go @@ -0,0 +1,1486 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package json implements encoding and decoding of JSON as defined in +// RFC 7159. The mapping between JSON and Go values is described +// in the documentation for the Marshal and Unmarshal functions. +// +// See "JSON and Go" for an introduction to this package: +// https://golang.org/doc/articles/json_and_go.html +package json + +import ( + "bytes" + "encoding" + "encoding/base64" + "fmt" + "math" + "reflect" + "sort" + "strconv" + "strings" + "sync" + "unicode" + "unicode/utf8" +) + +// Marshal returns the JSON encoding of v. +// +// Marshal traverses the value v recursively. +// If an encountered value implements the Marshaler interface +// and is not a nil pointer, Marshal calls its MarshalJSON method +// to produce JSON. If no MarshalJSON method is present but the +// value implements encoding.TextMarshaler instead, Marshal calls +// its MarshalText method and encodes the result as a JSON string. +// The nil pointer exception is not strictly necessary +// but mimics a similar, necessary exception in the behavior of +// UnmarshalJSON. +// +// Otherwise, Marshal uses the following type-dependent default encodings: +// +// Boolean values encode as JSON booleans. +// +// Floating point, integer, and Number values encode as JSON numbers. +// +// String values encode as JSON strings coerced to valid UTF-8, +// replacing invalid bytes with the Unicode replacement rune. +// So that the JSON will be safe to embed inside HTML