diff --git a/CHANGELOG/CHANGELOG-0.6.md b/CHANGELOG/CHANGELOG-0.6.md new file mode 100644 index 00000000..e421d851 --- /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 00000000..2adf2695 --- /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 00000000..ad4c8763 --- /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 00000000..c7ffa593 --- /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 00000000..f8c8107b --- /dev/null +++ b/CHANGELOG/CHANGELOG-1.10.md @@ -0,0 +1,369 @@ +# 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 00000000..b88812f5 --- /dev/null +++ b/CHANGELOG/CHANGELOG-1.11.md @@ -0,0 +1,184 @@ +# 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.2.md b/CHANGELOG/CHANGELOG-1.2.md new file mode 100644 index 00000000..75a70458 --- /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 00000000..5ae26b7a --- /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 00000000..ab67839c --- /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 00000000..f273ee4f --- /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 00000000..a4fbee06 --- /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 00000000..dba7f026 --- /dev/null +++ b/CHANGELOG/CHANGELOG-1.7.md @@ -0,0 +1,483 @@ +# 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 00000000..1308dda5 --- /dev/null +++ b/CHANGELOG/CHANGELOG-1.8.md @@ -0,0 +1,277 @@ +# 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 00000000..b8b266de --- /dev/null +++ b/CHANGELOG/CHANGELOG-1.9.md @@ -0,0 +1,293 @@ +# 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/CHANGELOG.md b/CHANGELOG/CHANGELOG.md deleted file mode 100644 index 0dce137a..00000000 --- a/CHANGELOG/CHANGELOG.md +++ /dev/null @@ -1 +0,0 @@ -See the [1.9 changelog in the master branch](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/blob/master/CHANGELOG/CHANGELOG-1.9.md). \ No newline at end of file diff --git a/CHANGELOG/README.md b/CHANGELOG/README.md new file mode 100644 index 00000000..79877342 --- /dev/null +++ b/CHANGELOG/README.md @@ -0,0 +1,16 @@ +# CHANGELOGs + +- [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 5214aae7..3a08bcf9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -30,9 +30,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG BUILDPLATFORM - -FROM --platform=$BUILDPLATFORM golang:1.19.1 as builder +FROM --platform=$BUILDPLATFORM golang:1.20.8 as builder ARG STAGINGVERSION ARG TARGETPLATFORM @@ -43,7 +41,7 @@ RUN apt update --yes && apt install -y libcryptsetup-dev RUN GOARCH=$(echo $TARGETPLATFORM | cut -f2 -d '/') GCE_PD_CSI_STAGING_VERSION=$STAGINGVERSION make gce-pd-driver # Start from Kubernetes Debian base. -FROM k8s.gcr.io/build-image/debian-base:bullseye-v1.4.2 as debian +FROM gke.gcr.io/debian-base:bullseye-v1.4.3-gke.5 as debian # Install necessary dependencies # google_nvme_id script depends on the following packages: nvme-cli, xxd, bash RUN clean-install util-linux e2fsprogs mount ca-certificates udev xfsprogs nvme-cli xxd bash libcryptsetup-dev @@ -65,8 +63,6 @@ FROM distroless-$TARGETARCH as output-image COPY --from=builder /go/src/sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/bin/gce-pd-csi-driver /gce-pd-csi-driver COPY --from=debian /etc/mke2fs.conf /etc/mke2fs.conf COPY --from=debian /lib/udev/scsi_id /lib/udev_containerized/scsi_id -COPY --from=debian /bin/udevadm /bin/udevadm -COPY --from=debian /sbin/dmsetup /sbin/dmsetup COPY --from=debian /bin/mount /bin/mount COPY --from=debian /bin/umount /bin/umount COPY --from=debian /sbin/blkid /sbin/blkid @@ -92,51 +88,53 @@ COPY --from=debian /bin/date /bin/date COPY --from=debian /bin/grep /bin/grep COPY --from=debian /bin/sed /bin/sed COPY --from=debian /bin/ln /bin/ln +COPY --from=debian /bin/udevadm /bin/udevadm +# Add dependencies for cryptsetup +COPY --from=debian /sbin/dmsetup /sbin/dmsetup # Copy shared libraries into distroless base. -COPY --from=debian /lib/${LIB_DIR_PREFIX}-linux-gnu/libcom_err.so.2 \ - /lib/${LIB_DIR_PREFIX}-linux-gnu/libdevmapper.so.1.02.1 \ - /lib/${LIB_DIR_PREFIX}-linux-gnu/libe2p.so.2 \ - /lib/${LIB_DIR_PREFIX}-linux-gnu/libext2fs.so.2 \ - /lib/${LIB_DIR_PREFIX}-linux-gnu/libgcc_s.so.1 \ - /lib/${LIB_DIR_PREFIX}-linux-gnu/libpcre.so.3 \ - /lib/${LIB_DIR_PREFIX}-linux-gnu/libreadline.so.8 \ - /lib/${LIB_DIR_PREFIX}-linux-gnu/libselinux.so.1 \ - /lib/${LIB_DIR_PREFIX}-linux-gnu/libtinfo.so.6 \ - /lib/${LIB_DIR_PREFIX}-linux-gnu/libz.so.1 \ - /lib/${LIB_DIR_PREFIX}-linux-gnu/libpthread.so.0 \ - /lib/${LIB_DIR_PREFIX}-linux-gnu/liblzma.so.5 \ - /lib/${LIB_DIR_PREFIX}-linux-gnu/libdl.so.2 \ - /lib/${LIB_DIR_PREFIX}-linux-gnu/libcryptsetup.so.12 \ - /lib/${LIB_DIR_PREFIX}-linux-gnu/libcryptsetup.so \ - /lib/${LIB_DIR_PREFIX}-linux-gnu/ - -COPY --from=debian /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/libacl.so.1 \ - /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/libattr.so.1 \ - /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/libicudata.so.67 \ - /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/libicui18n.so.67 \ - /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/libicuuc.so.67 \ - /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/libstdc++.so.6 \ - /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/libblkid.so.1 \ - /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/libmount.so.1 \ - /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/libudev.so.1 \ - /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/libuuid.so.1.3.0 \ - /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/libuuid.so.1 \ - /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/libpcre2-8.so.0 \ - /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/libpcre2-8.so.0.10.1 \ - /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/libkmod.so.2 \ - /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/libedit.so.2 \ - /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/libinih.so.1 \ - /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/libbsd.so.0 \ - /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/libmd.so.0 \ - /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/libargon2.so.1 \ - /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/libjson-c.so.5.1.0 \ - /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/libjson-c.so.5 \ - /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/engines-1.1/afalg.so \ - /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/engines-1.1/padlock.so \ - /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/libcrypto.so.1.1 \ - /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/libssl.so.1.1 \ - /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/ +COPY --from=debian /lib/${LIB_DIR_PREFIX}-linux-gnu/libpcre.so.3 \ + /lib/${LIB_DIR_PREFIX}-linux-gnu/libselinux.so.1 \ + /lib/${LIB_DIR_PREFIX}-linux-gnu/libtinfo.so.6 \ + /lib/${LIB_DIR_PREFIX}-linux-gnu/libe2p.so.2 \ + /lib/${LIB_DIR_PREFIX}-linux-gnu/libcom_err.so.2 \ + /lib/${LIB_DIR_PREFIX}-linux-gnu/libdevmapper.so.1.02.1 \ + /lib/${LIB_DIR_PREFIX}-linux-gnu/libext2fs.so.2 \ + /lib/${LIB_DIR_PREFIX}-linux-gnu/libgcc_s.so.1 \ + /lib/${LIB_DIR_PREFIX}-linux-gnu/liblzma.so.5 \ + /lib/${LIB_DIR_PREFIX}-linux-gnu/libreadline.so.8 \ + /lib/${LIB_DIR_PREFIX}-linux-gnu/libz.so.1 \ + /lib/${LIB_DIR_PREFIX}-linux-gnu/libpthread.so.0 \ + /lib/${LIB_DIR_PREFIX}-linux-gnu/libcryptsetup.so.12 \ + /lib/${LIB_DIR_PREFIX}-linux-gnu/libcryptsetup.so \ + /lib/${LIB_DIR_PREFIX}-linux-gnu/ + +COPY --from=debian /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/libblkid.so.1 \ + /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/libbsd.so.0 \ + /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/libinih.so.1 \ + /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/libmount.so.1 \ + /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/libudev.so.1 \ + /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/libuuid.so.1.3.0 \ + /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/libuuid.so.1 \ + /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/libacl.so.1 \ + /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/libattr.so.1 \ + /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/libedit.so.2 \ + /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/libicudata.so.67 \ + /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/libicui18n.so.67 \ + /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/libicuuc.so.67 \ + /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/libkmod.so.2 \ + /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/libmd.so.0 \ + /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/libpcre2-8.so.0 \ + /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/libpcre2-8.so.0.10.1 \ + /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/libstdc++.so.6 \ + /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/libargon2.so.1 \ + /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/libjson-c.so.5.1.0 \ + /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/libjson-c.so.5 \ + /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/engines-1.1/afalg.so \ + /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/engines-1.1/padlock.so \ + /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/libcrypto.so.1.1 \ + /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/libssl.so.1.1 \ + /usr/lib/${LIB_DIR_PREFIX}-linux-gnu/ # Copy NVME support required script and rules into distroless base. COPY deploy/kubernetes/udev/google_nvme_id /lib/udev_containerized/google_nvme_id diff --git a/Dockerfile.Windows b/Dockerfile.Windows index 091b61cd..e13d78e9 100644 --- a/Dockerfile.Windows +++ b/Dockerfile.Windows @@ -13,10 +13,9 @@ # limitations under the License. ARG BASE_IMAGE -FROM --platform=$BUILDPLATFORM golang:1.19.6 AS builder +FROM --platform=$BUILDPLATFORM golang:1.20.8 AS builder ARG TARGETPLATFORM -ARG BUILDPLATFORM ARG STAGINGVERSION WORKDIR /code ADD . /code/ diff --git a/Dockerfile.debug b/Dockerfile.debug index 249f62d9..f2de3527 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.19.6 as builder +FROM golang:1.20.8 as builder WORKDIR /go/src/sigs.k8s.io/gcp-compute-persistent-disk-csi-driver ADD . . @@ -24,11 +24,11 @@ RUN CGO_ENABLED=0 go install -ldflags "-s -w -extldflags '-static'" github.com/g RUN GOARCH="$(echo $TARGETPLATFORM | cut -f2 -d '/')" GCE_PD_CSI_STAGING_VERSION=$STAGINGVERSION GCE_PD_CSI_DEBUG=1 make gce-pd-driver # MAD HACKS: Build a version first so we can take the scsi_id bin and put it somewhere else in our real build -FROM k8s.gcr.io/build-image/debian-base-amd64:buster-v1.5.0 as mad-hack +FROM gke.gcr.io/debian-base:bullseye-v1.4.3-gke.0 as mad-hack RUN clean-install udev # Start from Kubernetes Debian base -FROM k8s.gcr.io/build-image/debian-base-amd64:buster-v1.5.0 +FROM gke.gcr.io/debian-base:bullseye-v1.4.3-gke.0 # Copy source code too to correlate the binary and the breakpoints WORKDIR /go/src/sigs.k8s.io/gcp-compute-persistent-disk-csi-driver diff --git a/Makefile b/Makefile index bf45a313..56ec8c60 100644 --- a/Makefile +++ b/Makefile @@ -78,8 +78,8 @@ build-and-push-windows-container-ltsc2019: require-GCE_PD_CSI_STAGING_IMAGE --build-arg STAGINGVERSION=$(STAGINGVERSION) . $(DOCKER) push $(STAGINGIMAGE):$(STAGINGVERSION)_ltsc2019 -build-and-push-multi-arch: build-and-push-container-linux-amd64 build-and-push-windows-container-ltsc2019 - $(DOCKER) manifest create --amend $(STAGINGIMAGE):$(STAGINGVERSION) $(STAGINGIMAGE):$(STAGINGVERSION)_linux_amd64 $(STAGINGIMAGE):$(STAGINGVERSION)_ltsc2019 +build-and-push-multi-arch: build-and-push-container-linux-amd64 build-and-push-container-linux-arm64 build-and-push-windows-container-ltsc2019 + $(DOCKER) manifest create --amend $(STAGINGIMAGE):$(STAGINGVERSION) $(STAGINGIMAGE):$(STAGINGVERSION)_linux_amd64 $(STAGINGIMAGE):$(STAGINGVERSION)_linux_arm64 $(STAGINGIMAGE):$(STAGINGVERSION)_ltsc2019 STAGINGIMAGE="$(STAGINGIMAGE)" STAGINGVERSION="$(STAGINGVERSION)" WINDOWS_IMAGE_TAGS="$(WINDOWS_IMAGE_TAGS)" WINDOWS_BASE_IMAGES="$(WINDOWS_BASE_IMAGES)" ./manifest_osversion.sh $(DOCKER) manifest push -p $(STAGINGIMAGE):$(STAGINGVERSION) diff --git a/OWNERS b/OWNERS index 043f6732..bf259fa4 100644 --- a/OWNERS +++ b/OWNERS @@ -4,12 +4,16 @@ reviewers: - mattcary - msau42 - saikat-royc + - sunnylovestiramisu + - pwschuurman approvers: - amacaskill - leiyiz - mattcary - msau42 - saikat-royc + - sunnylovestiramisu + - pwschuurman emeritus_reviewers: - davidz627 - jingxu97 diff --git a/README.md b/README.md index 0a5ea028..f0ac68ea 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ helm uninstall ## Further Documentation -- [Local Development](docs/local-development.md) +- [Local Development](docs/kubernetes/development.md) - [User Guides](docs/kubernetes/user-guides) - [Driver Development](docs/kubernetes/development.md) diff --git a/cmd/gce-pd-csi-driver/main.go b/cmd/gce-pd-csi-driver/main.go index 959fed8e..01ae5636 100644 --- a/cmd/gce-pd-csi-driver/main.go +++ b/cmd/gce-pd-csi-driver/main.go @@ -38,7 +38,6 @@ import ( "flag" "math/rand" "os" - "path/filepath" "runtime" "time" @@ -81,7 +80,12 @@ var ( waitForOpBackoffSteps = flag.Int("wait-op-backoff-steps", 100, "Steps for wait for operation backoff") waitForOpBackoffCap = flag.Duration("wait-op-backoff-cap", 0, "Cap for wait for operation backoff") - maxprocs = flag.Int("maxprocs", 1, "GOMAXPROCS override") + maxProcs = flag.Int("maxprocs", 1, "GOMAXPROCS override") + maxConcurrentFormat = flag.Int("max-concurrent-format", 1, "The maximum number of concurrent format exec calls") + concurrentFormatTimeout = flag.Duration("concurrent-format-timeout", 1*time.Minute, "The maximum duration of a format operation before its concurrency token is released") + + maxConcurrentFormatAndMount = flag.Int("max-concurrent-format-and-mount", 1, "If set then format and mount operations are serialized on each node. This is stronger than max-concurrent-format as it includes fsck and other mount operations") + formatAndMountTimeout = flag.Duration("format-and-mount-timeout", 1*time.Minute, "The maximum duration of a format and mount operation before another such operation will be started. Used only if --serialize-format-and-mount") version string ) @@ -110,7 +114,7 @@ func main() { func handle() { var err error - runtime.GOMAXPROCS(*maxprocs) + runtime.GOMAXPROCS(*maxProcs) klog.Infof("Sys info: NumCPU: %v MAXPROC: %v", runtime.NumCPU(), runtime.GOMAXPROCS(0)) if version == "" { @@ -118,10 +122,14 @@ func handle() { } klog.V(2).Infof("Driver vendor version %v", version) - if *runControllerService && *httpEndpoint != "" && metrics.IsGKEComponentVersionAvailable() { + if *runControllerService && *httpEndpoint != "" { mm := metrics.NewMetricsManager() mm.InitializeHttpHandler(*httpEndpoint, *metricsPath) - mm.EmitGKEComponentVersion() + mm.RegisterPDCSIMetric() + + if metrics.IsGKEComponentVersionAvailable() { + mm.EmitGKEComponentVersion() + } } if len(*extraVolumeLabelsStr) > 0 && !*runControllerService { @@ -132,16 +140,16 @@ func handle() { klog.Fatalf("Bad extra volume labels: %v", err.Error()) } - gceDriver := driver.GetGCEDriver() - - //Initialize GCE Driver ctx, cancel := context.WithCancel(context.Background()) defer cancel() - //Initialize identity server + // Initialize driver + gceDriver := driver.GetGCEDriver() + + // Initialize identity server identityServer := driver.NewIdentityServer(gceDriver) - //Initialize requirements for the controller service + // Initialize requirements for the controller service var controllerServer *driver.GCEControllerServer if *runControllerService { cloudProvider, err := gce.CreateCloudProvider(ctx, version, *cloudConfigFilePath, *computeEndpoint) @@ -155,10 +163,10 @@ func handle() { klog.Warningf("controller service is disabled but cloud config given - it has no effect") } - //Initialize requirements for the node service + // Initialize requirements for the node service var nodeServer *driver.GCENodeServer if *runNodeService { - mounter, err := mountmanager.NewSafeMounter() + mounter, err := mountmanager.NewSafeMounter(*maxConcurrentFormat, *concurrentFormatTimeout) if err != nil { klog.Fatalf("Failed to get safe mounter: %v", err.Error()) } @@ -170,12 +178,12 @@ func handle() { } // [Edgeless] set up Constellation key management - mapper := cryptmapper.New( - cryptKms.NewConstellationKMS(*constellationAddr), - &cryptmapper.CryptDevice{}, - ) + mapper := cryptmapper.New(cryptKms.NewConstellationKMS(*constellationAddr)) - nodeServer = driver.NewNodeServer(gceDriver, mounter, deviceUtils, meta, statter, mapper, filepath.EvalSymlinks) + nodeServer = driver.NewNodeServer(gceDriver, mounter, deviceUtils, meta, statter, mapper) + if *maxConcurrentFormatAndMount > 0 { + nodeServer = nodeServer.WithSerializedFormatAndMount(*formatAndMountTimeout, *maxConcurrentFormatAndMount) + } } err = gceDriver.SetupGCEDriver(driverName, version, extraVolumeLabels, identityServer, controllerServer, nodeServer) diff --git a/deploy/kubernetes/base/controller/controller.yaml b/deploy/kubernetes/base/controller/controller.yaml index 93e8b92c..e7e5db9d 100644 --- a/deploy/kubernetes/base/controller/controller.yaml +++ b/deploy/kubernetes/base/controller/controller.yaml @@ -23,7 +23,7 @@ spec: priorityClassName: csi-gce-pd-controller containers: - name: csi-provisioner - image: k8s.gcr.io/sig-storage/csi-provisioner + image: registry.k8s.io/sig-storage/csi-provisioner args: - "--v=5" - "--csi-address=/csi/csi.sock" @@ -58,7 +58,7 @@ spec: - name: socket-dir mountPath: /csi - name: csi-attacher - image: k8s.gcr.io/sig-storage/csi-attacher + image: registry.k8s.io/sig-storage/csi-attacher args: - "--v=5" - "--csi-address=/csi/csi.sock" @@ -87,7 +87,7 @@ spec: - name: socket-dir mountPath: /csi - name: csi-resizer - image: k8s.gcr.io/sig-storage/csi-resizer + image: registry.k8s.io/sig-storage/csi-resizer args: - "--v=5" - "--csi-address=/csi/csi.sock" @@ -116,7 +116,7 @@ spec: - name: socket-dir mountPath: /csi - name: csi-snapshotter - image: k8s.gcr.io/sig-storage/csi-snapshotter + image: registry.k8s.io/sig-storage/csi-snapshotter args: - "--v=5" - "--csi-address=/csi/csi.sock" diff --git a/deploy/kubernetes/base/node_linux/node.yaml b/deploy/kubernetes/base/node_linux/node.yaml index 51b5c8b8..ebf7779c 100644 --- a/deploy/kubernetes/base/node_linux/node.yaml +++ b/deploy/kubernetes/base/node_linux/node.yaml @@ -23,7 +23,7 @@ spec: kubernetes.io/os: linux containers: - name: csi-driver-registrar - image: k8s.gcr.io/sig-storage/csi-node-driver-registrar + image: registry.k8s.io/sig-storage/csi-node-driver-registrar args: - "--v=5" - "--csi-address=/csi/csi.sock" diff --git a/deploy/kubernetes/base/node_windows/node.yaml b/deploy/kubernetes/base/node_windows/node.yaml index 63c01a79..44e9be57 100644 --- a/deploy/kubernetes/base/node_windows/node.yaml +++ b/deploy/kubernetes/base/node_windows/node.yaml @@ -24,7 +24,7 @@ spec: kubernetes.io/os: windows containers: - name: csi-driver-registrar - image: k8s.gcr.io/sig-storage/csi-node-driver-registrar + image: registry.k8s.io/sig-storage/csi-node-driver-registrar args: - --v=5 - --csi-address=unix://C:\\csi\\csi.sock diff --git a/deploy/kubernetes/images/prow-canary-sidecar/image.yaml b/deploy/kubernetes/images/prow-canary-sidecar/image.yaml index ce0d779f..255883b5 100644 --- a/deploy/kubernetes/images/prow-canary-sidecar/image.yaml +++ b/deploy/kubernetes/images/prow-canary-sidecar/image.yaml @@ -3,7 +3,7 @@ kind: ImageTagTransformer metadata: name: imagetag-gcepd-driver-prow-head imageTag: - name: k8s.gcr.io/cloud-provider-gcp/gcp-compute-persistent-disk-csi-driver + name: registry.k8s.io/cloud-provider-gcp/gcp-compute-persistent-disk-csi-driver newName: gcr.io/k8s-staging-cloud-provider-gcp/gcp-compute-persistent-disk-csi-driver newTag: "master" --- @@ -12,7 +12,7 @@ kind: ImageTagTransformer metadata: name: imagetag-csi-provisioner-prow-head imageTag: - name: k8s.gcr.io/sig-storage/csi-provisioner + name: registry.k8s.io/sig-storage/csi-provisioner newName: gcr.io/k8s-staging-sig-storage/csi-provisioner newTag: "canary" @@ -22,7 +22,7 @@ kind: ImageTagTransformer metadata: name: imagetag-csi-attacher-prow-head imageTag: - name: k8s.gcr.io/sig-storage/csi-attacher + name: registry.k8s.io/sig-storage/csi-attacher newName: gcr.io/k8s-staging-sig-storage/csi-attacher newTag: "canary" --- @@ -32,7 +32,7 @@ kind: ImageTagTransformer metadata: name: imagetag-csi-nodo-registrar-prow-head imageTag: - name: k8s.gcr.io/sig-storage/csi-node-driver-registrar + name: registry.k8s.io/sig-storage/csi-node-driver-registrar newName: gcr.io/k8s-staging-sig-storage/csi-node-driver-registrar newTag: "canary" --- @@ -42,7 +42,7 @@ kind: ImageTagTransformer metadata: name: imagetag-csi-resizer-prow-head imageTag: - name: k8s.gcr.io/sig-storage/csi-resizer + name: registry.k8s.io/sig-storage/csi-resizer newName: gcr.io/k8s-staging-sig-storage/csi-resizer newTag: "canary" --- @@ -52,6 +52,6 @@ kind: ImageTagTransformer metadata: name: imagetag-csi-snapshotter-prow-head imageTag: - name: k8s.gcr.io/sig-storage/csi-snapshotter + name: registry.k8s.io/sig-storage/csi-snapshotter newName: gcr.io/k8s-staging-sig-storage/csi-snapshotter newTag: "canary" diff --git a/deploy/kubernetes/images/prow-stable-sidecar-rc-master/image.yaml b/deploy/kubernetes/images/prow-stable-sidecar-rc-master/image.yaml index 8a985093..b1e6ab1c 100644 --- a/deploy/kubernetes/images/prow-stable-sidecar-rc-master/image.yaml +++ b/deploy/kubernetes/images/prow-stable-sidecar-rc-master/image.yaml @@ -6,7 +6,7 @@ kind: ImageTagTransformer metadata: name: imagetag-csi-provisioner-prow-rc imageTag: - name: k8s.gcr.io/sig-storage/csi-provisioner + name: registry.k8s.io/sig-storage/csi-provisioner newTag: "v3.4.0" --- apiVersion: builtin @@ -14,7 +14,7 @@ kind: ImageTagTransformer metadata: name: imagetag-csi-attacher-prow-rc imageTag: - name: k8s.gcr.io/sig-storage/csi-attacher + name: registry.k8s.io/sig-storage/csi-attacher newTag: "v4.2.0" --- apiVersion: builtin @@ -22,7 +22,7 @@ kind: ImageTagTransformer metadata: name: imagetag-csi-resize-prow-rc imageTag: - name: k8s.gcr.io/sig-storage/csi-resizer + name: registry.k8s.io/sig-storage/csi-resizer newTag: "v1.7.0" --- apiVersion: builtin @@ -30,7 +30,7 @@ kind: ImageTagTransformer metadata: name: imagetag-csi-snapshotter-prow-head imageTag: - name: k8s.gcr.io/sig-storage/csi-snapshotter + name: registry.k8s.io/sig-storage/csi-snapshotter newTag: "v6.1.0" --- apiVersion: builtin @@ -38,7 +38,7 @@ kind: ImageTagTransformer metadata: name: imagetag-csi-node-registrar-prow-rc imageTag: - name: k8s.gcr.io/sig-storage/csi-node-driver-registrar + name: registry.k8s.io/sig-storage/csi-node-driver-registrar newTag: "v2.7.0" --- apiVersion: builtin @@ -46,8 +46,8 @@ kind: ImageTagTransformer metadata: name: imagetag-csi-gce-driver-prow-rc imageTag: - name: k8s.gcr.io/cloud-provider-gcp/gcp-compute-persistent-disk-csi-driver + name: registry.k8s.io/cloud-provider-gcp/gcp-compute-persistent-disk-csi-driver newName: gcr.io/k8s-staging-cloud-provider-gcp/gcp-compute-persistent-disk-csi-driver - newTag: "v1.9.0-rc1" + newTag: "v1.8.11-rc1" --- diff --git a/deploy/kubernetes/images/stable-1-21/image.yaml b/deploy/kubernetes/images/stable-1-21/image.yaml deleted file mode 100644 index c84eeea6..00000000 --- a/deploy/kubernetes/images/stable-1-21/image.yaml +++ /dev/null @@ -1,53 +0,0 @@ -apiVersion: builtin -kind: ImageTagTransformer -metadata: - name: imagetag-csi-provisioner -imageTag: - name: k8s.gcr.io/sig-storage/csi-provisioner - newTag: "v3.1.0" - ---- -apiVersion: builtin -kind: ImageTagTransformer -metadata: - name: imagetag-csi-attacher -imageTag: - name: k8s.gcr.io/sig-storage/csi-attacher - newTag: "v3.4.0" ---- - -apiVersion: builtin -kind: ImageTagTransformer -metadata: - name: imagetag-csi-resizer -imageTag: - name: k8s.gcr.io/sig-storage/csi-resizer - newTag: "v1.4.0" ---- - -apiVersion: builtin -kind: ImageTagTransformer -metadata: - name: imagetag-csi-snapshotter -imageTag: - name: k8s.gcr.io/sig-storage/csi-snapshotter - newTag: "v4.0.1" ---- - -apiVersion: builtin -kind: ImageTagTransformer -metadata: - name: imagetag-csi-node-registrar -imageTag: - name: k8s.gcr.io/sig-storage/csi-node-driver-registrar - newTag: "v2.5.0" ---- - -apiVersion: builtin -kind: ImageTagTransformer -metadata: - name: imagetag-gcepd-driver -imageTag: - name: gke.gcr.io/gcp-compute-persistent-disk-csi-driver - newTag: "v1.4.0" ---- diff --git a/deploy/kubernetes/images/stable-1-21/kustomization.yaml b/deploy/kubernetes/images/stable-1-21/kustomization.yaml deleted file mode 100644 index f16988f1..00000000 --- a/deploy/kubernetes/images/stable-1-21/kustomization.yaml +++ /dev/null @@ -1,4 +0,0 @@ -namespace: - gce-pd-csi-driver -resources: -- image.yaml diff --git a/deploy/kubernetes/images/stable-1-22/image.yaml b/deploy/kubernetes/images/stable-1-22/image.yaml deleted file mode 100644 index 7afc446f..00000000 --- a/deploy/kubernetes/images/stable-1-22/image.yaml +++ /dev/null @@ -1,54 +0,0 @@ -apiVersion: builtin -kind: ImageTagTransformer -metadata: - name: imagetag-csi-provisioner -imageTag: - name: k8s.gcr.io/sig-storage/csi-provisioner - newTag: "v3.1.0" - ---- -apiVersion: builtin -kind: ImageTagTransformer -metadata: - name: imagetag-csi-attacher -imageTag: - name: k8s.gcr.io/sig-storage/csi-attacher - newTag: "v3.4.0" ---- - -apiVersion: builtin -kind: ImageTagTransformer -metadata: - name: imagetag-csi-resizer -imageTag: - name: k8s.gcr.io/sig-storage/csi-resizer - newTag: "v1.4.0" ---- - -apiVersion: builtin -kind: ImageTagTransformer -metadata: - name: imagetag-csi-snapshotter -imageTag: - name: k8s.gcr.io/sig-storage/csi-snapshotter - newTag: "v4.0.1" ---- - -apiVersion: builtin -kind: ImageTagTransformer -metadata: - name: imagetag-csi-node-registrar -imageTag: - name: k8s.gcr.io/sig-storage/csi-node-driver-registrar - newTag: "v2.5.0" ---- - -apiVersion: builtin -kind: ImageTagTransformer -metadata: - name: imagetag-gcepd-driver -imageTag: - name: gke.gcr.io/gcp-compute-persistent-disk-csi-driver - newName: k8s.gcr.io/cloud-provider-gcp/gcp-compute-persistent-disk-csi-driver - newTag: "v1.7.1" ---- diff --git a/deploy/kubernetes/images/stable-1-22/kustomization.yaml b/deploy/kubernetes/images/stable-1-22/kustomization.yaml deleted file mode 100644 index f16988f1..00000000 --- a/deploy/kubernetes/images/stable-1-22/kustomization.yaml +++ /dev/null @@ -1,4 +0,0 @@ -namespace: - gce-pd-csi-driver -resources: -- image.yaml diff --git a/deploy/kubernetes/images/stable-1-23/image.yaml b/deploy/kubernetes/images/stable-1-23/image.yaml deleted file mode 100644 index 7afc446f..00000000 --- a/deploy/kubernetes/images/stable-1-23/image.yaml +++ /dev/null @@ -1,54 +0,0 @@ -apiVersion: builtin -kind: ImageTagTransformer -metadata: - name: imagetag-csi-provisioner -imageTag: - name: k8s.gcr.io/sig-storage/csi-provisioner - newTag: "v3.1.0" - ---- -apiVersion: builtin -kind: ImageTagTransformer -metadata: - name: imagetag-csi-attacher -imageTag: - name: k8s.gcr.io/sig-storage/csi-attacher - newTag: "v3.4.0" ---- - -apiVersion: builtin -kind: ImageTagTransformer -metadata: - name: imagetag-csi-resizer -imageTag: - name: k8s.gcr.io/sig-storage/csi-resizer - newTag: "v1.4.0" ---- - -apiVersion: builtin -kind: ImageTagTransformer -metadata: - name: imagetag-csi-snapshotter -imageTag: - name: k8s.gcr.io/sig-storage/csi-snapshotter - newTag: "v4.0.1" ---- - -apiVersion: builtin -kind: ImageTagTransformer -metadata: - name: imagetag-csi-node-registrar -imageTag: - name: k8s.gcr.io/sig-storage/csi-node-driver-registrar - newTag: "v2.5.0" ---- - -apiVersion: builtin -kind: ImageTagTransformer -metadata: - name: imagetag-gcepd-driver -imageTag: - name: gke.gcr.io/gcp-compute-persistent-disk-csi-driver - newName: k8s.gcr.io/cloud-provider-gcp/gcp-compute-persistent-disk-csi-driver - newTag: "v1.7.1" ---- diff --git a/deploy/kubernetes/images/stable-1-23/kustomization.yaml b/deploy/kubernetes/images/stable-1-23/kustomization.yaml deleted file mode 100644 index f16988f1..00000000 --- a/deploy/kubernetes/images/stable-1-23/kustomization.yaml +++ /dev/null @@ -1,4 +0,0 @@ -namespace: - gce-pd-csi-driver -resources: -- image.yaml diff --git a/deploy/kubernetes/images/stable-1-24/image.yaml b/deploy/kubernetes/images/stable-1-24/image.yaml deleted file mode 100644 index 37f36cb7..00000000 --- a/deploy/kubernetes/images/stable-1-24/image.yaml +++ /dev/null @@ -1,56 +0,0 @@ -apiVersion: builtin -kind: ImageTagTransformer -metadata: - name: imagetag-csi-provisioner -imageTag: - name: k8s.gcr.io/sig-storage/csi-provisioner - newTag: "v3.1.0" - ---- -apiVersion: builtin -kind: ImageTagTransformer -metadata: - name: imagetag-csi-attacher -imageTag: - name: k8s.gcr.io/sig-storage/csi-attacher - newTag: "v3.4.0" ---- - -apiVersion: builtin -kind: ImageTagTransformer -metadata: - name: imagetag-csi-resizer -imageTag: - name: k8s.gcr.io/sig-storage/csi-resizer - newTag: "v1.4.0" ---- - -apiVersion: builtin -kind: ImageTagTransformer -metadata: - name: imagetag-csi-snapshotter -imageTag: - name: k8s.gcr.io/sig-storage/csi-snapshotter - newTag: "v4.0.1" ---- - -apiVersion: builtin -kind: ImageTagTransformer -metadata: - name: imagetag-csi-node-registrar -imageTag: - name: k8s.gcr.io/sig-storage/csi-node-driver-registrar - newTag: "v2.5.0" ---- - -apiVersion: builtin -kind: ImageTagTransformer -metadata: - name: imagetag-gcepd-driver -imageTag: - name: gke.gcr.io/gcp-compute-persistent-disk-csi-driver - # Don't change stable image without changing pdImagePlaceholder in - # test/k8s-integration/main.go - newName: k8s.gcr.io/cloud-provider-gcp/gcp-compute-persistent-disk-csi-driver - newTag: "v1.7.1" ---- diff --git a/deploy/kubernetes/images/stable-1-24/kustomization.yaml b/deploy/kubernetes/images/stable-1-24/kustomization.yaml deleted file mode 100644 index f16988f1..00000000 --- a/deploy/kubernetes/images/stable-1-24/kustomization.yaml +++ /dev/null @@ -1,4 +0,0 @@ -namespace: - gce-pd-csi-driver -resources: -- image.yaml diff --git a/deploy/kubernetes/images/stable-master/image.yaml b/deploy/kubernetes/images/stable-master/image.yaml index 2c05ad46..c80af58f 100644 --- a/deploy/kubernetes/images/stable-master/image.yaml +++ b/deploy/kubernetes/images/stable-master/image.yaml @@ -3,7 +3,7 @@ kind: ImageTagTransformer metadata: name: imagetag-csi-provisioner imageTag: - name: k8s.gcr.io/sig-storage/csi-provisioner + name: registry.k8s.io/sig-storage/csi-provisioner newTag: "v3.4.0" --- @@ -12,7 +12,7 @@ kind: ImageTagTransformer metadata: name: imagetag-csi-attacher imageTag: - name: k8s.gcr.io/sig-storage/csi-attacher + name: registry.k8s.io/sig-storage/csi-attacher newTag: "v4.2.0" --- @@ -21,7 +21,7 @@ kind: ImageTagTransformer metadata: name: imagetag-csi-resizer imageTag: - name: k8s.gcr.io/sig-storage/csi-resizer + name: registry.k8s.io/sig-storage/csi-resizer newTag: "v1.7.0" --- @@ -30,7 +30,7 @@ kind: ImageTagTransformer metadata: name: imagetag-csi-snapshotter imageTag: - name: k8s.gcr.io/sig-storage/csi-snapshotter + name: registry.k8s.io/sig-storage/csi-snapshotter newTag: "v6.1.0" --- @@ -39,7 +39,7 @@ kind: ImageTagTransformer metadata: name: imagetag-csi-node-registrar imageTag: - name: k8s.gcr.io/sig-storage/csi-node-driver-registrar + name: registry.k8s.io/sig-storage/csi-node-driver-registrar newTag: "v2.7.0" --- @@ -51,6 +51,6 @@ imageTag: name: gke.gcr.io/gcp-compute-persistent-disk-csi-driver # Don't change stable image without changing pdImagePlaceholder in # test/k8s-integration/main.go - newName: k8s.gcr.io/cloud-provider-gcp/gcp-compute-persistent-disk-csi-driver - newTag: "v1.9.0" + newName: registry.k8s.io/cloud-provider-gcp/gcp-compute-persistent-disk-csi-driver + newTag: "v1.10.1" --- diff --git a/deploy/kubernetes/overlays/stable-1-21/kustomization.yaml b/deploy/kubernetes/overlays/stable-1-21/kustomization.yaml deleted file mode 100644 index 131348a9..00000000 --- a/deploy/kubernetes/overlays/stable-1-21/kustomization.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: kustomize.config.k8s.io/v1beta1 -kind: Kustomization -namespace: - gce-pd-csi-driver -resources: -- ../../base/ -- psp_controller.yaml -- psp_linux.yaml -- psp_windows.yaml -transformers: -- ../../images/stable-1-21 diff --git a/deploy/kubernetes/overlays/stable-1-21/psp_controller.yaml b/deploy/kubernetes/overlays/stable-1-21/psp_controller.yaml deleted file mode 100644 index 2e3a1838..00000000 --- a/deploy/kubernetes/overlays/stable-1-21/psp_controller.yaml +++ /dev/null @@ -1,17 +0,0 @@ -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: csi-gce-pd-controller-psp -spec: - seLinux: - rule: RunAsAny - supplementalGroups: - rule: RunAsAny - runAsUser: - rule: RunAsAny - fsGroup: - rule: RunAsAny - volumes: - - "emptyDir" - - "secret" - hostNetwork: true diff --git a/deploy/kubernetes/overlays/stable-1-21/psp_linux.yaml b/deploy/kubernetes/overlays/stable-1-21/psp_linux.yaml deleted file mode 100644 index 079b2822..00000000 --- a/deploy/kubernetes/overlays/stable-1-21/psp_linux.yaml +++ /dev/null @@ -1,27 +0,0 @@ -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: csi-gce-pd-node-psp -spec: - seLinux: - rule: RunAsAny - supplementalGroups: - rule: RunAsAny - runAsUser: - rule: RunAsAny - fsGroup: - rule: RunAsAny - privileged: true - volumes: - - '*' - hostNetwork: true - allowedHostPaths: - - pathPrefix: "/var/lib/kubelet/plugins_registry/" - - pathPrefix: "/var/lib/kubelet" - - pathPrefix: "/var/lib/kubelet/plugins/pd.csi.storage.gke.io/" - - pathPrefix: "/dev" - - pathPrefix: "/etc/udev" - - pathPrefix: "/lib/udev" - - pathPrefix: "/run/udev" - - pathPrefix: "/sys" - diff --git a/deploy/kubernetes/overlays/stable-1-21/psp_windows.yaml b/deploy/kubernetes/overlays/stable-1-21/psp_windows.yaml deleted file mode 100644 index 557660a0..00000000 --- a/deploy/kubernetes/overlays/stable-1-21/psp_windows.yaml +++ /dev/null @@ -1,30 +0,0 @@ -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: csi-gce-pd-node-psp-win -spec: - supplementalGroups: - rule: RunAsAny - runAsUser: - rule: RunAsAny - fsGroup: - rule: RunAsAny - seLinux: - rule: RunAsAny - volumes: - - '*' - hostNetwork: true - allowedHostPaths: - - pathPrefix: \var\lib\kubelet - - pathPrefix: \var\lib\kubelet\plugins_registry - - pathPrefix: \var\lib\kubelet\plugins\pd.csi.storage.gke.io - - pathPrefix: \\.\pipe\csi-proxy-disk-v1 - - pathPrefix: \\.\pipe\csi-proxy-volume-v1 - - pathPrefix: \\.\pipe\csi-proxy-filesystem-v1 - # these paths are allowed only for compatibility mode if the PD CSI driver - # is using the CSI Proxy v1 client and the node is still using the - # beta version of the CSI proxy - - pathPrefix: \\.\pipe\csi-proxy-disk-v1beta2 - - pathPrefix: \\.\pipe\csi-proxy-volume-v1beta1 - - pathPrefix: \\.\pipe\csi-proxy-filesystem-v1beta1 - diff --git a/deploy/kubernetes/overlays/stable-1-22/kustomization.yaml b/deploy/kubernetes/overlays/stable-1-22/kustomization.yaml deleted file mode 100644 index 4f7f113e..00000000 --- a/deploy/kubernetes/overlays/stable-1-22/kustomization.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: kustomize.config.k8s.io/v1beta1 -kind: Kustomization -namespace: - gce-pd-csi-driver -resources: -- ../../base/ -- psp_controller.yaml -- psp_linux.yaml -- psp_windows.yaml -transformers: -- ../../images/stable-1-22 diff --git a/deploy/kubernetes/overlays/stable-1-22/psp_controller.yaml b/deploy/kubernetes/overlays/stable-1-22/psp_controller.yaml deleted file mode 100644 index 2e3a1838..00000000 --- a/deploy/kubernetes/overlays/stable-1-22/psp_controller.yaml +++ /dev/null @@ -1,17 +0,0 @@ -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: csi-gce-pd-controller-psp -spec: - seLinux: - rule: RunAsAny - supplementalGroups: - rule: RunAsAny - runAsUser: - rule: RunAsAny - fsGroup: - rule: RunAsAny - volumes: - - "emptyDir" - - "secret" - hostNetwork: true diff --git a/deploy/kubernetes/overlays/stable-1-22/psp_linux.yaml b/deploy/kubernetes/overlays/stable-1-22/psp_linux.yaml deleted file mode 100644 index 079b2822..00000000 --- a/deploy/kubernetes/overlays/stable-1-22/psp_linux.yaml +++ /dev/null @@ -1,27 +0,0 @@ -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: csi-gce-pd-node-psp -spec: - seLinux: - rule: RunAsAny - supplementalGroups: - rule: RunAsAny - runAsUser: - rule: RunAsAny - fsGroup: - rule: RunAsAny - privileged: true - volumes: - - '*' - hostNetwork: true - allowedHostPaths: - - pathPrefix: "/var/lib/kubelet/plugins_registry/" - - pathPrefix: "/var/lib/kubelet" - - pathPrefix: "/var/lib/kubelet/plugins/pd.csi.storage.gke.io/" - - pathPrefix: "/dev" - - pathPrefix: "/etc/udev" - - pathPrefix: "/lib/udev" - - pathPrefix: "/run/udev" - - pathPrefix: "/sys" - diff --git a/deploy/kubernetes/overlays/stable-1-22/psp_windows.yaml b/deploy/kubernetes/overlays/stable-1-22/psp_windows.yaml deleted file mode 100644 index 557660a0..00000000 --- a/deploy/kubernetes/overlays/stable-1-22/psp_windows.yaml +++ /dev/null @@ -1,30 +0,0 @@ -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: csi-gce-pd-node-psp-win -spec: - supplementalGroups: - rule: RunAsAny - runAsUser: - rule: RunAsAny - fsGroup: - rule: RunAsAny - seLinux: - rule: RunAsAny - volumes: - - '*' - hostNetwork: true - allowedHostPaths: - - pathPrefix: \var\lib\kubelet - - pathPrefix: \var\lib\kubelet\plugins_registry - - pathPrefix: \var\lib\kubelet\plugins\pd.csi.storage.gke.io - - pathPrefix: \\.\pipe\csi-proxy-disk-v1 - - pathPrefix: \\.\pipe\csi-proxy-volume-v1 - - pathPrefix: \\.\pipe\csi-proxy-filesystem-v1 - # these paths are allowed only for compatibility mode if the PD CSI driver - # is using the CSI Proxy v1 client and the node is still using the - # beta version of the CSI proxy - - pathPrefix: \\.\pipe\csi-proxy-disk-v1beta2 - - pathPrefix: \\.\pipe\csi-proxy-volume-v1beta1 - - pathPrefix: \\.\pipe\csi-proxy-filesystem-v1beta1 - diff --git a/deploy/kubernetes/overlays/stable-1-23/kustomization.yaml b/deploy/kubernetes/overlays/stable-1-23/kustomization.yaml deleted file mode 100644 index 5b76e328..00000000 --- a/deploy/kubernetes/overlays/stable-1-23/kustomization.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: kustomize.config.k8s.io/v1beta1 -kind: Kustomization -namespace: - gce-pd-csi-driver -resources: -- ../../base/ -- psp_controller.yaml -- psp_linux.yaml -- psp_windows.yaml -transformers: -- ../../images/stable-1-23 diff --git a/deploy/kubernetes/overlays/stable-1-23/psp_controller.yaml b/deploy/kubernetes/overlays/stable-1-23/psp_controller.yaml deleted file mode 100644 index 2e3a1838..00000000 --- a/deploy/kubernetes/overlays/stable-1-23/psp_controller.yaml +++ /dev/null @@ -1,17 +0,0 @@ -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: csi-gce-pd-controller-psp -spec: - seLinux: - rule: RunAsAny - supplementalGroups: - rule: RunAsAny - runAsUser: - rule: RunAsAny - fsGroup: - rule: RunAsAny - volumes: - - "emptyDir" - - "secret" - hostNetwork: true diff --git a/deploy/kubernetes/overlays/stable-1-23/psp_linux.yaml b/deploy/kubernetes/overlays/stable-1-23/psp_linux.yaml deleted file mode 100644 index 079b2822..00000000 --- a/deploy/kubernetes/overlays/stable-1-23/psp_linux.yaml +++ /dev/null @@ -1,27 +0,0 @@ -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: csi-gce-pd-node-psp -spec: - seLinux: - rule: RunAsAny - supplementalGroups: - rule: RunAsAny - runAsUser: - rule: RunAsAny - fsGroup: - rule: RunAsAny - privileged: true - volumes: - - '*' - hostNetwork: true - allowedHostPaths: - - pathPrefix: "/var/lib/kubelet/plugins_registry/" - - pathPrefix: "/var/lib/kubelet" - - pathPrefix: "/var/lib/kubelet/plugins/pd.csi.storage.gke.io/" - - pathPrefix: "/dev" - - pathPrefix: "/etc/udev" - - pathPrefix: "/lib/udev" - - pathPrefix: "/run/udev" - - pathPrefix: "/sys" - diff --git a/deploy/kubernetes/overlays/stable-1-23/psp_windows.yaml b/deploy/kubernetes/overlays/stable-1-23/psp_windows.yaml deleted file mode 100644 index 557660a0..00000000 --- a/deploy/kubernetes/overlays/stable-1-23/psp_windows.yaml +++ /dev/null @@ -1,30 +0,0 @@ -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: csi-gce-pd-node-psp-win -spec: - supplementalGroups: - rule: RunAsAny - runAsUser: - rule: RunAsAny - fsGroup: - rule: RunAsAny - seLinux: - rule: RunAsAny - volumes: - - '*' - hostNetwork: true - allowedHostPaths: - - pathPrefix: \var\lib\kubelet - - pathPrefix: \var\lib\kubelet\plugins_registry - - pathPrefix: \var\lib\kubelet\plugins\pd.csi.storage.gke.io - - pathPrefix: \\.\pipe\csi-proxy-disk-v1 - - pathPrefix: \\.\pipe\csi-proxy-volume-v1 - - pathPrefix: \\.\pipe\csi-proxy-filesystem-v1 - # these paths are allowed only for compatibility mode if the PD CSI driver - # is using the CSI Proxy v1 client and the node is still using the - # beta version of the CSI proxy - - pathPrefix: \\.\pipe\csi-proxy-disk-v1beta2 - - pathPrefix: \\.\pipe\csi-proxy-volume-v1beta1 - - pathPrefix: \\.\pipe\csi-proxy-filesystem-v1beta1 - diff --git a/deploy/kubernetes/overlays/stable-1-24/kustomization.yaml b/deploy/kubernetes/overlays/stable-1-24/kustomization.yaml deleted file mode 100644 index 70a57aac..00000000 --- a/deploy/kubernetes/overlays/stable-1-24/kustomization.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: kustomize.config.k8s.io/v1beta1 -kind: Kustomization -namespace: - gce-pd-csi-driver -resources: -- ../../base -- psp_controller.yaml -- psp_linux.yaml -- psp_windows.yaml -transformers: -- ../../images/stable-1-24 diff --git a/deploy/kubernetes/overlays/stable-1-24/psp_controller.yaml b/deploy/kubernetes/overlays/stable-1-24/psp_controller.yaml deleted file mode 100644 index 2e3a1838..00000000 --- a/deploy/kubernetes/overlays/stable-1-24/psp_controller.yaml +++ /dev/null @@ -1,17 +0,0 @@ -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: csi-gce-pd-controller-psp -spec: - seLinux: - rule: RunAsAny - supplementalGroups: - rule: RunAsAny - runAsUser: - rule: RunAsAny - fsGroup: - rule: RunAsAny - volumes: - - "emptyDir" - - "secret" - hostNetwork: true diff --git a/deploy/kubernetes/overlays/stable-1-24/psp_linux.yaml b/deploy/kubernetes/overlays/stable-1-24/psp_linux.yaml deleted file mode 100644 index 079b2822..00000000 --- a/deploy/kubernetes/overlays/stable-1-24/psp_linux.yaml +++ /dev/null @@ -1,27 +0,0 @@ -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: csi-gce-pd-node-psp -spec: - seLinux: - rule: RunAsAny - supplementalGroups: - rule: RunAsAny - runAsUser: - rule: RunAsAny - fsGroup: - rule: RunAsAny - privileged: true - volumes: - - '*' - hostNetwork: true - allowedHostPaths: - - pathPrefix: "/var/lib/kubelet/plugins_registry/" - - pathPrefix: "/var/lib/kubelet" - - pathPrefix: "/var/lib/kubelet/plugins/pd.csi.storage.gke.io/" - - pathPrefix: "/dev" - - pathPrefix: "/etc/udev" - - pathPrefix: "/lib/udev" - - pathPrefix: "/run/udev" - - pathPrefix: "/sys" - diff --git a/deploy/kubernetes/overlays/stable-1-24/psp_windows.yaml b/deploy/kubernetes/overlays/stable-1-24/psp_windows.yaml deleted file mode 100644 index 557660a0..00000000 --- a/deploy/kubernetes/overlays/stable-1-24/psp_windows.yaml +++ /dev/null @@ -1,30 +0,0 @@ -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: csi-gce-pd-node-psp-win -spec: - supplementalGroups: - rule: RunAsAny - runAsUser: - rule: RunAsAny - fsGroup: - rule: RunAsAny - seLinux: - rule: RunAsAny - volumes: - - '*' - hostNetwork: true - allowedHostPaths: - - pathPrefix: \var\lib\kubelet - - pathPrefix: \var\lib\kubelet\plugins_registry - - pathPrefix: \var\lib\kubelet\plugins\pd.csi.storage.gke.io - - pathPrefix: \\.\pipe\csi-proxy-disk-v1 - - pathPrefix: \\.\pipe\csi-proxy-volume-v1 - - pathPrefix: \\.\pipe\csi-proxy-filesystem-v1 - # these paths are allowed only for compatibility mode if the PD CSI driver - # is using the CSI Proxy v1 client and the node is still using the - # beta version of the CSI proxy - - pathPrefix: \\.\pipe\csi-proxy-disk-v1beta2 - - pathPrefix: \\.\pipe\csi-proxy-volume-v1beta1 - - pathPrefix: \\.\pipe\csi-proxy-filesystem-v1beta1 - diff --git a/docs/kubernetes/development.md b/docs/kubernetes/development.md index abaca7ab..02b2c533 100644 --- a/docs/kubernetes/development.md +++ b/docs/kubernetes/development.md @@ -102,9 +102,6 @@ You may see errors during driver deployment. ### Sanity tests -> ***NOTE:*** Sanity tests are currently failing, tracked by -> https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/issues/990. - ``` ./test/run-sanity.sh ``` diff --git a/docs/kubernetes/user-guides/snapshots.md b/docs/kubernetes/user-guides/snapshots.md index 08cd9a7d..1fe66ea1 100644 --- a/docs/kubernetes/user-guides/snapshots.md +++ b/docs/kubernetes/user-guides/snapshots.md @@ -257,7 +257,7 @@ snapshot-controller and PD CSI driver: * gke.gcr.io/csi-attacher:v2.1.1-gke.0 * gke.gcr.io/csi-resizer:v0.4.0-gke.0 * gke.gcr.io/csi-snapshotter:v2.1.1-gke.0 - * k8s.gcr.io/cloud-provider-gcp/gcp-compute-persistent-disk-csi-driver:v1.2.1 + * registry.k8s.io/cloud-provider-gcp/gcp-compute-persistent-disk-csi-driver:v1.2.1 #### Migrating by Restoring from a Manually Provisioned Snapshot diff --git a/docs/release/overlays.md b/docs/release/overlays.md index 7ea9d5e9..a4b997aa 100644 --- a/docs/release/overlays.md +++ b/docs/release/overlays.md @@ -1,191 +1,45 @@ -# Overview of per kubernetes minor version overlays +# Overview of per kubernetes overlays -The Persistent Disk CSI Driver manifest [bundle](../../deploy/kubernetes/base) is a set of many kubernetes resources (driver pod which includes the containers csi-provisioner, csi-resizer, csi-snapshotter, gce-pd-driver, csi-driver-registrar; csi driver object, rbacs, pod security policies etc). Not all driver capabilties can be used with all kubernetes versions. For example [volume snapshots](https://kubernetes.io/docs/concepts/storage/volume-snapshots/) are supported on 1.17+ kubernetes versions. Thus structuring the overlays on a per kubernetes minor version is beneficial to quickly identify driver capabilities supported for a given minor version of kubernetes (example `stable-1-16` driver manifests did not contain the snapshotter sidecar), and facilitates easy maintenance/updates of the CSI driver. The master branch has the up-to-date [overlays](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/tree/master/deploy/kubernetes/overlays) for each kubernetes version, which specify which driver release version to use with each kubernetes version. - -Example: -`stable-1-22` [overlays](../../deploy/kubernetes/overlays/stable-1-22) bundle can be used to deploy all the components of the driver on kubernetes 1.22. This overlay uses persistent disk driver release version [1.4.0](../../deploy/kubernetes/images/stable-1-22/image.yaml). +The Persistent Disk CSI Driver manifest [bundle](../../deploy/kubernetes/base) is a set of many kubernetes resources (driver pod which includes the containers csi-provisioner, csi-resizer, csi-snapshotter, gce-pd-driver, csi-driver-registrar; csi driver object, rbacs, pod security policies etc). The master branch has the up-to-date [overlays](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/tree/master/deploy/kubernetes/overlays) for the lastest stable release, in addition to several other overlays used for release and other testing. ## General guidelines for creation/modification of new/existing overlays When it comes to creation of overlays there are no strict rules on how overlays must be created/modified but the following captures some of the common scenarios of adding new capabilities to the CSI driver bundle and how it would affect the overlays creation/modification. 1. Creating a new k8s minor version overlay with an existing released driver image - * Consider a scenario where we have existing overlays `stable-1-22`, `stable-master`. We plan to now create a new overlay for k8s 1.23 - * Update the `deploy/kubernetes/images/prow-stable-sidecar-rc-master` directory with appropriate image versions. If the images used in `stable-master` or `stable-1-22` are compatible with 1.23, no updates are necessary. + * Consider a scenario where the existing `stable-master` overlay needs to be changed for a new kubernetes version. + * Update the `deploy/kubernetes/images/prow-stable-sidecar-rc-master` directory with appropriate image versions. * Update the `deploy/kubernetes/images/prow-stable-sidecar-rc-master` directory. If there are no additional kustomize diff patches to add, no updates are necessary. * At this stage, validate the changes made to the `prow-stable-sidecar-rc-master` overlay. Ensure the upstream testgrids like [this](https://k8s-testgrid.appspot.com/provider-gcp-compute-persistent-disk-csi-driver) are green, and verify with repository maintainers that downstream test grids (e.g GKE internal prow test grids) are green. Care must be taken to avoid directly making changes to `deploy/kubernetes/base` manifests at this stage, as they may impact existing overlays. A sample kustomize patch file would look like this: ``` - deploy/kubernetes/overlays/prow-stable-sidecar-rc-master/your-1-23-kustomize-diff-patch.yaml + deploy/kubernetes/overlays/prow-stable-sidecar-rc-master/your-new-version-kustomize-diff-patch.yaml ``` In deploy/kubernetes/overlays/prow-stable-sidecar-rc-master/kustomize.yaml, - ``` - apiVersion: kustomize.config.k8s.io/v1beta1 - kind: Kustomization - resources: - - ../stable-master (If this 1.23 overlay is created based out of stable-master) - patchesStrategicMerge: # or any other patch strategies (such as JsonPatches6902) - - - transformers: - - ../../images/prow-stable-sidecar-rc-master - ``` - - * When `prow-stable-sidecar-rc-master` is validated, we have couple of options to update the stable-1-23. If the kustomize diffs are a one-off change specific to 1.23, we can simply move the kustomize patches to stable-1-23. The kustomize patch file would now look like this. - - ``` - $ mv deploy/kubernetes/overlays/prow-stable-sidecar-rc-master/your-1-23-kustomize-diff-patch.yaml deploy/kubernetes/overlays/stable-1-23/your-1-23-kustomize-diff-patch.yaml - ``` - - For `stable-1-23`, - ``` - apiVersion: kustomize.config.k8s.io/v1beta1 - kind: Kustomization - namespace: - gce-pd-csi-driver - resources: - - ../../base/controller - - ../../base/node_linux - patchesStrategicMerge: # or any other patch strategies (such as JsonPatches6902) - - - transformers: - - ../../images/stable-1-23 - ``` - - For `prow-stable-sidecar-rc-master`, - ``` - apiVersion: kustomize.config.k8s.io/v1beta1 - kind: Kustomization - resources: - - ../stable-master - transformers: - - ../../images/prow-stable-sidecar-rc-master - ``` - - * If the changes are long term, make the changes to `deploy/kubernetes/base`, add the appropriate diff to remove the changes from the overlays less than `stable-1-23`. The overlay kustomize would look something like this - - For `stable-1-23`, - ``` - apiVersion: kustomize.config.k8s.io/v1beta1 - kind: Kustomization - namespace: - gce-pd-csi-driver - resources: - - ../../base - # no patches needed since changes merged to deploy/kubernetes/base - transformers: - - ../../images/stable-1-23 - ``` - - For `prow-stable-sidecar-rc-master`, ``` apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - ../stable-master - transformers: - - ../../images/prow-stable-sidecar-rc-master - ``` - - For `stable-1-22` and older overlays, - ``` - apiVersion: kustomize.config.k8s.io/v1beta1 - kind: Kustomization - namespace: - gce-pd-csi-driver - resources: - - ../../base patchesStrategicMerge: # or any other patch strategies (such as JsonPatches6902) - - - transformers: - - ../../images/stable-1-22 - ``` - -2. Sidecar image version update for existing overlays - * Consider a scenario where we have three existing stable overlays `stable-1-22`, `stable-1-23`, `stable-master`. Sidecar S1 is available 1.22+, S2 is available 1.23+. If we need to upgrade the image versions for these sidecars, we would do the following: - * Update the `deploy/kubernetes/images/prow-stable-sidecar-rc-master` for sidecar S1 and S2. - * Validate the changes made to the staging overlays. Ensure the upstream testgrids like [this](https://k8s-testgrid.appspot.com/provider-gcp-compute-persistent-disk-csi-driver) are green, and verify with repository maintainers that downstream test grids (e.g GKE internal prow test grids) are green. - * Now update `deploy/kubernetes/images/stable-1-22` for sidecar S1, and `deploy/kubernetes/images/stable-1-23`, `deploy/kubernetes/images/stable-master` for sidecar S1 and S2. Repository maintainers should ensure that any internal downstream testgrids are green before approving the pull request to merge changes to a stable overlay. - -3. Sidecar spec changes - * Consider a scenario where a sidecar S1 has version V1 in 1.22 and V2 in 1.23. V2 introcudes a new capability via a new arg 'new-flag' (and say this flag deprecates 'old-flag'). To introduce this change, first we make changes to the `deploy/kubernetes/images/prow-stable-sidecar-rc-master` sidecar spec. - - For `prow-stable-sidecar-rc-master` overlay, - ``` - apiVersion: kustomize.config.k8s.io/v1beta1 - kind: Kustomization - resources: - - ../stable-master - patchesStrategicMerge: # or any other patch strategies (such as JsonPatches6902) - - - transformers: - - ../../images/prow-stable-sidecar-rc-master - ``` - - * Validate the changes made to the staging overlays. Ensure the upstream testgrids like [this](https://k8s-testgrid.appspot.com/provider-gcp-compute-persistent-disk-csi-driver) are green, and verify with repository maintainers that downstream test grids (e.g GKE internal prow test grids) are green. - * Now to merge the change to stable overlay, we incorporate the change in deploy/kubernetes/base, - - ``` - containers: - - name: - ... - args: - - "--new-flag" # --old-flag deleted. - ``` - - * - For `stable-1-23`, - ``` - apiVersion: kustomize.config.k8s.io/v1beta1 - kind: Kustomization - namespace: - gce-pd-csi-driver - resources: - - ../../base - # no patches needed since changes merged to deploy/kubernetes/base - transformers: - - ../../images/stable-1-23 - ``` - - For `prow-stable-sidecar-rc-master`, - ``` - apiVersion: kustomize.config.k8s.io/v1beta1 - kind: Kustomization - resources: - - ../stable-master + - transformers: - ../../images/prow-stable-sidecar-rc-master ``` - For `stable-1-22` and older overlays, - ``` - apiVersion: kustomize.config.k8s.io/v1beta1 - kind: Kustomization - namespace: - gce-pd-csi-driver - resources: - - ../../base - patchesStrategicMerge: # or any other patch strategies (such as JsonPatches6902) - - - transformers: - - ../../images/stable-1-22 + * When `prow-stable-sidecar-rc-master` is validated, we can then update the yaml in the `base/` directory. ``` -4. Driver image update - * If we have released a new driver image version, update the drivers image version in `deploy/kubernetes/images/prow-stable-sidecar-rc-master/image.yaml`. - * Validate the staging drivers and then make changes to the `deploy/kubernetes/images/stable-{k8s-minor}/image.yaml` and `deploy/kubernetes/images/stable-master/image.yaml`, for whichever k8s minor versions are compatible with the new driver image version. - -5. Cutting new releases - * With the master branch maintaining the stable-x.y overlays, the master branch stable overlays can always be the referenced to pick the latest and greatest stable driver manifest bundle. - * At the time of cutting a release branch (e.g release-1.0), we should ensure that the release branch has valid overlays bundle for all the k8s minor versions the driver supports, and tests running against the release branch will work. As the master branch moves forward, the release branch is still valid (but not necessarily up-to-date). For the most up-to-date manifests, refer to the master stable-x.y overlays. - * GKE managed driver changes will be pulled from the master branch stable-x.y overlays. +2. Cutting new releases + * At the time of cutting a release branch (e.g release-1.0), we should ensure that the release branch has valid overlays bundle for all the most recent k8s minor version. As the master branch moves forward, the release branch is still valid (but not necessarily up-to-date). For the most up-to-date manifests, refer to the master overlay. * As the master branch moves forward (changes to sidecars etc), we should cherry-pick changes to an older release branch only on a need basis. Possible cases of cherrypick: 1. Critical bug fixes on the core driver. 2. If a critical bug fix involves multiple components (driver and sidecar), cherry-pick all the changes to the older release branch. - After a change has been cherry-picked to a release branch, a new patch release will have to be cut on that branch, and the overlays would be updated to reflect the new driver image version. Check release process [here](../../release-tools/README.md) \ No newline at end of file + After a change has been cherry-picked to a release branch, a new patch release will have to be cut on that branch, and the overlays would be updated to reflect the new driver image version. Check release process [here](../../release-tools/README.md) diff --git a/edgeless/pod-test.yaml b/edgeless/pod-test.yaml index a205c231..ae139d6f 100644 --- a/edgeless/pod-test.yaml +++ b/edgeless/pod-test.yaml @@ -5,7 +5,7 @@ metadata: spec: accessModes: - ReadWriteOnce - storageClassName: encrypted-storage + storageClassName: encrypted-rwo resources: requests: storage: 20Gi diff --git a/edgeless/storageclass-test.yaml b/edgeless/storageclass-test.yaml index 96a22422..c0e13195 100644 --- a/edgeless/storageclass-test.yaml +++ b/edgeless/storageclass-test.yaml @@ -1,7 +1,7 @@ apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: - name: encrypted-storage + name: encrypted-rwo provisioner: gcp.csi.confidential.cloud parameters: type: pd-standard diff --git a/examples/kubernetes/demo-windows.yaml b/examples/kubernetes/demo-windows.yaml index 1b76cfe0..d9786a2f 100644 --- a/examples/kubernetes/demo-windows.yaml +++ b/examples/kubernetes/demo-windows.yaml @@ -23,7 +23,7 @@ spec: kubernetes.io/os: windows containers: - name: web-server - image: k8s.gcr.io/e2e-test-images/agnhost:2.21 + image: registry.k8s.io/e2e-test-images/agnhost:2.21 volumeMounts: - mountPath: /www/html name: mypvc diff --git a/go.mod b/go.mod index 2ae0cc4c..be6b0582 100644 --- a/go.mod +++ b/go.mod @@ -1,63 +1,64 @@ module sigs.k8s.io/gcp-compute-persistent-disk-csi-driver -go 1.19 +go 1.20 + +require github.com/edgelesssys/constellation/v2 v2.11.0 + +replace github.com/martinjungblut/go-cryptsetup => github.com/daniel-weisse/go-cryptsetup v0.0.0-20230705150314-d8c07bd1723c require ( - github.com/GoogleCloudPlatform/k8s-cloud-provider v1.18.1-0.20220218231025-f11817397a1b - github.com/container-storage-interface/spec v1.7.0 - github.com/golang/protobuf v1.5.2 // indirect + cloud.google.com/go/compute/metadata v0.2.3 + cloud.google.com/go/kms v1.12.1 + github.com/GoogleCloudPlatform/k8s-cloud-provider v1.24.0 + github.com/container-storage-interface/spec v1.6.0 + github.com/golang/protobuf v1.5.3 // indirect github.com/google/uuid v1.3.0 github.com/kubernetes-csi/csi-proxy/client v1.1.1 github.com/kubernetes-csi/csi-test/v4 v4.4.0 - github.com/onsi/ginkgo/v2 v2.7.1 - github.com/onsi/gomega v1.25.0 - golang.org/x/oauth2 v0.6.0 - golang.org/x/sys v0.6.0 - google.golang.org/api v0.114.0 - google.golang.org/genproto v0.0.0-20230320184635-7606e756e683 - google.golang.org/grpc v1.53.0 + github.com/onsi/ginkgo/v2 v2.9.1 + github.com/onsi/gomega v1.27.4 + golang.org/x/oauth2 v0.10.0 + golang.org/x/sys v0.11.0 + google.golang.org/api v0.134.0 + google.golang.org/genproto v0.0.0-20230706204954-ccb25ca9f130 + google.golang.org/grpc v1.56.2 + google.golang.org/protobuf v1.31.0 gopkg.in/gcfg.v1 v1.2.3 - gopkg.in/warnings.v0 v0.1.2 // indirect - k8s.io/apimachinery v0.26.3 - k8s.io/client-go v0.26.3 - k8s.io/component-base v0.26.3 - k8s.io/kubernetes v1.26.3 - k8s.io/mount-utils v0.26.3 - k8s.io/test-infra v0.0.0-20220913174101-46ac1a6cf806 // indirect - k8s.io/utils v0.0.0-20230313181309-38a27ef9d749 -) - -require ( - cloud.google.com/go/compute/metadata v0.2.3 - cloud.google.com/go/kms v1.10.0 - github.com/edgelesssys/constellation/v2 v2.7.0 - google.golang.org/protobuf v1.29.1 - k8s.io/cloud-provider v0.0.0 - k8s.io/klog/v2 v2.90.0 - sigs.k8s.io/boskos v0.0.0-20221128193344-1457a2165fda + k8s.io/api v0.27.3 + k8s.io/apimachinery v0.27.3 + k8s.io/client-go v11.0.1-0.20190805182717-6502b5e7b1b5+incompatible + k8s.io/cloud-provider v0.24.1 + k8s.io/component-base v0.27.3 + k8s.io/klog/v2 v2.100.1 + k8s.io/mount-utils v0.27.3 + k8s.io/utils v0.0.0-20230505201702-9f6742963106 + sigs.k8s.io/boskos v0.0.0-20220711194915-6cb8a6fb2dd1 ) require ( - cloud.google.com/go/compute v1.18.0 // indirect - cloud.google.com/go/iam v0.12.0 // indirect - github.com/Microsoft/go-winio v0.6.0 // indirect + cloud.google.com/go/compute v1.20.1 // indirect + cloud.google.com/go/iam v1.1.0 // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/emicklei/go-restful/v3 v3.9.0 // indirect + github.com/emicklei/go-restful/v3 v3.10.1 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect - github.com/go-logr/logr v1.2.3 // indirect + github.com/go-logr/logr v1.2.4 // indirect github.com/go-openapi/jsonpointer v0.19.6 // indirect - github.com/go-openapi/jsonreference v0.20.1 // indirect - github.com/go-openapi/swag v0.22.3 // indirect + github.com/go-openapi/jsonreference v0.20.2 // indirect + github.com/go-openapi/swag v0.22.4 // indirect + github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/gnostic v0.5.7-v3refs // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/google/gofuzz v1.2.1-0.20210504230335-f78f29fc09ea // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect - github.com/googleapis/gax-go/v2 v2.7.1 // indirect + github.com/google/pprof v0.0.0-20221103000818-d260c55eee4c // indirect + github.com/google/s2a-go v0.1.4 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.2.5 // indirect + github.com/googleapis/gax-go/v2 v2.12.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/imdario/mergo v0.3.13 // indirect @@ -73,60 +74,34 @@ require ( github.com/nxadm/tail v1.4.8 // indirect github.com/onsi/ginkgo v1.16.5 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/prometheus/client_golang v1.14.0 // indirect - github.com/prometheus/client_model v0.3.0 // indirect - github.com/prometheus/common v0.37.0 // indirect - github.com/prometheus/procfs v0.8.0 // indirect + github.com/prometheus/client_golang v1.16.0 // indirect + github.com/prometheus/client_model v0.4.0 // indirect + github.com/prometheus/common v0.42.0 // indirect + github.com/prometheus/procfs v0.10.1 // indirect github.com/sirupsen/logrus v1.9.0 // indirect github.com/spf13/pflag v1.0.5 // indirect go.opencensus.io v0.24.0 // indirect go4.org v0.0.0-20201209231011-d4a079459e60 // indirect - golang.org/x/crypto v0.6.0 // indirect - golang.org/x/mod v0.8.0 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/term v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect + golang.org/x/crypto v0.12.0 // indirect + golang.org/x/mod v0.12.0 // indirect + golang.org/x/net v0.14.0 // indirect + golang.org/x/term v0.11.0 // indirect + golang.org/x/text v0.12.0 // indirect golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.6.0 // indirect + golang.org/x/tools v0.10.0 // indirect google.golang.org/appengine v1.6.7 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20230706204954-ccb25ca9f130 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230720185612-659f7aaaa771 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // 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/api v0.26.3 // indirect - k8s.io/kube-openapi v0.0.0-20230228151317-19cbebb19cb7 // indirect + k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f // indirect + k8s.io/test-infra v0.0.0-20210730160938-8ad9b8c53bd8 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect sigs.k8s.io/yaml v1.3.0 // indirect ) -replace ( - k8s.io/api => k8s.io/api v0.26.3 - k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.26.3 - k8s.io/apimachinery => k8s.io/apimachinery v0.26.3 - k8s.io/apiserver => k8s.io/apiserver v0.26.3 - k8s.io/cli-runtime => k8s.io/cli-runtime v0.26.3 - k8s.io/client-go => k8s.io/client-go v0.26.3 - k8s.io/cloud-provider => k8s.io/cloud-provider v0.26.3 - k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.26.3 - k8s.io/code-generator => k8s.io/code-generator v0.26.3 - k8s.io/component-base => k8s.io/component-base v0.26.3 - k8s.io/component-helpers => k8s.io/component-helpers v0.26.3 - k8s.io/controller-manager => k8s.io/controller-manager v0.26.3 - k8s.io/cri-api => k8s.io/cri-api v0.26.3 - k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.26.3 - k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.26.3 - k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.26.3 - k8s.io/kube-proxy => k8s.io/kube-proxy v0.26.3 - k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.26.3 - k8s.io/kubectl => k8s.io/kubectl v0.26.3 - k8s.io/kubelet => k8s.io/kubelet v0.26.3 - k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.26.3 - k8s.io/metrics => k8s.io/metrics v0.26.3 - k8s.io/mount-utils => k8s.io/mount-utils v0.26.3 - k8s.io/node-api => k8s.io/node-api v0.26.3 - k8s.io/pod-security-admission => k8s.io/pod-security-admission v0.26.3 - k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.26.3 - k8s.io/sample-cli-plugin => k8s.io/sample-cli-plugin v0.26.3 - k8s.io/sample-controller => k8s.io/sample-controller v0.26.3 -) +replace k8s.io/client-go => k8s.io/client-go v0.24.1 diff --git a/go.sum b/go.sum index d75c08e0..41f74a31 100644 --- a/go.sum +++ b/go.sum @@ -1,108 +1,412 @@ +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= cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.110.0 h1:Zc8gqp3+a9/Eyph2KDmcGaPtbKRIoqq4YTlL4NMD0Ys= +cloud.google.com/go v0.110.4 h1:1JYyxKMN9hd5dR2MYTPWkGUgcoxVVhg0LKNKEo0qvmk= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= 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 v1.18.0 h1:FEigFqoDbys2cvFkZ9Fjq4gnHBP55anJ0yQyau2f9oY= -cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= +cloud.google.com/go/compute v1.20.1 h1:6aKEtlUiwEpJzM001l0yFkpXmUVXaN8W+fbkb2AZNbg= +cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/iam v0.12.0 h1:DRtTY29b75ciH6Ov1PHb4/iat2CLCvrOm40Q0a6DFpE= -cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= -cloud.google.com/go/kms v1.10.0 h1:Imrtp8792uqNP9bdfPrjtUkjjqOMBcAJ2bdFaAnLhnk= -cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24= -cloud.google.com/go/longrunning v0.4.1 h1:v+yFJOfKC3yZdY6ZUI933pIYdhyhV8S3NpWrXWmg7jM= +cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/iam v1.1.0 h1:67gSqaPukx7O8WLLHMa0PNs3EBGd2eE4d+psbO/CO94= +cloud.google.com/go/iam v1.1.0/go.mod h1:nxdHjaKfCr7fNYx/HJMM8LgiMugmveWlkatear5gVyk= +cloud.google.com/go/kms v1.12.1 h1:xZmZuwy2cwzsocmKDOPu4BL7umg8QXagQx6fKVmf45U= +cloud.google.com/go/kms v1.12.1/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM= +cloud.google.com/go/logging v1.0.0/go.mod h1:V1cc3ogwobYzQq5f2R7DS/GvRIrI4FKj01Gs5glwAls= 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/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-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +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 v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +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/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +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/logger v0.2.1/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/GoogleCloudPlatform/k8s-cloud-provider v1.18.1-0.20220218231025-f11817397a1b h1:Heo1J/ttaQFgGJSVnCZquy3e5eH5j1nqxBuomztB3P0= -github.com/GoogleCloudPlatform/k8s-cloud-provider v1.18.1-0.20220218231025-f11817397a1b/go.mod h1:FNj4KYEAAHfYu68kRYolGoxkaJn+6mdEsaM12VTwuI0= +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.24.0 h1:a/2jEb6YZq88x+36TcyUu9widTOcGlndZc4L54r+Jys= +github.com/GoogleCloudPlatform/k8s-cloud-provider v1.24.0/go.mod h1:SZTgFVlGGwQ/X9NQsExTrYerE+frOeQvIuHCTuAGODI= +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/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg= -github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +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/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +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/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/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= +github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= 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.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +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/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= +github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= +github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= +github.com/container-storage-interface/spec v1.6.0 h1:vwN9uCciKygX/a0toYryoYD5+qI9ZFeAMuhEEKO+JBA= github.com/container-storage-interface/spec v1.6.0/go.mod h1:8K96oQNkJ7pFcC2R9Z1ynGGBB1I93kcS6PGg3SsOk8s= -github.com/container-storage-interface/spec v1.7.0 h1:gW8eyFQUZWWrMWa8p1seJ28gwDoN5CVJ4uAbQ+Hdycw= -github.com/container-storage-interface/spec v1.7.0/go.mod h1:JYuzLqr9VVNoDJl44xp/8fmCOvWPDKzuGTwCoklhuqk= +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/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/daniel-weisse/go-cryptsetup v0.0.0-20230705150314-d8c07bd1723c h1:ToajP6trZoiqlZ3Z4uoG1P02/wtqSw1AcowOXOYjATk= +github.com/daniel-weisse/go-cryptsetup v0.0.0-20230705150314-d8c07bd1723c/go.mod h1:gZoZ0+POlM1ge/VUxWpMmZVNPzzMJ7l436CgkQ5+qzU= +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 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/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/edgelesssys/constellation/v2 v2.7.0 h1:1yYqAecn42Pz/nNrVmuwtJNyfvrU87PIbbSTrNlSGVo= -github.com/edgelesssys/constellation/v2 v2.7.0/go.mod h1:BkAahvBkSZivWW+uhGzLB/yh0ZohTyWE3a0d03106mE= -github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= -github.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +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/edgelesssys/constellation/v2 v2.11.0 h1:hOb47W1kaAM929rCLnSTtkKIQK9x6pPdrXefu/ORJyA= +github.com/edgelesssys/constellation/v2 v2.11.0/go.mod h1:AJfKEiTXmmtCQ/01H0Jat8T8FQBgaFpBLYkUvBkHxQQ= +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.10.1 h1:rc42Y5YTp7Am7CS630D7JmhRjq4UlEUuEKfrDac4bSQ= +github.com/emicklei/go-restful/v3 v3.10.1/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= @@ -110,45 +414,277 @@ 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/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= 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/evanphx/json-patch v4.12.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/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.1/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/form3tech-oss/jwt-go v3.2.3+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.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +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/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= +github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= +github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= +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/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/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-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +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-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= 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.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= -github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= +github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +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-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= +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 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= -github.com/go-openapi/jsonreference v0.20.1 h1:FBLnyygC4/IZZr893oiomc9XaghoveYTrLC1F86HID8= -github.com/go-openapi/jsonreference v0.20.1/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= -github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= +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.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= +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.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= +github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +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 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +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/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= +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= @@ -158,6 +694,7 @@ github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt 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/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/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= @@ -174,11 +711,39 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= 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 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +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 v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -193,77 +758,264 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ 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.6/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.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +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.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/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= 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-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20221103000818-d260c55eee4c h1:lvddKcYTQ545ADhBujtIJmqQrZBDsGo7XIMbAQe/sNY= +github.com/google/pprof v0.0.0-20221103000818-d260c55eee4c/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo= 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.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= +github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= +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 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +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.2.5 h1:UR4rDjcgpgEnqpIEvkiqTYKBCKLNmlge2eVjoZfySzM= +github.com/googleapis/enterprise-certificate-proxy v0.2.5/go.mod h1:RxW0N9901Cko1VOCW3SXCpWP+mlIEkk2tP7jnHy9a3w= +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.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.7.1 h1:gF4c0zjUP2H/s/hEGyLA3I0fA2ZWjzYiONAD6cvPr8A= -github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= +github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= +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/mux v1.8.0/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/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/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-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= +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/h2non/gock v1.0.9/go.mod h1:CZMcB0Lg5IWnr9bF79pPMg9WeV6WumxQiUJ1UvdO1iE= +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/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/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.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/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= +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/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= 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/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/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 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pty v1.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= @@ -271,92 +1023,388 @@ github.com/kubernetes-csi/csi-proxy/client v1.1.1 h1:GagYqArF85E/pQuzldTEQ3WmrcN github.com/kubernetes-csi/csi-proxy/client v1.1.1/go.mod h1:SfK4HVKQdMH5KrffivddAWgX5hl3P5KmnuOTBbDNboU= github.com/kubernetes-csi/csi-test/v4 v4.4.0 h1:r0mnAwDURI24Vw3a/LyA/ga11yD5ZGuU7+REO35Na9s= github.com/kubernetes-csi/csi-test/v4 v4.4.0/go.mod h1:t1RzseMZJKy313nezI/d7TolbbiKpUZM3SXQvXxOX0w= +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/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 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/martinjungblut/go-cryptsetup v0.0.0-20220520180014-fd0874fd07a6 h1:YDjLk3wsL5ZLhLC4TIwIvT2NkSCAdAV6pzzZaRfj4jk= -github.com/martinjungblut/go-cryptsetup v0.0.0-20220520180014-fd0874fd07a6/go.mod h1:gZoZ0+POlM1ge/VUxWpMmZVNPzzMJ7l436CgkQ5+qzU= +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/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/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/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/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/sys/mountinfo v0.6.2 h1:BzJjoreD5BMFNmD9Rus6gdd1pLuecOFPt8wC+Vygl78= github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= +github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= +github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= 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/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 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= 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.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +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 v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= -github.com/onsi/ginkgo/v2 v2.7.1 h1:YgLPk+gpqDtAPeRCWEmfO8oxE6ru3xcVSXAM7wn8w9I= -github.com/onsi/ginkgo/v2 v2.7.1/go.mod h1:6JsQiECmxCa3V5st74AL/AmsV482EDdVrGaVW6z3oYU= +github.com/onsi/ginkgo/v2 v2.9.1 h1:zie5Ly042PD3bsCvsSOPvRnFwyo3rKe64TJlD6nu0mk= +github.com/onsi/ginkgo/v2 v2.9.1/go.mod h1:FEcmzVcCHl+4o9bQZVab+4dC9+j+91t2FHSzmGAPfuo= +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.25.0 h1:Vw7br2PCDYijJHSfBOWhov+8cAnUf8MfMaIOV323l6Y= -github.com/onsi/gomega v1.25.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM= +github.com/onsi/gomega v1.27.4 h1:Z2AnStgsdSayCMDiCU42qIz+HLqEPcgiOCXjAU/w+8E= +github.com/onsi/gomega v1.27.4/go.mod h1:riYq/GJKh8hhoM01HN6Vmuy93AarCXCBGpvFDK3q3fQ= +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.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +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/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/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/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/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/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.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= -github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= +github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= +github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= +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_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.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= +github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= +github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= +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.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= -github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= +github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= +github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= +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/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= -github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= +github.com/prometheus/procfs v0.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+PymziUAg= +github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= +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.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +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/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.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= github.com/sirupsen/logrus v1.9.0/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/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= +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/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/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.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= +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/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 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/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/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/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= @@ -366,14 +1414,121 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +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/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/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/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/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= +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/api/v3 v3.5.1/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/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= +go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= +go.etcd.io/etcd/client/v3 v3.5.1/go.mod h1:OnjH4M8OnAotwaB2l9bVgZzRFKru7/ZMoS46OtKyd3Q= +go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= +go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= +go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= +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= @@ -381,22 +1536,97 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= +go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= +go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= +go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= +go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= +go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= +go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= +go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= +go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +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.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= +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/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= +go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= 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.6.0 h1:qfktjS5LUO+fFKeJXZ+ikTRijMmljikvG68fpMMruSc= -golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +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.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 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= @@ -405,6 +1635,7 @@ golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EH golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= 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= @@ -419,32 +1650,56 @@ 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.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +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.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-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= @@ -457,26 +1712,39 @@ golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/ 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-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/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.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/oauth2 v0.0.0-20180724155351-3d292e4d0cdc/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= 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= @@ -486,18 +1754,16 @@ golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= 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.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.6.0 h1:Lh8GPgSKBfWSwFvtuWOfeI3aAAnbXTSutYxJiOJFgIw= -golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.10.0 h1:zHCpF2Khkwy4mMB4bv0U37YtJdTGW8jI0glAApi0Kh8= +golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI= 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= @@ -505,44 +1771,85 @@ 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.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +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-20200923182605-d9f96fdee20d/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= @@ -551,91 +1858,159 @@ golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7w 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-20210514084401-e8d321eab015/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-20210603125802-9665404d3644/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-20210616094352-59db8d763f22/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-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/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-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/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.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= 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.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 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.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 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.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-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/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= @@ -645,19 +2020,35 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f 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.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.10.0 h1:tvDr/iQoUqNdohiYm0LmmKcBk+q86lb9EprIUFhHHGg= +golang.org/x/tools v0.10.0/go.mod h1:UJwyiVBsOA2uwvK/e5OY3GTpDUJriEd+/YlqAwLPmyM= 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= 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= @@ -667,41 +2058,52 @@ 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= google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.60.0/go.mod h1:d7rl65NZAkEQ90JFzqBjcRq1TVeG5ZoGV3sSpEnnVb4= -google.golang.org/api v0.114.0 h1:1xQPji6cO2E2vLiI+C/XiFAnsn1WV3mjaEwGLhi3grE= -google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= +google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= +google.golang.org/api v0.134.0 h1:ktL4Goua+UBgoP1eL1/60LwZJqa1sIzkLmvoR3hR6Gw= +google.golang.org/api v0.134.0/go.mod h1:sjRL3UnjTx5UqNQS9EWr9N8p7xbHpy1k0XGRLCf3Spk= 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 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= 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= @@ -714,19 +2116,32 @@ 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-20200423170343-7949de9c1215/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-20201209185603-f92720507ed4/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -736,29 +2151,30 @@ google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211021150943-2b146023228c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20230320184635-7606e756e683 h1:khxVcsk/FhnzxMKOyD+TDGwjbEOpcPuIpmafPGFmhMA= -google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20230706204954-ccb25ca9f130 h1:Au6te5hbKUV8pIYWHqOUZ1pva5qK/rwbIhoXEUB9Lu8= +google.golang.org/genproto v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:O9kGHb51iE/nOGvQaDUuadVYqovW56s5emA88lQnj6Y= +google.golang.org/genproto/googleapis/api v0.0.0-20230706204954-ccb25ca9f130 h1:XVeBY8d/FaK4848myy41HBqnDwvxeV3zMZhwN1TvAMU= +google.golang.org/genproto/googleapis/api v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:mPBs5jNgx2GuQGvFwUvVKqtn6HsUw9nP64BedgvqEsQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230720185612-659f7aaaa771 h1:Z8qdAF9GFsmcUuWQ5KVYIpP3PCKydn/YKORnghIalu4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230720185612-659f7aaaa771/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= +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/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= @@ -768,6 +2184,7 @@ 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= @@ -775,15 +2192,12 @@ 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.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.53.0 h1:LAv2ds7cmFV/XTS3XG1NneeENYrXGmorPxsBbptIjNc= -google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/grpc v1.56.2 h1:fVRFRnXvU+x6C4IlHZewvJOVHoOv1TUuQyoRsYnB4bI= +google.golang.org/grpc v1.56.2/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= 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= @@ -797,77 +2211,293 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba 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.29.1 h1:7QBf+IK2gx70Ap/hDsOmam3GE0v9HicjfEdAxE62UoM= -google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/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= 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/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gcfg.v1 v1.2.0/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= 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 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= 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/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.0/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.26.3 h1:emf74GIQMTik01Aum9dPP0gAypL8JTLl/lHa4V9RFSU= -k8s.io/api v0.26.3/go.mod h1:PXsqwPMXBSBcL1lJ9CYDKy7kIReUydukS5JiRlxC3qE= -k8s.io/apimachinery v0.26.3 h1:dQx6PNETJ7nODU3XPtrwkfuubs6w7sX0M8n61zHIV/k= -k8s.io/apimachinery v0.26.3/go.mod h1:ats7nN1LExKHvJ9TmwootT00Yz05MuYqPXEXaVeOy5I= -k8s.io/client-go v0.26.3 h1:k1UY+KXfkxV2ScEL3gilKcF7761xkYsSD6BC9szIu8s= -k8s.io/client-go v0.26.3/go.mod h1:ZPNu9lm8/dbRIPAgteN30RSXea6vrCpFvq+MateTUuQ= -k8s.io/cloud-provider v0.26.3 h1:qN4f0+PvgOZyKIIct+90eedYj8/S4EKPpSD9S+3RCFE= -k8s.io/cloud-provider v0.26.3/go.mod h1:Hfxu0mvz426xlvz2tziw0m3ubr+sk05KKD4HPy2kwdY= -k8s.io/component-base v0.26.3 h1:oC0WMK/ggcbGDTkdcqefI4wIZRYdK3JySx9/HADpV0g= -k8s.io/component-base v0.26.3/go.mod h1:5kj1kZYwSC6ZstHJN7oHBqcJC6yyn41eR+Sqa/mQc8E= +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.24.1/go.mod h1:JhoOvNiLXKTPQ60zh2g0ewpA+bnEYf5q44Flhquh4vQ= +k8s.io/api v0.27.3 h1:yR6oQXXnUEBWEWcvPWS0jQL575KoAboQPfJAuKNrw5Y= +k8s.io/api v0.27.3/go.mod h1:C4BNvZnQOF7JA/0Xed2S+aUyJSfTGkGFxLXz9MnpIpg= +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.24.1/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= +k8s.io/apimachinery v0.27.3 h1:Ubye8oBufD04l9QnNtW05idcOe9Z3GQN8+7PqmuVcUM= +k8s.io/apimachinery v0.27.3/go.mod h1:XNfZ6xklnMCOGGFNqXG7bUrQCoR04dh/E7FprV6pb+E= +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/apiserver v0.24.1/go.mod h1:dQWNMx15S8NqJMp0gpYfssyvhYnkilc1LpExd/dkLh0= +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.24.1 h1:w1hNdI9PFrzu3OlovVeTnf4oHDt+FJLd9Ndluvnb42E= +k8s.io/client-go v0.24.1/go.mod h1:f1kIDqcEYmwXS/vTbbhopMUbhKp2JhOeVTfxgaCIlF8= +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.24.1 h1:SaQNq2Ax+epdY9wFngwN9GWpOVnM72hUqr2qy20cOvg= +k8s.io/cloud-provider v0.24.1/go.mod h1:h5m/KIiwiQ76hpUBsgrwm/rxteIfJG9kJQ/+/w1as2M= +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.24.1/go.mod h1:DW5vQGYVCog8WYpNob3PMmmsY8A3L9QZNg4j/dV3s38= +k8s.io/component-base v0.27.3 h1:g078YmdcdTfrCE4fFobt7qmVXwS8J/3cI1XxRi/2+6k= +k8s.io/component-base v0.27.3/go.mod h1:JNiKYcGImpQ44iwSYs6dysxzR9SxIIgQalk4HaCNVUY= +k8s.io/component-helpers v0.24.1/go.mod h1:q5Z1pWV/QfX9ThuNeywxasiwkLw9KsR4Q9TAOdb/Y3s= +k8s.io/controller-manager v0.24.1/go.mod h1:g105ENexD6A2holEq7Bl6ae+69LJHiLnoEEm7wkE6sc= +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 v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +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.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/klog/v2 v2.90.0 h1:VkTxIV/FjRXn1fgNNcKGM8cfmL1Z33ZjXRTVxKCoF5M= -k8s.io/klog/v2 v2.90.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20230228151317-19cbebb19cb7 h1:GGNnJLiG6Dk4o75ZHMD40IVsodq/s4kiR0Va5orFZco= -k8s.io/kube-openapi v0.0.0-20230228151317-19cbebb19cb7/go.mod h1:y5VtZWM9sHHc2ZodIH/6SHzXj+TPU5USoA8lcIeKEKY= -k8s.io/kubernetes v1.26.3 h1:LtjNGNNpCTRyrWhDJMwTWDX+4h+GLwfULS8pu0xzSdk= -k8s.io/kubernetes v1.26.3/go.mod h1:NxzR7U7mS+OGa3J/qweI86Pek//mlfHqDgt6NNGdz8g= -k8s.io/mount-utils v0.26.3 h1:FxMDiPLCkrYgonfSaKHWltLNkyTg3Q/Xrwn94uwhd8k= -k8s.io/mount-utils v0.26.3/go.mod h1:95yx9K6N37y8YZ0/lUh9U6ITosMODNaW0/v4wvaa0Xw= -k8s.io/test-infra v0.0.0-20220913174101-46ac1a6cf806 h1:TIT4tzITs2yaaFmBPy3gRVza0QEvE8Sra2cAyAbYrV0= -k8s.io/test-infra v0.0.0-20220913174101-46ac1a6cf806/go.mod h1:1emAuQGuX9NvcVYeO10mx7v2TnE3dmHhMiP6rKLVjZM= -k8s.io/utils v0.0.0-20230313181309-38a27ef9d749 h1:xMMXJlJbsU8w3V5N2FLDQ8YgU8s1EoULdbQBcAeNJkY= -k8s.io/utils v0.0.0-20230313181309-38a27ef9d749/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= +k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +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-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= +k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f h1:2kWPakN3i/k81b0gvD5C5FJ2kxm1WrQFanWchyKuqGg= +k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f/go.mod h1:byini6yhqGC14c3ebc/QwanvYwhuMWF6yz2F8uwW8eg= +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.27.3 h1:oubkDKLTZUneW27wgyOmp8a1AAZj04vGmtq+YW8wdvY= +k8s.io/mount-utils v0.27.3/go.mod h1:vmcjYdi2Vg1VTWY7KkhvwJVY6WDHxb/QQhiQKkR8iNs= +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-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20230505201702-9f6742963106 h1:EObNQ3TW2D+WptiYXlApGNLVy0zm/JIBVY9i+M4wpAU= +k8s.io/utils v0.0.0-20230505201702-9f6742963106/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= 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/boskos v0.0.0-20221128193344-1457a2165fda h1:uPIZ+GmcDQKRgVHhRtNEcM8mgb+5OUqLR8Z+EMUJVPA= -sigs.k8s.io/boskos v0.0.0-20221128193344-1457a2165fda/go.mod h1:SFfNgqHCE0MxoYAJ9MPL21Lt2q2W+rr5ntzBfd/6Uw0= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw= +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-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/kustomize v2.0.3+incompatible/go.mod h1:MkjgH3RdOWrievjo6c9T245dYlB5QeXV4WCbnt/PEpU= +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.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= +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 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +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/parameters.go b/pkg/common/parameters.go index 422498b0..4c7e5e44 100644 --- a/pkg/common/parameters.go +++ b/pkg/common/parameters.go @@ -29,6 +29,8 @@ const ( ParameterKeyLabels = "labels" ParameterKeyProvisionedIOPSOnCreate = "provisioned-iops-on-create" ParameterKeyProvisionedThroughputOnCreate = "provisioned-throughput-on-create" + ParameterAvailabilityClass = "availability-class" + ParameterKeyEnableConfidentialCompute = "enable-confidential-storage" // Parameters for VolumeSnapshotClass ParameterKeyStorageLocations = "storage-locations" @@ -38,6 +40,10 @@ const ( 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" @@ -83,6 +89,11 @@ type DiskParameters struct { // Values: {int64} // Default: none ProvisionedThroughputOnCreate int64 + // Values: {bool} + // Default: false + EnableConfidentialCompute bool + // Default: false + ForceAttach bool } // SnapshotParameters contains normalized and defaulted parameters for snapshots @@ -150,11 +161,34 @@ func ExtractAndDefaultParameters(parameters map[string]string, driverName string } p.ProvisionedIOPSOnCreate = paramProvisionedIOPSOnCreate case ParameterKeyProvisionedThroughputOnCreate: - paramProvisionedThroughputOnCreate, err := ConvertMiBStringToInt64(v) + paramProvisionedThroughputOnCreate, err := ConvertMiStringToInt64(v) if err != nil { return p, fmt.Errorf("parameters contain invalid provisionedThroughputOnCreate parameter: %w", err) } p.ProvisionedThroughputOnCreate = paramProvisionedThroughputOnCreate + case ParameterAvailabilityClass: + paramAvailabilityClass, err := ConvertStringToAvailabilityClass(v) + if err != nil { + return p, fmt.Errorf("parameters contain invalid availability class parameter: %w", err) + } + if paramAvailabilityClass == ParameterRegionalHardFailoverClass { + p.ForceAttach = true + } + case ParameterKeyEnableConfidentialCompute: + paramEnableConfidentialCompute, err := ConvertStringToBool(v) + if err != nil { + return p, fmt.Errorf("parameters contain invalid value for enable-confidential-storage parameter: %w", err) + } + + if paramEnableConfidentialCompute { + // DiskEncryptionKmsKey is needed to enable confidentialStorage + if val, ok := parameters[ParameterKeyDiskEncryptionKmsKey]; !ok || !isValidDiskEncryptionKmsKey(val) { + return p, fmt.Errorf("Valid %v is required to enbale ConfidentialStorage", ParameterKeyDiskEncryptionKmsKey) + } + } + + p.EnableConfidentialCompute = paramEnableConfidentialCompute + default: return p, fmt.Errorf("parameters contains invalid option %q", k) } diff --git a/pkg/common/parameters_test.go b/pkg/common/parameters_test.go index 2d1a4b6b..acffe5a5 100644 --- a/pkg/common/parameters_test.go +++ b/pkg/common/parameters_test.go @@ -178,6 +178,27 @@ func TestExtractAndDefaultParameters(t *testing.T) { Labels: map[string]string{"key1": "value1", "label-1": "value-a", "label-2": "label-value-2"}, }, }, + { + name: "availability class parameters", + parameters: map[string]string{ParameterAvailabilityClass: ParameterRegionalHardFailoverClass}, + expectParams: DiskParameters{ + DiskType: "pd-standard", + ReplicationType: "none", + ForceAttach: true, + Tags: map[string]string{}, + Labels: map[string]string{}, + }, + }, + { + name: "no force attach parameters", + parameters: map[string]string{ParameterAvailabilityClass: ParameterNoAvailabilityClass}, + expectParams: DiskParameters{ + DiskType: "pd-standard", + ReplicationType: "none", + Tags: map[string]string{}, + Labels: map[string]string{}, + }, + }, } for _, tc := range tests { diff --git a/pkg/common/utils.go b/pkg/common/utils.go index 86cc3f9d..368a853a 100644 --- a/pkg/common/utils.go +++ b/pkg/common/utils.go @@ -17,14 +17,21 @@ limitations under the License. package common import ( + "context" + "errors" "fmt" + "net/http" "regexp" "strings" "github.com/GoogleCloudPlatform/k8s-cloud-provider/pkg/cloud/meta" + "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" ) const ( @@ -59,11 +66,27 @@ const ( multiRegionalLocationFmt = "^[a-z]+$" // Example: us-east1 regionalLocationFmt = "^[a-z]+-[a-z]+[0-9]$" + + // Full or partial URL of the machine type resource, in the format: + // zones/zone/machineTypes/machine-type + machineTypePattern = "zones/[^/]+/machineTypes/([^/]+)$" ) 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) + + // 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, + } ) func BytesToGbRoundDown(bytes int64) int64 { @@ -260,11 +283,112 @@ func ConvertStringToInt64(str string) (int64, error) { return volumehelpers.RoundUpToB(quantity) } -// ConvertMiBStringToInt64 converts a GiB string to int64 -func ConvertMiBStringToInt64(str string) (int64, error) { +// 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) } + +// 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: +// +// zones/zone/machineTypes/machine-type +func ParseMachineType(machineTypeUrl string) (string, error) { + machineType := machineTypeRegex.FindStringSubmatch(machineTypeUrl) + if machineType == nil { + return "", fmt.Errorf("failed to parse machineTypeUrl. Expected suffix: zones/{zone}/machineTypes/{machine-type}. Got: %s", machineTypeUrl) + } + return machineType[1], nil +} + +// CodeForError returns the grpc error code that maps to the http error code for the +// passed in user googleapi error or context error. Returns codes.Internal if the given +// error is not a googleapi error caused by the user. userErrorCodeMap is used for +// encoding most errors. +func CodeForError(sourceError error) codes.Code { + if sourceError == nil { + return codes.Internal + } + + if code, err := existingErrorCode(sourceError); err == nil { + return code + } + if code, err := isContextError(sourceError); err == nil { + return code + } + + var apiErr *googleapi.Error + if !errors.As(sourceError, &apiErr) { + return codes.Internal + } + if code, ok := userErrorCodeMap[apiErr.Code]; ok { + return code + } + + return codes.Internal +} + +// isContextError returns the grpc error code DeadlineExceeded if the passed in error +// contains the "context deadline exceeded" string and returns the grpc error code +// Canceled if the error contains the "context canceled" string. It returns and error if +// err isn't a context error. +func isContextError(err error) (codes.Code, error) { + if err == nil { + return codes.Unknown, fmt.Errorf("null error") + } + + errStr := err.Error() + if strings.Contains(errStr, context.DeadlineExceeded.Error()) { + return codes.DeadlineExceeded, nil + } + if strings.Contains(errStr, context.Canceled.Error()) { + return codes.Canceled, nil + } + return codes.Unknown, fmt.Errorf("Not a context error: %w", err) +} + +func existingErrorCode(err error) (codes.Code, error) { + if err == nil { + return codes.Unknown, fmt.Errorf("null error") + } + if status, ok := status.FromError(err); ok { + return status.Code(), nil + } + return codes.Unknown, fmt.Errorf("no existing error code for %w", err) +} + +func LoggedError(msg string, err error) error { + klog.Errorf(msg+"%v", err.Error()) + return status.Errorf(CodeForError(err), msg+"%v", err.Error()) +} + +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/common/utils_test.go b/pkg/common/utils_test.go index b08aee54..3f5993a0 100644 --- a/pkg/common/utils_test.go +++ b/pkg/common/utils_test.go @@ -17,11 +17,17 @@ limitations under the License. package common import ( + "context" + "errors" "fmt" + "net/http" "reflect" "testing" "github.com/GoogleCloudPlatform/k8s-cloud-provider/pkg/cloud/meta" + "google.golang.org/api/googleapi" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" ) const ( @@ -591,6 +597,12 @@ func TestConvertStringToInt64(t *testing.T) { expInt64: 10000, expectError: false, }, + { + desc: "test higher number", + inputStr: "15000", + expInt64: 15000, + expectError: false, + }, { desc: "round M to number", inputStr: "1M", @@ -612,13 +624,13 @@ func TestConvertStringToInt64(t *testing.T) { { desc: "invalid empty string", inputStr: "", - expInt64: 10000, + expInt64: 0, expectError: true, }, { desc: "invalid string", inputStr: "ew%65", - expInt64: 10000, + expInt64: 0, expectError: true, }, { @@ -630,7 +642,7 @@ func TestConvertStringToInt64(t *testing.T) { { desc: "invalid GB string", inputStr: "10GB", - expInt64: 10000, + expInt64: 0, expectError: true, }, { @@ -698,7 +710,7 @@ func TestConvertStringToInt64(t *testing.T) { } } -func TestConvertMiBStringToInt64(t *testing.T) { +func TestConvertMiStringToInt64(t *testing.T) { tests := []struct { desc string inputStr string @@ -706,75 +718,87 @@ func TestConvertMiBStringToInt64(t *testing.T) { expectError bool }{ { - "valid number string", - "10000", - 1, - false, + desc: "valid number string", + inputStr: "10000", + expInt64: 1, + expectError: false, }, { - "round Ki to MiB", - "1000Ki", - 1, - false, + desc: "round Ki to MiB", + inputStr: "1000Ki", + expInt64: 1, + expectError: false, }, { - "round k to MiB", - "1000k", - 1, - false, + desc: "round k to MiB", + inputStr: "1000k", + expInt64: 1, + expectError: false, }, { - "round Mi to MiB", - "1000Mi", - 1000, - false, + desc: "round Mi to MiB", + inputStr: "1000Mi", + expInt64: 1000, + expectError: false, }, { - "round M to MiB", - "1000M", - 954, - false, + desc: "round M to MiB", + inputStr: "1000M", + expInt64: 954, + expectError: false, }, { - "round G to MiB", - "1000G", - 953675, - false, + desc: "round G to MiB", + inputStr: "1000G", + expInt64: 953675, + expectError: false, }, { - "round Gi to MiB", - "10000Gi", - 10240000, - false, + desc: "round Gi to MiB", + inputStr: "10000Gi", + expInt64: 10240000, + expectError: false, }, { - "round decimal to MiB", - "1.2Gi", - 1229, - false, + desc: "round decimal to MiB", + inputStr: "1.2Gi", + expInt64: 1229, + expectError: false, }, { - "round big value to MiB", - "8191Pi", - 8795019280384, - false, + desc: "round big value to MiB", + inputStr: "8191Pi", + expInt64: 8795019280384, + expectError: false, }, { - "invalid empty string", - "", - 10000, - true, + desc: "invalid empty string", + inputStr: "", + expInt64: 0, + expectError: true, }, { - "invalid string", - "ew%65", - 10000, - 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 := ConvertMiBStringToInt64(tc.inputStr) + 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) } @@ -787,3 +811,293 @@ func TestConvertMiBStringToInt64(t *testing.T) { }) } } + +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 + inputMachineTypeUrl string + expectedMachineType string + expectError bool + }{ + { + desc: "full URL machine type", + inputMachineTypeUrl: "https://www.googleapis.com/compute/v1/projects/my-project/zones/us-central1-c/machineTypes/c3-highcpu-4", + expectedMachineType: "c3-highcpu-4", + }, + { + desc: "partial URL machine type", + inputMachineTypeUrl: "zones/us-central1-c/machineTypes/n2-standard-4", + expectedMachineType: "n2-standard-4", + }, + { + desc: "custom partial URL machine type", + inputMachineTypeUrl: "zones/us-central1-c/machineTypes/e2-custom-2-4096", + expectedMachineType: "e2-custom-2-4096", + }, + { + desc: "incorrect URL", + inputMachineTypeUrl: "https://www.googleapis.com/compute/v1/projects/psch-gke-dev/zones/us-central1-c", + expectError: true, + }, + { + desc: "incorrect partial URL", + inputMachineTypeUrl: "zones/us-central1-c/machineTypes/", + expectError: true, + }, + { + desc: "missing zone", + inputMachineTypeUrl: "zones//machineTypes/n2-standard-4", + expectError: true, + }, + } + for _, tc := range tests { + t.Run(tc.desc, func(t *testing.T) { + actualMachineFamily, err := ParseMachineType(tc.inputMachineTypeUrl) + if err != nil && !tc.expectError { + t.Errorf("Got error %v parsing machine type %s; expect no error", err, tc.inputMachineTypeUrl) + } + if err == nil && tc.expectError { + t.Errorf("Got no error parsing machine type %s; expect an error", tc.inputMachineTypeUrl) + } + if err == nil && actualMachineFamily != tc.expectedMachineType { + t.Errorf("Got %s parsing machine type; expect %s", actualMachineFamily, tc.expectedMachineType) + } + }) + } +} + +func TestCodeForError(t *testing.T) { + testCases := []struct { + name string + inputErr error + expCode codes.Code + }{ + { + name: "Not googleapi.Error", + inputErr: errors.New("I am not a googleapi.Error"), + expCode: codes.Internal, + }, + { + name: "User error", + inputErr: &googleapi.Error{Code: http.StatusBadRequest, Message: "User error with bad request"}, + expCode: codes.InvalidArgument, + }, + { + name: "googleapi.Error but not a user error", + inputErr: &googleapi.Error{Code: http.StatusInternalServerError, Message: "Internal error"}, + expCode: codes.Internal, + }, + { + name: "context canceled error", + inputErr: context.Canceled, + expCode: codes.Canceled, + }, + { + name: "context deadline exceeded error", + inputErr: context.DeadlineExceeded, + expCode: codes.DeadlineExceeded, + }, + { + name: "status error with Aborted error code", + inputErr: status.Error(codes.Aborted, "aborted error"), + expCode: codes.Aborted, + }, + { + name: "nil error", + inputErr: nil, + expCode: codes.Internal, + }, + } + + for _, tc := range testCases { + errCode := CodeForError(tc.inputErr) + if errCode != tc.expCode { + t.Errorf("test %v failed: got %v, expected %v", tc.name, errCode, tc.expCode) + } + } +} + +func TestIsContextError(t *testing.T) { + cases := []struct { + name string + err error + expectedErrCode codes.Code + expectError bool + }{ + { + name: "deadline exceeded error", + err: context.DeadlineExceeded, + expectedErrCode: codes.DeadlineExceeded, + }, + { + name: "contains 'context deadline exceeded'", + err: fmt.Errorf("got error: %w", context.DeadlineExceeded), + expectedErrCode: codes.DeadlineExceeded, + }, + { + name: "context canceled error", + err: context.Canceled, + expectedErrCode: codes.Canceled, + }, + { + name: "contains 'context canceled'", + err: fmt.Errorf("got error: %w", context.Canceled), + expectedErrCode: codes.Canceled, + }, + { + name: "does not contain 'context canceled' or 'context deadline exceeded'", + err: fmt.Errorf("unknown error"), + expectError: true, + }, + { + name: "nil error", + err: nil, + expectError: true, + }, + } + + for _, test := range cases { + errCode, err := isContextError(test.err) + if test.expectError { + if err == nil { + t.Errorf("test %v failed, expected error, got %v", test.name, errCode) + } + } else if errCode != test.expectedErrCode { + t.Errorf("test %v failed: got %v, expected %v", test.name, errCode, test.expectedErrCode) + } + } +} + +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) + } + } +} diff --git a/pkg/deviceutils/device-utils.go b/pkg/deviceutils/device-utils.go index f65a79ae..0835f0ba 100644 --- a/pkg/deviceutils/device-utils.go +++ b/pkg/deviceutils/device-utils.go @@ -366,7 +366,7 @@ func udevadmChangeToDrive(devFsPath string) error { klog.V(4).Infof("Running command: %s", cmd.String()) out, err := cmd.CombinedOutput() if err != nil { - return fmt.Errorf("udevadmChangeToDrive: udevadm trigger failed for drive %q with output %s: %w", devFsPath, string(out), err) + return fmt.Errorf("udevadmChangeToDrive: udevadm trigger failed for drive %q with output %s: %v", devFsPath, string(out), err) } return nil } diff --git a/pkg/deviceutils/fake-device-utils.go b/pkg/deviceutils/fake-device-utils.go index 74734076..d17c43e5 100644 --- a/pkg/deviceutils/fake-device-utils.go +++ b/pkg/deviceutils/fake-device-utils.go @@ -17,12 +17,15 @@ package deviceutils import "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/resizefs" type fakeDeviceUtils struct { + skipResize bool } var _ DeviceUtils = &fakeDeviceUtils{} -func NewFakeDeviceUtils() *fakeDeviceUtils { - return &fakeDeviceUtils{} +func NewFakeDeviceUtils(skipResize bool) *fakeDeviceUtils { + return &fakeDeviceUtils{ + skipResize: skipResize, + } } // Returns list of all /dev/disk/by-id/* paths for given PD. @@ -41,6 +44,9 @@ func (_ *fakeDeviceUtils) DisableDevice(devicePath string) error { return nil } -func (_ *fakeDeviceUtils) Resize(resizer resizefs.Resizefs, devicePath string, deviceMountPath string) (bool, error) { - return false, nil +func (du *fakeDeviceUtils) Resize(resizer resizefs.Resizefs, devicePath string, deviceMountPath string) (bool, error) { + if du.skipResize { + return false, nil + } + return resizer.Resize(devicePath, deviceMountPath) } diff --git a/pkg/gce-cloud-provider/compute/cloud-disk.go b/pkg/gce-cloud-provider/compute/cloud-disk.go index 99968d00..1d59cdd0 100644 --- a/pkg/gce-cloud-provider/compute/cloud-disk.go +++ b/pkg/gce-cloud-provider/compute/cloud-disk.go @@ -223,3 +223,14 @@ func (d *CloudDisk) GetMultiWriter() bool { return false } } + +func (d *CloudDisk) GetEnableConfidentialCompute() bool { + switch { + case d.disk != nil: + return false + case d.betaDisk != nil: + return d.betaDisk.EnableConfidentialCompute + default: + return false + } +} diff --git a/pkg/gce-cloud-provider/compute/cloud-disk_test.go b/pkg/gce-cloud-provider/compute/cloud-disk_test.go new file mode 100644 index 00000000..a37584ea --- /dev/null +++ b/pkg/gce-cloud-provider/compute/cloud-disk_test.go @@ -0,0 +1,79 @@ +/* +Copyright 2023 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 gcecloudprovider + +import ( + "testing" + + computebeta "google.golang.org/api/compute/v0.beta" + computev1 "google.golang.org/api/compute/v1" +) + +func CreateDiskWithConfidentialCompute(betaDisk bool, confidentialCompute bool, diskType string) *CloudDisk { + if betaDisk { + return &CloudDisk{ + betaDisk: &computebeta.Disk{ + EnableConfidentialCompute: confidentialCompute, + Type: diskType, + }, + } + } + return &CloudDisk{ + disk: &computev1.Disk{}, + } +} + +func TestGetEnableConfidentialCompute(t *testing.T) { + testCases := []struct { + name string + diskVersion *CloudDisk + expectedEnableConfidentialCompute bool + }{ + { + name: "test betaDisk with enableConfidentialCompute=false", + diskVersion: CreateDiskWithConfidentialCompute(true, false, "hyperdisk-balanced"), + expectedEnableConfidentialCompute: false, + }, + { + name: "test betaDisk with enableConfidentialCompute=true", + diskVersion: CreateDiskWithConfidentialCompute(true, true, "hyperdisk-balanced"), + expectedEnableConfidentialCompute: true, + }, + { + name: "test disk withpit enableConfidentialCompute", + diskVersion: CreateDiskWithConfidentialCompute(false, false, "hyperdisk-balanced"), + expectedEnableConfidentialCompute: false, + }, + { + name: "test disk withpit enableConfidentialCompute", + diskVersion: CreateDiskWithConfidentialCompute(false, false, "pd-standard"), + expectedEnableConfidentialCompute: false, + }, + } + + for _, tc := range testCases { + t.Logf("Running test: %v", tc.name) + confidentialCompute := tc.diskVersion.GetEnableConfidentialCompute() + if confidentialCompute != tc.expectedEnableConfidentialCompute { + t.Fatalf("Got confidentialCompute value %t expected %t", confidentialCompute, tc.expectedEnableConfidentialCompute) + } + if confidentialCompute != tc.expectedEnableConfidentialCompute { + t.Fatalf("Got confidentialCompute value %t expected %t", confidentialCompute, tc.expectedEnableConfidentialCompute) + } + } +} diff --git a/pkg/gce-cloud-provider/compute/fake-gce.go b/pkg/gce-cloud-provider/compute/fake-gce.go index 9dedbaf3..14fbaf44 100644 --- a/pkg/gce-cloud-provider/compute/fake-gce.go +++ b/pkg/gce-cloud-provider/compute/fake-gce.go @@ -247,15 +247,21 @@ func (cloud *FakeCloudProvider) InsertDisk(ctx context.Context, project string, switch volKey.Type() { case meta.Zonal: computeDisk.Zone = volKey.Zone - computeDisk.SelfLink = fmt.Sprintf("projects/%s/zones/%s/disks/%s", project, volKey.Zone, volKey.Name) + computeDisk.SelfLink = fmt.Sprintf("%sprojects/%s/zones/%s/disks/%s", BasePath, project, volKey.Zone, volKey.Name) case meta.Regional: computeDisk.Region = volKey.Region - computeDisk.SelfLink = fmt.Sprintf("projects/%s/regions/%s/disks/%s", project, volKey.Region, volKey.Name) + computeDisk.SelfLink = fmt.Sprintf("%sprojects/%s/regions/%s/disks/%s", BasePath, project, volKey.Region, volKey.Name) default: return fmt.Errorf("could not create disk, key was neither zonal nor regional, instead got: %v", volKey.String()) } - cloud.disks[volKey.Name] = CloudDiskFromV1(computeDisk) + if containsBetaDiskType(hyperdiskTypes, params.DiskType) { + betaDisk := convertV1DiskToBetaDisk(computeDisk, params.ProvisionedThroughputOnCreate) + betaDisk.EnableConfidentialCompute = params.EnableConfidentialCompute + cloud.disks[volKey.Name] = CloudDiskFromBeta(betaDisk) + } else { + cloud.disks[volKey.Name] = CloudDiskFromV1(computeDisk) + } return nil } @@ -264,15 +270,16 @@ func (cloud *FakeCloudProvider) DeleteDisk(ctx context.Context, project string, return nil } -func (cloud *FakeCloudProvider) AttachDisk(ctx context.Context, project string, volKey *meta.Key, readWrite, diskType, instanceZone, instanceName string) error { +func (cloud *FakeCloudProvider) AttachDisk(ctx context.Context, project string, volKey *meta.Key, readWrite, diskType, instanceZone, instanceName string, forceAttach bool) error { source := cloud.GetDiskSourceURI(project, volKey) attachedDiskV1 := &computev1.AttachedDisk{ - DeviceName: volKey.Name, - Kind: diskKind, - Mode: readWrite, - Source: source, - Type: diskType, + DeviceName: volKey.Name, + Kind: diskKind, + Mode: readWrite, + Source: source, + Type: diskType, + ForceAttach: forceAttach, } instance, ok := cloud.instances[instanceName] if !ok { @@ -556,14 +563,14 @@ func (cloud *FakeBlockingCloudProvider) DetachDisk(ctx context.Context, project, return cloud.FakeCloudProvider.DetachDisk(ctx, project, deviceName, instanceZone, instanceName) } -func (cloud *FakeBlockingCloudProvider) AttachDisk(ctx context.Context, project string, volKey *meta.Key, readWrite, diskType, instanceZone, instanceName string) error { +func (cloud *FakeBlockingCloudProvider) AttachDisk(ctx context.Context, project string, volKey *meta.Key, readWrite, diskType, instanceZone, instanceName string, forceAttach bool) error { execute := make(chan Signal) cloud.ReadyToExecute <- execute val := <-execute if val.ReportError { return fmt.Errorf("force mock error for AttachDisk: volkey %s", volKey) } - return cloud.FakeCloudProvider.AttachDisk(ctx, project, volKey, readWrite, diskType, instanceZone, instanceName) + return cloud.FakeCloudProvider.AttachDisk(ctx, project, volKey, readWrite, diskType, instanceZone, instanceName, forceAttach) } func notFoundError() *googleapi.Error { diff --git a/pkg/gce-cloud-provider/compute/gce-compute.go b/pkg/gce-cloud-provider/compute/gce-compute.go index 0be8356d..9626787b 100644 --- a/pkg/gce-cloud-provider/compute/gce-compute.go +++ b/pkg/gce-cloud-provider/compute/gce-compute.go @@ -18,6 +18,7 @@ import ( "context" "encoding/json" "fmt" + "regexp" "strings" "time" @@ -38,9 +39,12 @@ const ( waitForImageCreationTimeOut = 5 * time.Minute diskKind = "compute#disk" cryptoKeyVerDelimiter = "/cryptoKeyVersions" + // Example message: "[pd-standard] features are not compatible for creating instance" + pdDiskTypeUnsupportedPattern = `\[([a-z-]+)\] features are not compatible for creating instance` ) -var hyperdiskTypes = []string{"hyperdisk-extreme", "hyperdisk-throughput"} +var hyperdiskTypes = []string{"hyperdisk-extreme", "hyperdisk-throughput", "hyperdisk-balanced"} +var pdDiskTypeUnsupportedRegex = regexp.MustCompile(pdDiskTypeUnsupportedPattern) type GCEAPIVersion string @@ -69,6 +73,15 @@ var WaitForOpBackoff = wait.Backoff{ Steps: 100, Cap: 0} +// Custom error type to propagate error messages up to clients. +type UnsupportedDiskError struct { + DiskType string +} + +func (udErr *UnsupportedDiskError) Error() string { + return "" +} + type GCECompute interface { // Metadata information GetDefaultProject() string @@ -79,7 +92,7 @@ type GCECompute interface { ValidateExistingDisk(ctx context.Context, disk *CloudDisk, params common.DiskParameters, reqBytes, limBytes int64, multiWriter bool) 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) error DeleteDisk(ctx context.Context, project string, volumeKey *meta.Key) error - AttachDisk(ctx context.Context, project string, volKey *meta.Key, readWrite, diskType, instanceZone, instanceName string) 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 GetDiskSourceURI(project string, volKey *meta.Key) string GetDiskTypeURI(project string, volKey *meta.Key, diskType string) string @@ -245,6 +258,9 @@ func (cloud *CloudProvider) ListSnapshots(ctx context.Context, filter string) ([ func (cloud *CloudProvider) GetDisk(ctx context.Context, project string, key *meta.Key, gceAPIVersion GCEAPIVersion) (*CloudDisk, error) { klog.V(5).Infof("Getting disk %v", key) + + // Override GCEAPIVersion as hyperdisk is only available in beta and we cannot get the disk-type with get disk call. + gceAPIVersion = GCEAPIVersionBeta switch key.Type() { case meta.Zonal: if gceAPIVersion == GCEAPIVersionBeta { @@ -403,8 +419,19 @@ func convertV1DiskToBetaDisk(v1Disk *computev1.Disk, provisionedThroughputOnCrea Description: v1Disk.Description, Type: v1Disk.Type, SourceSnapshot: v1Disk.SourceSnapshot, + SourceImage: v1Disk.SourceImage, + SourceImageId: v1Disk.SourceImageId, + SourceSnapshotId: v1Disk.SourceSnapshotId, + SourceDisk: v1Disk.SourceDisk, ReplicaZones: v1Disk.ReplicaZones, DiskEncryptionKey: dek, + Zone: v1Disk.Zone, + Region: v1Disk.Region, + Status: v1Disk.Status, + SelfLink: v1Disk.SelfLink, + } + if v1Disk.ProvisionedIops > 0 { + betaDisk.ProvisionedIops = v1Disk.ProvisionedIops } if provisionedThroughputOnCreate > 0 { betaDisk.ProvisionedThroughput = provisionedThroughputOnCreate @@ -436,12 +463,11 @@ func (cloud *CloudProvider) insertRegionalDisk( } diskToCreate := &computev1.Disk{ - Name: volKey.Name, - SizeGb: common.BytesToGbRoundUp(capBytes), - Description: description, - Type: cloud.GetDiskTypeURI(cloud.project, volKey, params.DiskType), - Labels: params.Labels, - ProvisionedIops: params.ProvisionedIOPSOnCreate, + Name: volKey.Name, + SizeGb: common.BytesToGbRoundUp(capBytes), + Description: description, + Type: cloud.GetDiskTypeURI(cloud.project, volKey, params.DiskType), + Labels: params.Labels, } if snapshotID != "" { _, snapshotType, _, err := common.SnapshotIDToProjectKey(snapshotID) @@ -543,7 +569,6 @@ func (cloud *CloudProvider) insertZonalDisk( opName string gceAPIVersion = GCEAPIVersionV1 ) - if multiWriter || containsBetaDiskType(hyperdiskTypes, params.DiskType) { gceAPIVersion = GCEAPIVersionBeta } @@ -556,6 +581,10 @@ func (cloud *CloudProvider) insertZonalDisk( Labels: params.Labels, } + if params.ProvisionedIOPSOnCreate > 0 { + diskToCreate.ProvisionedIops = params.ProvisionedIOPSOnCreate + } + if snapshotID != "" { _, snapshotType, _, err := common.SnapshotIDToProjectKey(snapshotID) if err != nil { @@ -584,6 +613,7 @@ func (cloud *CloudProvider) insertZonalDisk( var insertOp *computebeta.Operation betaDiskToCreate := convertV1DiskToBetaDisk(diskToCreate, params.ProvisionedThroughputOnCreate) betaDiskToCreate.MultiWriter = multiWriter + betaDiskToCreate.EnableConfidentialCompute = params.EnableConfidentialCompute insertOp, err = cloud.betaService.Disks.Insert(project, volKey.Zone, betaDiskToCreate).Context(ctx).Do() if insertOp != nil { opName = insertOp.Name @@ -687,7 +717,7 @@ func (cloud *CloudProvider) deleteRegionalDisk(ctx context.Context, project, reg return nil } -func (cloud *CloudProvider) AttachDisk(ctx context.Context, project string, volKey *meta.Key, readWrite, diskType, instanceZone, instanceName string) error { +func (cloud *CloudProvider) AttachDisk(ctx context.Context, project string, volKey *meta.Key, readWrite, diskType, instanceZone, instanceName string, forceAttach bool) error { klog.V(5).Infof("Attaching disk %v to %s", volKey, instanceName) source := cloud.GetDiskSourceURI(project, volKey) @@ -701,9 +731,13 @@ func (cloud *CloudProvider) AttachDisk(ctx context.Context, project string, volK Mode: readWrite, Source: source, Type: diskType, + // This parameter is ignored in the call, the ForceAttach decorator + // (query parameter) is the important one. We'll set it in both places + // in case that behavior changes. + ForceAttach: forceAttach, } - op, err := cloud.service.Instances.AttachDisk(project, instanceZone, instanceName, attachedDiskV1).Context(ctx).Do() + op, err := cloud.service.Instances.AttachDisk(project, instanceZone, instanceName, attachedDiskV1).Context(ctx).ForceAttach(forceAttach).Do() if err != nil { return fmt.Errorf("failed cloud service attach disk call: %w", err) } @@ -838,12 +872,49 @@ func (cloud *CloudProvider) WaitForAttach(ctx context.Context, project string, v }) } +func wrapOpErr(name string, opErr *computev1.OperationErrorErrors) error { + if opErr == nil { + return nil + } + + if opErr.Code == "UNSUPPORTED_OPERATION" { + if diskType := pdDiskTypeUnsupportedRegex.FindStringSubmatch(opErr.Message); diskType != nil { + return &UnsupportedDiskError{ + DiskType: diskType[1], + } + } + } + grpcErrCode := codeForGCEOpError(*opErr) + return status.Errorf(grpcErrCode, "operation %v failed (%v): %v", name, opErr.Code, opErr.Message) +} + +// codeForGCEOpError return the grpc error code for the passed in +// gce operation error. +func codeForGCEOpError(err computev1.OperationErrorErrors) codes.Code { + userErrors := map[string]codes.Code{ + "RESOURCE_NOT_FOUND": codes.NotFound, + "RESOURCE_ALREADY_EXISTS": codes.AlreadyExists, + "RESOURCE_IN_USE_BY_ANOTHER_RESOURCE": codes.InvalidArgument, + "OPERATION_CANCELED_BY_USER": codes.Aborted, + "QUOTA_EXCEEDED": codes.ResourceExhausted, + "ZONE_RESOURCE_POOL_EXHAUSTED": codes.Unavailable, + "ZONE_RESOURCE_POOL_EXHAUSTED_WITH_DETAILS": codes.Unavailable, + "REGION_QUOTA_EXCEEDED": codes.ResourceExhausted, + "RATE_LIMIT_EXCEEDED": codes.ResourceExhausted, + "INVALID_USAGE": codes.InvalidArgument, + } + if code, ok := userErrors[err.Code]; ok { + return code + } + return codes.Internal +} + func opIsDone(op *computev1.Operation) (bool, error) { if op == nil || op.Status != operationStatusDone { return false, nil } if op.Error != nil && len(op.Error.Errors) > 0 && op.Error.Errors[0] != nil { - return true, fmt.Errorf("operation %v failed (%v): %v", op.Name, op.Error.Errors[0].Code, op.Error.Errors[0].Message) + return true, wrapOpErr(op.Name, op.Error.Errors[0]) } return true, nil } diff --git a/pkg/gce-cloud-provider/compute/gce-compute_test.go b/pkg/gce-cloud-provider/compute/gce-compute_test.go index 1a9c9f6e..652b111a 100644 --- a/pkg/gce-cloud-provider/compute/gce-compute_test.go +++ b/pkg/gce-cloud-provider/compute/gce-compute_test.go @@ -18,6 +18,7 @@ import ( "testing" computev1 "google.golang.org/api/compute/v1" + "google.golang.org/grpc/codes" "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/common" ) @@ -101,3 +102,75 @@ func TestValidateDiskParameters(t *testing.T) { } } } + +func TestCodeForGCEOpError(t *testing.T) { + testCases := []struct { + name string + inputErr computev1.OperationErrorErrors + expCode codes.Code + }{ + { + name: "RESOURCE_NOT_FOUND error", + inputErr: computev1.OperationErrorErrors{Code: "RESOURCE_NOT_FOUND"}, + expCode: codes.NotFound, + }, + { + name: "RESOURCE_ALREADY_EXISTS error", + inputErr: computev1.OperationErrorErrors{Code: "RESOURCE_ALREADY_EXISTS"}, + expCode: codes.AlreadyExists, + }, + { + name: "OPERATION_CANCELED_BY_USER error", + inputErr: computev1.OperationErrorErrors{Code: "OPERATION_CANCELED_BY_USER"}, + expCode: codes.Aborted, + }, + { + name: "QUOTA_EXCEEDED error", + inputErr: computev1.OperationErrorErrors{Code: "QUOTA_EXCEEDED"}, + expCode: codes.ResourceExhausted, + }, + { + name: "ZONE_RESOURCE_POOL_EXHAUSTED error", + inputErr: computev1.OperationErrorErrors{Code: "ZONE_RESOURCE_POOL_EXHAUSTED"}, + expCode: codes.Unavailable, + }, + { + name: "ZONE_RESOURCE_POOL_EXHAUSTED_WITH_DETAILS error", + inputErr: computev1.OperationErrorErrors{Code: "ZONE_RESOURCE_POOL_EXHAUSTED_WITH_DETAILS"}, + expCode: codes.Unavailable, + }, + { + name: "REGION_QUOTA_EXCEEDED error", + inputErr: computev1.OperationErrorErrors{Code: "REGION_QUOTA_EXCEEDED"}, + expCode: codes.ResourceExhausted, + }, + { + name: "RATE_LIMIT_EXCEEDED error", + inputErr: computev1.OperationErrorErrors{Code: "RATE_LIMIT_EXCEEDED"}, + expCode: codes.ResourceExhausted, + }, + { + name: "INVALID_USAGE error", + inputErr: computev1.OperationErrorErrors{Code: "INVALID_USAGE"}, + expCode: codes.InvalidArgument, + }, + { + name: "RESOURCE_IN_USE_BY_ANOTHER_RESOURCE error", + inputErr: computev1.OperationErrorErrors{Code: "RESOURCE_IN_USE_BY_ANOTHER_RESOURCE"}, + expCode: codes.InvalidArgument, + }, + { + name: "UNSUPPORTED_OPERATION error", + inputErr: computev1.OperationErrorErrors{Code: "UNSUPPORTED_OPERATION"}, + expCode: codes.Internal, + }, + } + + for _, tc := range testCases { + t.Logf("Running test: %v", tc.name) + errCode := codeForGCEOpError(tc.inputErr) + if errCode != tc.expCode { + t.Errorf("test %v failed: got %v, expected %v", tc.name, errCode, tc.expCode) + } + } +} diff --git a/pkg/gce-cloud-provider/compute/gce.go b/pkg/gce-cloud-provider/compute/gce.go index 26bf46a0..0921eca0 100644 --- a/pkg/gce-cloud-provider/compute/gce.go +++ b/pkg/gce-cloud-provider/compute/gce.go @@ -34,6 +34,7 @@ package gcecloudprovider import ( "context" + "errors" "fmt" "net/http" "os" @@ -266,8 +267,8 @@ func getProjectAndZone(config *ConfigFile) (string, string, error) { // isGCEError returns true if given error is a googleapi.Error with given // reason (e.g. "resourceInUseByAnotherResource") func IsGCEError(err error, reason string) bool { - apiErr, ok := err.(*googleapi.Error) - if !ok { + var apiErr *googleapi.Error + if !errors.As(err, &apiErr) { return false } diff --git a/pkg/gce-cloud-provider/compute/gce_test.go b/pkg/gce-cloud-provider/compute/gce_test.go new file mode 100644 index 00000000..5bb2aed8 --- /dev/null +++ b/pkg/gce-cloud-provider/compute/gce_test.go @@ -0,0 +1,86 @@ +/* +Copyright 2023 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 gcecloudprovider + +import ( + "errors" + "fmt" + "net/http" + "testing" + + "google.golang.org/api/googleapi" +) + +func TestIsGCEError(t *testing.T) { + testCases := []struct { + name string + inputErr error + reason string + expIsGCEError bool + }{ + { + name: "Not googleapi.Error", + inputErr: errors.New("I am not a googleapi.Error"), + reason: "notFound", + expIsGCEError: false, + }, + { + name: "googleapi.Error not found error", + inputErr: &googleapi.Error{ + Code: http.StatusNotFound, + Errors: []googleapi.ErrorItem{ + { + Reason: "notFound", + }, + }, + Message: "Not found", + }, + reason: "notFound", + expIsGCEError: true, + }, + { + name: "wrapped googleapi.Error", + inputErr: fmt.Errorf("encountered not found: %w", &googleapi.Error{ + Code: http.StatusNotFound, + Errors: []googleapi.ErrorItem{ + { + Reason: "notFound", + }, + }, + Message: "Not found", + }, + ), + reason: "notFound", + expIsGCEError: true, + }, + { + name: "nil error", + inputErr: nil, + reason: "notFound", + expIsGCEError: false, + }, + } + + for _, tc := range testCases { + t.Logf("Running test: %v", tc.name) + isGCEError := IsGCEError(tc.inputErr, tc.reason) + if tc.expIsGCEError != isGCEError { + t.Fatalf("Got isGCEError '%t', expected '%t'", isGCEError, tc.expIsGCEError) + } + } +} diff --git a/pkg/gce-pd-csi-driver/controller.go b/pkg/gce-pd-csi-driver/controller.go index c9f3fb60..78359b15 100644 --- a/pkg/gce-pd-csi-driver/controller.go +++ b/pkg/gce-pd-csi-driver/controller.go @@ -16,10 +16,13 @@ package gceGCEDriver import ( "context" + "errors" "fmt" "math/rand" - "regexp" + neturl "net/url" "sort" + "strconv" + "strings" "time" "github.com/GoogleCloudPlatform/k8s-cloud-provider/pkg/cloud/meta" @@ -32,14 +35,17 @@ import ( "k8s.io/apimachinery/pkg/util/uuid" "k8s.io/client-go/util/flowcontrol" "k8s.io/klog/v2" + "k8s.io/utils/strings/slices" "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" ) type GCEControllerServer struct { Driver *GCEDriver CloudProvider gce.GCECompute + Metrics metrics.MetricsManager disks []*compute.Disk seen map[string]int @@ -87,10 +93,12 @@ type GCEControllerServer struct { errorBackoff *csiErrorBackoff } +type csiErrorBackoffId string + type csiErrorBackoff struct { - backoff *flowcontrol.Backoff + backoff *flowcontrol.Backoff + errorCodes map[csiErrorBackoffId]codes.Code } -type csiErrorBackoffId string type workItem struct { ctx context.Context @@ -98,6 +106,19 @@ type workItem struct { unpublishReq *csi.ControllerUnpublishVolumeRequest } +// locationRequirements are additional location topology requirements that must be respected when creating a volume. +type locationRequirements struct { + srcVolRegion string + srcVolZone string + srcReplicationType string + cloneReplicationType string +} + +// PDCSIContext is the extracted VolumeContext from controller requests. +type PDCSIContext struct { + ForceAttach bool +} + var _ csi.ControllerServer = &GCEControllerServer{} const ( @@ -110,13 +131,23 @@ const ( replicationTypeNone = "none" replicationTypeRegionalPD = "regional-pd" - // The maximum number of entries that we can include in the // ListVolumesResposne // In reality, the limit here is 4MB (based on gRPC client response limits), // but 500 is a good proxy (gives ~8KB of data per ListVolumesResponse#Entry) // See https://github.com/grpc/grpc/blob/master/include/grpc/impl/codegen/grpc_types.h#L503) maxListVolumesResponseEntries = 500 + + // Keys in the volume context. + contextForceAttach = "force-attach" + + resourceApiScheme = "https" + resourceApiService = "compute" + resourceProject = "projects" +) + +var ( + validResourceApiVersions = map[string]bool{"v1": true, "alpha": true, "beta": true} ) func isDiskReady(disk *gce.CloudDisk) (bool, error) { @@ -142,8 +173,51 @@ func isDiskReady(disk *gce.CloudDisk) (bool, error) { return false, nil } +// cloningLocationRequirements returns additional location requirements to be applied to the given create volume requests topology. +// If the CreateVolumeRequest will use volume cloning, location requirements in compliance with the volume cloning limitations +// will be returned: https://cloud.google.com/kubernetes-engine/docs/how-to/persistent-volumes/volume-cloning#limitations. +func cloningLocationRequirements(req *csi.CreateVolumeRequest, cloneReplicationType string) (*locationRequirements, error) { + if !useVolumeCloning(req) { + return nil, nil + } + // If we are using volume cloning, this will be set. + volSrc := req.VolumeContentSource.GetVolume() + volSrcVolID := volSrc.GetVolumeId() + + _, sourceVolKey, err := common.VolumeIDToKey(volSrcVolID) + if err != nil { + return nil, fmt.Errorf("volume ID is invalid: %w", err) + } + + isZonalSrcVol := sourceVolKey.Type() == meta.Zonal + if isZonalSrcVol { + region, err := common.GetRegionFromZones([]string{sourceVolKey.Zone}) + if err != nil { + return nil, fmt.Errorf("failed to get region from zones: %w", err) + } + sourceVolKey.Region = region + } + + srcReplicationType := replicationTypeNone + if !isZonalSrcVol { + srcReplicationType = replicationTypeRegionalPD + } + + return &locationRequirements{srcVolZone: sourceVolKey.Zone, srcVolRegion: sourceVolKey.Region, srcReplicationType: srcReplicationType, cloneReplicationType: cloneReplicationType}, nil +} + +// useVolumeCloning returns true if the create volume request should be created with volume cloning. +func useVolumeCloning(req *csi.CreateVolumeRequest) bool { + return req.VolumeContentSource != nil && req.VolumeContentSource.GetVolume() != nil +} + func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.CreateVolumeRequest) (*csi.CreateVolumeResponse, error) { var err error + diskTypeForMetric := metrics.DefaultDiskTypeForMetric + enableConfidentialCompute := metrics.DefaultEnableConfidentialCompute + defer func() { + gceCS.Metrics.RecordOperationErrorMetrics("CreateVolume", err, diskTypeForMetric, enableConfidentialCompute) + }() // Validate arguments volumeCapabilities := req.GetVolumeCapabilities() name := req.GetName() @@ -168,6 +242,8 @@ func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.Cre // Apply Parameters (case-insensitive). We leave validation of // the values to the cloud provider. params, err := common.ExtractAndDefaultParameters(req.GetParameters(), gceCS.Driver.name, gceCS.Driver.extraVolumeLabels) + diskTypeForMetric = params.DiskType + enableConfidentialCompute = strconv.FormatBool(params.EnableConfidentialCompute) if err != nil { return nil, status.Errorf(codes.InvalidArgument, "failed to extract parameters: %v", err.Error()) } @@ -177,12 +253,26 @@ func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.Cre if multiWriter { gceAPIVersion = gce.GCEAPIVersionBeta } + + // Verify that the regional availability class is only used on regional disks. + if params.ForceAttach && params.ReplicationType != replicationTypeRegionalPD { + return nil, status.Errorf(codes.InvalidArgument, "invalid availabilty class for zonal disk") + } + + var locationTopReq *locationRequirements + if useVolumeCloning(req) { + locationTopReq, err = cloningLocationRequirements(req, params.ReplicationType) + if err != nil { + return nil, status.Errorf(codes.InvalidArgument, "failed to get location requirements: %v", err.Error()) + } + } + // Determine the zone or zones+region of the disk var zones []string var volKey *meta.Key switch params.ReplicationType { case replicationTypeNone: - zones, err = pickZones(ctx, gceCS, req.GetAccessibilityRequirements(), 1) + zones, err = pickZones(ctx, gceCS, req.GetAccessibilityRequirements(), 1, locationTopReq) if err != nil { return nil, status.Errorf(codes.InvalidArgument, "CreateVolume failed to pick zones for disk: %v", err.Error()) } @@ -192,7 +282,7 @@ func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.Cre volKey = meta.ZonalKey(name, zones[0]) case replicationTypeRegionalPD: - zones, err = pickZones(ctx, gceCS, req.GetAccessibilityRequirements(), 2) + zones, err = pickZones(ctx, gceCS, req.GetAccessibilityRequirements(), 2, locationTopReq) if err != nil { return nil, status.Errorf(codes.InvalidArgument, "CreateVolume failed to pick zones for disk: %v", err.Error()) } @@ -207,7 +297,7 @@ func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.Cre volumeID, err := common.KeyToVolumeID(volKey, gceCS.CloudProvider.GetDefaultProject()) if err != nil { - return nil, LoggedError("Failed to convert volume key to volume ID: ", err) + return nil, common.LoggedError("Failed to convert volume key to volume ID: ", err) } if acquired := gceCS.volumeLocks.TryAcquire(volumeID); !acquired { return nil, status.Errorf(codes.Aborted, common.VolumeOperationAlreadyExistsFmt, volumeID) @@ -218,7 +308,7 @@ func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.Cre existingDisk, err := gceCS.CloudProvider.GetDisk(ctx, gceCS.CloudProvider.GetDefaultProject(), volKey, gceAPIVersion) if err != nil { if !gce.IsGCEError(err, "notFound") { - return nil, LoggedError("CreateVolume unknown get disk error when validating: ", err) + return nil, common.LoggedError("CreateVolume, failed to getDisk when validating: ", err) } } if err == nil { @@ -233,7 +323,7 @@ func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.Cre ready, err := isDiskReady(existingDisk) if err != nil { - return nil, LoggedError("CreateVolume disk "+volKey.String()+" had error checking ready status: ", err) + return nil, common.LoggedError("CreateVolume disk "+volKey.String()+" had error checking ready status: ", err) } if !ready { return nil, status.Errorf(codes.Internal, "CreateVolume existing disk %v is not ready", volKey) @@ -241,7 +331,7 @@ func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.Cre // If there is no validation error, immediately return success klog.V(4).Infof("CreateVolume succeeded for disk %v, it already exists and was compatible", volKey) - return generateCreateVolumeResponse(existingDisk, zones), nil + return generateCreateVolumeResponse(existingDisk, zones, params) } snapshotID := "" @@ -254,7 +344,7 @@ func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.Cre // Verify that snapshot exists sl, err := gceCS.getSnapshotByID(ctx, snapshotID) if err != nil { - return nil, LoggedError("CreateVolume failed to get snapshot "+snapshotID+": ", err) + return nil, common.LoggedError("CreateVolume failed to get snapshot "+snapshotID+": ", err) } else if len(sl.Entries) == 0 { return nil, status.Errorf(codes.NotFound, "CreateVolume source snapshot %s does not exist", snapshotID) } @@ -274,10 +364,9 @@ func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.Cre if gce.IsGCEError(err, "notFound") { return nil, status.Errorf(codes.NotFound, "CreateVolume source volume %s does not exist", volumeContentSourceVolumeID) } else { - return nil, LoggedError("CreateVolume unknown get disk error when validating: ", err) + return nil, common.LoggedError("CreateVolume, getDisk error when validating: ", err) } } - // 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) @@ -312,7 +401,7 @@ func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.Cre // Verify the source disk is ready. ready, err := isDiskReady(diskFromSourceVolume) if err != nil { - return nil, LoggedError("CreateVolume disk from source volume "+sourceVolKey.String()+" had error checking ready status: ", err) + return nil, common.LoggedError("CreateVolume disk from source volume "+sourceVolKey.String()+" had error checking ready status: ", err) } if !ready { return nil, status.Errorf(codes.Internal, "CreateVolume disk from source volume %v is not ready", sourceVolKey) @@ -333,7 +422,7 @@ func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.Cre } disk, err = createSingleZoneDisk(ctx, gceCS.CloudProvider, name, zones, params, capacityRange, capBytes, snapshotID, volumeContentSourceVolumeID, multiWriter) if err != nil { - return nil, LoggedError("CreateVolume failed to create single zonal disk "+name+": ", err) + return nil, common.LoggedError("CreateVolume failed to create single zonal disk "+name+": ", err) } case replicationTypeRegionalPD: if len(zones) != 2 { @@ -341,7 +430,7 @@ func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.Cre } disk, err = createRegionalDisk(ctx, gceCS.CloudProvider, name, zones, params, capacityRange, capBytes, snapshotID, volumeContentSourceVolumeID, multiWriter) if err != nil { - return nil, LoggedError("CreateVolume failed to create regional disk "+name+": ", err) + return nil, common.LoggedError("CreateVolume failed to create regional disk "+name+": ", err) } default: return nil, status.Errorf(codes.InvalidArgument, "CreateVolume replication type '%s' is not supported", params.ReplicationType) @@ -356,11 +445,17 @@ func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.Cre } klog.V(4).Infof("CreateVolume succeeded for disk %v", volKey) - return generateCreateVolumeResponse(disk, zones), nil + return generateCreateVolumeResponse(disk, zones, params) } func (gceCS *GCEControllerServer) DeleteVolume(ctx context.Context, req *csi.DeleteVolumeRequest) (*csi.DeleteVolumeResponse, error) { + var err error + diskTypeForMetric := metrics.DefaultDiskTypeForMetric + enableConfidentialCompute := metrics.DefaultEnableConfidentialCompute + defer func() { + gceCS.Metrics.RecordOperationErrorMetrics("DeleteVolume", err, diskTypeForMetric, enableConfidentialCompute) + }() // Validate arguments volumeID := req.GetVolumeId() if len(volumeID) == 0 { @@ -381,17 +476,18 @@ func (gceCS *GCEControllerServer) DeleteVolume(ctx context.Context, req *csi.Del klog.Warningf("DeleteVolume treating volume as deleted because cannot find volume %v: %v", volumeID, err.Error()) return &csi.DeleteVolumeResponse{}, nil } - return nil, LoggedError("DeleteVolume error repairing underspecified volume key: ", err) + return nil, common.LoggedError("DeleteVolume error repairing underspecified volume key: ", err) } if acquired := gceCS.volumeLocks.TryAcquire(volumeID); !acquired { return nil, status.Errorf(codes.Aborted, common.VolumeOperationAlreadyExistsFmt, volumeID) } defer gceCS.volumeLocks.Release(volumeID) - + disk, _ := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1) + diskTypeForMetric, enableConfidentialCompute = metrics.GetMetricParameters(disk) err = gceCS.CloudProvider.DeleteDisk(ctx, project, volKey) if err != nil { - return nil, LoggedError("unknown Delete disk error: ", err) + return nil, common.LoggedError("Failed to delete disk: ", err) } klog.V(4).Infof("DeleteVolume succeeded for disk %v", volKey) @@ -399,21 +495,28 @@ func (gceCS *GCEControllerServer) DeleteVolume(ctx context.Context, req *csi.Del } func (gceCS *GCEControllerServer) ControllerPublishVolume(ctx context.Context, req *csi.ControllerPublishVolumeRequest) (*csi.ControllerPublishVolumeResponse, error) { + var err error + diskTypeForMetric := metrics.DefaultDiskTypeForMetric + enableConfidentialCompute := metrics.DefaultEnableConfidentialCompute + defer func() { + gceCS.Metrics.RecordOperationErrorMetrics("ControllerPublishVolume", err, diskTypeForMetric, enableConfidentialCompute) + }() // Only valid requests will be accepted - _, _, err := gceCS.validateControllerPublishVolumeRequest(ctx, req) + _, _, _, err = gceCS.validateControllerPublishVolumeRequest(ctx, req) if err != nil { return nil, err } backoffId := gceCS.errorBackoff.backoffId(req.NodeId, req.VolumeId) if gceCS.errorBackoff.blocking(backoffId) { - return nil, status.Errorf(codes.Unavailable, "ControllerPublish not permitted on node %q due to backoff condition", req.NodeId) + return nil, status.Errorf(gceCS.errorBackoff.code(backoffId), "ControllerPublish not permitted on node %q due to backoff condition", req.NodeId) } - resp, err := gceCS.executeControllerPublishVolume(ctx, req) + resp, err, disk := gceCS.executeControllerPublishVolume(ctx, req) + diskTypeForMetric, enableConfidentialCompute = metrics.GetMetricParameters(disk) if err != nil { - klog.Infof("For node %s adding backoff due to error for volume %s: %v", req.NodeId, req.VolumeId, err.Error()) - gceCS.errorBackoff.next(backoffId) + klog.Infof("For node %s adding backoff due to error for volume %s: %v", req.NodeId, req.VolumeId, err) + gceCS.errorBackoff.next(backoffId, common.CodeForError(err)) } else { klog.Infof("For node %s clear backoff due to successful publish of volume %v", req.NodeId, req.VolumeId) gceCS.errorBackoff.reset(backoffId) @@ -421,39 +524,52 @@ func (gceCS *GCEControllerServer) ControllerPublishVolume(ctx context.Context, r return resp, err } -func (gceCS *GCEControllerServer) validateControllerPublishVolumeRequest(ctx context.Context, req *csi.ControllerPublishVolumeRequest) (string, *meta.Key, error) { +func (gceCS *GCEControllerServer) validateControllerPublishVolumeRequest(ctx context.Context, req *csi.ControllerPublishVolumeRequest) (string, *meta.Key, *PDCSIContext, error) { // Validate arguments volumeID := req.GetVolumeId() nodeID := req.GetNodeId() volumeCapability := req.GetVolumeCapability() if len(volumeID) == 0 { - return "", nil, status.Error(codes.InvalidArgument, "ControllerPublishVolume Volume ID must be provided") + return "", nil, nil, status.Error(codes.InvalidArgument, "ControllerPublishVolume Volume ID must be provided") } if len(nodeID) == 0 { - return "", nil, status.Error(codes.InvalidArgument, "ControllerPublishVolume Node ID must be provided") + return "", nil, nil, status.Error(codes.InvalidArgument, "ControllerPublishVolume Node ID must be provided") } if volumeCapability == nil { - return "", nil, status.Error(codes.InvalidArgument, "ControllerPublishVolume Volume capability must be provided") + return "", nil, nil, status.Error(codes.InvalidArgument, "ControllerPublishVolume Volume capability must be provided") } project, volKey, err := common.VolumeIDToKey(volumeID) if err != nil { - return "", nil, status.Errorf(codes.InvalidArgument, "ControllerPublishVolume volume ID is invalid: %v", err.Error()) + return "", nil, nil, status.Errorf(codes.InvalidArgument, "ControllerPublishVolume volume ID is invalid: %v", err.Error()) } // TODO(#253): Check volume capability matches for ALREADY_EXISTS if err = validateVolumeCapability(volumeCapability); err != nil { - return "", nil, status.Errorf(codes.InvalidArgument, "VolumeCapabilities is invalid: %v", err.Error()) + return "", nil, nil, status.Errorf(codes.InvalidArgument, "VolumeCapabilities is invalid: %v", err.Error()) } - return project, volKey, nil + var pdcsiContext *PDCSIContext + if pdcsiContext, err = extractVolumeContext(req.VolumeContext); err != nil { + return "", nil, nil, status.Errorf(codes.InvalidArgument, "Invalid volume context: %v", err.Error()) + } + + return project, volKey, pdcsiContext, nil } -func (gceCS *GCEControllerServer) executeControllerPublishVolume(ctx context.Context, req *csi.ControllerPublishVolumeRequest) (*csi.ControllerPublishVolumeResponse, error) { - project, volKey, err := gceCS.validateControllerPublishVolumeRequest(ctx, req) +func parseMachineType(machineTypeUrl string) string { + machineType, parseErr := common.ParseMachineType(machineTypeUrl) + if parseErr != nil { + // Parse errors represent an unexpected API change with instance.MachineType; log a warning. + klog.Warningf("ParseMachineType(%v): %v", machineTypeUrl, parseErr) + } + return machineType +} +func (gceCS *GCEControllerServer) executeControllerPublishVolume(ctx context.Context, req *csi.ControllerPublishVolumeRequest) (*csi.ControllerPublishVolumeResponse, error, *gce.CloudDisk) { + project, volKey, pdcsiContext, err := gceCS.validateControllerPublishVolumeRequest(ctx, req) if err != nil { - return nil, err + return nil, err, nil } volumeID := req.GetVolumeId() @@ -468,36 +584,35 @@ func (gceCS *GCEControllerServer) executeControllerPublishVolume(ctx context.Con 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()) + return nil, status.Errorf(codes.NotFound, "ControllerPublishVolume could not find volume with ID %v: %v", volumeID, err.Error()), nil } - return nil, LoggedError("ControllerPublishVolume error repairing underspecified volume key: ", err) + return nil, common.LoggedError("ControllerPublishVolume error repairing underspecified volume key: ", err), nil } // Acquires the lock for the volume on that node only, because we need to support the ability // 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) + return nil, status.Errorf(codes.Aborted, common.VolumeOperationAlreadyExistsFmt, lockingVolumeID), nil } defer gceCS.volumeLocks.Release(lockingVolumeID) - - _, err = gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1) + disk, err := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1) if err != nil { if gce.IsGCENotFoundError(err) { - return nil, status.Errorf(codes.NotFound, "Could not find disk %v: %v", volKey.String(), err.Error()) + return nil, status.Errorf(codes.NotFound, "Could not find disk %v: %v", volKey.String(), err.Error()), disk } - return nil, status.Errorf(codes.Internal, "Unknown get disk error: %v", err.Error()) + return nil, common.LoggedError("Failed to getDisk: ", err), disk } instanceZone, instanceName, err := common.NodeIDToZoneAndName(nodeID) if err != nil { - return nil, status.Errorf(codes.NotFound, "could not split nodeID: %v", err.Error()) + return nil, status.Errorf(codes.NotFound, "could not split nodeID: %v", err.Error()), disk } instance, err := gceCS.CloudProvider.GetInstanceOrError(ctx, instanceZone, instanceName) if err != nil { if gce.IsGCENotFoundError(err) { - return nil, status.Errorf(codes.NotFound, "Could not find instance %v: %v", nodeID, err.Error()) + return nil, status.Errorf(codes.NotFound, "Could not find instance %v: %v", nodeID, err.Error()), disk } - return nil, status.Errorf(codes.Internal, "Unknown get instance error: %v", err.Error()) + return nil, common.LoggedError("Failed to get instance: ", err), disk } readWrite := "READ_WRITE" @@ -507,51 +622,65 @@ func (gceCS *GCEControllerServer) executeControllerPublishVolume(ctx context.Con deviceName, err := common.GetDeviceName(volKey) if err != nil { - return nil, status.Errorf(codes.Internal, "error getting device name: %v", err.Error()) + return nil, status.Errorf(codes.Internal, "error getting device name: %v", err.Error()), disk } attached, err := diskIsAttachedAndCompatible(deviceName, instance, volumeCapability, readWrite) if err != nil { - return nil, status.Errorf(codes.AlreadyExists, "Disk %v already published to node %v but incompatible: %v", volKey.Name, nodeID, err.Error()) + return nil, status.Errorf(codes.AlreadyExists, "Disk %v already published to node %v but incompatible: %v", volKey.Name, nodeID, err.Error()), disk } if attached { // Volume is attached to node. Success! klog.V(4).Infof("ControllerPublishVolume succeeded for disk %v to instance %v, already attached.", volKey, nodeID) - return pubVolResp, nil + return pubVolResp, nil, disk } instanceZone, instanceName, err = common.NodeIDToZoneAndName(nodeID) if err != nil { - return nil, status.Errorf(codes.InvalidArgument, "could not split nodeID: %v", err.Error()) + return nil, status.Errorf(codes.InvalidArgument, "could not split nodeID: %v", err.Error()), disk } - err = gceCS.CloudProvider.AttachDisk(ctx, project, volKey, readWrite, attachableDiskTypePersistent, instanceZone, instanceName) + err = gceCS.CloudProvider.AttachDisk(ctx, project, volKey, readWrite, attachableDiskTypePersistent, instanceZone, instanceName, pdcsiContext.ForceAttach) if err != nil { - return nil, status.Errorf(codes.Internal, "unknown Attach error: %v", err.Error()) + var udErr *gce.UnsupportedDiskError + if errors.As(err, &udErr) { + // If we encountered an UnsupportedDiskError, rewrite the error message to be more user friendly. + // The error message from GCE is phrased around disk create on VM creation, not runtime attach. + machineType := parseMachineType(instance.MachineType) + return nil, status.Errorf(codes.InvalidArgument, "'%s' is not a compatible disk type with the machine type %s, please review the GCP online documentation for available persistent disk options", udErr.DiskType, machineType), disk + } + return nil, common.LoggedError("Failed to Attach: ", err), disk } err = gceCS.CloudProvider.WaitForAttach(ctx, project, volKey, instanceZone, instanceName) if err != nil { - return nil, status.Errorf(codes.Internal, "unknown WaitForAttach error: %v", err.Error()) + return nil, common.LoggedError("Errored during WaitForAttach: ", err), disk } + klog.V(4).Infof("ControllerPublishVolume succeeded for disk %v to instance %v", volKey, nodeID) - return pubVolResp, nil + return pubVolResp, nil, disk } func (gceCS *GCEControllerServer) ControllerUnpublishVolume(ctx context.Context, req *csi.ControllerUnpublishVolumeRequest) (*csi.ControllerUnpublishVolumeResponse, error) { - // Only valid requests will be queued - _, _, err := gceCS.validateControllerUnpublishVolumeRequest(ctx, req) + var err error + diskTypeForMetric := metrics.DefaultDiskTypeForMetric + enableConfidentialCompute := metrics.DefaultEnableConfidentialCompute + defer func() { + gceCS.Metrics.RecordOperationErrorMetrics("ControllerUnpublishVolume", err, diskTypeForMetric, enableConfidentialCompute) + }() + _, _, err = gceCS.validateControllerUnpublishVolumeRequest(ctx, req) if err != nil { return nil, err } - + err = status.Errorf(codes.InvalidArgument, "error message") + // Only valid requests will be queued backoffId := gceCS.errorBackoff.backoffId(req.NodeId, req.VolumeId) if gceCS.errorBackoff.blocking(backoffId) { - return nil, status.Errorf(codes.Unavailable, "ControllerUnpublish not permitted on node %q due to backoff condition", req.NodeId) + return nil, status.Errorf(gceCS.errorBackoff.code(backoffId), "ControllerUnpublish not permitted on node %q due to backoff condition", req.NodeId) } - - resp, err := gceCS.executeControllerUnpublishVolume(ctx, req) + resp, err, disk := gceCS.executeControllerUnpublishVolume(ctx, req) + diskTypeForMetric, enableConfidentialCompute = metrics.GetMetricParameters(disk) if err != nil { - klog.Infof("For node %s adding backoff due to error for volume %s", req.NodeId, req.VolumeId) - gceCS.errorBackoff.next(backoffId) + klog.Infof("For node %s adding backoff due to error for volume %s: %v", req.NodeId, req.VolumeId, err) + gceCS.errorBackoff.next(backoffId, common.CodeForError(err)) } else { klog.Infof("For node %s clear backoff due to successful unpublish of volume %v", req.NodeId, req.VolumeId) gceCS.errorBackoff.reset(backoffId) @@ -578,11 +707,11 @@ func (gceCS *GCEControllerServer) validateControllerUnpublishVolumeRequest(ctx c return project, volKey, nil } -func (gceCS *GCEControllerServer) executeControllerUnpublishVolume(ctx context.Context, req *csi.ControllerUnpublishVolumeRequest) (*csi.ControllerUnpublishVolumeResponse, error) { +func (gceCS *GCEControllerServer) executeControllerUnpublishVolume(ctx context.Context, req *csi.ControllerUnpublishVolumeRequest) (*csi.ControllerUnpublishVolumeResponse, error, *gce.CloudDisk) { project, volKey, err := gceCS.validateControllerUnpublishVolumeRequest(ctx, req) if err != nil { - return nil, err + return nil, err, nil } volumeID := req.GetVolumeId() @@ -591,36 +720,36 @@ func (gceCS *GCEControllerServer) executeControllerUnpublishVolume(ctx context.C if err != nil { if gce.IsGCENotFoundError(err) { klog.Warningf("Treating volume %v as unpublished because it could not be found", volumeID) - return &csi.ControllerUnpublishVolumeResponse{}, nil + return &csi.ControllerUnpublishVolumeResponse{}, nil, nil } - return nil, LoggedError("ControllerUnpublishVolume error repairing underspecified volume key: ", err) + return nil, common.LoggedError("ControllerUnpublishVolume error repairing underspecified volume key: ", err), nil } // Acquires the lock for the volume on that node only, because we need to support the ability // 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) + return nil, status.Errorf(codes.Aborted, common.VolumeOperationAlreadyExistsFmt, lockingVolumeID), nil } defer gceCS.volumeLocks.Release(lockingVolumeID) - + diskToUnpublish, _ := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1) instanceZone, instanceName, err := common.NodeIDToZoneAndName(nodeID) if err != nil { - return nil, status.Errorf(codes.InvalidArgument, "could not split nodeID: %v", err.Error()) + return nil, status.Errorf(codes.InvalidArgument, "could not split nodeID: %v", err.Error()), diskToUnpublish } instance, err := gceCS.CloudProvider.GetInstanceOrError(ctx, instanceZone, instanceName) if err != nil { if gce.IsGCENotFoundError(err) { // Node not existing on GCE means that disk has been detached klog.Warningf("Treating volume %v as unpublished because node %v could not be found", volKey.String(), instanceName) - return &csi.ControllerUnpublishVolumeResponse{}, nil + return &csi.ControllerUnpublishVolumeResponse{}, nil, diskToUnpublish } - return nil, status.Errorf(codes.Internal, "error getting instance: %v", err.Error()) + return nil, common.LoggedError("error getting instance: ", err), diskToUnpublish } deviceName, err := common.GetDeviceName(volKey) if err != nil { - return nil, status.Errorf(codes.Internal, "error getting device name: %v", err.Error()) + return nil, status.Errorf(codes.Internal, "error getting device name: %v", err.Error()), diskToUnpublish } attached := diskIsAttached(deviceName, instance) @@ -628,19 +757,24 @@ func (gceCS *GCEControllerServer) executeControllerUnpublishVolume(ctx context.C if !attached { // Volume is not attached to node. Success! klog.V(4).Infof("ControllerUnpublishVolume succeeded for disk %v from node %v. Already not attached.", volKey, nodeID) - return &csi.ControllerUnpublishVolumeResponse{}, nil + return &csi.ControllerUnpublishVolumeResponse{}, nil, diskToUnpublish } - err = gceCS.CloudProvider.DetachDisk(ctx, project, deviceName, instanceZone, instanceName) if err != nil { - return nil, LoggedError("unknown detach error: ", err) + return nil, common.LoggedError("Failed to detach: ", err), diskToUnpublish } klog.V(4).Infof("ControllerUnpublishVolume succeeded for disk %v from node %v", volKey, nodeID) - return &csi.ControllerUnpublishVolumeResponse{}, nil + return &csi.ControllerUnpublishVolumeResponse{}, nil, diskToUnpublish } func (gceCS *GCEControllerServer) ValidateVolumeCapabilities(ctx context.Context, req *csi.ValidateVolumeCapabilitiesRequest) (*csi.ValidateVolumeCapabilitiesResponse, error) { + var err error + diskTypeForMetric := metrics.DefaultDiskTypeForMetric + enableConfidentialCompute := metrics.DefaultEnableConfidentialCompute + defer func() { + gceCS.Metrics.RecordOperationErrorMetrics("ValidateVolumeCapabilities", err, diskTypeForMetric, enableConfidentialCompute) + }() if req.GetVolumeCapabilities() == nil || len(req.GetVolumeCapabilities()) == 0 { return nil, status.Error(codes.InvalidArgument, "Volume Capabilities must be provided") } @@ -652,13 +786,12 @@ func (gceCS *GCEControllerServer) ValidateVolumeCapabilities(ctx context.Context if err != nil { return nil, status.Errorf(codes.InvalidArgument, "Volume ID is invalid: %v", err.Error()) } - 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()) } - return nil, LoggedError("ValidateVolumeCapabilities error repairing underspecified volume key: ", err) + return nil, common.LoggedError("ValidateVolumeCapabilities error repairing underspecified volume key: ", err) } if acquired := gceCS.volumeLocks.TryAcquire(volumeID); !acquired { @@ -667,16 +800,12 @@ func (gceCS *GCEControllerServer) ValidateVolumeCapabilities(ctx context.Context defer gceCS.volumeLocks.Release(volumeID) disk, err := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1) + diskTypeForMetric, enableConfidentialCompute = metrics.GetMetricParameters(disk) if err != nil { if gce.IsGCENotFoundError(err) { return nil, status.Errorf(codes.NotFound, "Could not find disk %v: %v", volKey.Name, err.Error()) } - return nil, LoggedError("Unknown get disk error: ", err) - } - - // Check Volume Context is Empty - if len(req.GetVolumeContext()) != 0 { - return generateFailedValidationMessage("VolumeContext expected to be empty but got %v", req.GetVolumeContext()), nil + return nil, common.LoggedError("Failed to getDisk: ", err) } // Check volume capabilities supported by PD. These are the same for any PD @@ -734,7 +863,7 @@ func (gceCS *GCEControllerServer) ListVolumes(ctx context.Context, req *csi.List if gce.IsGCEInvalidError(err) { return nil, status.Errorf(codes.Aborted, "ListVolumes error with invalid request: %v", err.Error()) } - return nil, LoggedError("Unknown list disk error: ", err) + return nil, common.LoggedError("Failed to list disk: ", err) } gceCS.disks = diskList gceCS.seen = map[string]int{} @@ -753,13 +882,23 @@ func (gceCS *GCEControllerServer) ListVolumes(ctx context.Context, req *csi.List entries := []*csi.ListVolumesResponse_Entry{} for i := 0; i+offset < len(gceCS.disks) && i < maxEntries; i++ { d := gceCS.disks[i+offset] + diskRsrc, err := getResourceId(d.SelfLink) + if err != nil { + klog.Warningf("Bad ListVolumes disk resource %s, skipped: %v (%+v)", d.SelfLink, err, d) + continue + } users := []string{} for _, u := range d.Users { - users = append(users, cleanSelfLink(u)) + rsrc, err := getResourceId(u) + if err != nil { + klog.Warningf("Bad ListVolumes user %s, skipped: %v", u, err) + } else { + users = append(users, rsrc) + } } entries = append(entries, &csi.ListVolumesResponse_Entry{ Volume: &csi.Volume{ - VolumeId: cleanSelfLink(d.SelfLink), + VolumeId: diskRsrc, }, Status: &csi.ListVolumesResponse_VolumeStatus{ PublishedNodeIds: users, @@ -793,6 +932,12 @@ func (gceCS *GCEControllerServer) ControllerGetCapabilities(ctx context.Context, } func (gceCS *GCEControllerServer) CreateSnapshot(ctx context.Context, req *csi.CreateSnapshotRequest) (*csi.CreateSnapshotResponse, error) { + var err error + diskTypeForMetric := metrics.DefaultDiskTypeForMetric + enableConfidentialCompute := metrics.DefaultEnableConfidentialCompute + defer func() { + gceCS.Metrics.RecordOperationErrorMetrics("CreateSnapshot", err, diskTypeForMetric, enableConfidentialCompute) + }() // Validate arguments volumeID := req.GetSourceVolumeId() if len(req.Name) == 0 { @@ -812,12 +957,13 @@ func (gceCS *GCEControllerServer) CreateSnapshot(ctx context.Context, req *csi.C defer gceCS.volumeLocks.Release(volumeID) // Check if volume exists - _, err = gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1) + disk, err := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1) + diskTypeForMetric, enableConfidentialCompute = metrics.GetMetricParameters(disk) if err != nil { if gce.IsGCENotFoundError(err) { return nil, status.Errorf(codes.NotFound, "CreateSnapshot could not find disk %v: %v", volKey.String(), err.Error()) } - return nil, LoggedError("CreateSnapshot unknown get disk error: ", err) + return nil, common.LoggedError("CreateSnapshot, failed to getDisk: ", err) } snapshotParams, err := common.ExtractAndDefaultSnapshotParameters(req.GetParameters(), gceCS.Driver.name) @@ -850,13 +996,12 @@ func (gceCS *GCEControllerServer) createPDSnapshot(ctx context.Context, project if err != nil { return nil, status.Errorf(codes.InvalidArgument, "Invalid volume key: %v", volKey) } - // Check if PD snapshot already exists var snapshot *compute.Snapshot snapshot, err = gceCS.CloudProvider.GetSnapshot(ctx, project, snapshotName) if err != nil { if !gce.IsGCEError(err, "notFound") { - return nil, status.Errorf(codes.Internal, "Unknown get snapshot error: %v", err.Error()) + return nil, common.LoggedError("Failed to get snapshot: ", err) } // If we could not find the snapshot, we create a new one snapshot, err = gceCS.CloudProvider.CreateSnapshot(ctx, project, volKey, snapshotName, snapshotParams) @@ -864,9 +1009,13 @@ func (gceCS *GCEControllerServer) createPDSnapshot(ctx context.Context, project if gce.IsGCEError(err, "notFound") { return nil, status.Errorf(codes.NotFound, "Could not find volume with ID %v: %v", volKey.String(), err.Error()) } - return nil, LoggedError("Unknown create snapshot error: ", err) + return nil, common.LoggedError("Failed to create snapshot: ", err) } } + snapshotId, err := getResourceId(snapshot.SelfLink) + if err != nil { + return nil, common.LoggedError(fmt.Sprintf("Cannot extract resource id from snapshot %s", snapshot.SelfLink), err) + } err = gceCS.validateExistingSnapshot(snapshot, volKey) if err != nil { @@ -885,7 +1034,7 @@ func (gceCS *GCEControllerServer) createPDSnapshot(ctx context.Context, project return &csi.Snapshot{ SizeBytes: common.GbToBytes(snapshot.DiskSizeGb), - SnapshotId: cleanSelfLink(snapshot.SelfLink), + SnapshotId: snapshotId, SourceVolumeId: volumeID, CreationTime: timestamp, ReadyToUse: ready, @@ -903,7 +1052,7 @@ func (gceCS *GCEControllerServer) createImage(ctx context.Context, project strin image, err = gceCS.CloudProvider.GetImage(ctx, project, imageName) if err != nil { if !gce.IsGCEError(err, "notFound") { - return nil, LoggedError("Unknown get image error: ", err) + return nil, common.LoggedError("Failed to get image: ", err) } // create a new image image, err = gceCS.CloudProvider.CreateImage(ctx, project, volKey, imageName, snapshotParams) @@ -911,9 +1060,13 @@ func (gceCS *GCEControllerServer) createImage(ctx context.Context, project strin if gce.IsGCEError(err, "notFound") { return nil, status.Errorf(codes.NotFound, "Could not find volume with ID %v: %v", volKey.String(), err.Error()) } - return nil, LoggedError("Unknown create image error: ", err) + return nil, common.LoggedError("Failed to create image: ", err) } } + imageId, err := getResourceId(image.SelfLink) + if err != nil { + return nil, common.LoggedError(fmt.Sprintf("Cannot extract resource id from snapshot %s", image.SelfLink), err) + } err = gceCS.validateExistingImage(image, volKey) if err != nil { @@ -932,7 +1085,7 @@ func (gceCS *GCEControllerServer) createImage(ctx context.Context, project strin return &csi.Snapshot{ SizeBytes: common.GbToBytes(image.DiskSizeGb), - SnapshotId: cleanSelfLink(image.SelfLink), + SnapshotId: imageId, SourceVolumeId: volumeID, CreationTime: timestamp, ReadyToUse: ready, @@ -944,9 +1097,13 @@ func (gceCS *GCEControllerServer) validateExistingImage(image *compute.Image, vo return fmt.Errorf("disk does not exist") } - _, sourceKey, err := common.VolumeIDToKey(cleanSelfLink(image.SourceDisk)) + sourceId, err := getResourceId(image.SourceDisk) + if err != nil { + return fmt.Errorf("failed to get source id from %s: %w", image.SourceDisk, err) + } + _, sourceKey, err := common.VolumeIDToKey(sourceId) if err != nil { - return fmt.Errorf("fail to get source disk key %s, %w", image.SourceDisk, err) + return fmt.Errorf("failed to get source disk key %s: %w", image.SourceDisk, err) } if sourceKey.String() != volKey.String() { @@ -995,7 +1152,11 @@ func (gceCS *GCEControllerServer) validateExistingSnapshot(snapshot *compute.Sna return fmt.Errorf("disk does not exist") } - _, sourceKey, err := common.VolumeIDToKey(cleanSelfLink(snapshot.SourceDisk)) + sourceId, err := getResourceId(snapshot.SourceDisk) + if err != nil { + return fmt.Errorf("failed to get source id from %s: %w", snapshot.SourceDisk, err) + } + _, sourceKey, err := common.VolumeIDToKey(sourceId) if err != nil { return fmt.Errorf("fail to get source disk key %s, %w", snapshot.SourceDisk, err) } @@ -1023,6 +1184,12 @@ func isCSISnapshotReady(status string) (bool, error) { } func (gceCS *GCEControllerServer) DeleteSnapshot(ctx context.Context, req *csi.DeleteSnapshotRequest) (*csi.DeleteSnapshotResponse, error) { + var err error + diskTypeForMetric := metrics.DefaultDiskTypeForMetric + enableConfidentialCompute := metrics.DefaultEnableConfidentialCompute + defer func() { + gceCS.Metrics.RecordOperationErrorMetrics("DeleteSnapshot", err, diskTypeForMetric, enableConfidentialCompute) + }() // Validate arguments snapshotID := req.GetSnapshotId() if len(snapshotID) == 0 { @@ -1033,7 +1200,7 @@ func (gceCS *GCEControllerServer) DeleteSnapshot(ctx context.Context, req *csi.D if err != nil { // Cannot get snapshot ID from the passing request // This is a success according to the spec - klog.Warningf("Snapshot id does not have the correct format %s", snapshotID) + klog.Warningf("Snapshot id does not have the correct format %s: %v", snapshotID, err) return &csi.DeleteSnapshotResponse{}, nil } @@ -1041,12 +1208,12 @@ func (gceCS *GCEControllerServer) DeleteSnapshot(ctx context.Context, req *csi.D case common.DiskSnapshotType: err = gceCS.CloudProvider.DeleteSnapshot(ctx, project, key) if err != nil { - return nil, LoggedError("unknown Delete snapshot error: ", err) + return nil, common.LoggedError("Failed to DeleteSnapshot: ", err) } case common.DiskImageType: err = gceCS.CloudProvider.DeleteImage(ctx, project, key) if err != nil { - return nil, LoggedError("unknown Delete image error: ", err) + return nil, common.LoggedError("Failed to DeleteImage error: ", err) } default: return nil, status.Errorf(codes.InvalidArgument, "unknown snapshot type %s", snapshotType) @@ -1078,7 +1245,7 @@ func (gceCS *GCEControllerServer) ListSnapshots(ctx context.Context, req *csi.Li if gce.IsGCEInvalidError(err) { return nil, status.Errorf(codes.Aborted, "ListSnapshots error with invalid request: %v", err.Error()) } - return nil, LoggedError("Unknown list snapshots error: ", err) + return nil, common.LoggedError("Failed to list snapshots: ", err) } gceCS.snapshots = snapshotList gceCS.snapshotTokens = map[string]int{} @@ -1107,6 +1274,12 @@ func (gceCS *GCEControllerServer) ListSnapshots(ctx context.Context, req *csi.Li } func (gceCS *GCEControllerServer) ControllerExpandVolume(ctx context.Context, req *csi.ControllerExpandVolumeRequest) (*csi.ControllerExpandVolumeResponse, error) { + var err error + diskTypeForMetric := metrics.DefaultDiskTypeForMetric + enableConfidentialCompute := metrics.DefaultEnableConfidentialCompute + defer func() { + gceCS.Metrics.RecordOperationErrorMetrics("ControllerExpandVolume", err, diskTypeForMetric, enableConfidentialCompute) + }() volumeID := req.GetVolumeId() if len(volumeID) == 0 { return nil, status.Error(codes.InvalidArgument, "ControllerExpandVolume volume ID must be provided") @@ -1121,18 +1294,18 @@ 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) if err != nil { if gce.IsGCENotFoundError(err) { return nil, status.Errorf(codes.NotFound, "ControllerExpandVolume could not find volume with ID %v: %v", volumeID, err.Error()) } - return nil, LoggedError("ControllerExpandVolume error repairing underspecified volume key: ", err) + return nil, common.LoggedError("ControllerExpandVolume error repairing underspecified volume key: ", err) } - + sourceDisk, err := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1) + diskTypeForMetric, enableConfidentialCompute = metrics.GetMetricParameters(sourceDisk) resizedGb, err := gceCS.CloudProvider.ResizeDisk(ctx, project, volKey, reqBytes) if err != nil { - return nil, LoggedError("ControllerExpandVolume failed to resize disk: ", err) + return nil, common.LoggedError("ControllerExpandVolume failed to resize disk: ", err) } klog.V(4).Infof("ControllerExpandVolume succeeded for disk %v to size %v", volKey, resizedGb) @@ -1155,7 +1328,7 @@ func (gceCS *GCEControllerServer) getSnapshots(ctx context.Context, req *csi.Lis if gce.IsGCEError(err, "invalid") { return nil, status.Errorf(codes.Aborted, "Invalid error: %v", err.Error()) } - return nil, LoggedError("Unknown list snapshot error: ", err) + return nil, common.LoggedError("Failed to list snapshot: ", err) } images, _, err = gceCS.CloudProvider.ListImages(ctx, filter) @@ -1163,7 +1336,7 @@ func (gceCS *GCEControllerServer) getSnapshots(ctx context.Context, req *csi.Lis if gce.IsGCEError(err, "invalid") { return nil, status.Errorf(codes.Aborted, "Invalid error: %v", err.Error()) } - return nil, LoggedError("Unknown list image error: ", err) + return nil, common.LoggedError("Failed to list image: ", err) } entries := []*csi.ListSnapshotsResponse_Entry{} @@ -1204,7 +1377,7 @@ func (gceCS *GCEControllerServer) getSnapshotByID(ctx context.Context, snapshotI // return empty list if no snapshot is found return &csi.ListSnapshotsResponse{}, nil } - return nil, LoggedError("Unknown list snapshot error: ", err) + return nil, common.LoggedError("Failed to list snapshot: ", err) } e, err := generateDiskSnapshotEntry(snapshot) if err != nil { @@ -1219,7 +1392,7 @@ func (gceCS *GCEControllerServer) getSnapshotByID(ctx context.Context, snapshotI return &csi.ListSnapshotsResponse{}, nil } } - e, err := generateImageEntry(image) + e, err := generateDiskImageEntry(image) if err != nil { return nil, fmt.Errorf("failed to generate image entry: %w", err) } @@ -1241,6 +1414,15 @@ func generateDiskSnapshotEntry(snapshot *compute.Snapshot) (*csi.ListSnapshotsRe return nil, fmt.Errorf("Failed to covert creation timestamp: %w", err) } + snapshotId, err := getResourceId(snapshot.SelfLink) + if err != nil { + return nil, fmt.Errorf("failed to get snapshot id from %s: %w", snapshot.SelfLink, err) + } + sourceId, err := getResourceId(snapshot.SourceDisk) + if err != nil { + return nil, fmt.Errorf("failed to get source id from %s: %w", snapshot.SourceDisk, err) + } + // 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. @@ -1249,8 +1431,8 @@ func generateDiskSnapshotEntry(snapshot *compute.Snapshot) (*csi.ListSnapshotsRe entry := &csi.ListSnapshotsResponse_Entry{ Snapshot: &csi.Snapshot{ SizeBytes: common.GbToBytes(snapshot.DiskSizeGb), - SnapshotId: cleanSelfLink(snapshot.SelfLink), - SourceVolumeId: cleanSelfLink(snapshot.SourceDisk), + SnapshotId: snapshotId, + SourceVolumeId: sourceId, CreationTime: tp, ReadyToUse: ready, }, @@ -1266,35 +1448,23 @@ func generateDiskImageEntry(image *compute.Image) (*csi.ListSnapshotsResponse_En return nil, fmt.Errorf("failed to covert creation timestamp: %w", err) } - ready, _ := isImageReady(image.Status) - - entry := &csi.ListSnapshotsResponse_Entry{ - Snapshot: &csi.Snapshot{ - SizeBytes: common.GbToBytes(image.DiskSizeGb), - SnapshotId: cleanSelfLink(image.SelfLink), - SourceVolumeId: cleanSelfLink(image.SourceDisk), - CreationTime: tp, - ReadyToUse: ready, - }, + imageId, err := getResourceId(image.SelfLink) + if err != nil { + return nil, fmt.Errorf("cannot get image id from %s: %w", image.SelfLink, err) } - return entry, nil -} - -func generateImageEntry(image *compute.Image) (*csi.ListSnapshotsResponse_Entry, error) { - timestamp, err := parseTimestamp(image.CreationTimestamp) + sourceId, err := getResourceId(image.SourceDisk) if err != nil { - return nil, fmt.Errorf("Failed to covert creation timestamp: %w", err) + return nil, fmt.Errorf("cannot get source id from %s: %w", image.SourceDisk, err) } - // ignore the error intentionally here since we are just listing images ready, _ := isImageReady(image.Status) entry := &csi.ListSnapshotsResponse_Entry{ Snapshot: &csi.Snapshot{ SizeBytes: common.GbToBytes(image.DiskSizeGb), - SnapshotId: cleanSelfLink(image.SelfLink), - SourceVolumeId: cleanSelfLink(image.SourceDisk), - CreationTime: timestamp, + SnapshotId: imageId, + SourceVolumeId: sourceId, + CreationTime: tp, ReadyToUse: ready, }, } @@ -1358,7 +1528,29 @@ func diskIsAttachedAndCompatible(deviceName string, instance *compute.Instance, return false, nil } -func pickZonesFromTopology(top *csi.TopologyRequirement, numZones int) ([]string, error) { +// pickZonesInRegion will remove any zones that are not in the given region. +func pickZonesInRegion(region string, zones []string) []string { + refinedZones := []string{} + for _, zone := range zones { + if strings.Contains(zone, region) { + refinedZones = append(refinedZones, zone) + } + } + return refinedZones +} + +func prependZone(zone string, zones []string) []string { + newZones := []string{zone} + for i := 0; i < len(zones); i++ { + // Do not add a zone if it is equal to the zone that is already prepended to newZones. + if zones[i] != zone { + newZones = append(newZones, zones[i]) + } + } + return newZones +} + +func pickZonesFromTopology(top *csi.TopologyRequirement, numZones int, locationTopReq *locationRequirements) ([]string, error) { reqZones, err := getZonesFromTopology(top.GetRequisite()) if err != nil { return nil, fmt.Errorf("could not get zones from requisite topology: %w", err) @@ -1368,6 +1560,39 @@ func pickZonesFromTopology(top *csi.TopologyRequirement, numZones int) ([]string return nil, fmt.Errorf("could not get zones from preferred topology: %w", err) } + if locationTopReq != nil { + srcVolZone := locationTopReq.srcVolZone + switch locationTopReq.cloneReplicationType { + // For zonal -> zonal cloning, the source disk zone must match the destination disk zone. + case replicationTypeNone: + // If the source volume zone is not in the topology requirement, we return an error. + if !slices.Contains(prefZones, srcVolZone) && !slices.Contains(reqZones, srcVolZone) { + volumeCloningReq := fmt.Sprintf("clone zone must match source disk zone: %s", srcVolZone) + return nil, fmt.Errorf("failed to find zone from topology %v: %s", top, volumeCloningReq) + } + return []string{srcVolZone}, nil + // For zonal or regional -> regional disk cloning, the source disk region must match the destination disk region. + case replicationTypeRegionalPD: + srcVolRegion := locationTopReq.srcVolRegion + prefZones = pickZonesInRegion(srcVolRegion, prefZones) + reqZones = pickZonesInRegion(srcVolRegion, reqZones) + + if len(prefZones) == 0 && len(reqZones) == 0 { + volumeCloningReq := fmt.Sprintf("clone zone must reside in source disk region %s", srcVolRegion) + return nil, fmt.Errorf("failed to find zone from topology %v: %s", top, volumeCloningReq) + } + + // For zonal -> regional disk cloning, one of the replicated zones must match the source zone. + if locationTopReq.srcReplicationType == replicationTypeNone { + if !slices.Contains(prefZones, srcVolZone) && !slices.Contains(reqZones, srcVolZone) { + volumeCloningReq := fmt.Sprintf("one of the replica zones of the clone must match the source disk zone: %s", srcVolZone) + return nil, fmt.Errorf("failed to find zone from topology %v: %s", top, volumeCloningReq) + } + prefZones = prependZone(srcVolZone, prefZones) + } + } + } + if numZones <= len(prefZones) { return prefZones[0:numZones], nil } else { @@ -1426,16 +1651,25 @@ func getZoneFromSegment(seg map[string]string) (string, error) { return zone, nil } -func pickZones(ctx context.Context, gceCS *GCEControllerServer, top *csi.TopologyRequirement, numZones int) ([]string, error) { +func pickZones(ctx context.Context, gceCS *GCEControllerServer, top *csi.TopologyRequirement, numZones int, locationTopReq *locationRequirements) ([]string, error) { var zones []string var err error if top != nil { - zones, err = pickZonesFromTopology(top, numZones) + zones, err = pickZonesFromTopology(top, numZones, locationTopReq) if err != nil { return nil, fmt.Errorf("failed to pick zones from topology: %w", err) } } else { - zones, err = getDefaultZonesInRegion(ctx, gceCS, []string{gceCS.CloudProvider.GetDefaultZone()}, numZones) + existingZones := []string{gceCS.CloudProvider.GetDefaultZone()} + // We set existingZones to the source volume zone so that for zonal -> zonal cloning, the clone is provisioned + // in the same zone as the source volume, and for zonal -> regional, one of the replicated zones will always + // be the zone of the source volume. For regional -> regional cloning, the srcVolZone will not be set, so we + // just use the default zone. + if locationTopReq != nil && locationTopReq.srcReplicationType == replicationTypeNone { + existingZones = []string{locationTopReq.srcVolZone} + } + // If topology is nil, then the Immediate binding mode was used without setting allowedTopologies in the storageclass. + zones, err = getDefaultZonesInRegion(ctx, gceCS, existingZones, numZones) if err != nil { return nil, fmt.Errorf("failed to get default %v zones in region: %w", numZones, err) } @@ -1468,7 +1702,40 @@ func getDefaultZonesInRegion(ctx context.Context, gceCS *GCEControllerServer, ex return ret, nil } -func generateCreateVolumeResponse(disk *gce.CloudDisk, zones []string) *csi.CreateVolumeResponse { +func paramsToVolumeContext(params common.DiskParameters) map[string]string { + context := map[string]string{} + if params.ForceAttach { + context[contextForceAttach] = "true" + } + if len(context) > 0 { + return context + } + return nil +} + +func extractVolumeContext(context map[string]string) (*PDCSIContext, error) { + info := &PDCSIContext{} + // Note that sidecars may inject values in the context (eg, + // csiProvisionerIdentity). So we don't validate that all keys are known. + for key, val := range context { + switch key { + case contextForceAttach: + b, err := common.ConvertStringToBool(val) + if err != nil { + return nil, fmt.Errorf("Bad volume context force attach: %v", err) + } + info.ForceAttach = b + } + } + return info, nil +} + +func generateCreateVolumeResponse(disk *gce.CloudDisk, zones []string, params common.DiskParameters) (*csi.CreateVolumeResponse, error) { + volumeId, err := getResourceId(disk.GetSelfLink()) + if err != nil { + return nil, fmt.Errorf("cannot get volume id from %s: %w", disk.GetSelfLink(), err) + } + tops := []*csi.Topology{} for _, zone := range zones { tops = append(tops, &csi.Topology{ @@ -1479,8 +1746,8 @@ func generateCreateVolumeResponse(disk *gce.CloudDisk, zones []string) *csi.Crea createResp := &csi.CreateVolumeResponse{ Volume: &csi.Volume{ CapacityBytes: realDiskSizeBytes, - VolumeId: cleanSelfLink(disk.GetSelfLink()), - VolumeContext: nil, + VolumeId: volumeId, + VolumeContext: paramsToVolumeContext(params), AccessibleTopology: tops, }, } @@ -1518,12 +1785,36 @@ func generateCreateVolumeResponse(disk *gce.CloudDisk, zones []string) *csi.Crea } createResp.Volume.ContentSource = contentSource } - return createResp + return createResp, nil } -func cleanSelfLink(selfLink string) string { - r, _ := regexp.Compile("https:\\/\\/www.*apis.com\\/.*(v1|beta|alpha)\\/") - return r.ReplaceAllString(selfLink, "") +func getResourceId(resourceLink string) (string, error) { + url, err := neturl.Parse(resourceLink) + if err != nil { + return "", fmt.Errorf("Could not parse resource %s: %w", resourceLink, err) + } + if url.Scheme != resourceApiScheme { + return "", fmt.Errorf("Unexpected API scheme for resource %s", resourceLink) + } + + // Note that the resource host can basically be anything, if we are running in + // a distributed cloud or trusted partner environment. + + // The path should be /compute/VERSION/project/.... + elts := strings.Split(url.Path, "/") + if len(elts) < 4 { + return "", fmt.Errorf("Short resource path %s", resourceLink) + } + if elts[1] != resourceApiService { + return "", fmt.Errorf("Bad resource service %s in %s", elts[1], resourceLink) + } + if _, ok := validResourceApiVersions[elts[2]]; !ok { + return "", fmt.Errorf("Bad version %s in %s", elts[2], resourceLink) + } + if elts[3] != resourceProject { + return "", fmt.Errorf("Expected %v to start with %s in resource %s", elts[3:], resourceProject, resourceLink) + } + 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) (*gce.CloudDisk, error) { @@ -1548,7 +1839,6 @@ func createRegionalDisk(ctx context.Context, cloudProvider gce.GCECompute, name if multiWriter { gceAPIVersion = gce.GCEAPIVersionBeta } - disk, err := cloudProvider.GetDisk(ctx, project, meta.RegionalKey(name, region), gceAPIVersion) if err != nil { return nil, fmt.Errorf("failed to get disk after creating regional disk: %w", err) @@ -1593,7 +1883,7 @@ func pickRandAndConsecutive(slice []string, n int) ([]string, error) { } func newCsiErrorBackoff(initialDuration, errorBackoffMaxDuration time.Duration) *csiErrorBackoff { - return &csiErrorBackoff{flowcontrol.NewBackOff(initialDuration, errorBackoffMaxDuration)} + return &csiErrorBackoff{flowcontrol.NewBackOff(initialDuration, errorBackoffMaxDuration), make(map[csiErrorBackoffId]codes.Code)} } func (_ *csiErrorBackoff) backoffId(nodeId, volumeId string) csiErrorBackoffId { @@ -1605,10 +1895,22 @@ func (b *csiErrorBackoff) blocking(id csiErrorBackoffId) bool { return blk } -func (b *csiErrorBackoff) next(id csiErrorBackoffId) { +func (b *csiErrorBackoff) code(id csiErrorBackoffId) codes.Code { + if code, ok := b.errorCodes[id]; ok { + return code + } + // If we haven't recorded a code, return unavailable, which signals a problem with the driver + // (ie, next() wasn't called correctly). + klog.Errorf("using default code for %s", id) + return codes.Unavailable +} + +func (b *csiErrorBackoff) next(id csiErrorBackoffId, code codes.Code) { b.backoff.Next(string(id), b.backoff.Clock.Now()) + b.errorCodes[id] = code } func (b *csiErrorBackoff) reset(id csiErrorBackoffId) { b.backoff.Reset(string(id)) + delete(b.errorCodes, id) } diff --git a/pkg/gce-pd-csi-driver/controller_test.go b/pkg/gce-pd-csi-driver/controller_test.go index 6ac139d2..8ea8065b 100644 --- a/pkg/gce-pd-csi-driver/controller_test.go +++ b/pkg/gce-pd-csi-driver/controller_test.go @@ -20,6 +20,7 @@ import ( "math/rand" "reflect" "sort" + "strconv" "testing" "time" @@ -39,12 +40,14 @@ import ( ) const ( - project = "test-project" - zone = "country-region-zone" - secondZone = "country-region-fakesecondzone" - node = "test-node" - driver = "test-driver" - name = "test-name" + project = "test-project" + zone = "country-region-zone" + secondZone = "country-region-fakesecondzone" + node = "test-node" + driver = "test-driver" + name = "test-name" + parameterConfidentialCompute = "EnableConfidentialCompute" + testDiskEncryptionKmsKey = "projects/KMS_PROJECT_ID/locations/REGION/keyRings/KEY_RING/cryptoKeys/KEY" ) var ( @@ -72,6 +75,7 @@ var ( errorBackoffInitialDuration = 200 * time.Millisecond errorBackoffMaxDuration = 5 * time.Minute + defaultConfidentialStorage = "false" ) func TestCreateSnapshotArguments(t *testing.T) { @@ -257,7 +261,6 @@ func TestDeleteSnapshot(t *testing.T) { _, err := gceDriver.cs.DeleteSnapshot(context.Background(), tc.req) if err != nil { serverError, ok := status.FromError(err) - t.Logf("get server error %v", serverError) if !ok { t.Fatalf("Could not get error status code from err: %v", serverError) } @@ -930,7 +933,11 @@ func TestListVolumePagination(t *testing.T) { var d []*gce.CloudDisk for i := 0; i < tc.diskCount; i++ { // Create diskCount dummy disks - d = append(d, gce.CloudDiskFromV1(&compute.Disk{Name: fmt.Sprintf("%v", i)})) + name := fmt.Sprintf("disk-%v", i) + d = append(d, gce.CloudDiskFromV1(&compute.Disk{ + Name: name, + SelfLink: fmt.Sprintf("https://www.googleapis.com/compute/v1/projects/project/zones/zone/disk/%s", name), + })) } gceDriver := initGCEDriver(t, d) tok := "" @@ -988,7 +995,11 @@ func TestListVolumeArgs(t *testing.T) { var d []*gce.CloudDisk for i := 0; i < diskCount; i++ { // Create 600 dummy disks - d = append(d, gce.CloudDiskFromV1(&compute.Disk{Name: fmt.Sprintf("%v", i)})) + name := fmt.Sprintf("disk-%v", i) + d = append(d, gce.CloudDiskFromV1(&compute.Disk{ + Name: name, + SelfLink: fmt.Sprintf("https://www.googleapis.com/compute/v1/projects/project/zones/zone/disk/%s", name), + })) } gceDriver := initGCEDriver(t, d) lvr := &csi.ListVolumesRequest{ @@ -1118,8 +1129,112 @@ func TestCreateVolumeWithVolumeSourceFromSnapshot(t *testing.T) { } } +func TestCloningLocationRequirements(t *testing.T) { + testSourceVolumeName := "test-volume-source-name" + testZonalVolumeSourceID := fmt.Sprintf("projects/%s/zones/%s/disks/%s", project, zone, testSourceVolumeName) + testRegionalVolumeSourceID := fmt.Sprintf("projects/%s/regions/%s/disks/%s", project, region, testSourceVolumeName) + + testCases := []struct { + name string + sourceVolumeID string + nilVolumeContentSource bool + reqParameters map[string]string + requestCapacityRange *csi.CapacityRange + replicationType string + expectedLocationRequirements *locationRequirements + expectedErr bool + }{ + { + name: "success zonal disk clone of zonal source disk", + sourceVolumeID: testZonalVolumeSourceID, + requestCapacityRange: stdCapRange, + reqParameters: map[string]string{ + common.ParameterKeyReplicationType: replicationTypeNone, + }, + replicationType: replicationTypeNone, + expectedLocationRequirements: &locationRequirements{srcVolRegion: region, srcVolZone: zone, srcReplicationType: replicationTypeNone, cloneReplicationType: replicationTypeNone}, + expectedErr: false, + }, + { + name: "success regional disk clone of regional source disk", + sourceVolumeID: testRegionalVolumeSourceID, + requestCapacityRange: stdCapRange, + reqParameters: map[string]string{ + common.ParameterKeyReplicationType: replicationTypeRegionalPD, + }, + replicationType: replicationTypeRegionalPD, + expectedLocationRequirements: &locationRequirements{srcVolRegion: region, srcVolZone: "", srcReplicationType: replicationTypeRegionalPD, cloneReplicationType: replicationTypeRegionalPD}, + expectedErr: false, + }, + { + name: "success regional disk clone of zonal data source", + sourceVolumeID: testZonalVolumeSourceID, + requestCapacityRange: stdCapRange, + reqParameters: map[string]string{ + common.ParameterKeyReplicationType: replicationTypeRegionalPD, + }, + replicationType: replicationTypeRegionalPD, + expectedLocationRequirements: &locationRequirements{srcVolRegion: region, srcVolZone: zone, srcReplicationType: replicationTypeNone, cloneReplicationType: replicationTypeRegionalPD}, + expectedErr: false, + }, + { + name: "non-cloning CreateVolumeRequest", + nilVolumeContentSource: true, + requestCapacityRange: stdCapRange, + reqParameters: map[string]string{ + common.ParameterKeyReplicationType: replicationTypeRegionalPD, + }, + replicationType: replicationTypeRegionalPD, + expectedLocationRequirements: nil, + expectedErr: false, + }, + { + name: "failure invalid volumeID", + sourceVolumeID: fmt.Sprintf("projects/%s/disks/%s", project, testSourceVolumeName), + requestCapacityRange: stdCapRange, + reqParameters: map[string]string{ + common.ParameterKeyReplicationType: replicationTypeNone, + }, + replicationType: replicationTypeNone, + expectedLocationRequirements: nil, + expectedErr: true, + }, + } + + for _, tc := range testCases { + t.Logf("test case: %s", tc.name) + req := &csi.CreateVolumeRequest{ + Name: name, + CapacityRange: tc.requestCapacityRange, + VolumeCapabilities: stdVolCaps, + Parameters: tc.reqParameters, + VolumeContentSource: &csi.VolumeContentSource{ + Type: &csi.VolumeContentSource_Volume{ + Volume: &csi.VolumeContentSource_VolumeSource{ + VolumeId: tc.sourceVolumeID, + }, + }, + }, + } + if tc.nilVolumeContentSource { + req.VolumeContentSource = nil + } + + locationRequirements, err := cloningLocationRequirements(req, tc.replicationType) + + if err != nil != tc.expectedErr { + t.Fatalf("Got error %v, expected error %t", err, tc.expectedErr) + } + input := fmt.Sprintf("cloningLocationRequirements(%v, %s", req, tc.replicationType) + if fmt.Sprintf("%v", tc.expectedLocationRequirements) != fmt.Sprintf("%v", locationRequirements) { + t.Fatalf("%s returned unexpected diff got: %v, want %v", input, locationRequirements, tc.expectedLocationRequirements) + } + } +} + func TestCreateVolumeWithVolumeSourceFromVolume(t *testing.T) { testSourceVolumeName := "test-volume-source-name" + testCloneVolumeName := "test-volume-clone" testZonalVolumeSourceID := fmt.Sprintf("projects/%s/zones/%s/disks/%s", project, zone, testSourceVolumeName) 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) @@ -1131,14 +1246,33 @@ func TestCreateVolumeWithVolumeSourceFromVolume(t *testing.T) { common.ParameterKeyType: "test-type", common.ParameterKeyReplicationType: replicationTypeRegionalPD, common.ParameterKeyDiskEncryptionKmsKey: "encryption-key", } - topology := &csi.TopologyRequirement{ - Requisite: []*csi.Topology{ - { - Segments: map[string]string{common.TopologyKeyZone: zone}, - }, - { - Segments: map[string]string{common.TopologyKeyZone: secondZone}, - }, + requisiteTopology := []*csi.Topology{ + { + Segments: map[string]string{common.TopologyKeyZone: zone}, + }, + { + Segments: map[string]string{common.TopologyKeyZone: secondZone}, + }, + } + + requisiteAllRegionZonesTopology := []*csi.Topology{ + { + Segments: map[string]string{common.TopologyKeyZone: "country-region-fakethirdzone"}, + }, + { + Segments: map[string]string{common.TopologyKeyZone: zone}, + }, + { + Segments: map[string]string{common.TopologyKeyZone: secondZone}, + }, + } + + prefTopology := []*csi.Topology{ + { + Segments: map[string]string{common.TopologyKeyZone: zone}, + }, + { + Segments: map[string]string{common.TopologyKeyZone: secondZone}, }, } @@ -1153,39 +1287,326 @@ func TestCreateVolumeWithVolumeSourceFromVolume(t *testing.T) { requestCapacityRange *csi.CapacityRange sourceTopology *csi.TopologyRequirement requestTopology *csi.TopologyRequirement + expCloneKey *meta.Key + // Accessible topologies validates that the replica zones are valid for regional disk clones. + expAccessibleTop []*csi.Topology }{ + { - name: "success zonal disk clone of zonal source disk", + name: "success zonal -> zonal cloning, nil topology: immediate binding w/ no allowedTopologies", volumeOnCloud: true, sourceVolumeID: testZonalVolumeSourceID, requestCapacityRange: stdCapRange, sourceCapacityRange: stdCapRange, reqParameters: zonalParams, sourceReqParameters: zonalParams, - sourceTopology: topology, - requestTopology: topology, + // Source volume will be in the zone that is the first element of preferred topologies (country-region-zone) + sourceTopology: &csi.TopologyRequirement{ + Requisite: requisiteTopology, + Preferred: prefTopology, + }, + requestTopology: nil, + expCloneKey: &meta.Key{Name: testCloneVolumeName, Zone: zone, Region: ""}, + expAccessibleTop: []*csi.Topology{ + { + Segments: map[string]string{common.TopologyKeyZone: "country-region-zone"}, + }, + }, }, { - name: "success regional disk clone of regional source disk", + name: "success zonal -> zonal cloning, req = allowedTopologies, pref = req w/ randomly selected zone as first element: immediate binding w/ allowedTopologies", volumeOnCloud: true, - sourceVolumeID: testRegionalVolumeSourceID, + sourceVolumeID: testZonalVolumeSourceID, + requestCapacityRange: stdCapRange, + sourceCapacityRange: stdCapRange, + reqParameters: zonalParams, + sourceReqParameters: zonalParams, + // Source volume will be in the zone that is the first element of preferred topologies (country-region-zone) + sourceTopology: &csi.TopologyRequirement{ + Requisite: requisiteTopology, + Preferred: prefTopology, + }, + requestTopology: &csi.TopologyRequirement{ + Requisite: requisiteTopology, + Preferred: []*csi.Topology{ + { + Segments: map[string]string{common.TopologyKeyZone: secondZone}, + }, + { + Segments: map[string]string{common.TopologyKeyZone: zone}, + }, + }, + }, + expCloneKey: &meta.Key{Name: testCloneVolumeName, Zone: zone, Region: ""}, + expAccessibleTop: []*csi.Topology{ + { + Segments: map[string]string{common.TopologyKeyZone: "country-region-zone"}, + }, + }, + }, + { + name: "success zonal -> zonal cloning, req = allowedTopologies, pref = req w/ src zone as first element: delayed binding w/ allowedTopologies", + volumeOnCloud: true, + sourceVolumeID: testZonalVolumeSourceID, + requestCapacityRange: stdCapRange, + sourceCapacityRange: stdCapRange, + reqParameters: zonalParams, + sourceReqParameters: zonalParams, + // Source volume will be in the zone that is the first element of preferred topologies (country-region-zone) + sourceTopology: &csi.TopologyRequirement{ + Requisite: requisiteTopology, + Preferred: prefTopology, + }, + requestTopology: &csi.TopologyRequirement{ + Requisite: requisiteTopology, + Preferred: prefTopology, + }, + expCloneKey: &meta.Key{Name: testCloneVolumeName, Zone: zone, Region: ""}, + expAccessibleTop: []*csi.Topology{ + { + Segments: map[string]string{common.TopologyKeyZone: "country-region-zone"}, + }, + }, + }, + { + name: "success zonal -> zonal cloning, req = all zones in region, pref = req w/ src zone as first element: delayed binding without allowedTopologies", + volumeOnCloud: true, + sourceVolumeID: testZonalVolumeSourceID, + requestCapacityRange: stdCapRange, + sourceCapacityRange: stdCapRange, + reqParameters: zonalParams, + sourceReqParameters: zonalParams, + // Source volume will be in the zone that is the first element of preferred topologies (country-region-zone) + sourceTopology: &csi.TopologyRequirement{ + Requisite: requisiteTopology, + Preferred: prefTopology, + }, + requestTopology: &csi.TopologyRequirement{ + Requisite: requisiteAllRegionZonesTopology, + Preferred: prefTopology, + }, + expCloneKey: &meta.Key{Name: testCloneVolumeName, Zone: zone, Region: ""}, + expAccessibleTop: []*csi.Topology{ + { + Segments: map[string]string{common.TopologyKeyZone: "country-region-zone"}, + }, + }, + }, + { + name: "success zonal -> regional cloning, nil topology: immediate binding w/ no allowedTopologies", + volumeOnCloud: true, + sourceVolumeID: testZonalVolumeSourceID, requestCapacityRange: stdCapRange, sourceCapacityRange: stdCapRange, reqParameters: regionalParams, - sourceReqParameters: regionalParams, - sourceTopology: topology, - requestTopology: topology, + sourceReqParameters: zonalParams, + sourceTopology: &csi.TopologyRequirement{ + Requisite: requisiteTopology, + Preferred: prefTopology, + }, + requestTopology: nil, + 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{common.TopologyKeyZone: "country-region-fakesecondzone"}, + }, + }, }, { - name: "success regional disk clone of zonal data source", + name: "success zonal -> regional cloning, req = allowedTopologies, pref = req w/ randomly selected zone as first element: immediate binding w/ allowedTopologies", volumeOnCloud: true, sourceVolumeID: testZonalVolumeSourceID, requestCapacityRange: stdCapRange, sourceCapacityRange: stdCapRange, reqParameters: regionalParams, sourceReqParameters: zonalParams, - sourceTopology: topology, - requestTopology: topology, + sourceTopology: &csi.TopologyRequirement{ + Requisite: requisiteTopology, + Preferred: prefTopology, + }, + requestTopology: &csi.TopologyRequirement{ + Requisite: requisiteTopology, + Preferred: []*csi.Topology{ + { + Segments: map[string]string{common.TopologyKeyZone: secondZone}, + }, + { + Segments: map[string]string{common.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{common.TopologyKeyZone: "country-region-fakesecondzone"}, + }, + }, + }, + { + name: "success zonal -> regional cloning, req = allowedTopologies, pref = req w/ src zone as first element: delayed binding w/ allowedTopologies", + volumeOnCloud: true, + sourceVolumeID: testZonalVolumeSourceID, + requestCapacityRange: stdCapRange, + sourceCapacityRange: stdCapRange, + reqParameters: regionalParams, + sourceReqParameters: zonalParams, + sourceTopology: &csi.TopologyRequirement{ + Requisite: requisiteTopology, + Preferred: prefTopology, + }, + requestTopology: &csi.TopologyRequirement{ + Requisite: requisiteTopology, + Preferred: prefTopology, + }, + 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{common.TopologyKeyZone: "country-region-fakesecondzone"}, + }, + }, + }, + { + name: "success zonal -> regional cloning, req = all zones in region, pref = req w/ src zone as first element: delayed binding without allowedTopologies", + volumeOnCloud: true, + sourceVolumeID: testZonalVolumeSourceID, + requestCapacityRange: stdCapRange, + sourceCapacityRange: stdCapRange, + reqParameters: regionalParams, + sourceReqParameters: zonalParams, + sourceTopology: &csi.TopologyRequirement{ + Requisite: requisiteTopology, + Preferred: prefTopology, + }, + requestTopology: &csi.TopologyRequirement{ + Requisite: requisiteAllRegionZonesTopology, + Preferred: prefTopology, + }, + 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{common.TopologyKeyZone: "country-region-fakesecondzone"}, + }, + }, + }, + { + name: "success regional -> regional cloning, nil topology: immediate binding w/ no allowedTopologies", + volumeOnCloud: true, + sourceVolumeID: testRegionalVolumeSourceID, + requestCapacityRange: stdCapRange, + sourceCapacityRange: stdCapRange, + reqParameters: regionalParams, + sourceReqParameters: regionalParams, + sourceTopology: &csi.TopologyRequirement{ + Requisite: requisiteTopology, + Preferred: prefTopology, + }, + requestTopology: nil, + 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{common.TopologyKeyZone: "country-region-fakesecondzone"}, + }, + }, + }, + { + name: "success regional -> regional cloning, req = allowedTopologies, pref = req w/ randomly selected zone as first element: immediate binding w/ allowedTopologies", + volumeOnCloud: true, + sourceVolumeID: testRegionalVolumeSourceID, + requestCapacityRange: stdCapRange, + sourceCapacityRange: stdCapRange, + reqParameters: regionalParams, + sourceReqParameters: regionalParams, + sourceTopology: &csi.TopologyRequirement{ + Requisite: requisiteTopology, + Preferred: prefTopology, + }, + requestTopology: &csi.TopologyRequirement{ + Requisite: requisiteTopology, + Preferred: []*csi.Topology{ + { + Segments: map[string]string{common.TopologyKeyZone: secondZone}, + }, + { + Segments: map[string]string{common.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{common.TopologyKeyZone: "country-region-fakesecondzone"}, + }, + }, + }, + { + name: "success regional -> regional cloning, req = allowedTopologies, pref = req w/ src zone as first element: delayed binding w/ allowedTopologies", + volumeOnCloud: true, + sourceVolumeID: testRegionalVolumeSourceID, + requestCapacityRange: stdCapRange, + sourceCapacityRange: stdCapRange, + reqParameters: regionalParams, + sourceReqParameters: regionalParams, + sourceTopology: &csi.TopologyRequirement{ + Requisite: requisiteTopology, + Preferred: prefTopology, + }, + requestTopology: &csi.TopologyRequirement{ + Requisite: requisiteTopology, + Preferred: prefTopology, + }, + 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{common.TopologyKeyZone: "country-region-fakesecondzone"}, + }, + }, + }, + { + name: "success regional -> regional cloning, req = all zones in region, pref = req w/ src zone as first element: delayed binding without allowedTopologies", + volumeOnCloud: true, + sourceVolumeID: testRegionalVolumeSourceID, + requestCapacityRange: stdCapRange, + sourceCapacityRange: stdCapRange, + reqParameters: regionalParams, + sourceReqParameters: regionalParams, + sourceTopology: &csi.TopologyRequirement{ + Requisite: requisiteTopology, + Preferred: prefTopology, + }, + requestTopology: &csi.TopologyRequirement{ + Requisite: requisiteTopology, + Preferred: prefTopology, + }, + 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{common.TopologyKeyZone: "country-region-fakesecondzone"}, + }, + }, }, { name: "fail regional disk clone with no matching replica zone of zonal data source", @@ -1196,7 +1617,10 @@ func TestCreateVolumeWithVolumeSourceFromVolume(t *testing.T) { sourceCapacityRange: stdCapRange, reqParameters: regionalParams, sourceReqParameters: zonalParams, - sourceTopology: topology, + sourceTopology: &csi.TopologyRequirement{ + Requisite: requisiteTopology, + Preferred: prefTopology, + }, requestTopology: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { @@ -1219,8 +1643,14 @@ func TestCreateVolumeWithVolumeSourceFromVolume(t *testing.T) { sourceReqParameters: map[string]string{ common.ParameterKeyType: "different-type", }, - sourceTopology: topology, - requestTopology: topology, + sourceTopology: &csi.TopologyRequirement{ + Requisite: requisiteTopology, + Preferred: prefTopology, + }, + requestTopology: &csi.TopologyRequirement{ + Requisite: requisiteTopology, + Preferred: prefTopology, + }, }, { name: "fail zonal disk clone with different DiskEncryptionKMSKey", @@ -1234,8 +1664,14 @@ func TestCreateVolumeWithVolumeSourceFromVolume(t *testing.T) { common.ParameterKeyType: "test-type", common.ParameterKeyReplicationType: replicationTypeNone, common.ParameterKeyDiskEncryptionKmsKey: "different-encryption-key", }, - sourceTopology: topology, - requestTopology: topology, + sourceTopology: &csi.TopologyRequirement{ + Requisite: requisiteTopology, + Preferred: prefTopology, + }, + requestTopology: &csi.TopologyRequirement{ + Requisite: requisiteTopology, + Preferred: prefTopology, + }, }, { name: "fail zonal disk clone with different zone", @@ -1256,7 +1692,10 @@ func TestCreateVolumeWithVolumeSourceFromVolume(t *testing.T) { }, }, }, - requestTopology: topology, + requestTopology: &csi.TopologyRequirement{ + Requisite: requisiteTopology, + Preferred: prefTopology, + }, }, { name: "fail zonal disk clone of regional data source", @@ -1267,8 +1706,14 @@ func TestCreateVolumeWithVolumeSourceFromVolume(t *testing.T) { sourceCapacityRange: stdCapRange, reqParameters: zonalParams, sourceReqParameters: regionalParams, - sourceTopology: topology, - requestTopology: topology, + sourceTopology: &csi.TopologyRequirement{ + Requisite: requisiteTopology, + Preferred: prefTopology, + }, + requestTopology: &csi.TopologyRequirement{ + Requisite: requisiteTopology, + Preferred: prefTopology, + }, }, { @@ -1280,7 +1725,10 @@ func TestCreateVolumeWithVolumeSourceFromVolume(t *testing.T) { sourceCapacityRange: stdCapRange, reqParameters: stdParams, sourceReqParameters: stdParams, - requestTopology: topology, + requestTopology: &csi.TopologyRequirement{ + Requisite: requisiteTopology, + Preferred: prefTopology, + }, }, { name: "fail invalid source disk volume id format", @@ -1291,7 +1739,10 @@ func TestCreateVolumeWithVolumeSourceFromVolume(t *testing.T) { sourceCapacityRange: stdCapRange, reqParameters: stdParams, sourceReqParameters: stdParams, - requestTopology: topology, + requestTopology: &csi.TopologyRequirement{ + Requisite: requisiteTopology, + Preferred: prefTopology, + }, }, { name: "fail zonal disk clone with smaller disk capacity", @@ -1304,16 +1755,23 @@ func TestCreateVolumeWithVolumeSourceFromVolume(t *testing.T) { }, reqParameters: zonalParams, sourceReqParameters: zonalParams, - sourceTopology: topology, - requestTopology: topology, - }} + sourceTopology: &csi.TopologyRequirement{ + Requisite: requisiteTopology, + Preferred: prefTopology, + }, + requestTopology: &csi.TopologyRequirement{ + Requisite: requisiteTopology, + Preferred: prefTopology, + }, + }, + } for _, tc := range testCases { t.Logf("test case: %s", tc.name) gceDriver := initGCEDriver(t, nil) req := &csi.CreateVolumeRequest{ - Name: name, + Name: testCloneVolumeName, CapacityRange: tc.requestCapacityRange, VolumeCapabilities: stdVolCaps, Parameters: tc.reqParameters, @@ -1348,7 +1806,6 @@ func TestCreateVolumeWithVolumeSourceFromVolume(t *testing.T) { } resp, err := gceDriver.cs.CreateVolume(context.Background(), req) - t.Logf("response: %v err: %v", resp, err) if err != nil { serverError, ok := status.FromError(err) if !ok { @@ -1364,14 +1821,39 @@ func TestCreateVolumeWithVolumeSourceFromVolume(t *testing.T) { } // Make sure the response has the source volume. - sourceVolume := resp.GetVolume() - if sourceVolume.ContentSource == nil || sourceVolume.ContentSource.Type == nil || - sourceVolume.ContentSource.GetVolume() == nil || sourceVolume.ContentSource.GetVolume().VolumeId == "" { + respVolume := resp.GetVolume() + if respVolume.ContentSource == nil || respVolume.ContentSource.Type == nil || + respVolume.ContentSource.GetVolume() == nil || respVolume.ContentSource.GetVolume().VolumeId == "" { t.Fatalf("Expected volume content source to have volume ID, got none") } + // Validate that the cloned volume is in the region/zone that we expect + cloneVolID := respVolume.VolumeId + _, cloneVolKey, err := common.VolumeIDToKey(cloneVolID) + if err != nil { + t.Fatalf("failed to get key from volume id %q: %v", cloneVolID, err) + } + if cloneVolKey.String() != tc.expCloneKey.String() { + t.Fatalf("got clone volume key: %q, expected clone volume key: %q", cloneVolKey.String(), tc.expCloneKey.String()) + } + if !accessibleTopologiesEqual(respVolume.AccessibleTopology, tc.expAccessibleTop) { + t.Fatalf("got accessible topology: %q, expected accessible topology: %q", fmt.Sprintf("%+v", respVolume.AccessibleTopology), fmt.Sprintf("%+v", tc.expAccessibleTop)) + + } } } +func sortTopologies(in []*csi.Topology) { + sort.Slice(in, func(i, j int) bool { + return in[i].Segments[common.TopologyKeyZone] < in[j].Segments[common.TopologyKeyZone] + }) +} + +func accessibleTopologiesEqual(got []*csi.Topology, expected []*csi.Topology) bool { + sortTopologies(got) + sortTopologies(expected) + return fmt.Sprintf("%+v", got) == fmt.Sprintf("%+v", expected) +} + func TestCreateVolumeRandomRequisiteTopology(t *testing.T) { req := &csi.CreateVolumeRequest{ Name: "test-name", @@ -1416,7 +1898,8 @@ func TestCreateVolumeRandomRequisiteTopology(t *testing.T) { func createZonalCloudDisk(name string) *gce.CloudDisk { return gce.CloudDiskFromV1(&compute.Disk{ - Name: name, + Name: name, + SelfLink: fmt.Sprintf("https://www.googleapis.com/compute/v1/projects/project/zones/zone/name/%s", name), }) } @@ -1802,16 +2285,158 @@ func TestGetZonesFromTopology(t *testing.T) { } } +func TestPickZonesInRegion(t *testing.T) { + testCases := []struct { + name string + region string + zones []string + expZones []string + }{ + { + name: "all zones in region", + region: "us-central1", + zones: []string{"us-central1-a", "us-central1-b", "us-central1-c"}, + expZones: []string{"us-central1-a", "us-central1-b", "us-central1-c"}, + }, + { + name: "removes zones not in region", + region: "us-central1", + zones: []string{"us-central1-a", "us-central1-b", "us-central1-c", "us-east1-a, us-west1-a"}, + expZones: []string{"us-central1-a", "us-central1-b", "us-central1-c"}, + }, + { + name: "region not in zones", + region: "us-west1", + zones: []string{"us-central1-a", "us-central1-b", "us-central1-c"}, + expZones: []string{}, + }, + { + name: "empty zones", + region: "us-central1", + zones: []string{}, + expZones: []string{}, + }, + } + for _, tc := range testCases { + t.Logf("test case: %s", tc.name) + gotZones := pickZonesInRegion(tc.region, tc.zones) + if !sets.NewString(gotZones...).Equal(sets.NewString(tc.expZones...)) { + t.Errorf("Got zones: %v, expected: %v", gotZones, tc.expZones) + } + } +} + +func TestPrependZone(t *testing.T) { + testCases := []struct { + name string + zone string + zones []string + expZones []string + }{ + { + name: "zone already at index 0", + zone: "us-central1-a", + zones: []string{"us-central1-a", "us-central1-b", "us-central1-c"}, + expZones: []string{"us-central1-a", "us-central1-b", "us-central1-c"}, + }, + { + name: "zone at index 1", + zone: "us-central1-b", + zones: []string{"us-central1-a", "us-central1-b", "us-central1-c"}, + expZones: []string{"us-central1-b", "us-central1-a", "us-central1-c"}, + }, + { + name: "zone not in zones", + zone: "us-central1-f", + zones: []string{"us-central1-a", "us-central1-b", "us-central1-c"}, + expZones: []string{"us-central1-f", "us-central1-a", "us-central1-b", "us-central1-c"}, + }, + { + name: "empty zones", + zone: "us-central1-a", + zones: []string{}, + expZones: []string{"us-central1-a"}, + }, + } + for _, tc := range testCases { + t.Logf("test case: %s", tc.name) + gotZones := prependZone(tc.zone, tc.zones) + if !zonesEqual(gotZones, tc.expZones) { + t.Errorf("Got zones: %v, expected: %v", gotZones, tc.expZones) + } + } +} + func TestPickZonesFromTopology(t *testing.T) { testCases := []struct { name string top *csi.TopologyRequirement + locReq *locationRequirements numZones int expZones []string expErr bool }{ { - name: "success: preferred", + name: "success: preferred", + top: &csi.TopologyRequirement{ + Requisite: []*csi.Topology{ + { + Segments: map[string]string{common.TopologyKeyZone: "topology-zone3"}, + }, + { + Segments: map[string]string{common.TopologyKeyZone: "topology-zone1"}, + }, + { + Segments: map[string]string{common.TopologyKeyZone: "topology-zone2"}, + }, + }, + Preferred: []*csi.Topology{ + { + Segments: map[string]string{common.TopologyKeyZone: "topology-zone2"}, + }, + { + Segments: map[string]string{common.TopologyKeyZone: "topology-zone3"}, + }, + { + Segments: map[string]string{common.TopologyKeyZone: "topology-zone1"}, + }, + }, + }, + numZones: 2, + expZones: []string{"topology-zone2", "topology-zone3"}, + }, + { + name: "success: preferred, locationRequirements[region:us-central1, zone:us-central1-a, srcReplicationType:none, cloneReplicationType:none]", + top: &csi.TopologyRequirement{ + Requisite: []*csi.Topology{ + { + Segments: map[string]string{common.TopologyKeyZone: "us-central1-c"}, + }, + { + Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + }, + { + Segments: map[string]string{common.TopologyKeyZone: "us-central1-b"}, + }, + }, + Preferred: []*csi.Topology{ + { + Segments: map[string]string{common.TopologyKeyZone: "us-central1-b"}, + }, + { + Segments: map[string]string{common.TopologyKeyZone: "us-central1-c"}, + }, + { + Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + }, + }, + }, + locReq: &locationRequirements{srcVolRegion: "us-central1", srcVolZone: "us-central1-a", srcReplicationType: replicationTypeNone, cloneReplicationType: replicationTypeNone}, + numZones: 1, + expZones: []string{"us-central1-a"}, + }, + { + name: "success: preferred and requisite", top: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { @@ -1823,6 +2448,12 @@ func TestPickZonesFromTopology(t *testing.T) { { Segments: map[string]string{common.TopologyKeyZone: "topology-zone2"}, }, + { + Segments: map[string]string{common.TopologyKeyZone: "topology-zone5"}, + }, + { + Segments: map[string]string{common.TopologyKeyZone: "topology-zone6"}, + }, }, Preferred: []*csi.Topology{ { @@ -1836,43 +2467,74 @@ func TestPickZonesFromTopology(t *testing.T) { }, }, }, - numZones: 2, - expZones: []string{"topology-zone2", "topology-zone3"}, + numZones: 5, + expZones: []string{"topology-zone2", "topology-zone3", "topology-zone1", "topology-zone5", "topology-zone6"}, }, { - name: "success: preferred and requisite", + name: "success: preferred and requisite, locationRequirements[region:us-central1, zone:us-central1-a, srcReplicationType:regional-pd, cloneReplicationType:regional-pd]", top: &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "topology-zone3"}, + Segments: map[string]string{common.TopologyKeyZone: "us-central1-c"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "topology-zone1"}, + Segments: map[string]string{common.TopologyKeyZone: "us-central1-d"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "topology-zone2"}, + Segments: map[string]string{common.TopologyKeyZone: "us-central1-f"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "topology-zone5"}, + Segments: map[string]string{common.TopologyKeyZone: "us-west1-a"}, + }, + }, + Preferred: []*csi.Topology{ + { + Segments: map[string]string{common.TopologyKeyZone: "us-central1-b"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "topology-zone6"}, + Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + }, + { + Segments: map[string]string{common.TopologyKeyZone: "us-east1-a"}, + }, + }, + }, + locReq: &locationRequirements{srcVolRegion: "us-central1", srcVolZone: "us-central1-a", srcReplicationType: replicationTypeRegionalPD, cloneReplicationType: replicationTypeRegionalPD}, + numZones: 5, + expZones: []string{"us-central1-b", "us-central1-c", "us-central1-a", "us-central1-d", "us-central1-f"}, + }, + { + name: "success: preferred and requisite, locationRequirements[region:us-central1, zone:us-central1-a, srcReplicationType:none, cloneReplicationType:regional-pd]", + top: &csi.TopologyRequirement{ + Requisite: []*csi.Topology{ + { + Segments: map[string]string{common.TopologyKeyZone: "us-central1-c"}, + }, + { + Segments: map[string]string{common.TopologyKeyZone: "us-central1-d"}, + }, + { + Segments: map[string]string{common.TopologyKeyZone: "us-central1-f"}, + }, + { + Segments: map[string]string{common.TopologyKeyZone: "us-west1-a"}, }, }, Preferred: []*csi.Topology{ { - Segments: map[string]string{common.TopologyKeyZone: "topology-zone2"}, + Segments: map[string]string{common.TopologyKeyZone: "us-central1-b"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "topology-zone3"}, + Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, }, { - Segments: map[string]string{common.TopologyKeyZone: "topology-zone1"}, + Segments: map[string]string{common.TopologyKeyZone: "us-east1-a"}, }, }, }, + locReq: &locationRequirements{srcVolRegion: "us-central1", srcVolZone: "us-central1-a", srcReplicationType: replicationTypeNone, cloneReplicationType: replicationTypeRegionalPD}, numZones: 5, - expZones: []string{"topology-zone2", "topology-zone3", "topology-zone1", "topology-zone5", "topology-zone6"}, + expZones: []string{"us-central1-a", "us-central1-b", "us-central1-c", "us-central1-d", "us-central1-f"}, }, { name: "fail: not enough topologies", @@ -1903,6 +2565,114 @@ func TestPickZonesFromTopology(t *testing.T) { numZones: 4, expErr: true, }, + { + name: "fail: no topologies that match locationRequirment, locationRequirements[region:us-east1, zone:us-east1-a, replicationType:none]", + top: &csi.TopologyRequirement{ + Requisite: []*csi.Topology{ + { + Segments: map[string]string{common.TopologyKeyZone: "us-central1-c"}, + }, + { + Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + }, + { + Segments: map[string]string{common.TopologyKeyZone: "us-central1-b"}, + }, + }, + Preferred: []*csi.Topology{ + { + Segments: map[string]string{common.TopologyKeyZone: "us-central1-b"}, + }, + { + Segments: map[string]string{common.TopologyKeyZone: "us-central1-c"}, + }, + { + Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + }, + }, + }, + locReq: &locationRequirements{srcVolRegion: "us-east1", srcVolZone: "us-east1-a", cloneReplicationType: replicationTypeNone}, + numZones: 1, + expErr: true, + }, + { + name: "fail: no topologies that match locationRequirment, locationRequirements[region:us-east1, zone:us-east1-a, replicationType:regional-pd]", + top: &csi.TopologyRequirement{ + Requisite: []*csi.Topology{ + { + Segments: map[string]string{common.TopologyKeyZone: "us-central1-c"}, + }, + { + Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + }, + { + Segments: map[string]string{common.TopologyKeyZone: "us-central1-b"}, + }, + }, + Preferred: []*csi.Topology{ + { + Segments: map[string]string{common.TopologyKeyZone: "us-central1-b"}, + }, + { + Segments: map[string]string{common.TopologyKeyZone: "us-central1-c"}, + }, + { + Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + }, + }, + }, + locReq: &locationRequirements{srcVolRegion: "us-east1", srcVolZone: "us-east1-a", cloneReplicationType: replicationTypeRegionalPD}, + numZones: 2, + expErr: true, + }, + { + name: "fail: not enough topologies, locationRequirements[region:us-central1, zone:us-central1-a, replicationType:regional-pd]", + top: &csi.TopologyRequirement{ + Requisite: []*csi.Topology{ + { + Segments: map[string]string{common.TopologyKeyZone: "us-central1-c"}, + }, + { + Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + }, + { + Segments: map[string]string{common.TopologyKeyZone: "us-central1-b"}, + }, + }, + Preferred: []*csi.Topology{ + { + Segments: map[string]string{common.TopologyKeyZone: "us-central1-b"}, + }, + { + Segments: map[string]string{common.TopologyKeyZone: "us-central1-c"}, + }, + { + Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + }, + }, + }, + locReq: &locationRequirements{srcVolRegion: "us-central1", srcVolZone: "us-central1-a", cloneReplicationType: replicationTypeRegionalPD}, + numZones: 4, + expErr: true, + }, + { + name: "success: only requisite, locationRequirements[region:us-central1, zone:us-central1-a, replicationType:regional-pd", + top: &csi.TopologyRequirement{ + Requisite: []*csi.Topology{ + { + Segments: map[string]string{common.TopologyKeyZone: "us-central1-c"}, + }, + { + Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"}, + }, + { + Segments: map[string]string{common.TopologyKeyZone: "us-central1-b"}, + }, + }, + }, + numZones: 3, + expZones: []string{"us-central1-b", "us-central1-c", "us-central1-a"}, + }, { name: "success: only requisite", top: &csi.TopologyRequirement{ @@ -1924,12 +2694,12 @@ func TestPickZonesFromTopology(t *testing.T) { } for _, tc := range testCases { t.Logf("test case: %s", tc.name) - gotZones, err := pickZonesFromTopology(tc.top, tc.numZones) + gotZones, err := pickZonesFromTopology(tc.top, tc.numZones, tc.locReq) if err != nil && !tc.expErr { - t.Errorf("Did not expect error but got: %v", err) + t.Errorf("got error: %v, but did not expect error", err) } if err == nil && tc.expErr { - t.Errorf("Expected error but got none") + t.Errorf("got no error, but expected error") } if !sets.NewString(gotZones...).Equal(sets.NewString(tc.expZones...)) { t.Errorf("Expected zones: %v, but got: %v", tc.expZones, gotZones) @@ -1937,6 +2707,18 @@ func TestPickZonesFromTopology(t *testing.T) { } } +func zonesEqual(gotZones, expectedZones []string) bool { + if len(gotZones) != len(expectedZones) { + return false + } + for i := 0; i < len(gotZones); i++ { + if gotZones[i] != expectedZones[i] { + return false + } + } + return true +} + func TestPickRandAndConsecutive(t *testing.T) { rand.Seed(time.Now().UnixNano()) testCases := []struct { @@ -2200,7 +2982,7 @@ type backoffDriverConfig struct { func newFakeCSIErrorBackoff(tc *clock.FakeClock) *csiErrorBackoff { backoff := flowcontrol.NewFakeBackOff(errorBackoffInitialDuration, errorBackoffMaxDuration, tc) - return &csiErrorBackoff{backoff} + return &csiErrorBackoff{backoff, make(map[csiErrorBackoffId]codes.Code)} } func TestControllerUnpublishBackoff(t *testing.T) { @@ -2240,7 +3022,7 @@ func TestControllerUnpublishBackoff(t *testing.T) { } // Mock an active backoff condition on the node. - driver.cs.errorBackoff.next(backoffId) + driver.cs.errorBackoff.next(backoffId, codes.Unavailable) tc.config.clock.Step(step) // A requst for a a different volume should succeed. This volume is not @@ -2258,7 +3040,9 @@ func TestControllerUnpublishBackoff(t *testing.T) { VolumeId: testVolumeID, NodeId: testNodeID, } - // For the first 199 ms, the backoff condition is true. All controller publish request will be denied with 'Unavailable' error code. + // For the first 199 ms, the backoff condition is true. All controller publish + // request will be denied with the same unavailable error code as was set on + // the original error. for i := 0; i < 199; i++ { var err error _, err = driver.cs.ControllerUnpublishVolume(context.Background(), unpubreq) @@ -2282,18 +3066,23 @@ func TestControllerUnpublishBackoff(t *testing.T) { return } - // Mock an error + // Mock an error. This will produce an Internal error, which is different from + // the default error and what's used in the failure above, so that the correct + // error code can be confirmed. if err := runUnpublishRequest(unpubreq, true); err == nil { t.Errorf("expected error") } - // The above failure should cause driver to call Backoff.Next() again and a backoff duration of 400 ms duration is set starting at the 200th millisecond. - // For the 200-599 ms, the backoff condition is true, and new controller publish requests will be deined. + // The above failure should cause driver to call backoff.next() again and a + // backoff duration of 400 ms duration is set starting at the 200th + // millisecond. For the 200-599 ms, the backoff condition is true, with an + // internal error this time, and new controller publish requests will be + // denied. for i := 0; i < 399; i++ { tc.config.clock.Step(step) var err error _, err = driver.cs.ControllerUnpublishVolume(context.Background(), unpubreq) - if !isUnavailableError(err) { + if !isInternalError(err) { t.Errorf("unexpected error %v", err) } } @@ -2347,9 +3136,11 @@ func TestControllerUnpublishSucceedsIfNotFound(t *testing.T) { func TestControllerPublishBackoff(t *testing.T) { for desc, tc := range map[string]struct { - config *backoffDriverConfig + config *backoffDriverConfig + forceAttach bool }{ - "success": {}, + "success": {}, + "force attach": {forceAttach: true}, "missing instance": { config: &backoffDriverConfig{ mockMissingInstance: true, @@ -2367,8 +3158,8 @@ func TestControllerPublishBackoff(t *testing.T) { backoffId := driver.cs.errorBackoff.backoffId(testNodeID, testVolumeID) step := 1 * time.Millisecond - // Mock an active backoff condition on the node. - driver.cs.errorBackoff.next(backoffId) + // Mock an active bakcoff condition on the node. + driver.cs.errorBackoff.next(backoffId, codes.Unavailable) // A detach request for a different disk should succeed. As this disk is not // on the instance, the detach will succeed without calling the gce detach @@ -2378,6 +3169,12 @@ func TestControllerPublishBackoff(t *testing.T) { t.Errorf("expected no error on different unpublish, got %v", err) } + var volumeContext map[string]string + if tc.forceAttach { + volumeContext = map[string]string{ + contextForceAttach: "true", + } + } pubreq := &csi.ControllerPublishVolumeRequest{ VolumeId: testVolumeID, NodeId: testNodeID, @@ -2389,6 +3186,7 @@ func TestControllerPublishBackoff(t *testing.T) { Mode: csi.VolumeCapability_AccessMode_SINGLE_NODE_WRITER, }, }, + VolumeContext: volumeContext, } // For the first 199 ms, the backoff condition is true. All controller publish request will be denied with 'Unavailable' error code. for i := 0; i < 199; i++ { @@ -2434,13 +3232,16 @@ func TestControllerPublishBackoff(t *testing.T) { t.Errorf("expected error") } - // The above failure should cause driver to call Backoff.Next() again and a backoff duration of 400 ms duration is set starting at the 200th millisecond. - // For the 200-599 ms, the backoff condition is true, and new controller publish requests will be deined. + // The above failure should cause driver to call backoff.next() again and a + // backoff duration of 400 ms duration is set starting at the 200th + // millisecond. For the 200-599 ms, the backoff condition is true, with an + // internal error this time, and new controller publish requests will be + // denied. for i := 0; i < 399; i++ { tc.config.clock.Step(step) var err error _, err = driver.cs.ControllerPublishVolume(context.Background(), pubreq) - if !isUnavailableError(err) { + if !isInternalError(err) { t.Errorf("unexpected error %v", err) } } @@ -2452,6 +3253,18 @@ func TestControllerPublishBackoff(t *testing.T) { t.Errorf("unexpected error") } + if tc.forceAttach { + instance, err := driver.cs.CloudProvider.GetInstanceOrError(context.Background(), zone, node) + if err != nil { + t.Fatalf("%s instance not found: %v", node, err) + } + for _, disk := range instance.Disks { + if !disk.ForceAttach { + t.Errorf("Expected %s to be force attached", disk.DeviceName) + } + } + } + // Driver is expected to remove the node key from the backoff map. t1 := driver.cs.errorBackoff.backoff.Get(string(backoffId)) if t1 != 0 { @@ -2461,11 +3274,12 @@ func TestControllerPublishBackoff(t *testing.T) { } } -func TestCleanSelfLink(t *testing.T) { +func TestGetResource(t *testing.T) { testCases := []struct { - name string - in string - want string + name string + in string + want string + error bool }{ { name: "v1 full standard w/ endpoint prefix", @@ -2483,24 +3297,38 @@ func TestCleanSelfLink(t *testing.T) { want: "projects/project/zones/zone/disks/disk", }, { - name: "no prefix", - in: "projects/project/zones/zone/disks/disk", - want: "projects/project/zones/zone/disks/disk", + name: "no prefix", + in: "projects/project/zones/zone/disks/disk", + error: true, }, - { - name: "no prefix + project omitted", - in: "zones/zone/disks/disk", - want: "zones/zone/disks/disk", + name: "no prefix + project omitted", + in: "zones/zone/disks/disk", + error: true, }, { - name: "Compute prefix, google api", + name: "Compute prefix, www google api", in: "https://www.compute.googleapis.com/compute/v1/projects/project/zones/zone/disks/disk", want: "projects/project/zones/zone/disks/disk", }, { name: "Compute prefix, partner api", - in: "https://www.compute.PARTNERapis.com/compute/v1/projects/project/zones/zone/disks/disk", + in: "https://www.compute.partnerapis.com/compute/v1/projects/project/zones/zone/disks/disk", + want: "projects/project/zones/zone/disks/disk", + }, + { + name: "Compute, alternate googleapis host", + in: "https://content-compute.googleapis.com/compute/v1/projects/project/zones/zone/disks/disk", + want: "projects/project/zones/zone/disks/disk", + }, + { + name: "Compute, partner host", + in: "https://compute.blahapis.com/compute/v1/projects/project/zones/zone/disks/disk", + want: "projects/project/zones/zone/disks/disk", + }, + { + name: "Alternate partner host with mtls domain", + in: "https://content-compute.us-central1.rep.mtls.googleapis.com/compute/v1/projects/project/zones/zone/disks/disk", want: "projects/project/zones/zone/disks/disk", }, { @@ -2513,14 +3341,167 @@ func TestCleanSelfLink(t *testing.T) { in: "https://www.partnerapis.com/compute/alpha/projects/project/zones/zone/disks/disk", want: "projects/project/zones/zone/disks/disk", }, + { + name: "alpha project", + in: "https://www.googleapis.com/compute/alpha/projects/alphaproject/zones/zone/disks/disk", + want: "projects/alphaproject/zones/zone/disks/disk", + }, + { + name: "beta project", + in: "https://www.googleapis.com/compute/alpha/projects/betabeta/zones/zone/disks/disk", + want: "projects/betabeta/zones/zone/disks/disk", + }, + { + name: "v1 project", + in: "https://www.googleapis.com/compute/alpha/projects/projectv1/zones/zone/disks/disk", + want: "projects/projectv1/zones/zone/disks/disk", + }, + { + name: "random host", + in: "https://npr.org/compute/v1/projects/project/zones/zone/disks/disk", + want: "projects/project/zones/zone/disks/disk", + }, + { + name: "no prefix", + in: "projects/project/zones/zone/disks/disk", + error: true, + }, + { + name: "bad scheme", + in: "ftp://www.googleapis.com/compute/v1/projects/project/zones/zone/disks/disk", + error: true, + }, + { + name: "insecure scheme", + in: "http://www.googleapis.com/compute/v1/projects/project/zones/zone/disks/disk", + error: true, + }, + { + name: "bad service", + in: "https://www.googleapis.com/computers/v1/projects/project/zones/zone/disks/disk", + error: true, + }, + { + name: "bad version", + in: "https://www..googleapis.com/compute/zeta/projects/project/zones/zone/disks/disk", + error: true, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + got, err := getResourceId(tc.in) + if tc.error { + if err == nil { + t.Errorf("Expected error, but got none") + } + } else { + if err != nil { + t.Errorf("Unexpected error %v", err) + } else if got != tc.want { + t.Errorf("Expected cleaned self link: %v, got: %v", tc.want, got) + } + } + }) } +} +func TestCreateConfidentialVolume(t *testing.T) { + // Define test cases + testCases := []struct { + name string + volKey *meta.Key + req *csi.CreateVolumeRequest + diskStatus string + expErrCode codes.Code + }{ + { + name: "create confidential volume from snapshot", + volKey: meta.ZonalKey("my-disk", zone), + diskStatus: "READY", + req: &csi.CreateVolumeRequest{ + Name: "test-volume", + CapacityRange: stdCapRange, + VolumeCapabilities: stdVolCaps, + Parameters: map[string]string{ + common.ParameterKeyEnableConfidentialCompute: "true", + common.ParameterKeyDiskEncryptionKmsKey: testDiskEncryptionKmsKey, + common.ParameterKeyType: "hyperdisk-balanced", + }, + VolumeContentSource: &csi.VolumeContentSource{ + Type: &csi.VolumeContentSource_Snapshot{ + Snapshot: &csi.VolumeContentSource_SnapshotSource{ + SnapshotId: testSnapshotID, + }, + }, + }, + }, + }, + { + name: "create volume from snapshot with confidential-compute disabled", + volKey: meta.ZonalKey("my-disk", zone), + diskStatus: "READY", + req: &csi.CreateVolumeRequest{ + Name: "test-volume", + CapacityRange: stdCapRange, + VolumeCapabilities: stdVolCaps, + Parameters: map[string]string{ + common.ParameterKeyEnableConfidentialCompute: "false", + common.ParameterKeyType: "hyperdisk-balanced", + }, + VolumeContentSource: &csi.VolumeContentSource{ + Type: &csi.VolumeContentSource_Snapshot{ + Snapshot: &csi.VolumeContentSource_SnapshotSource{ + SnapshotId: testSnapshotID, + }, + }, + }, + }, + }, + } for _, tc := range testCases { + t.Logf("test case: %s", tc.name) t.Run(tc.name, func(t *testing.T) { - got := cleanSelfLink(tc.in) - if got != tc.want { - t.Errorf("Expected cleaned self link: %v, got: %v", tc.want, got) + fcp, err := gce.CreateFakeCloudProvider(project, zone, nil) + if err != nil { + t.Fatalf("Failed to create fake cloud provider: %v", err) + } + // Setup new driver each time so no interference + gceDriver := initGCEDriverWithCloudProvider(t, fcp) + + if tc.req.VolumeContentSource.GetType() != nil { + snapshotParams, err := common.ExtractAndDefaultSnapshotParameters(nil, gceDriver.name) + if err != nil { + t.Errorf("Got error extracting snapshot parameters: %v", err) + } + if snapshotParams.SnapshotType == common.DiskSnapshotType { + fcp.CreateSnapshot(context.Background(), project, tc.volKey, name, snapshotParams) + } else { + t.Fatalf("No volume source mentioned in snapshot parameters %v", snapshotParams) + } + } + + // Start Test + resp, err := gceDriver.cs.CreateVolume(context.Background(), tc.req) + if err != nil { + serverError, ok := status.FromError(err) + if !ok { + t.Fatalf("Could not get error status code from err: %v", serverError) + } + t.Errorf("Recieved error %v", serverError) + } + + volumeId := resp.GetVolume().VolumeId + project, volumeKey, err := common.VolumeIDToKey(volumeId) + createdDisk, err := fcp.GetDisk(context.Background(), project, volumeKey, gce.GCEAPIVersionBeta) + if err != nil { + t.Fatalf("Get Disk failed for created disk with error: %v", err) } + val, ok := tc.req.Parameters[common.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) + } + t.Logf("Created disk for confidentialCompute %v with parametrs, %v", createdDisk.GetEnableConfidentialCompute(), tc.req.Parameters) }) } } @@ -2572,3 +3553,16 @@ func isUnavailableError(err error) bool { return st.Code().String() == "Unavailable" } + +func isInternalError(err error) bool { + if err == nil { + return false + } + + st, ok := status.FromError(err) + if !ok { + return false + } + + return st.Code().String() == "Internal" +} diff --git a/pkg/gce-pd-csi-driver/gce-pd-driver.go b/pkg/gce-pd-csi-driver/gce-pd-driver.go index 251bc942..6a5ff3f2 100644 --- a/pkg/gce-pd-csi-driver/gce-pd-driver.go +++ b/pkg/gce-pd-csi-driver/gce-pd-driver.go @@ -159,7 +159,7 @@ func NewIdentityServer(gceDriver *GCEDriver) *GCEIdentityServer { } } -func NewNodeServer(gceDriver *GCEDriver, mounter *mount.SafeFormatAndMount, deviceUtils deviceutils.DeviceUtils, meta metadataservice.MetadataService, statter mountmanager.Statter, mapper cryptMapper, evalSymLinks func(string) (string, error)) *GCENodeServer { +func NewNodeServer(gceDriver *GCEDriver, mounter *mount.SafeFormatAndMount, deviceUtils deviceutils.DeviceUtils, meta metadataservice.MetadataService, statter mountmanager.Statter, mapper cryptMapper) *GCENodeServer { return &GCENodeServer{ Driver: gceDriver, Mounter: mounter, @@ -168,7 +168,6 @@ func NewNodeServer(gceDriver *GCEDriver, mounter *mount.SafeFormatAndMount, devi volumeLocks: common.NewVolumeLocks(), VolumeStatter: statter, CryptMapper: mapper, - evalSymLinks: evalSymLinks, } } diff --git a/pkg/gce-pd-csi-driver/node.go b/pkg/gce-pd-csi-driver/node.go index 3b74af47..e4107f9d 100644 --- a/pkg/gce-pd-csi-driver/node.go +++ b/pkg/gce-pd-csi-driver/node.go @@ -38,6 +38,7 @@ import ( "os" "path/filepath" "runtime" + "time" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -72,8 +73,16 @@ type GCENodeServer struct { // A map storing all volumes with ongoing operations so that additional operations // for that same volume (as defined by VolumeID) return an Aborted error - volumeLocks *common.VolumeLocks - evalSymLinks func(string) (string, error) + volumeLocks *common.VolumeLocks + + // If set, this semaphore will be used to serialize formatAndMount. It will be raised + // when the operation starts, and lowered either when finished, or when + // formatAndMountTimeout has expired. + // + // This is used only on linux (where memory problems for concurrent fsck and mkfs have + // been observed). + formatAndMountSemaphore chan any + formatAndMountTimeout time.Duration } var _ csi.NodeServer = &GCENodeServer{} @@ -115,6 +124,14 @@ func (ns *GCENodeServer) isVolumePathMounted(path string) bool { return false } +func (ns *GCENodeServer) WithSerializedFormatAndMount(timeout time.Duration, maxConcurrent int) *GCENodeServer { + if maxConcurrent > 0 { + ns.formatAndMountSemaphore = make(chan any, maxConcurrent) + ns.formatAndMountTimeout = timeout + } + return ns +} + func (ns *GCENodeServer) NodePublishVolume(ctx context.Context, req *csi.NodePublishVolumeRequest) (*csi.NodePublishVolumeResponse, error) { // Validate Arguments targetPath := req.GetTargetPath() @@ -182,10 +199,8 @@ func (ns *GCENodeServer) NodePublishVolume(ctx context.Context, req *csi.NodePub if err != nil { return nil, status.Error(codes.Internal, fmt.Sprintf("Error when getting device path: %v", err.Error())) } - sourcePath, err = ns.evalSymLinks(filepath.Join("/dev/mapper", volumeKey.Name)) - if err != nil { - return nil, status.Error(codes.Internal, fmt.Sprintf("NodePublishVolume can not evaluate source path: %v", err.Error())) - } + + sourcePath = filepath.Join("/dev/mapper", volumeKey.Name) // Expose block volume as file at target path err = makeFile(targetPath) @@ -341,12 +356,9 @@ func (ns *GCENodeServer) NodeStageVolume(ctx context.Context, req *csi.NodeStage if integrity { klog.V(4).Infof("Integrity protected FS requested. Preparing to wipe device...") } - devicePathReal, err := ns.evalSymLinks(devicePath) - if err != nil { - return nil, status.Error(codes.Internal, fmt.Sprintf("could not evaluate device path for device %q: %v", devicePath, err)) - } - klog.V(4).Infof("Creating LUKS2 device on %s", devicePathReal) - devicePath, err = ns.CryptMapper.OpenCryptDevice(ctx, devicePathReal, volumeKey.Name, integrity) + + klog.V(4).Infof("Creating LUKS2 device on %s", devicePath) + devicePath, err = ns.CryptMapper.OpenCryptDevice(ctx, devicePath, volumeKey.Name, integrity) if err != nil { return nil, status.Error(codes.Internal, fmt.Sprintf("NodeStageVolume failed on volume %v to %s, open crypt device failed (%v)", devicePath, stagingTargetPath, err)) } @@ -365,7 +377,7 @@ func (ns *GCENodeServer) NodeStageVolume(ctx context.Context, req *csi.NodeStage klog.V(4).Infof("CSI volume is read-only, mounting with extra option ro") } - err = formatAndMount(devicePath, stagingTargetPath, fstype, options, ns.Mounter) + err = ns.formatAndMount(devicePath, stagingTargetPath, fstype, options, ns.Mounter) if err != nil { // If a volume is created from a content source like snapshot or cloning, the filesystem might get marked // as "dirty" even if it is otherwise consistent and ext3/4 will try to restore to a consistent state by replaying @@ -376,7 +388,7 @@ func (ns *GCENodeServer) NodeStageVolume(ctx context.Context, req *csi.NodeStage klog.V(4).Infof("Failed to mount CSI volume read-only, retry mounting with extra option noload") options = append(options, "noload") - err = formatAndMount(devicePath, stagingTargetPath, fstype, options, ns.Mounter) + err = ns.formatAndMount(devicePath, stagingTargetPath, fstype, options, ns.Mounter) if err == nil { klog.V(4).Infof("NodeStageVolume succeeded with \"noload\" option on %v to %s", volumeID, stagingTargetPath) return &csi.NodeStageVolumeResponse{}, nil @@ -389,10 +401,12 @@ func (ns *GCENodeServer) NodeStageVolume(ctx context.Context, req *csi.NodeStage // Part 4: Resize filesystem. // https://github.com/kubernetes/kubernetes/issues/94929 - resizer := resizefs.NewResizeFs(ns.Mounter) - _, err = ns.DeviceUtils.Resize(resizer, devicePath, stagingTargetPath) - if err != nil { - return nil, status.Error(codes.Internal, fmt.Sprintf("error when resizing volume %s from device '%s' at path '%s': %v", volumeID, devicePath, stagingTargetPath, err.Error())) + if !readonly { + resizer := resizefs.NewResizeFs(ns.Mounter) + _, err = ns.DeviceUtils.Resize(resizer, devicePath, stagingTargetPath) + if err != nil { + return nil, status.Error(codes.Internal, fmt.Sprintf("error when resizing volume %s from device '%s' at path '%s': %v", volumeID, devicePath, stagingTargetPath, err.Error())) + } } klog.V(4).Infof("NodeStageVolume succeeded on %v to %s", volumeID, stagingTargetPath) @@ -552,6 +566,15 @@ func (ns *GCENodeServer) NodeExpandVolume(ctx context.Context, req *csi.NodeExpa klog.Error("Integrity protected devices can not be resized") return nil, status.Error(codes.InvalidArgument, "integrity protected devices can not be resized") } + + readonly, err := getReadOnlyFromCapability(volumeCapability) + if err != nil { + return nil, status.Error(codes.Internal, fmt.Sprintf("failed to check if capability for volume %s is readonly: %v", volumeID, err)) + } + if readonly { + klog.V(4).Infof("NodeExpandVolume succeeded on %v to %s, capability access is readonly so this is a no-op", volumeID, volumePath) + return &csi.NodeExpandVolumeResponse{}, nil + } } devicePath, err := ns.CryptMapper.ResizeCryptDevice(ctx, volKey.Name) diff --git a/pkg/gce-pd-csi-driver/node_test.go b/pkg/gce-pd-csi-driver/node_test.go index 599a60e3..459134c6 100644 --- a/pkg/gce-pd-csi-driver/node_test.go +++ b/pkg/gce-pd-csi-driver/node_test.go @@ -38,7 +38,9 @@ import ( "io/ioutil" "os" "path/filepath" + "strings" "testing" + "time" "k8s.io/utils/exec" testingexec "k8s.io/utils/exec/testing" @@ -78,21 +80,17 @@ func (s *fakeCryptMapper) GetDevicePath(volumeID string) (string, error) { return s.deviceName, nil } -func fakeEvalSymlinks(path string) (string, error) { - return path, nil -} - func getTestGCEDriver(t *testing.T) *GCEDriver { - return getCustomTestGCEDriver(t, mountmanager.NewFakeSafeMounter(), deviceutils.NewFakeDeviceUtils(), metadataservice.NewFakeService()) + return getCustomTestGCEDriver(t, mountmanager.NewFakeSafeMounter(), deviceutils.NewFakeDeviceUtils(false), metadataservice.NewFakeService()) } func getTestGCEDriverWithCustomMounter(t *testing.T, mounter *mount.SafeFormatAndMount) *GCEDriver { - return getCustomTestGCEDriver(t, mounter, deviceutils.NewFakeDeviceUtils(), metadataservice.NewFakeService()) + return getCustomTestGCEDriver(t, mounter, deviceutils.NewFakeDeviceUtils(false), metadataservice.NewFakeService()) } func getCustomTestGCEDriver(t *testing.T, mounter *mount.SafeFormatAndMount, deviceUtils deviceutils.DeviceUtils, metaService metadataservice.MetadataService) *GCEDriver { gceDriver := GetGCEDriver() - nodeServer := NewNodeServer(gceDriver, mounter, deviceUtils, metaService, mountmanager.NewFakeStatter(mounter), &fakeCryptMapper{}, fakeEvalSymlinks) + nodeServer := NewNodeServer(gceDriver, mounter, deviceUtils, metaService, mountmanager.NewFakeStatter(mounter), &fakeCryptMapper{}) err := gceDriver.SetupGCEDriver(driver, "test-vendor", nil, nil, nil, nodeServer) if err != nil { t.Fatalf("Failed to setup GCE Driver: %v", err) @@ -100,10 +98,22 @@ func getCustomTestGCEDriver(t *testing.T, mounter *mount.SafeFormatAndMount, dev return gceDriver } -func getTestBlockingGCEDriver(t *testing.T, readyToExecute chan chan struct{}) *GCEDriver { +func getTestBlockingMountGCEDriver(t *testing.T, readyToExecute chan chan struct{}) *GCEDriver { gceDriver := GetGCEDriver() mounter := mountmanager.NewFakeSafeBlockingMounter(readyToExecute) - nodeServer := NewNodeServer(gceDriver, mounter, deviceutils.NewFakeDeviceUtils(), metadataservice.NewFakeService(), mountmanager.NewFakeStatter(mounter), &fakeCryptMapper{}, fakeEvalSymlinks) + nodeServer := NewNodeServer(gceDriver, mounter, deviceutils.NewFakeDeviceUtils(false), metadataservice.NewFakeService(), mountmanager.NewFakeStatter(mounter), &fakeCryptMapper{}) + err := gceDriver.SetupGCEDriver(driver, "test-vendor", nil, nil, nil, nodeServer) + if err != nil { + t.Fatalf("Failed to setup GCE Driver: %v", err) + } + return gceDriver +} + +func getTestBlockingFormatAndMountGCEDriver(t *testing.T, readyToExecute chan chan struct{}) *GCEDriver { + gceDriver := GetGCEDriver() + mounter := mountmanager.NewFakeSafeBlockingMounter(readyToExecute) + nodeServer := NewNodeServer(gceDriver, mounter, deviceutils.NewFakeDeviceUtils(false), metadataservice.NewFakeService(), mountmanager.NewFakeStatter(mounter), &fakeCryptMapper{}).WithSerializedFormatAndMount(5*time.Second, 1) + err := gceDriver.SetupGCEDriver(driver, "test-vendor", nil, nil, nil, nodeServer) if err != nil { t.Fatalf("Failed to setup GCE Driver: %v", err) @@ -422,26 +432,61 @@ func TestNodeStageVolume(t *testing.T) { stagingPath := filepath.Join(tempDir, defaultStagingPath) testCases := []struct { - name string - req *csi.NodeStageVolumeRequest - expErrCode codes.Code + name string + req *csi.NodeStageVolumeRequest + deviceSize int + blockExtSize int + readonlyBit string + expResize bool + expErrCode codes.Code }{ { - name: "Valid request", + name: "Valid request, no resize because block and filesystem sizes match", req: &csi.NodeStageVolumeRequest{ VolumeId: volumeID, StagingTargetPath: stagingPath, VolumeCapability: stdVolCap, }, + deviceSize: 1, + blockExtSize: 1, + readonlyBit: "0", + expResize: false, }, { - name: "Invalid request (Bad Access Mode)", + name: "Valid request, no resize bc readonly", req: &csi.NodeStageVolumeRequest{ VolumeId: volumeID, StagingTargetPath: stagingPath, - VolumeCapability: createVolumeCapability(csi.VolumeCapability_AccessMode_UNKNOWN), + VolumeCapability: stdVolCap, }, - expErrCode: codes.InvalidArgument, + deviceSize: 1, + blockExtSize: 1, + readonlyBit: "1", + expResize: false, + }, + { + name: "Valid request, resize bc size", + req: &csi.NodeStageVolumeRequest{ + VolumeId: volumeID, + StagingTargetPath: stagingPath, + VolumeCapability: stdVolCap, + }, + deviceSize: 5, + blockExtSize: 1, + readonlyBit: "0", + expResize: true, + }, + { + name: "Valid request, no resize bc readonly capability", + req: &csi.NodeStageVolumeRequest{ + VolumeId: volumeID, + StagingTargetPath: stagingPath, + VolumeCapability: createVolumeCapability(csi.VolumeCapability_AccessMode_MULTI_NODE_READER_ONLY), + }, + deviceSize: 5, + blockExtSize: 1, + readonlyBit: "0", + expResize: false, }, { name: "Invalid request (Bad Access Mode)", @@ -489,6 +534,7 @@ func TestNodeStageVolume(t *testing.T) { } for _, tc := range testCases { t.Logf("Test case: %s", tc.name) + resizeCalled := false actionList := []testingexec.FakeCommandAction{ makeFakeCmd( &testingexec.FakeCmd{ @@ -499,26 +545,40 @@ func TestNodeStageVolume(t *testing.T) { }, }, "blkid", + strings.Split("-p -s TYPE -s PTTYPE -o export /dev/disk/fake-path", " ")..., + ), + makeFakeCmd( + &testingexec.FakeCmd{ + CombinedOutputScript: []testingexec.FakeAction{ + func() ([]byte, []byte, error) { + return []byte(""), nil, nil + }, + }, + }, + "fsck", + strings.Split("-a /dev/disk/fake-path", " ")..., ), makeFakeCmd( &testingexec.FakeCmd{ CombinedOutputScript: []testingexec.FakeAction{ func() ([]byte, []byte, error) { - return []byte("1"), nil, nil + return []byte(tc.readonlyBit), nil, nil }, }, }, "blockdev", + strings.Split("--getro /dev/disk/fake-path", " ")..., ), makeFakeCmd( &testingexec.FakeCmd{ CombinedOutputScript: []testingexec.FakeAction{ func() ([]byte, []byte, error) { - return []byte("1"), nil, nil + return []byte(fmt.Sprintf("%d", tc.deviceSize)), nil, nil }, }, }, "blockdev", + strings.Split("--getsize64 /dev/disk/fake-path", " ")..., ), makeFakeCmd( &testingexec.FakeCmd{ @@ -529,18 +589,48 @@ func TestNodeStageVolume(t *testing.T) { }, }, "blkid", + strings.Split("-p -s TYPE -s PTTYPE -o export /dev/disk/fake-path", " ")..., ), makeFakeCmd( &testingexec.FakeCmd{ CombinedOutputScript: []testingexec.FakeAction{ func() ([]byte, []byte, error) { - return []byte(fmt.Sprintf("block size: 1\nblock count: 1")), nil, nil + return []byte(fmt.Sprintf("block size: %d\nblock count: 1", tc.blockExtSize)), nil, nil }, }, }, "dumpe2fs", + strings.Split("-h /dev/disk/fake-path", " ")..., ), } + + if tc.expResize { + actionList = append(actionList, []testingexec.FakeCommandAction{ + makeFakeCmd( + &testingexec.FakeCmd{ + CombinedOutputScript: []testingexec.FakeAction{ + func() ([]byte, []byte, error) { + return []byte(fmt.Sprintf("DEVNAME=/dev/sdb\nTYPE=ext4")), nil, nil + }, + }, + }, + "blkid", + strings.Split("-p -s TYPE -s PTTYPE -o export /dev/disk/fake-path", " ")..., + ), + makeFakeCmd( + &testingexec.FakeCmd{ + CombinedOutputScript: []testingexec.FakeAction{ + func() ([]byte, []byte, error) { + resizeCalled = true + return []byte(fmt.Sprintf("DEVNAME=/dev/sdb\nTYPE=ext4")), nil, nil + }, + }, + }, + "resize2fs", + strings.Split("/dev/disk/fake-path", " ")..., + ), + }...) + } mounter := mountmanager.NewFakeSafeMounterWithCustomExec(&testingexec.FakeExec{CommandScript: actionList}) gceDriver := getTestGCEDriverWithCustomMounter(t, mounter) ns := gceDriver.ns @@ -558,6 +648,12 @@ func TestNodeStageVolume(t *testing.T) { if tc.expErrCode != codes.OK { t.Fatalf("Expected error: %v, got no error", tc.expErrCode) } + if tc.expResize == true && resizeCalled == false { + t.Fatalf("Test did not call resize, but it was expected.") + } + if tc.expResize == false && resizeCalled == true { + t.Fatalf("Test called resize, but it was not expected.") + } } } @@ -803,9 +899,7 @@ func TestNodeGetCapabilities(t *testing.T) { } } -func TestConcurrentNodeOperations(t *testing.T) { - readyToExecute := make(chan chan struct{}, 1) - gceDriver := getTestBlockingGCEDriver(t, readyToExecute) +func runBlockingFormatAndMount(t *testing.T, gceDriver *GCEDriver, readyToExecute chan chan struct{}) { ns := gceDriver.ns tempDir, err := ioutil.TempDir("", "cno") if err != nil { @@ -885,3 +979,15 @@ func TestConcurrentNodeOperations(t *testing.T) { t.Errorf("Unexpected error: %v", err) } } + +func TestBlockingMount(t *testing.T) { + readyToExecute := make(chan chan struct{}, 1) + gceDriver := getTestBlockingMountGCEDriver(t, readyToExecute) + runBlockingFormatAndMount(t, gceDriver, readyToExecute) +} + +func TestBlockingFormatAndMount(t *testing.T) { + readyToExecute := make(chan chan struct{}, 1) + gceDriver := getTestBlockingFormatAndMountGCEDriver(t, readyToExecute) + runBlockingFormatAndMount(t, gceDriver, readyToExecute) +} diff --git a/pkg/gce-pd-csi-driver/utils.go b/pkg/gce-pd-csi-driver/utils.go index c81fc5be..d8ef8ce0 100644 --- a/pkg/gce-pd-csi-driver/utils.go +++ b/pkg/gce-pd-csi-driver/utils.go @@ -17,17 +17,12 @@ limitations under the License. package gceGCEDriver import ( + "context" "errors" "fmt" - "net/http" - - "context" csi "github.com/container-storage-interface/spec/lib/go/csi" - "google.golang.org/api/googleapi" "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" "k8s.io/klog/v2" ) @@ -217,36 +212,3 @@ func containsZone(zones []string, zone string) bool { return false } - -// CodeForError returns a pointer to the grpc error code that maps to the http -// error code for the passed in user googleapi error. Returns codes.Internal if -// the given error is not a googleapi error caused by the user. The following -// http error codes are considered user errors: -// (1) http 400 Bad Request, returns grpc InvalidArgument, -// (2) http 403 Forbidden, returns grpc PermissionDenied, -// (3) http 404 Not Found, returns grpc NotFound -// (4) http 429 Too Many Requests, returns grpc ResourceExhausted -func CodeForError(err error) *codes.Code { - internalErrorCode := codes.Internal - // Upwrap the error - var apiErr *googleapi.Error - if !errors.As(err, &apiErr) { - return &internalErrorCode - } - - userErrors := map[int]codes.Code{ - http.StatusForbidden: codes.PermissionDenied, - http.StatusBadRequest: codes.InvalidArgument, - http.StatusTooManyRequests: codes.ResourceExhausted, - http.StatusNotFound: codes.NotFound, - } - if code, ok := userErrors[apiErr.Code]; ok { - return &code - } - return &internalErrorCode -} - -func LoggedError(msg string, err error) error { - klog.Errorf(msg+"%v", err.Error()) - return status.Errorf(*CodeForError(err), msg+"%v", err.Error()) -} diff --git a/pkg/gce-pd-csi-driver/utils_linux.go b/pkg/gce-pd-csi-driver/utils_linux.go index a1afe786..e686323c 100644 --- a/pkg/gce-pd-csi-driver/utils_linux.go +++ b/pkg/gce-pd-csi-driver/utils_linux.go @@ -21,6 +21,7 @@ import ( "path" "strconv" "strings" + "time" "k8s.io/mount-utils" "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/common" @@ -53,7 +54,33 @@ func getDevicePath(ns *GCENodeServer, volumeID, partition string) (string, error // return devicePath, nil } -func formatAndMount(source, target, fstype string, options []string, m *mount.SafeFormatAndMount) error { +func (ns *GCENodeServer) formatAndMount(source, target, fstype string, options []string, m *mount.SafeFormatAndMount) error { + if ns.formatAndMountSemaphore != nil { + done := make(chan any) + defer close(done) + + // Aquire the semaphore. This will block if another formatAndMount has put an item + // into the semaphore channel. + ns.formatAndMountSemaphore <- struct{}{} + + go func() { + defer func() { <-ns.formatAndMountSemaphore }() + + // Add a timeout where so the semaphore will be released even if + // formatAndMount is still working. This allows the node to make progress on + // volumes if some error causes one formatAndMount to get stuck. The + // motivation for this serialization is to reduce memory usage; if stuck + // processes cause OOMs then the containers will be killed and restarted, + // including the stuck threads and with any luck making progress. + timeout := time.NewTimer(ns.formatAndMountTimeout) + defer timeout.Stop() + + select { + case <-done: + case <-timeout.C: + } + }() + } return m.FormatAndMount(source, target, fstype, options) } diff --git a/pkg/gce-pd-csi-driver/utils_test.go b/pkg/gce-pd-csi-driver/utils_test.go index ab92e45e..2a0fd5f4 100644 --- a/pkg/gce-pd-csi-driver/utils_test.go +++ b/pkg/gce-pd-csi-driver/utils_test.go @@ -18,13 +18,9 @@ limitations under the License. package gceGCEDriver import ( - "errors" - "net/http" "testing" csi "github.com/container-storage-interface/spec/lib/go/csi" - "google.golang.org/api/googleapi" - "google.golang.org/grpc/codes" ) var ( @@ -295,37 +291,3 @@ func TestGetReadOnlyFromCapabilities(t *testing.T) { } } } - -func TestCodeForError(t *testing.T) { - internalErrorCode := codes.Internal - userErrorCode := codes.InvalidArgument - testCases := []struct { - name string - inputErr error - expCode *codes.Code - }{ - { - name: "Not googleapi.Error", - inputErr: errors.New("I am not a googleapi.Error"), - expCode: &internalErrorCode, - }, - { - name: "User error", - inputErr: &googleapi.Error{Code: http.StatusBadRequest, Message: "User error with bad request"}, - expCode: &userErrorCode, - }, - { - name: "googleapi.Error but not a user error", - inputErr: &googleapi.Error{Code: http.StatusInternalServerError, Message: "Internal error"}, - expCode: &internalErrorCode, - }, - } - - for _, tc := range testCases { - t.Logf("Running test: %v", tc.name) - actualCode := *CodeForError(tc.inputErr) - if *tc.expCode != actualCode { - t.Fatalf("Expected error code '%v' but got '%v'", tc.expCode, actualCode) - } - } -} diff --git a/pkg/gce-pd-csi-driver/utils_windows.go b/pkg/gce-pd-csi-driver/utils_windows.go index 4661cd89..b12f4f82 100644 --- a/pkg/gce-pd-csi-driver/utils_windows.go +++ b/pkg/gce-pd-csi-driver/utils_windows.go @@ -24,7 +24,7 @@ import ( mounter "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/mount-manager" ) -func formatAndMount(source, target, fstype string, options []string, m *mount.SafeFormatAndMount) error { +func (ns *GCENodeServer) formatAndMount(source, target, fstype string, options []string, m *mount.SafeFormatAndMount) error { if !strings.EqualFold(fstype, defaultWindowsFsType) { return fmt.Errorf("GCE PD CSI driver can only supports %s file system, it does not support %s", defaultWindowsFsType, fstype) } diff --git a/pkg/metrics/metrics.go b/pkg/metrics/metrics.go index cae37923..a08f5074 100644 --- a/pkg/metrics/metrics.go +++ b/pkg/metrics/metrics.go @@ -20,15 +20,22 @@ import ( "fmt" "net/http" "os" + "strconv" + "google.golang.org/grpc/codes" "k8s.io/component-base/metrics" "k8s.io/klog/v2" + "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" ) const ( // envGKEPDCSIVersion is an environment variable set in the PDCSI controller manifest // with the current version of the GKE component. - envGKEPDCSIVersion = "GKE_PDCSI_VERSION" + envGKEPDCSIVersion = "GKE_PDCSI_VERSION" + pdcsiDriverName = "pd.csi.storage.gke.io" + DefaultDiskTypeForMetric = "unknownDiskType" + DefaultEnableConfidentialCompute = "unknownConfidentialMode" ) var ( @@ -37,28 +44,41 @@ var ( Name: "component_version", Help: "Metric to expose the version of the PDCSI GKE component.", }, []string{"component_version"}) + + pdcsiOperationErrorsMetric = metrics.NewCounterVec( + &metrics.CounterOpts{ + Subsystem: "csidriver", + Name: "operation_errors", + Help: "CSI server side error metrics", + StabilityLevel: metrics.ALPHA, + }, + []string{"driver_name", "method_name", "grpc_status_code", "disk_type", "enable_confidential_storage"}) ) -type metricsManager struct { +type MetricsManager struct { registry metrics.KubeRegistry } -func NewMetricsManager() metricsManager { - mm := metricsManager{ +func NewMetricsManager() MetricsManager { + mm := MetricsManager{ registry: metrics.NewKubeRegistry(), } return mm } -func (mm *metricsManager) GetRegistry() metrics.KubeRegistry { +func (mm *MetricsManager) GetRegistry() metrics.KubeRegistry { return mm.registry } -func (mm *metricsManager) registerComponentVersionMetric() { +func (mm *MetricsManager) registerComponentVersionMetric() { mm.registry.MustRegister(gkeComponentVersion) } -func (mm *metricsManager) recordComponentVersionMetric() error { +func (mm *MetricsManager) RegisterPDCSIMetric() { + mm.registry.MustRegister(pdcsiOperationErrorsMetric) +} + +func (mm *MetricsManager) recordComponentVersionMetric() error { v := getEnvVar(envGKEPDCSIVersion) if v == "" { klog.V(2).Info("Skip emitting component version metric") @@ -70,7 +90,19 @@ func (mm *metricsManager) recordComponentVersionMetric() error { return nil } -func (mm *metricsManager) EmitGKEComponentVersion() error { +func (mm *MetricsManager) RecordOperationErrorMetrics( + operationName string, + operationErr error, + diskType string, + enableConfidentialStorage string) { + err := codes.OK.String() + if operationErr != nil { + err = common.CodeForError(operationErr).String() + } + pdcsiOperationErrorsMetric.WithLabelValues(pdcsiDriverName, "/csi.v1.Controller/"+operationName, err, diskType, enableConfidentialStorage).Inc() +} + +func (mm *MetricsManager) EmitGKEComponentVersion() error { mm.registerComponentVersionMetric() if err := mm.recordComponentVersionMetric(); err != nil { return err @@ -87,7 +119,7 @@ type Server interface { // RegisterToServer registers an HTTP handler for this metrics manager to the // given server at the specified address/path. -func (mm *metricsManager) registerToServer(s Server, metricsPath string) { +func (mm *MetricsManager) registerToServer(s Server, metricsPath string) { s.Handle(metricsPath, metrics.HandlerFor( mm.GetRegistry(), metrics.HandlerOpts{ @@ -95,7 +127,7 @@ func (mm *metricsManager) registerToServer(s Server, metricsPath string) { } // InitializeHttpHandler sets up a server and creates a handler for metrics. -func (mm *metricsManager) InitializeHttpHandler(address, path string) { +func (mm *MetricsManager) InitializeHttpHandler(address, path string) { mux := http.NewServeMux() mm.registerToServer(mux, path) go func() { @@ -123,3 +155,13 @@ func IsGKEComponentVersionAvailable() bool { return true } + +func GetMetricParameters(disk *gce.CloudDisk) (string, string) { + diskType := DefaultDiskTypeForMetric + enableConfidentialStorage := DefaultEnableConfidentialCompute + if disk != nil { + diskType = disk.GetPDType() + enableConfidentialStorage = strconv.FormatBool(disk.GetEnableConfidentialCompute()) + } + return diskType, enableConfidentialStorage +} diff --git a/pkg/metrics/metrics_test.go b/pkg/metrics/metrics_test.go new file mode 100644 index 00000000..dcf49092 --- /dev/null +++ b/pkg/metrics/metrics_test.go @@ -0,0 +1,81 @@ +/* +Copyright 2023 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 metrics + +import ( + "testing" + + computebeta "google.golang.org/api/compute/v0.beta" + "google.golang.org/api/compute/v1" + gce "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/gce-cloud-provider/compute" +) + +const ( + hyperdiskBalanced = "hyperdisk-balanced" +) + +func CreateDiskWithConfidentialCompute(betaVersion bool, confidentialCompute bool, diskType string) *gce.CloudDisk { + if betaVersion { + return gce.CloudDiskFromBeta(&computebeta.Disk{ + EnableConfidentialCompute: confidentialCompute, + Type: diskType, + }) + } + return gce.CloudDiskFromV1(&compute.Disk{ + Type: diskType, + }) +} + +func TestGetEnableConfidentialCompute(t *testing.T) { + testCases := []struct { + name string + disk *gce.CloudDisk + expectedEnableConfidentialCompute string + expectedDiskType string + }{ + { + name: "test betaDisk with enableConfidentialCompute=false", + disk: CreateDiskWithConfidentialCompute(true, false, hyperdiskBalanced), + expectedEnableConfidentialCompute: "false", + expectedDiskType: hyperdiskBalanced, + }, + { + name: "test betaDisk with enableConfidentialCompute=true", + disk: CreateDiskWithConfidentialCompute(true, true, hyperdiskBalanced), + expectedEnableConfidentialCompute: "true", + expectedDiskType: hyperdiskBalanced, + }, + { + name: "test disk withpit enableConfidentialCompute", + disk: CreateDiskWithConfidentialCompute(false, false, hyperdiskBalanced), + expectedEnableConfidentialCompute: "false", + expectedDiskType: hyperdiskBalanced, + }, + } + + for _, tc := range testCases { + t.Logf("Running test: %v", tc.name) + diskType, confidentialCompute := GetMetricParameters(tc.disk) + if confidentialCompute != tc.expectedEnableConfidentialCompute { + t.Fatalf("Got confidentialCompute value %v expected %v", confidentialCompute, tc.expectedEnableConfidentialCompute) + } + if diskType != tc.expectedDiskType { + t.Fatalf("Got confidentialCompute value %v expected %v", diskType, tc.expectedDiskType) + } + } +} diff --git a/pkg/mount-manager/safe-mounter-v1_windows.go b/pkg/mount-manager/safe-mounter-v1_windows.go index 68233837..92c2b579 100644 --- a/pkg/mount-manager/safe-mounter-v1_windows.go +++ b/pkg/mount-manager/safe-mounter-v1_windows.go @@ -337,3 +337,17 @@ func (mounter *CSIProxyMounterV1) MountSensitiveWithoutSystemd(source string, ta func (mounter *CSIProxyMounterV1) MountSensitiveWithoutSystemdWithMountFlags(source string, target string, fstype string, options []string, sensitiveOptions []string, mountFlags []string) error { return errors.New("MountSensitiveWithoutSystemd is not implemented") } + +// CanSafelySkipMountPointCheck always returns false on Windows. +func (mounter *CSIProxyMounterV1) CanSafelySkipMountPointCheck() bool { + return false +} + +// IsMountPoint returns true if a directory is a mountpoint. +func (mounter *CSIProxyMounterV1) IsMountPoint(file string) (bool, error) { + isNotMnt, err := mounter.IsLikelyNotMountPoint(file) + if err != nil { + return false, err + } + return !isNotMnt, nil +} diff --git a/pkg/mount-manager/safe-mounter-v1beta_windows.go b/pkg/mount-manager/safe-mounter-v1beta_windows.go index 70ce52ee..d765edc6 100644 --- a/pkg/mount-manager/safe-mounter-v1beta_windows.go +++ b/pkg/mount-manager/safe-mounter-v1beta_windows.go @@ -331,3 +331,17 @@ func (mounter *CSIProxyMounterV1Beta) MountSensitiveWithoutSystemd(source string func (mounter *CSIProxyMounterV1Beta) MountSensitiveWithoutSystemdWithMountFlags(source string, target string, fstype string, options []string, sensitiveOptions []string, mountFlags []string) error { return errors.New("MountSensitiveWithoutSystemd is not implemented") } + +// CanSafelySkipMountPointCheck always returns false on Windows. +func (mounter *CSIProxyMounterV1Beta) CanSafelySkipMountPointCheck() bool { + return false +} + +// IsMountPoint returns true if a directory is a mountpoint. +func (mounter *CSIProxyMounterV1Beta) IsMountPoint(file string) (bool, error) { + isNotMnt, err := mounter.IsLikelyNotMountPoint(file) + if err != nil { + return false, err + } + return !isNotMnt, nil +} diff --git a/pkg/mount-manager/safe-mounter_linux.go b/pkg/mount-manager/safe-mounter_linux.go index 40f6c7b3..22d2d8b3 100644 --- a/pkg/mount-manager/safe-mounter_linux.go +++ b/pkg/mount-manager/safe-mounter_linux.go @@ -17,16 +17,13 @@ limitations under the License. package mountmanager import ( + "time" + "k8s.io/mount-utils" "k8s.io/utils/exec" ) -func NewSafeMounter() (*mount.SafeFormatAndMount, error) { - realMounter := mount.New("") - realExec := exec.New() - return &mount.SafeFormatAndMount{ - Interface: realMounter, - Exec: realExec, - }, nil - +func NewSafeMounter(maxConcurrentFormat int, concurrentFormatTimeout time.Duration) (*mount.SafeFormatAndMount, error) { + opt := mount.WithMaxConcurrentFormat(maxConcurrentFormat, concurrentFormatTimeout) + return mount.NewSafeFormatAndMount(mount.New(""), exec.New(), opt), nil } diff --git a/pkg/mount-manager/safe-mounter_windows.go b/pkg/mount-manager/safe-mounter_windows.go index 23e6dd36..b37a4009 100644 --- a/pkg/mount-manager/safe-mounter_windows.go +++ b/pkg/mount-manager/safe-mounter_windows.go @@ -17,6 +17,8 @@ limitations under the License. package mountmanager import ( + "time" + "k8s.io/klog/v2" "k8s.io/mount-utils" utilexec "k8s.io/utils/exec" @@ -58,7 +60,7 @@ type CSIProxyMounter interface { GetDiskTotalBytes(devicePath string) (int64, error) } -func NewSafeMounter() (*mount.SafeFormatAndMount, error) { +func NewSafeMounter(int, time.Duration) (*mount.SafeFormatAndMount, error) { csiProxyMounterV1, err := NewCSIProxyMounterV1() if err == nil { klog.V(4).Infof("using CSIProxyMounterV1, %s", csiProxyMounterV1.GetAPIVersions()) diff --git a/release-tools/SIDECAR_RELEASE_PROCESS.md b/release-tools/SIDECAR_RELEASE_PROCESS.md index 8977fbe6..bf310083 100644 --- a/release-tools/SIDECAR_RELEASE_PROCESS.md +++ b/release-tools/SIDECAR_RELEASE_PROCESS.md @@ -100,9 +100,9 @@ naming convention `-on-`. 1. If release was a new major/minor version, create a new `release-` branch at that commit. 1. Check [image build status](https://k8s-testgrid.appspot.com/sig-storage-image-build). -1. Promote images from k8s-staging-sig-storage to k8s.gcr.io/sig-storage. From +1. Promote images from k8s-staging-sig-storage to registry.k8s.io/sig-storage. From the [k8s image - repo](https://github.com/kubernetes/k8s.io/tree/HEAD/k8s.gcr.io/images/k8s-staging-sig-storage), + repo](https://github.com/kubernetes/k8s.io/tree/HEAD/registry.k8s.io/images/k8s-staging-sig-storage), run `./generate.sh > images.yaml`, and send a PR with the updated images. Once merged, the image promoter will copy the images from staging to prod. 1. Update [kubernetes-csi/docs](https://github.com/kubernetes-csi/docs) sidecar diff --git a/release-tools/cloudbuild.yaml b/release-tools/cloudbuild.yaml index 4bcffad3..40e84547 100644 --- a/release-tools/cloudbuild.yaml +++ b/release-tools/cloudbuild.yaml @@ -13,7 +13,7 @@ # See https://github.com/kubernetes/test-infra/blob/HEAD/config/jobs/image-pushing/README.md # for more details on image pushing process in Kubernetes. # -# To promote release images, see https://github.com/kubernetes/k8s.io/tree/HEAD/k8s.gcr.io/images/k8s-staging-sig-storage. +# To promote release images, see https://github.com/kubernetes/k8s.io/tree/HEAD/registry.k8s.io/images/k8s-staging-sig-storage. # This must be specified in seconds. If omitted, defaults to 600s (10 mins). # Building three images in external-snapshotter takes more than an hour. diff --git a/test/e2e/tests/multi_zone_e2e_test.go b/test/e2e/tests/multi_zone_e2e_test.go index 5149c4d8..bb54356c 100644 --- a/test/e2e/tests/multi_zone_e2e_test.go +++ b/test/e2e/tests/multi_zone_e2e_test.go @@ -31,6 +31,14 @@ import ( remote "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/test/remote" ) +type verifyArgs struct { + publishDir, stageDir string +} + +type verifyFunc func(*verifyArgs) error + +type detacherFunc func() + var _ = Describe("GCE PD CSI Driver Multi-Zone", func() { BeforeEach(func() { Expect(len(testContexts)).To(BeNumerically(">", 1)) @@ -77,7 +85,7 @@ var _ = Describe("GCE PD CSI Driver Multi-Zone", func() { } } - Expect(len(zoneToContext)).To(Equal(2), "Must have instances in exactly 2 zones") + Expect(len(zoneToContext)).To(Equal(2), "Must have instances in 2 zones") controllerContext := zoneToContext[zones[0]] controllerClient := controllerContext.Client @@ -90,7 +98,7 @@ var _ = Describe("GCE PD CSI Driver Multi-Zone", func() { // Create Disk volName := testNamePrefix + string(uuid.NewUUID()) - volID, err := controllerClient.CreateVolume(volName, map[string]string{ + volume, err := controllerClient.CreateVolume(volName, map[string]string{ common.ParameterKeyReplicationType: "regional-pd", }, defaultRepdSizeGb, &csi.TopologyRequirement{ Requisite: []*csi.Topology{ @@ -121,7 +129,7 @@ var _ = Describe("GCE PD CSI Driver Multi-Zone", func() { defer func() { // Delete Disk - controllerClient.DeleteVolume(volID) + controllerClient.DeleteVolume(volume.VolumeId) Expect(err).To(BeNil(), "DeleteVolume failed") // Validate Disk Deleted @@ -136,22 +144,121 @@ var _ = Describe("GCE PD CSI Driver Multi-Zone", func() { if i >= 1 { readOnly = true } - err = testAttachWriteReadDetach(volID, volName, testContext.Instance, testContext.Client, readOnly) + err = testAttachWriteReadDetach(volume.VolumeId, volName, testContext.Instance, testContext.Client, readOnly) Expect(err).To(BeNil(), "failed volume lifecycle checks") i = i + 1 } }) -}) -type verifyArgs struct { - publishDir string -} + It("Should create a RePD instance, write to it, force-attach it to another instance, and read the same data", func() { + Expect(testContexts).NotTo(BeEmpty()) + + zoneToContext := map[string]*remote.TestContext{} + zones := []string{} + + for _, tc := range testContexts { + _, z, _ := tc.Instance.GetIdentity() + // Zone hasn't been seen before + if _, ok := zoneToContext[z]; !ok { + zoneToContext[z] = tc + zones = append(zones, z) + } + if len(zoneToContext) == 2 { + break + } + } + + Expect(len(zoneToContext)).To(Equal(2), "Must have instances in 2 zones") + + controllerContext := zoneToContext[zones[0]] + controllerClient := controllerContext.Client + controllerInstance := controllerContext.Instance -type verifyFunc func(verifyArgs) error + p, _, _ := controllerInstance.GetIdentity() + + region, err := common.GetRegionFromZones(zones) + Expect(err).To(BeNil(), "Failed to get region from zones") + + // Create Disk + volName := testNamePrefix + string(uuid.NewUUID()) + volume, err := controllerClient.CreateVolume(volName, map[string]string{ + common.ParameterKeyReplicationType: "regional-pd", + common.ParameterAvailabilityClass: common.ParameterRegionalHardFailoverClass, + }, defaultRepdSizeGb, &csi.TopologyRequirement{ + Requisite: []*csi.Topology{ + { + Segments: map[string]string{common.TopologyKeyZone: zones[0]}, + }, + { + Segments: map[string]string{common.TopologyKeyZone: zones[1]}, + }, + }, + }, nil) + Expect(err).To(BeNil(), "CreateVolume failed with error: %v", err) + + // Validate Disk Created + cloudDisk, err := computeService.RegionDisks.Get(p, region, volName).Do() + Expect(err).To(BeNil(), "Could not get disk from cloud directly") + Expect(cloudDisk.Type).To(ContainSubstring(standardDiskType)) + Expect(cloudDisk.Status).To(Equal(readyState)) + Expect(cloudDisk.SizeGb).To(Equal(defaultRepdSizeGb)) + Expect(cloudDisk.Name).To(Equal(volName)) + Expect(len(cloudDisk.ReplicaZones)).To(Equal(2)) + zonesSet := sets.NewString(zones...) + for _, replicaZone := range cloudDisk.ReplicaZones { + tokens := strings.Split(replicaZone, "/") + actualZone := tokens[len(tokens)-1] + Expect(zonesSet.Has(actualZone)).To(BeTrue(), "Expected zone %v to exist in zone set %v", actualZone, zones) + } + Expect(volume.VolumeContext).To(HaveKeyWithValue("force-attach", "true")) + + detachers := []detacherFunc{} + + defer func() { + // Perform any detaches + for _, fn := range detachers { + fn() + } + + // Delete Disk + controllerClient.DeleteVolume(volume.VolumeId) + Expect(err).To(BeNil(), "DeleteVolume failed") + + // Validate Disk Deleted + _, err = computeService.RegionDisks.Get(p, region, volName).Do() + Expect(gce.IsGCEError(err, "notFound")).To(BeTrue(), "Expected disk to not be found") + }() + + // Attach disk to instance in the first zone. + tc0 := zoneToContext[zones[0]] + err, detacher, args := testAttachAndMount(volume.VolumeId, volName, tc0.Instance, tc0.Client, false /* useBlock */, false /* forceAttach */) + detachers = append(detachers, detacher) + Expect(err).To(BeNil(), "failed attach in zone 0") + testFileName := filepath.Join(args.publishDir, "force-attach-test") + testFileContents := "force attach test" + err = testutils.WriteFile(tc0.Instance, testFileName, testFileContents) + Expect(err).To(BeNil(), "failed write in zone 0") + _, err = tc0.Instance.SSH("sync") // Sync so force detach doesn't lose data. + Expect(err).To(BeNil(), "failed sync") + + readContents, err := testutils.ReadFile(tc0.Instance, testFileName) + Expect(err).To(BeNil(), "failed read in zone 0") + Expect(strings.TrimSpace(string(readContents))).To(BeIdenticalTo(testFileContents), "content mismatch in zone 0") + + // Now force attach to the second instance without detaching. + tc1 := zoneToContext[zones[1]] + err, detacher, args = testAttachAndMount(volume.VolumeId, volName, tc1.Instance, tc1.Client, false /* useBlock */, true /* forceAttach */) + detachers = append(detachers, detacher) + Expect(err).To(BeNil(), "failed force attach in zone 1") + readContents, err = testutils.ReadFile(tc1.Instance, testFileName) + Expect(err).To(BeNil(), "failed read in zone 1") + Expect(strings.TrimSpace(string(readContents))).To(BeIdenticalTo(testFileContents), "content mismatch in zone 1") + }) +}) func testAttachWriteReadDetach(volID string, volName string, instance *remote.InstanceInfo, client *remote.CsiClient, readOnly bool) error { var testFileContents = "test" - writeFile := func(a verifyArgs) error { + writeFile := func(a *verifyArgs) error { if !readOnly { // Write a file testFile := filepath.Join(a.publishDir, "testfile") @@ -163,7 +270,7 @@ func testAttachWriteReadDetach(volID string, volName string, instance *remote.In return nil } - verifyReadFile := func(a verifyArgs) error { + verifyReadFile := func(a *verifyArgs) error { // Read File secondTestFile := filepath.Join(a.publishDir, "testfile") readContents, err := testutils.ReadFile(instance, secondTestFile) @@ -178,23 +285,20 @@ func testAttachWriteReadDetach(volID string, volName string, instance *remote.In return testLifecycleWithVerify(volID, volName, instance, client, readOnly, false /* fs */, writeFile, verifyReadFile) } -func testLifecycleWithVerify(volID string, volName string, instance *remote.InstanceInfo, client *remote.CsiClient, readOnly, useBlock bool, firstMountVerify, secondMountVerify verifyFunc) error { - var err error - klog.Infof("Starting testAttachWriteReadDetach with volume %v node %v with readonly %v\n", volID, instance.GetNodeID(), readOnly) +func testAttachAndMount(volID string, volName string, instance *remote.InstanceInfo, client *remote.CsiClient, useBlock, forceAttach bool) (error, func(), *verifyArgs) { // Attach Disk - err = client.ControllerPublishVolume(volID, instance.GetNodeID()) + err := client.ControllerPublishVolume(volID, instance.GetNodeID(), forceAttach) if err != nil { - return fmt.Errorf("ControllerPublishVolume failed with error for disk %v on node %v: %v", volID, instance.GetNodeID(), err.Error()) + return fmt.Errorf("ControllerPublishVolume failed with error for disk %v on node %v: %v", volID, instance.GetNodeID(), err.Error()), nil, nil } - defer func() { + detach := func() { // Detach Disk err = client.ControllerUnpublishVolume(volID, instance.GetNodeID()) if err != nil { klog.Errorf("Failed to detach disk: %w", err) } - - }() + } // Stage Disk stageDir := filepath.Join("/tmp/", volName, "stage") @@ -204,12 +308,12 @@ func testLifecycleWithVerify(volID string, volName string, instance *remote.Inst err = client.NodeStageExt4Volume(volID, stageDir) } - //err = client.NodeStageExt4Volume(volID, stageDir) if err != nil { - return fmt.Errorf("NodeStageExt4Volume failed with error: %w", err) + detach() + return fmt.Errorf("NodeStageExt4Volume failed with error: %w", err), nil, nil } - defer func() { + unstageAndDetach := func() { // Unstage Disk err = client.NodeUnstageVolume(volID, stageDir) if err != nil { @@ -220,7 +324,9 @@ func testLifecycleWithVerify(volID string, volName string, instance *remote.Inst if err != nil { klog.Errorf("Failed to rm file path %s: %w", fp, err) } - }() + + detach() + } // Mount Disk publishDir := filepath.Join("/tmp/", volName, "mount") @@ -232,24 +338,38 @@ func testLifecycleWithVerify(volID string, volName string, instance *remote.Inst } if err != nil { - return fmt.Errorf("NodePublishVolume failed with error: %v", err.Error()) + unstageAndDetach() + return fmt.Errorf("NodePublishVolume failed with error: %v", err.Error()), nil, nil } err = testutils.ForceChmod(instance, filepath.Join("/tmp/", volName), "777") if err != nil { - return fmt.Errorf("Chmod failed with error: %v", err.Error()) + unstageAndDetach() + return fmt.Errorf("Chmod failed with error: %v", err.Error()), nil, nil } - a := verifyArgs{ + args := &verifyArgs{ publishDir: publishDir, + stageDir: stageDir, + } + + return nil, unstageAndDetach, args +} + +func testLifecycleWithVerify(volID string, volName string, instance *remote.InstanceInfo, client *remote.CsiClient, readOnly, useBlock bool, firstMountVerify, secondMountVerify verifyFunc) error { + klog.Infof("Starting testAttachWriteReadDetach with volume %v node %v with readonly %v\n", volID, instance.GetNodeID(), readOnly) + err, detacher, args := testAttachAndMount(volID, volName, instance, client, useBlock, false /* forceAttach */) + if err != nil { + return fmt.Errorf("failed to attach and mount: %w", err) } + defer detacher() - err = firstMountVerify(a) + err = firstMountVerify(args) if err != nil { - return fmt.Errorf("failed to verify after first mount to %s: %v", publishDir, err) + return fmt.Errorf("failed to verify after first mount to %s: %w", args.publishDir, err) } // Unmount Disk - err = client.NodeUnpublishVolume(volID, publishDir) + err = client.NodeUnpublishVolume(volID, args.publishDir) if err != nil { return fmt.Errorf("NodeUnpublishVolume failed with error: %v", err.Error()) } @@ -258,9 +378,9 @@ func testLifecycleWithVerify(volID string, volName string, instance *remote.Inst // Mount disk somewhere else secondPublishDir := filepath.Join("/tmp/", volName, "secondmount") if useBlock { - err = client.NodePublishBlockVolume(volID, stageDir, secondPublishDir) + err = client.NodePublishBlockVolume(volID, args.stageDir, secondPublishDir) } else { - err = client.NodePublishVolume(volID, stageDir, secondPublishDir) + err = client.NodePublishVolume(volID, args.stageDir, secondPublishDir) } if err != nil { return fmt.Errorf("NodePublishVolume failed with error: %v", err.Error()) @@ -273,9 +393,9 @@ func testLifecycleWithVerify(volID string, volName string, instance *remote.Inst b := verifyArgs{ publishDir: secondPublishDir, } - err = secondMountVerify(b) + err = secondMountVerify(&b) if err != nil { - return fmt.Errorf("failed to verify after second mount to %s: %v", publishDir, err.Error()) + return fmt.Errorf("failed to verify after second mount to %s: %v", args.publishDir, err.Error()) } // Unmount Disk diff --git a/test/e2e/tests/resize_e2e_test.go b/test/e2e/tests/resize_e2e_test.go index f6126475..2b04047d 100644 --- a/test/e2e/tests/resize_e2e_test.go +++ b/test/e2e/tests/resize_e2e_test.go @@ -38,7 +38,7 @@ var _ = Describe("GCE PD CSI Driver", func() { // Create Disk volName := testNamePrefix + string(uuid.NewUUID()) - volID, err := client.CreateVolume(volName, nil, defaultSizeGb, + volume, err := client.CreateVolume(volName, nil, defaultSizeGb, &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { @@ -58,7 +58,7 @@ var _ = Describe("GCE PD CSI Driver", func() { defer func() { // Delete Disk - client.DeleteVolume(volID) + client.DeleteVolume(volume.VolumeId) Expect(err).To(BeNil(), "DeleteVolume failed") // Validate Disk Deleted @@ -67,12 +67,12 @@ var _ = Describe("GCE PD CSI Driver", func() { }() // Attach Disk - err = client.ControllerPublishVolume(volID, instance.GetNodeID()) + err = client.ControllerPublishVolume(volume.VolumeId, instance.GetNodeID(), false /* forceAttach */) Expect(err).To(BeNil(), "Controller publish volume failed") defer func() { // Detach Disk - err = client.ControllerUnpublishVolume(volID, instance.GetNodeID()) + err = client.ControllerUnpublishVolume(volume.VolumeId, instance.GetNodeID()) if err != nil { klog.Errorf("Failed to detach disk: %w", err) } @@ -80,12 +80,12 @@ var _ = Describe("GCE PD CSI Driver", func() { // Stage Disk stageDir := filepath.Join("/tmp/", volName, "stage") - err = client.NodeStageExt4Volume(volID, stageDir) + err = client.NodeStageExt4Volume(volume.VolumeId, stageDir) Expect(err).To(BeNil(), "Node Stage volume failed") defer func() { // Unstage Disk - err = client.NodeUnstageVolume(volID, stageDir) + err = client.NodeUnstageVolume(volume.VolumeId, stageDir) if err != nil { klog.Errorf("Failed to unstage volume: %w", err) } @@ -98,12 +98,12 @@ var _ = Describe("GCE PD CSI Driver", func() { // Mount Disk publishDir := filepath.Join("/tmp/", volName, "mount") - err = client.NodePublishVolume(volID, stageDir, publishDir) + err = client.NodePublishVolume(volume.VolumeId, stageDir, publishDir) Expect(err).To(BeNil(), "Node publish volume failed") defer func() { // Unmount Disk - err = client.NodeUnpublishVolume(volID, publishDir) + err = client.NodeUnpublishVolume(volume.VolumeId, publishDir) if err != nil { klog.Errorf("NodeUnpublishVolume failed with error: %w", err) } @@ -116,7 +116,7 @@ var _ = Describe("GCE PD CSI Driver", func() { // Resize controller var newSizeGb int64 = 10 - err = client.ControllerExpandVolume(volID, newSizeGb) + err = client.ControllerExpandVolume(volume.VolumeId, newSizeGb) Expect(err).To(BeNil(), "Controller expand volume failed") @@ -126,7 +126,7 @@ var _ = Describe("GCE PD CSI Driver", func() { Expect(cloudDisk.SizeGb).To(Equal(newSizeGb)) // Resize node - _, err = client.NodeExpandVolume(volID, publishDir, newSizeGb) + _, err = client.NodeExpandVolume(volume.VolumeId, publishDir, newSizeGb) Expect(err).To(BeNil(), "Node expand volume failed") // Verify disk size @@ -145,7 +145,7 @@ var _ = Describe("GCE PD CSI Driver", func() { // Create Disk volName := testNamePrefix + string(uuid.NewUUID()) - volID, err := client.CreateVolume(volName, nil, defaultSizeGb, + volume, err := client.CreateVolume(volName, nil, defaultSizeGb, &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { @@ -165,7 +165,7 @@ var _ = Describe("GCE PD CSI Driver", func() { defer func() { // Delete Disk - client.DeleteVolume(volID) + client.DeleteVolume(volume.VolumeId) Expect(err).To(BeNil(), "DeleteVolume failed") // Validate Disk Deleted @@ -174,12 +174,12 @@ var _ = Describe("GCE PD CSI Driver", func() { }() // Volume should be attached/formatted/mounted/unmounted/detached - err = testAttachWriteReadDetach(volID, volName, instance, client, false /* readOnly */) + err = testAttachWriteReadDetach(volume.VolumeId, volName, instance, client, false /* readOnly */) Expect(err).To(BeNil(), "Failed to go through volume lifecycle") // Resize controller var newSizeGb int64 = 10 - err = client.ControllerExpandVolume(volID, newSizeGb) + err = client.ControllerExpandVolume(volume.VolumeId, newSizeGb) Expect(err).To(BeNil(), "Controller expand volume failed") @@ -189,12 +189,12 @@ var _ = Describe("GCE PD CSI Driver", func() { Expect(cloudDisk.SizeGb).To(Equal(newSizeGb)) // Attach and mount again - err = client.ControllerPublishVolume(volID, instance.GetNodeID()) + err = client.ControllerPublishVolume(volume.VolumeId, instance.GetNodeID(), false /* forceAttach */) Expect(err).To(BeNil(), "Controller publish volume failed") defer func() { // Detach Disk - err = client.ControllerUnpublishVolume(volID, instance.GetNodeID()) + err = client.ControllerUnpublishVolume(volume.VolumeId, instance.GetNodeID()) if err != nil { klog.Errorf("Failed to detach disk: %w", err) } @@ -203,12 +203,12 @@ var _ = Describe("GCE PD CSI Driver", func() { // Stage Disk stageDir := filepath.Join("/tmp/", volName, "stage") - err = client.NodeStageExt4Volume(volID, stageDir) + err = client.NodeStageExt4Volume(volume.VolumeId, stageDir) Expect(err).To(BeNil(), "Node Stage volume failed") defer func() { // Unstage Disk - err = client.NodeUnstageVolume(volID, stageDir) + err = client.NodeUnstageVolume(volume.VolumeId, stageDir) if err != nil { klog.Errorf("Failed to unstage volume: %w", err) } @@ -221,19 +221,19 @@ var _ = Describe("GCE PD CSI Driver", func() { // Mount Disk publishDir := filepath.Join("/tmp/", volName, "mount") - err = client.NodePublishVolume(volID, stageDir, publishDir) + err = client.NodePublishVolume(volume.VolumeId, stageDir, publishDir) Expect(err).To(BeNil(), "Node publish volume failed") defer func() { // Unmount Disk - err = client.NodeUnpublishVolume(volID, publishDir) + err = client.NodeUnpublishVolume(volume.VolumeId, publishDir) if err != nil { klog.Errorf("NodeUnpublishVolume failed with error: %w", err) } }() // Resize node - _, err = client.NodeExpandVolume(volID, publishDir, newSizeGb) + _, err = client.NodeExpandVolume(volume.VolumeId, publishDir, newSizeGb) Expect(err).To(BeNil(), "Node expand volume failed") // Verify disk size @@ -252,7 +252,7 @@ var _ = Describe("GCE PD CSI Driver", func() { // Create Disk volName := testNamePrefix + string(uuid.NewUUID()) - volID, err := client.CreateVolume(volName, nil, defaultSizeGb, + volume, err := client.CreateVolume(volName, nil, defaultSizeGb, &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { @@ -272,7 +272,7 @@ var _ = Describe("GCE PD CSI Driver", func() { defer func() { // Delete Disk - client.DeleteVolume(volID) + client.DeleteVolume(volume.VolumeId) Expect(err).To(BeNil(), "DeleteVolume failed") // Validate Disk Deleted @@ -281,12 +281,12 @@ var _ = Describe("GCE PD CSI Driver", func() { }() // Attach Disk - err = client.ControllerPublishVolume(volID, instance.GetNodeID()) + err = client.ControllerPublishVolume(volume.VolumeId, instance.GetNodeID(), false /* forceAttach */) Expect(err).To(BeNil(), "Controller publish volume failed") defer func() { // Detach Disk - err = client.ControllerUnpublishVolume(volID, instance.GetNodeID()) + err = client.ControllerUnpublishVolume(volume.VolumeId, instance.GetNodeID()) if err != nil { klog.Errorf("Failed to detach disk: %w", err) } @@ -295,12 +295,12 @@ var _ = Describe("GCE PD CSI Driver", func() { // Stage Disk stageDir := filepath.Join("/tmp/", volName, "stage") - err = client.NodeStageBlockVolume(volID, stageDir) + err = client.NodeStageBlockVolume(volume.VolumeId, stageDir) Expect(err).To(BeNil(), "Node Stage volume failed") defer func() { // Unstage Disk - err = client.NodeUnstageVolume(volID, stageDir) + err = client.NodeUnstageVolume(volume.VolumeId, stageDir) if err != nil { klog.Errorf("Failed to unstage volume: %w", err) } @@ -313,12 +313,12 @@ var _ = Describe("GCE PD CSI Driver", func() { // Mount Disk publishDir := filepath.Join("/tmp/", volName, "mount") - err = client.NodePublishBlockVolume(volID, stageDir, publishDir) + err = client.NodePublishBlockVolume(volume.VolumeId, stageDir, publishDir) Expect(err).To(BeNil(), "Node publish volume failed") defer func() { // Unmount Disk - err = client.NodeUnpublishVolume(volID, publishDir) + err = client.NodeUnpublishVolume(volume.VolumeId, publishDir) if err != nil { klog.Errorf("NodeUnpublishVolume failed with error: %w", err) } @@ -331,7 +331,7 @@ var _ = Describe("GCE PD CSI Driver", func() { // Resize controller var newSizeGb int64 = 10 - err = client.ControllerExpandVolume(volID, newSizeGb) + err = client.ControllerExpandVolume(volume.VolumeId, newSizeGb) Expect(err).To(BeNil(), "Controller expand volume failed") @@ -341,7 +341,7 @@ var _ = Describe("GCE PD CSI Driver", func() { Expect(cloudDisk.SizeGb).To(Equal(newSizeGb)) // Resize node - resp, err := client.NodeExpandVolume(volID, publishDir, newSizeGb) + resp, err := client.NodeExpandVolume(volume.VolumeId, publishDir, newSizeGb) Expect(err).To(BeNil(), "Node expand volume failed") Expect(resp.CapacityBytes).To(Equal(common.GbToBytes(newSizeGb)), "Node expand should not do anything") diff --git a/test/e2e/tests/setup_e2e_test.go b/test/e2e/tests/setup_e2e_test.go index a1988c34..0b11bf15 100644 --- a/test/e2e/tests/setup_e2e_test.go +++ b/test/e2e/tests/setup_e2e_test.go @@ -38,8 +38,8 @@ var ( project = flag.String("project", "", "Project to run tests in") serviceAccount = flag.String("service-account", "", "Service account to bring up instance with") architecture = flag.String("arch", "amd64", "Architecture pd csi driver build on") - zones = flag.String("zones", "us-central1-c,us-central1-b", "Zones to run tests in. If there are multiple zones, separate each by comma") - machineType = flag.String("machine-type", "n1-standard-1", "Type of machine to provision instance on") + 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", "n2-standard-2", "Type of machine to provision instance on") imageURL = flag.String("image-url", "projects/debian-cloud/global/images/family/debian-11", "OS image url to get image from") runInProw = flag.Bool("run-in-prow", false, "If true, use a Boskos loaned project and special CI service accounts and ssh keys") deleteInstances = flag.Bool("delete-instances", false, "Delete the instances after tests run") diff --git a/test/e2e/tests/single_zone_e2e_test.go b/test/e2e/tests/single_zone_e2e_test.go index 7c8d7e05..e337f117 100644 --- a/test/e2e/tests/single_zone_e2e_test.go +++ b/test/e2e/tests/single_zone_e2e_test.go @@ -44,17 +44,22 @@ import ( const ( testNamePrefix = "gcepd-csi-e2e-" - defaultSizeGb int64 = 5 - defaultRepdSizeGb int64 = 200 - defaultMwSizeGb int64 = 200 - defaultVolumeLimit int64 = 127 - readyState = "READY" - standardDiskType = "pd-standard" - extremeDiskType = "pd-extreme" - provisionedIOPSOnCreate = "100000" - provisionedIOPSOnCreateInt = int64(100000) - - defaultEpsilon = 500000000 // 500M + defaultSizeGb int64 = 5 + defaultExtremeSizeGb int64 = 500 + defaultHdTSizeGb int64 = 2048 + defaultRepdSizeGb int64 = 200 + defaultMwSizeGb int64 = 200 + defaultVolumeLimit int64 = 127 + readyState = "READY" + standardDiskType = "pd-standard" + extremeDiskType = "pd-extreme" + hdtDiskType = "hyperdisk-throughput" + provisionedIOPSOnCreate = "12345" + provisionedIOPSOnCreateInt = int64(12345) + provisionedIOPSOnCreateDefaultInt = int64(100000) + provisionedThroughputOnCreate = "66Mi" + provisionedThroughputOnCreateInt = int64(66) + defaultEpsilon = 500000000 // 500M ) var _ = Describe("GCE PD CSI Driver", func() { @@ -113,7 +118,7 @@ var _ = Describe("GCE PD CSI Driver", func() { }() // Attach Disk - err := client.ControllerPublishVolume(volID, instance.GetNodeID()) + err := client.ControllerPublishVolume(volID, instance.GetNodeID(), false /* forceAttach */) Expect(err).To(BeNil(), "ControllerPublishVolume failed with error for disk %v on node %v: %v", volID, instance.GetNodeID()) defer func() { @@ -185,7 +190,7 @@ var _ = Describe("GCE PD CSI Driver", func() { }() // Attach Disk - err := client.ControllerPublishVolume(volID, instance.GetNodeID()) + err := client.ControllerPublishVolume(volID, instance.GetNodeID(), false /* forceAttach */) Expect(err).To(BeNil(), "ControllerPublishVolume failed with error for disk %v on node %v: %v", volID, instance.GetNodeID()) defer func() { @@ -251,10 +256,10 @@ var _ = Describe("GCE PD CSI Driver", func() { }, }, } - volID, err := testContext.Client.CreateVolume(volName, nil, defaultSizeGb, topReq, nil) + volume, err := testContext.Client.CreateVolume(volName, nil, defaultSizeGb, topReq, nil) Expect(err).To(BeNil(), "Failed to create volume") defer func() { - err = testContext.Client.DeleteVolume(volID) + err = testContext.Client.DeleteVolume(volume.VolumeId) Expect(err).To(BeNil(), "Failed to delete volume") }() @@ -291,6 +296,7 @@ var _ = Describe("GCE PD CSI Driver", func() { }, Entry("on pd-standard", standardDiskType), Entry("on pd-extreme", extremeDiskType), + Entry("on hyperdisk-throughput", hdtDiskType), ) DescribeTable("Should complete publish/unpublish lifecycle with underspecified volume ID and missing volume", @@ -324,7 +330,7 @@ var _ = Describe("GCE PD CSI Driver", func() { }() // Attach Disk - err := client.ControllerPublishVolume(underSpecifiedID, instance.GetNodeID()) + err := client.ControllerPublishVolume(underSpecifiedID, instance.GetNodeID(), false /* forceAttach */) Expect(err).To(BeNil(), "ControllerPublishVolume failed") }, Entry("on pd-standard", standardDiskType), @@ -345,7 +351,7 @@ var _ = Describe("GCE PD CSI Driver", func() { // Create Disk volName := testNamePrefix + string(uuid.NewUUID()) - volID, err := controllerClient.CreateVolume(volName, map[string]string{ + volume, err := controllerClient.CreateVolume(volName, map[string]string{ common.ParameterKeyReplicationType: "regional-pd", }, defaultRepdSizeGb, nil, nil) Expect(err).To(BeNil(), "CreateVolume failed with error: %v", err) @@ -359,15 +365,14 @@ var _ = Describe("GCE PD CSI Driver", func() { Expect(cloudDisk.Name).To(Equal(volName)) Expect(len(cloudDisk.ReplicaZones)).To(Equal(2)) for _, replicaZone := range cloudDisk.ReplicaZones { - tokens := strings.Split(replicaZone, "/") - actualZone := tokens[len(tokens)-1] + actualZone := zoneFromURL(replicaZone) gotRegion, err := common.GetRegionFromZones([]string{actualZone}) Expect(err).To(BeNil(), "failed to get region from actual zone %v", actualZone) Expect(gotRegion).To(Equal(region), "Got region from replica zone that did not match supplied region") } defer func() { // Delete Disk - controllerClient.DeleteVolume(volID) + controllerClient.DeleteVolume(volume.VolumeId) Expect(err).To(BeNil(), "DeleteVolume failed") // Validate Disk Deleted @@ -387,20 +392,27 @@ var _ = Describe("GCE PD CSI Driver", func() { // Create Disk disk := typeToDisk[diskType] volName := testNamePrefix + string(uuid.NewUUID()) - volID, err := client.CreateVolume(volName, disk.params, defaultSizeGb, nil, nil) + + diskSize := defaultSizeGb + if diskType == extremeDiskType { + diskSize = defaultExtremeSizeGb + } + + volume, err := client.CreateVolume(volName, disk.params, diskSize, nil, nil) + Expect(err).To(BeNil(), "CreateVolume failed with error: %v", err) // Validate Disk Created cloudDisk, err := computeService.Disks.Get(p, z, volName).Do() Expect(err).To(BeNil(), "Could not get disk from cloud directly") Expect(cloudDisk.Status).To(Equal(readyState)) - Expect(cloudDisk.SizeGb).To(Equal(defaultSizeGb)) + Expect(cloudDisk.SizeGb).To(Equal(diskSize)) Expect(cloudDisk.Name).To(Equal(volName)) disk.validate(cloudDisk) defer func() { // Delete Disk - client.DeleteVolume(volID) + client.DeleteVolume(volume.VolumeId) Expect(err).To(BeNil(), "DeleteVolume failed") // Validate Disk Deleted @@ -412,6 +424,48 @@ var _ = Describe("GCE PD CSI Driver", func() { Entry("on pd-extreme", extremeDiskType), ) + DescribeTable("Should create and delete pd-extreme disk with default iops", + func(diskType string) { + Expect(testContexts).ToNot(BeEmpty()) + testContext := getRandomTestContext() + + p, z, _ := testContext.Instance.GetIdentity() + client := testContext.Client + + // Create Disk + diskParams := map[string]string{ + common.ParameterKeyType: diskType, + } + volName := testNamePrefix + string(uuid.NewUUID()) + + diskSize := defaultExtremeSizeGb + + volume, err := client.CreateVolume(volName, diskParams, diskSize, nil, nil) + + Expect(err).To(BeNil(), "CreateVolume failed with error: %v", err) + + // Validate Disk Created + cloudDisk, err := computeService.Disks.Get(p, z, volName).Do() + Expect(err).To(BeNil(), "Could not get disk from cloud directly") + Expect(cloudDisk.Status).To(Equal(readyState)) + Expect(cloudDisk.SizeGb).To(Equal(defaultExtremeSizeGb)) + Expect(cloudDisk.Type).To(ContainSubstring(extremeDiskType)) + Expect(cloudDisk.ProvisionedIops).To(Equal(provisionedIOPSOnCreateDefaultInt)) + Expect(cloudDisk.Name).To(Equal(volName)) + + defer func() { + // Delete Disk + client.DeleteVolume(volume.VolumeId) + Expect(err).To(BeNil(), "DeleteVolume failed") + + // Validate Disk Deleted + _, err = computeService.Disks.Get(p, z, volName).Do() + Expect(gce.IsGCEError(err, "notFound")).To(BeTrue(), "Expected disk to not be found") + }() + }, + Entry("on pd-extreme", extremeDiskType), + ) + DescribeTable("Should create and delete disk with labels", func(diskType string) { Expect(testContexts).ToNot(BeEmpty()) @@ -426,14 +480,19 @@ var _ = Describe("GCE PD CSI Driver", func() { params := merge(disk.params, map[string]string{ common.ParameterKeyLabels: "key1=value1,key2=value2", }) - volID, err := client.CreateVolume(volName, params, defaultSizeGb, nil, nil) + + diskSize := defaultSizeGb + if diskType == extremeDiskType { + diskSize = defaultExtremeSizeGb + } + volume, err := client.CreateVolume(volName, params, diskSize, nil, nil) Expect(err).To(BeNil(), "CreateVolume failed with error: %v", err) // Validate Disk Created cloudDisk, err := computeService.Disks.Get(p, z, volName).Do() Expect(err).To(BeNil(), "Could not get disk from cloud directly") Expect(cloudDisk.Status).To(Equal(readyState)) - Expect(cloudDisk.SizeGb).To(Equal(defaultSizeGb)) + Expect(cloudDisk.SizeGb).To(Equal(diskSize)) Expect(cloudDisk.Labels).To(Equal(map[string]string{ "key1": "value1", "key2": "value2", @@ -445,7 +504,7 @@ var _ = Describe("GCE PD CSI Driver", func() { defer func() { // Delete Disk - err := client.DeleteVolume(volID) + err := client.DeleteVolume(volume.VolumeId) Expect(err).To(BeNil(), "DeleteVolume failed") // Validate Disk Deleted @@ -548,20 +607,25 @@ var _ = Describe("GCE PD CSI Driver", func() { }, }, } - volID, err := controllerClient.CreateVolume(volName, params, defaultSizeGb, topology, nil) + + diskSize := defaultSizeGb + if diskType == extremeDiskType { + diskSize = defaultExtremeSizeGb + } + volume, err := controllerClient.CreateVolume(volName, params, diskSize, topology, nil) Expect(err).To(BeNil(), "CreateVolume failed with error: %v", err) // Validate Disk Created cloudDisk, err := computeService.Disks.Get(p, z, volName).Do() Expect(err).To(BeNil(), "Could not get disk from cloud directly") Expect(cloudDisk.Status).To(Equal(readyState)) - Expect(cloudDisk.SizeGb).To(Equal(defaultSizeGb)) + Expect(cloudDisk.SizeGb).To(Equal(diskSize)) Expect(cloudDisk.Name).To(Equal(volName)) disk.validate(cloudDisk) defer func() { // Delete Disk - err = controllerClient.DeleteVolume(volID) + err = controllerClient.DeleteVolume(volume.VolumeId) Expect(err).To(BeNil(), "DeleteVolume failed") // Validate Disk Deleted @@ -570,7 +634,7 @@ var _ = Describe("GCE PD CSI Driver", func() { }() // Test disk works - err = testAttachWriteReadDetach(volID, volName, controllerInstance, controllerClient, false /* readOnly */) + err = testAttachWriteReadDetach(volume.VolumeId, volName, controllerInstance, controllerClient, false /* readOnly */) Expect(err).To(BeNil(), "Failed to go through volume lifecycle before revoking CMEK key") // Revoke CMEK key @@ -591,7 +655,7 @@ var _ = Describe("GCE PD CSI Driver", func() { } // Make sure attach of PD fails - err = testAttachWriteReadDetach(volID, volName, controllerInstance, controllerClient, false /* readOnly */) + err = testAttachWriteReadDetach(volume.VolumeId, volName, controllerInstance, controllerClient, false /* readOnly */) Expect(err).ToNot(BeNil(), "Volume lifecycle should have failed, but succeeded") // Restore CMEK key @@ -612,7 +676,7 @@ var _ = Describe("GCE PD CSI Driver", func() { // The controller publish failure in above step would set a backoff condition on the node. Wait suffcient amount of time for the driver to accept new controller publish requests. time.Sleep(time.Second) // Make sure attach of PD succeeds - err = testAttachWriteReadDetach(volID, volName, controllerInstance, controllerClient, false /* readOnly */) + err = testAttachWriteReadDetach(volume.VolumeId, volName, controllerInstance, controllerClient, false /* readOnly */) Expect(err).To(BeNil(), "Failed to go through volume lifecycle after restoring CMEK key") }, Entry("on pd-standard", standardDiskType), @@ -635,7 +699,7 @@ var _ = Describe("GCE PD CSI Driver", func() { defer deleteVolumeOrError(client, secondVolID) // Attach volID to current instance - err := client.ControllerPublishVolume(volID, nodeID) + err := client.ControllerPublishVolume(volID, nodeID, false /* forceAttach */) Expect(err).To(BeNil(), "Failed ControllerPublishVolume") defer client.ControllerUnpublishVolume(volID, nodeID) @@ -663,7 +727,7 @@ var _ = Describe("GCE PD CSI Driver", func() { // Create Disk volName := testNamePrefix + string(uuid.NewUUID()) - volID, err := controllerClient.CreateVolume(volName, map[string]string{ + volume, err := controllerClient.CreateVolume(volName, map[string]string{ common.ParameterKeyReplicationType: "regional-pd", }, defaultRepdSizeGb, nil, nil) Expect(err).To(BeNil(), "CreateVolume failed with error: %v", err) @@ -677,8 +741,7 @@ var _ = Describe("GCE PD CSI Driver", func() { Expect(cloudDisk.Name).To(Equal(volName)) Expect(len(cloudDisk.ReplicaZones)).To(Equal(2)) for _, replicaZone := range cloudDisk.ReplicaZones { - tokens := strings.Split(replicaZone, "/") - actualZone := tokens[len(tokens)-1] + actualZone := zoneFromURL(replicaZone) gotRegion, err := common.GetRegionFromZones([]string{actualZone}) Expect(err).To(BeNil(), "failed to get region from actual zone %v", actualZone) Expect(gotRegion).To(Equal(region), "Got region from replica zone that did not match supplied region") @@ -686,7 +749,7 @@ var _ = Describe("GCE PD CSI Driver", func() { // Create Snapshot snapshotName := testNamePrefix + string(uuid.NewUUID()) - snapshotID, err := controllerClient.CreateSnapshot(snapshotName, volID, nil) + snapshotID, err := controllerClient.CreateSnapshot(snapshotName, volume.VolumeId, nil) Expect(err).To(BeNil(), "CreateSnapshot failed with error: %v", err) // Validate Snapshot Created @@ -706,7 +769,7 @@ var _ = Describe("GCE PD CSI Driver", func() { defer func() { // Delete Disk - err := controllerClient.DeleteVolume(volID) + err := controllerClient.DeleteVolume(volume.VolumeId) Expect(err).To(BeNil(), "DeleteVolume failed") // Validate Disk Deleted @@ -742,7 +805,7 @@ var _ = Describe("GCE PD CSI Driver", func() { Expect(gce.IsGCEError(err, "notFound")).To(BeTrue(), "Expected disk to not be found") }() - verifyVolumeStats := func(a verifyArgs) error { + verifyVolumeStats := func(a *verifyArgs) error { available, capacity, used, inodesFree, inodes, inodesUsed, err := client.NodeGetVolumeStats(volID, a.publishDir) if err != nil { return fmt.Errorf("failed to get node volume stats: %v", err.Error()) @@ -779,7 +842,7 @@ var _ = Describe("GCE PD CSI Driver", func() { Expect(gce.IsGCEError(err, "notFound")).To(BeTrue(), "Expected disk to not be found") }() - verifyVolumeStats := func(a verifyArgs) error { + verifyVolumeStats := func(a *verifyArgs) error { available, capacity, used, inodesFree, inodes, inodesUsed, err := client.NodeGetVolumeStats(volID, a.publishDir) if err != nil { return fmt.Errorf("failed to get node volume stats: %v", err.Error()) @@ -845,14 +908,14 @@ var _ = Describe("GCE PD CSI Driver", func() { // Attach Disk testFileContents := "test" - writeFunc := func(a verifyArgs) error { + writeFunc := func(a *verifyArgs) error { err := testutils.WriteBlock(instance, a.publishDir, testFileContents) if err != nil { return fmt.Errorf("Failed to write file: %v", err.Error()) } return nil } - verifyReadFunc := func(a verifyArgs) error { + verifyReadFunc := func(a *verifyArgs) error { readContents, err := testutils.ReadBlock(instance, a.publishDir, len(testFileContents)) if err != nil { return fmt.Errorf("ReadFile failed with error: %v", err.Error()) @@ -874,6 +937,11 @@ var _ = Describe("GCE PD CSI Driver", func() { controllerInstance := testContext.Instance controllerClient := testContext.Client + diskSize := defaultSizeGb + if diskType == extremeDiskType { + diskSize = defaultExtremeSizeGb + } + p, z, _ := controllerInstance.GetIdentity() // Create Disk @@ -884,21 +952,21 @@ var _ = Describe("GCE PD CSI Driver", func() { common.ParameterKeyPVCNamespace: "test-pvc-namespace", common.ParameterKeyPVName: "test-pv-name", }) - volID, err := controllerClient.CreateVolume(volName, params, defaultSizeGb, nil /* topReq */, nil) + volume, err := controllerClient.CreateVolume(volName, params, diskSize, nil /* topReq */, nil) Expect(err).To(BeNil(), "CreateVolume failed with error: %v", err) // Validate Disk Created cloudDisk, err := computeService.Disks.Get(p, z, volName).Do() Expect(err).To(BeNil(), "Could not get disk from cloud directly") Expect(cloudDisk.Status).To(Equal(readyState)) - Expect(cloudDisk.SizeGb).To(Equal(defaultSizeGb)) + Expect(cloudDisk.SizeGb).To(Equal(diskSize)) Expect(cloudDisk.Name).To(Equal(volName)) Expect(cloudDisk.Description).To(Equal("{\"kubernetes.io/created-for/pv/name\":\"test-pv-name\",\"kubernetes.io/created-for/pvc/name\":\"test-pvc\",\"kubernetes.io/created-for/pvc/namespace\":\"test-pvc-namespace\",\"storage.gke.io/created-by\":\"pd.csi.storage.gke.io\"}")) disk.validate(cloudDisk) defer func() { // Delete Disk - controllerClient.DeleteVolume(volID) + controllerClient.DeleteVolume(volume.VolumeId) Expect(err).To(BeNil(), "DeleteVolume failed") // Validate Disk Deleted @@ -1044,7 +1112,7 @@ var _ = Describe("GCE PD CSI Driver", func() { // Create Disk volName := testNamePrefix + string(uuid.NewUUID()) - volID, err := controllerClient.CreateVolume(volName, map[string]string{ + volume, err := controllerClient.CreateVolume(volName, map[string]string{ common.ParameterKeyReplicationType: "none", }, defaultSizeGb, &csi.TopologyRequirement{ @@ -1071,9 +1139,13 @@ var _ = Describe("GCE PD CSI Driver", func() { Expect(cloudDisk.Status).To(Equal(readyState)) Expect(cloudDisk.SizeGb).To(Equal(defaultSizeGb)) Expect(cloudDisk.Name).To(Equal(volName)) + // Validate the the clone disk zone matches the source disk zone. + _, srcKey, err := common.VolumeIDToKey(srcVolID) + Expect(err).To(BeNil(), "Could not get source volume key from id") + Expect(zoneFromURL(cloudDisk.Zone)).To(Equal(srcKey.Zone)) defer func() { // Delete Disk - controllerClient.DeleteVolume(volID) + controllerClient.DeleteVolume(volume.VolumeId) Expect(err).To(BeNil(), "DeleteVolume failed") // Validate Disk Deleted @@ -1096,18 +1168,83 @@ var _ = Describe("GCE PD CSI Driver", func() { // Create Source Disk srcVolName := testNamePrefix + string(uuid.NewUUID()) - srcVolID, err := controllerClient.CreateVolume(srcVolName, map[string]string{ + srcVolume, err := controllerClient.CreateVolume(srcVolName, map[string]string{ common.ParameterKeyReplicationType: "none", }, defaultRepdSizeGb, nil, nil) // Create Disk volName := testNamePrefix + string(uuid.NewUUID()) - volID, err := controllerClient.CreateVolume(volName, map[string]string{ + volume, err := controllerClient.CreateVolume(volName, map[string]string{ common.ParameterKeyReplicationType: "regional-pd", }, defaultRepdSizeGb, nil, &csi.VolumeContentSource{ Type: &csi.VolumeContentSource_Volume{ Volume: &csi.VolumeContentSource_VolumeSource{ - VolumeId: srcVolID, + VolumeId: srcVolume.VolumeId, + }, + }, + }) + + Expect(err).To(BeNil(), "CreateVolume failed with error: %v", err) + + // Validate Disk Created + cloudDisk, err := computeService.RegionDisks.Get(p, region, volName).Do() + Expect(err).To(BeNil(), "Could not get disk from cloud directly") + Expect(cloudDisk.Type).To(ContainSubstring(standardDiskType)) + Expect(cloudDisk.Status).To(Equal(readyState)) + Expect(cloudDisk.SizeGb).To(Equal(defaultRepdSizeGb)) + Expect(cloudDisk.Name).To(Equal(volName)) + Expect(len(cloudDisk.ReplicaZones)).To(Equal(2)) + replicaZonesCompatible := false + _, srcKey, err := common.VolumeIDToKey(srcVolume.VolumeId) + Expect(err).To(BeNil(), "Could not get source volume key from id") + for _, replicaZone := range cloudDisk.ReplicaZones { + actualZone := zoneFromURL(replicaZone) + if actualZone == srcKey.Zone { + replicaZonesCompatible = true + } + gotRegion, err := common.GetRegionFromZones([]string{actualZone}) + Expect(err).To(BeNil(), "failed to get region from actual zone %v", actualZone) + Expect(gotRegion).To(Equal(region), "Got region from replica zone that did not match supplied region") + } + // Validate that one of the replicaZones of the clone matches the zone of the source disk. + Expect(replicaZonesCompatible).To(Equal(true)) + defer func() { + // Delete Disk + controllerClient.DeleteVolume(volume.VolumeId) + Expect(err).To(BeNil(), "DeleteVolume failed") + + // Validate Disk Deleted + _, err = computeService.RegionDisks.Get(p, region, volName).Do() + Expect(gce.IsGCEError(err, "notFound")).To(BeTrue(), "Expected disk to not be found") + }() + }) + + It("Should successfully create RePD from a RePD VolumeContentSource", func() { + Expect(testContexts).ToNot(BeEmpty()) + testContext := getRandomTestContext() + + controllerInstance := testContext.Instance + controllerClient := testContext.Client + + p, z, _ := controllerInstance.GetIdentity() + + region, err := common.GetRegionFromZones([]string{z}) + Expect(err).To(BeNil(), "Failed to get region from zones") + + // Create Source Disk + srcVolName := testNamePrefix + string(uuid.NewUUID()) + srcVolume, err := controllerClient.CreateVolume(srcVolName, map[string]string{ + common.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", + }, defaultRepdSizeGb, nil, + &csi.VolumeContentSource{ + Type: &csi.VolumeContentSource_Volume{ + Volume: &csi.VolumeContentSource_VolumeSource{ + VolumeId: srcVolume.VolumeId, }, }, }) @@ -1122,16 +1259,19 @@ var _ = Describe("GCE PD CSI Driver", func() { Expect(cloudDisk.SizeGb).To(Equal(defaultRepdSizeGb)) Expect(cloudDisk.Name).To(Equal(volName)) Expect(len(cloudDisk.ReplicaZones)).To(Equal(2)) + // Validate that the replicaZones of the clone match the replicaZones of the source disk. + srcCloudDisk, err := computeService.RegionDisks.Get(p, region, srcVolName).Do() + Expect(err).To(BeNil(), "Could not get source disk from cloud directly") + Expect(srcCloudDisk.ReplicaZones).To(Equal(cloudDisk.ReplicaZones)) for _, replicaZone := range cloudDisk.ReplicaZones { - tokens := strings.Split(replicaZone, "/") - actualZone := tokens[len(tokens)-1] + actualZone := zoneFromURL(replicaZone) gotRegion, err := common.GetRegionFromZones([]string{actualZone}) Expect(err).To(BeNil(), "failed to get region from actual zone %v", actualZone) Expect(gotRegion).To(Equal(region), "Got region from replica zone that did not match supplied region") } defer func() { // Delete Disk - controllerClient.DeleteVolume(volID) + controllerClient.DeleteVolume(volume.VolumeId) Expect(err).To(BeNil(), "DeleteVolume failed") // Validate Disk Deleted @@ -1186,7 +1326,15 @@ func createAndValidateUniqueZonalDisk(client *remote.CsiClient, project, zone st // Create Disk disk := typeToDisk[diskType] volName := testNamePrefix + string(uuid.NewUUID()) - volID, err := client.CreateVolume(volName, disk.params, defaultSizeGb, + + diskSize := defaultSizeGb + switch diskType { + case extremeDiskType: + diskSize = defaultExtremeSizeGb + case hdtDiskType: + diskSize = defaultHdTSizeGb + } + volume, err := client.CreateVolume(volName, disk.params, diskSize, &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { @@ -1200,11 +1348,11 @@ func createAndValidateUniqueZonalDisk(client *remote.CsiClient, project, zone st cloudDisk, err := computeService.Disks.Get(project, zone, volName).Do() Expect(err).To(BeNil(), "Could not get disk from cloud directly") Expect(cloudDisk.Status).To(Equal(readyState)) - Expect(cloudDisk.SizeGb).To(Equal(defaultSizeGb)) + Expect(cloudDisk.SizeGb).To(Equal(diskSize)) Expect(cloudDisk.Name).To(Equal(volName)) disk.validate(cloudDisk) - return volName, volID + return volName, volume.VolumeId } func deleteVolumeOrError(client *remote.CsiClient, volID string) { @@ -1223,7 +1371,7 @@ func createAndValidateUniqueZonalMultiWriterDisk(client *remote.CsiClient, proje // Create Disk disk := typeToDisk[diskType] volName := testNamePrefix + string(uuid.NewUUID()) - volID, err := client.CreateVolumeWithCaps(volName, disk.params, defaultMwSizeGb, + volume, err := client.CreateVolumeWithCaps(volName, disk.params, defaultMwSizeGb, &csi.TopologyRequirement{ Requisite: []*csi.Topology{ { @@ -1255,7 +1403,7 @@ func createAndValidateUniqueZonalMultiWriterDisk(client *remote.CsiClient, proje Expect(err).To(BeNil(), "Failed to get cloud disk using alpha API") Expect(alphaDisk.MultiWriter).To(Equal(true)) - return volName, volID + return volName, volume.VolumeId } func cleanSelfLink(selfLink string) string { @@ -1263,6 +1411,16 @@ func cleanSelfLink(selfLink string) string { return r.ReplaceAllString(selfLink, "") } +// Returns the zone from the URL with the format https://compute.googleapis.com/compute/v1/projects/{project}/zones/{zone}. +// Returns the empty string if the zone cannot be abstracted from the URL. +func zoneFromURL(url string) string { + tokens := strings.Split(url, "/") + if len(tokens) == 0 { + return "" + } + return tokens[len(tokens)-1] +} + func setupKeyRing(ctx context.Context, parentName string, keyRingId string) (*kmspb.CryptoKey, []string) { // Create KeyRing ringReq := &kmspb.CreateKeyRingRequest{ @@ -1337,6 +1495,16 @@ var typeToDisk = map[string]*disk{ Expect(disk.ProvisionedIops).To(Equal(provisionedIOPSOnCreateInt)) }, }, + hdtDiskType: { + params: map[string]string{ + common.ParameterKeyType: hdtDiskType, + common.ParameterKeyProvisionedThroughputOnCreate: provisionedThroughputOnCreate, + }, + validate: func(disk *compute.Disk) { + Expect(disk.Type).To(ContainSubstring(hdtDiskType)) + Expect(disk.ProvisionedThroughput).To(Equal(provisionedThroughputOnCreateInt)) + }, + }, } func merge(a, b map[string]string) map[string]string { diff --git a/test/e2e/utils/utils.go b/test/e2e/utils/utils.go index 8a80501e..97364bed 100644 --- a/test/e2e/utils/utils.go +++ b/test/e2e/utils/utils.go @@ -53,14 +53,18 @@ func GCEClientAndDriverSetup(instance *remote.InstanceInfo, computeEndpoint stri binPath := path.Join(pkgPath, "bin/gce-pd-csi-driver") endpoint := fmt.Sprintf("tcp://localhost:%s", port) - computeFlag := "" + extra_flags := []string{ + fmt.Sprintf("--extra-labels=%s=%s", DiskLabelKey, DiskLabelValue), + "--max-concurrent-format-and-mount=20", // otherwise the serialization times out the e2e test. + } if computeEndpoint != "" { - computeFlag = fmt.Sprintf("--compute-endpoint %s", computeEndpoint) + extra_flags = append(extra_flags, fmt.Sprintf("--compute-endpoint %s", computeEndpoint)) } - workspace := remote.NewWorkspaceDir("gce-pd-e2e-") - driverRunCmd := fmt.Sprintf("sh -c '/usr/bin/nohup %s/gce-pd-csi-driver -v=4 --endpoint=%s %s --extra-labels=%s=%s 2> %s/prog.out < /dev/null > /dev/null &'", - workspace, endpoint, computeFlag, DiskLabelKey, DiskLabelValue, workspace) + // Log at V(6) as the compute API calls are emitted at that level and it's + // useful to see what's happening when debugging tests. + driverRunCmd := fmt.Sprintf("sh -c '/usr/bin/nohup %s/gce-pd-csi-driver -v=6 --endpoint=%s %s 2> %s/prog.out < /dev/null > /dev/null &'", + workspace, endpoint, strings.Join(extra_flags, " "), workspace) config := &remote.ClientConfig{ PkgPath: pkgPath, diff --git a/test/k8s-integration/cluster.go b/test/k8s-integration/cluster.go index e3425935..5f63cbaa 100644 --- a/test/k8s-integration/cluster.go +++ b/test/k8s-integration/cluster.go @@ -183,7 +183,7 @@ func clusterUpGKE(gceZone, gceRegion string, numNodes int, numWindowsNodes int, var cmd *exec.Cmd cmdParams := []string{"container", "clusters", "create", *gkeTestClusterName, locationArg, locationVal, "--num-nodes", strconv.Itoa(numNodes), - "--quiet", "--machine-type", "n1-standard-2", "--image-type", imageType} + "--quiet", "--machine-type", "n1-standard-2", "--image-type", imageType, "--no-enable-autoupgrade"} if isVariableSet(gkeClusterVer) { cmdParams = append(cmdParams, "--cluster-version", *gkeClusterVer) } else { @@ -223,11 +223,81 @@ func clusterUpGKE(gceZone, gceRegion string, numNodes int, numWindowsNodes int, return nil } -func downloadKubernetesSource(pkgDir, k8sIoDir, kubeVersion string) error { - k8sDir := filepath.Join(k8sIoDir, "kubernetes") - klog.Infof("Downloading Kubernetes source v=%s to path=%s", kubeVersion, k8sIoDir) +func downloadTarball(k8sDir, releaseVersion, subDir, tarballName string) error { + tarballPath := filepath.Join(k8sDir, subDir) + if err := os.MkdirAll(tarballPath, 0777); err != nil { + return err + } + tarballOutput := filepath.Join(tarballPath, tarballName) + downloadUrl := fmt.Sprintf("https://dl.k8s.io/release/%s/%s", releaseVersion, tarballName) + klog.Infof("Downloading tarball %s to path=%s from url=%s", tarballName, tarballPath, downloadUrl) + _, err := exec.Command("curl", "-Lsf", "--output", tarballOutput, downloadUrl).CombinedOutput() + if err != nil { + return err + } + + return nil +} + +func downloadAndExtractSrcTarball(k8sDir, releaseVersion, tarballName string) error { + tarballPath := filepath.Join(k8sDir, tarballName) + if err := downloadTarball(k8sDir, releaseVersion, "", tarballName); err != nil { + return err + } + out, err := exec.Command("tar", "xf", tarballPath, "-C", k8sDir).CombinedOutput() + if err != nil { + return fmt.Errorf("Failed to extract src tarball %s: %s: %s", tarballName, out, err) + } + return nil +} + +func getReleaseVersionFromKubeVersion(kubeVersion string) (string, error) { + releaseVersion := fmt.Sprintf("v%s", kubeVersion) + if kubeVersion == "stable" || kubeVersion == "latest" { + // See https://kubernetes.io/releases/download/ + out, err := exec.Command("curl", "-Lsf", "https://dl.k8s.io/release/stable.txt").CombinedOutput() + if err != nil { + return "", err + } + releaseVersion = string(out) + } + return releaseVersion, nil +} + +func downloadKubernetesRelease(k8sDir, kubeVersion, platform, arch string) error { + releaseVersion, err := getReleaseVersionFromKubeVersion(kubeVersion) + if err != nil { + return err + } + + // Download precompiled tarballs + serverTarballName := fmt.Sprintf("kubernetes-server-%s-%s.tar.gz", platform, arch) + if err := downloadTarball(k8sDir, releaseVersion, "server", serverTarballName); err != nil { + return err + } + + manifestsTarballName := fmt.Sprintf("kubernetes-manifests.tar.gz") + if err := downloadTarball(k8sDir, releaseVersion, "server", manifestsTarballName); err != nil { + return err + } + + nodeTarballName := fmt.Sprintf("kubernetes-node-%s-%s.tar.gz", platform, arch) + if err := downloadTarball(k8sDir, releaseVersion, "node", nodeTarballName); err != nil { + return err + } - if err := os.MkdirAll(k8sIoDir, 0777); err != nil { + clientTarballName := fmt.Sprintf("kubernetes-client-%s-%s.tar.gz", platform, arch) + if err := downloadTarball(k8sDir, releaseVersion, "client", clientTarballName); err != nil { + return err + } + + return nil +} + +func downloadKubernetesSource(k8sDir, kubeVersion string) error { + klog.Infof("Downloading Kubernetes source v=%s to path=%s", kubeVersion, k8sDir) + + if err := os.MkdirAll(k8sDir, 0777); err != nil { return err } if err := os.RemoveAll(k8sDir); err != nil { @@ -248,12 +318,17 @@ func downloadKubernetesSource(pkgDir, k8sIoDir, kubeVersion string) error { return fmt.Errorf("failed to clone kubernetes master: %s, err: %v", out, err.Error()) } } else { - // Shallow clone of a release branch. - vKubeVersion := "v" + kubeVersion - klog.Infof("shallow clone of k8s %s", vKubeVersion) - out, err := exec.Command("git", "clone", "--depth", "1", "https://github.com/kubernetes/kubernetes", k8sDir).CombinedOutput() + releaseVersion, err := getReleaseVersionFromKubeVersion(kubeVersion) if err != nil { - return fmt.Errorf("failed to clone kubernetes %s: %s, err: %v", vKubeVersion, out, err.Error()) + return err + } + + // Download versioned source. + if err := downloadAndExtractSrcTarball(k8sDir, releaseVersion, "kubernetes-src.tar.gz"); err != nil { + return err + } + if err := downloadAndExtractSrcTarball(k8sDir, releaseVersion, "kubernetes.tar.gz"); err != nil { + return err } } return nil diff --git a/test/k8s-integration/config/sc-xfs.yaml b/test/k8s-integration/config/sc-xfs.yaml new file mode 100644 index 00000000..2f286746 --- /dev/null +++ b/test/k8s-integration/config/sc-xfs.yaml @@ -0,0 +1,9 @@ +apiVersion: storage.k8s.io/v1 +kind: StorageClass +metadata: + name: csi-gcepd-xfs +provisioner: pd.csi.storage.gke.io +parameters: + type: pd-balanced + csi.storage.k8s.io/fstype: xfs +volumeBindingMode: WaitForFirstConsumer diff --git a/test/k8s-integration/config/test-config-template.in b/test/k8s-integration/config/test-config-template.in index 6571ae9e..a70686c5 100644 --- a/test/k8s-integration/config/test-config-template.in +++ b/test/k8s-integration/config/test-config-template.in @@ -22,7 +22,7 @@ DriverInfo: NumRestarts: 10 SupportedMountOption: debug: - nouid32: + noatime: SupportedSizeRange: Min: {{.MinimumVolumeSize}} Max: 64Ti diff --git a/test/k8s-integration/driver.go b/test/k8s-integration/driver.go index a8e7c209..0481e8ad 100644 --- a/test/k8s-integration/driver.go +++ b/test/k8s-integration/driver.go @@ -9,7 +9,7 @@ import ( "strings" "k8s.io/klog/v2" - "k8s.io/kubernetes/test/e2e/storage/podlogs" + "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/test/k8s-integration/podlogs" ) func getOverlayDir(pkgDir, deployOverlayName string) string { diff --git a/test/k8s-integration/main.go b/test/k8s-integration/main.go index f1663a9d..67aa5a46 100644 --- a/test/k8s-integration/main.go +++ b/test/k8s-integration/main.go @@ -28,6 +28,7 @@ import ( apimachineryversion "k8s.io/apimachinery/pkg/util/version" _ "k8s.io/client-go/plugin/pkg/client/auth/gcp" "k8s.io/klog/v2" + "k8s.io/utils/strings/slices" testutils "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/test/e2e/utils" ) @@ -36,7 +37,8 @@ var ( teardownCluster = flag.Bool("teardown-cluster", true, "teardown the cluster after the e2e test") teardownDriver = flag.Bool("teardown-driver", true, "teardown the driver after the e2e test") bringupCluster = flag.Bool("bringup-cluster", true, "build kubernetes and bringup a cluster") - platform = flag.String("platform", "linux", "platform that the tests will be run, either linux or windows") + platform = flag.String("platform", "linux", "platform that the tests will be run on, either linux or windows") + arch = flag.String("arch", "amd64", "architecture that the tests will be run on (eg: amd64/arm64)") gceZone = flag.String("gce-zone", "", "zone that the gce k8s cluster is created/found in") gceRegion = flag.String("gce-region", "", "region that gke regional cluster should be created in") kubeVersion = flag.String("kube-version", "", "version of Kubernetes to download and use for the cluster") @@ -65,6 +67,7 @@ var ( saFile = flag.String("service-account-file", "", "path of service account file") deployOverlayName = flag.String("deploy-overlay-name", "", "which kustomize overlay to deploy the driver with") doDriverBuild = flag.Bool("do-driver-build", true, "building the driver from source") + doK8sBuild = flag.Bool("do-k8s-build", true, "building the driver from source. If false, will fetch precompiled artifacts") useGKEManagedDriver = flag.Bool("use-gke-managed-driver", false, "use GKE managed PD CSI driver for the tests") // Test flags @@ -73,6 +76,8 @@ var ( useKubeTest2 = flag.Bool("use-kubetest2", false, "use kubetest2 to run e2e tests") parallel = flag.Int("parallel", 4, "the number of parallel tests setting for ginkgo parallelism") + + allowedVersionTags = []string{"master", "stable", "latest"} ) const ( @@ -191,12 +196,48 @@ func main() { klog.Fatalf("num-windows-nodes must be set if the platform is windows") } + if *kubeVersion == "master" && !*doK8sBuild { + klog.Fatalf("must set do-k8s-build=true when kubeVersion=%s", *kubeVersion) + } + + if len(*kubeVersion) != 0 { + if !slices.Contains(allowedVersionTags, *kubeVersion) { + if _, err := parseVersion(*kubeVersion); err != nil { + klog.Fatalf("invalid kube-version %s", *kubeVersion) + } + } + } + + if len(*testVersion) != 0 { + if !slices.Contains(allowedVersionTags, *testVersion) { + if _, err := parseVersion(*testVersion); err != nil { + klog.Fatalf("invalid test-version %s", *testVersion) + } + } + } + err := handle() if err != nil { klog.Fatalf("Failed to run integration test: %w", err) } } +func buildTestingBinaries(k8sDir string) error { + if err := buildKubernetes(k8sDir, "WHAT=test/e2e/e2e.test"); err != nil { + return fmt.Errorf("failed to build Kubernetes e2e: %v", err.Error()) + } + + // kubetest relies on ginkgo and kubectl already built in the test k8s directory + if err := buildKubernetes(k8sDir, "ginkgo"); err != nil { + return fmt.Errorf("failed to build gingko: %v", err.Error()) + } + + if err := buildKubernetes(k8sDir, "kubectl"); err != nil { + return fmt.Errorf("failed to build kubectl: %v", err.Error()) + } + return nil +} + func handle() error { oldmask := syscall.Umask(0000) defer syscall.Umask(oldmask) @@ -266,7 +307,7 @@ func handle() error { }() } - // Create temporary directories for kubernetes builds + // Create temporary directories for kubernetes source/build artifacts testParams.testParentDir = generateUniqueTmpDir() defer removeDir(testParams.testParentDir) @@ -274,13 +315,24 @@ func handle() error { // Otherwise, either GKE or a prebuild local K8s dir is being used if len(*kubeVersion) != 0 { testParams.k8sSourceDir = filepath.Join(testParams.testParentDir, "kubernetes") - err := downloadKubernetesSource(testParams.pkgDir, testParams.testParentDir, *kubeVersion) - if err != nil { + klog.Infof("Downloading Kubernetes source from: %s", *kubeVersion) + if err := downloadKubernetesSource(testParams.k8sSourceDir, *kubeVersion); err != nil { return fmt.Errorf("failed to download Kubernetes source: %v", err.Error()) } - err = buildKubernetes(testParams.k8sSourceDir, "quick-release") - if err != nil { - return fmt.Errorf("failed to build Kubernetes: %v", err.Error()) + + if *doK8sBuild { + klog.Info("Building Kubernetes source") + if err := buildKubernetes(testParams.k8sSourceDir, "quick-release"); err != nil { + return fmt.Errorf("failed to build Kubernetes: %v", err.Error()) + } + } else { + klog.Info("Fetching precompiled Kubernetes artifacts for %s/%s", *platform, *arch) + if err := downloadKubernetesRelease(testParams.k8sSourceDir, *kubeVersion, *platform, *arch); err != nil { + return fmt.Errorf("failed to download Kubernetes release: %v", err.Error()) + } + if err := buildTestingBinaries(testParams.k8sSourceDir); err != nil { + return err + } } } else { testParams.k8sSourceDir = *localK8sDir @@ -290,22 +342,13 @@ func handle() error { // Otherwise, either kube version is set (which implies GCE) or a local K8s dir is being used. if !*useKubeTest2 && len(*testVersion) != 0 && *testVersion != *kubeVersion { testParams.k8sSourceDir = filepath.Join(testParams.testParentDir, "kubernetes") - err := downloadKubernetesSource(testParams.pkgDir, testParams.testParentDir, *testVersion) - if err != nil { + // Overlay the Kubernetes source + if err := downloadKubernetesSource(testParams.k8sSourceDir, *testVersion); err != nil { return fmt.Errorf("failed to download Kubernetes source: %v", err.Error()) } - err = buildKubernetes(testParams.k8sSourceDir, "WHAT=test/e2e/e2e.test") - if err != nil { - return fmt.Errorf("failed to build Kubernetes e2e: %v", err.Error()) - } - // kubetest relies on ginkgo and kubectl already built in the test k8s directory - err = buildKubernetes(testParams.k8sSourceDir, "ginkgo") - if err != nil { - return fmt.Errorf("failed to build gingko: %v", err.Error()) - } - err = buildKubernetes(testParams.k8sSourceDir, "kubectl") - if err != nil { - return fmt.Errorf("failed to build kubectl: %v", err.Error()) + klog.Infof("Building Kubernetes Testing binaries: %s", *kubeVersion) + if err := buildTestingBinaries(testParams.k8sSourceDir); err != nil { + return err } } @@ -598,6 +641,11 @@ func generateGKETestSkip(testParams *testParameters) string { skipString = skipString + "|pvc.data.source" } + // Snapshot and restore test fixes were introduced after 1.26 in PR#972. + if curVer.lessThan(mustParseVersion("1.26.0")) { + skipString = skipString + "|should.provision.correct.filesystem.size.when.restoring.snapshot.to.larger.size.pvc" + } + // "volumeMode should not mount / map unused volumes in a pod" tests a // (https://github.com/kubernetes/kubernetes/pull/81163) // bug-fix introduced in 1.16 @@ -646,6 +694,9 @@ func generateGKETestSkip(testParams *testParameters) string { skipString = skipString + "|provisioning.should.mount.multiple.PV.pointing.to.the.same.storage.on.the.same.node" } + // Skip mount options test until we fix the invalid mount options for xfs. + skipString = skipString + "|csi-gcepd-sc-xfs.*provisioning.should.provision.storage.with.mount.options" + return skipString } @@ -771,7 +822,17 @@ func runTestsWithConfig(testParams *testParameters, testConfigArg, reportPrefix } kubeTest2Args = append(kubeTest2Args, "--use-built-binaries") } else { - kubeTest2Args = append(kubeTest2Args, fmt.Sprintf("--test-package-marker=latest-%s.txt", *testVersion)) + testResourceVersion := *testVersion + if *testVersion != "stable" && *testVersion != "latest" { + // Find the minor version + v, err := parseVersion(*testVersion) + if err != nil { + // Note, this shouldn't happen, as we check flags in main(). + return fmt.Errorf("failed to parse --test-version") + } + testResourceVersion = fmt.Sprintf("stable-%s", v.minorVersion()) + } + kubeTest2Args = append(kubeTest2Args, fmt.Sprintf("--test-package-marker=%s.txt", testResourceVersion)) } } kubeTest2Args = append(kubeTest2Args, fmt.Sprintf("--focus-regex=%s", focus)) diff --git a/test/k8s-integration/podlogs/podlogs.go b/test/k8s-integration/podlogs/podlogs.go new file mode 100644 index 00000000..2d97d271 --- /dev/null +++ b/test/k8s-integration/podlogs/podlogs.go @@ -0,0 +1,262 @@ +/* +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 podlogs enables live capturing of all events and log +// messages for some or all pods in a namespace as they get generated. +// This helps debugging both a running test (what is currently going +// on?) and the output of a CI run (events appear in chronological +// order and output that normally isn't available like the command +// stdout messages are available). +package podlogs + +import ( + "bufio" + "context" + "fmt" + "io" + "os" + "path" + "regexp" + "strings" + "sync" + + v1 "k8s.io/api/core/v1" + meta "k8s.io/apimachinery/pkg/apis/meta/v1" + clientset "k8s.io/client-go/kubernetes" +) + +// LogOutput determines where output from CopyAllLogs goes. +type LogOutput struct { + // If not nil, errors will be logged here. + StatusWriter io.Writer + + // If not nil, all output goes to this writer with "/:" as prefix. + LogWriter io.Writer + + // Base directory for one log file per container. + // The full path of each log file will be -.log. + LogPathPrefix string +} + +// Matches harmless errors from pkg/kubelet/kubelet_pods.go. +var expectedErrors = regexp.MustCompile(`container .* in pod .* is (terminated|waiting to start|not available)|the server could not find the requested resource`) + +// CopyPodLogs is basically CopyPodLogs for all current or future pods in the given namespace ns +func CopyAllLogs(ctx context.Context, cs clientset.Interface, ns string, to LogOutput) error { + return CopyPodLogs(ctx, cs, ns, "", to) +} + +// CopyPodLogs follows the logs of all containers in pod with the given podName, +// including those that get created in the future, and writes each log +// line as configured in the output options. It does that until the +// context is done or until an error occurs. +// +// If podName is empty, it will follow all pods in the given namespace ns. +// +// Beware that there is currently no way to force log collection +// before removing pods, which means that there is a known race +// between "stop pod" and "collecting log entries". The alternative +// would be a blocking function with collects logs from all currently +// running pods, but that then would have the disadvantage that +// already deleted pods aren't covered. +// +// Another race occurs is when a pod shuts down. Logging stops, but if +// then the pod is not removed from the apiserver quickly enough, logging +// resumes and dumps the old log again. Previously, this was allowed based +// on the assumption that it is better to log twice than miss log messages +// of pods that started and immediately terminated or when logging temporarily +// stopped. +// +// But it turned out to be rather confusing, so now a heuristic is used: if +// log output of a container was already captured, then capturing does not +// resume if the pod is marked for deletion. +func CopyPodLogs(ctx context.Context, cs clientset.Interface, ns, podName string, to LogOutput) error { + options := meta.ListOptions{} + if podName != "" { + options = meta.ListOptions{ + FieldSelector: fmt.Sprintf("metadata.name=%s", podName), + } + } + watcher, err := cs.CoreV1().Pods(ns).Watch(context.TODO(), options) + + if err != nil { + return fmt.Errorf("cannot create Pod event watcher: %w", err) + } + + go func() { + var m sync.Mutex + // Key is pod/container name, true if currently logging it. + active := map[string]bool{} + // Key is pod/container/container-id, true if we have ever started to capture its output. + started := map[string]bool{} + + check := func() { + m.Lock() + defer m.Unlock() + + pods, err := cs.CoreV1().Pods(ns).List(context.TODO(), options) + if err != nil { + if to.StatusWriter != nil { + fmt.Fprintf(to.StatusWriter, "ERROR: get pod list in %s: %s\n", ns, err) + } + return + } + + for _, pod := range pods.Items { + for i, c := range pod.Spec.Containers { + // sanity check, array should have entry for each container + if len(pod.Status.ContainerStatuses) <= i { + continue + } + name := pod.ObjectMeta.Name + "/" + c.Name + id := name + "/" + pod.Status.ContainerStatuses[i].ContainerID + if active[name] || + // If we have worked on a container before and it has now terminated, then + // there cannot be any new output and we can ignore it. + (pod.Status.ContainerStatuses[i].State.Terminated != nil && + started[id]) || + // State.Terminated might not have been updated although the container already + // stopped running. Also check whether the pod is deleted. + (pod.DeletionTimestamp != nil && started[id]) || + // Don't attempt to get logs for a container unless it is running or has terminated. + // Trying to get a log would just end up with an error that we would have to suppress. + (pod.Status.ContainerStatuses[i].State.Running == nil && + pod.Status.ContainerStatuses[i].State.Terminated == nil) { + continue + } + readCloser, err := logsForPod(ctx, cs, ns, pod.ObjectMeta.Name, + &v1.PodLogOptions{ + Container: c.Name, + Follow: true, + }) + if err != nil { + // We do get "normal" errors here, like trying to read too early. + // We can ignore those. + if to.StatusWriter != nil && + expectedErrors.FindStringIndex(err.Error()) == nil { + fmt.Fprintf(to.StatusWriter, "WARNING: pod log: %s: %s\n", name, err) + } + continue + } + + // Determine where we write. If this fails, we intentionally return without clearing + // the active[name] flag, which prevents trying over and over again to + // create the output file. + var out io.Writer + var closer io.Closer + var prefix string + if to.LogWriter != nil { + out = to.LogWriter + nodeName := pod.Spec.NodeName + if len(nodeName) > 10 { + nodeName = nodeName[0:4] + ".." + nodeName[len(nodeName)-4:] + } + prefix = name + "@" + nodeName + ": " + } else { + var err error + filename := to.LogPathPrefix + pod.ObjectMeta.Name + "-" + c.Name + ".log" + err = os.MkdirAll(path.Dir(filename), 0755) + if err != nil { + if to.StatusWriter != nil { + fmt.Fprintf(to.StatusWriter, "ERROR: pod log: create directory for %s: %s\n", filename, err) + } + return + } + // The test suite might run the same test multiple times, + // so we have to append here. + file, err := os.OpenFile(filename, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + if err != nil { + if to.StatusWriter != nil { + fmt.Fprintf(to.StatusWriter, "ERROR: pod log: create file %s: %s\n", filename, err) + } + return + } + closer = file + out = file + } + go func() { + if closer != nil { + defer closer.Close() + } + first := true + defer func() { + m.Lock() + // If we never printed anything, then also skip the final message. + if !first { + if prefix != "" { + fmt.Fprintf(out, "%s==== end of pod log ====\n", prefix) + } else { + fmt.Fprintf(out, "==== end of pod log for container %s ====\n", name) + } + } + active[name] = false + m.Unlock() + readCloser.Close() + }() + scanner := bufio.NewScanner(readCloser) + for scanner.Scan() { + line := scanner.Text() + // Filter out the expected "end of stream" error message, + // it would just confuse developers who don't know about it. + // Same for attempts to read logs from a container that + // isn't ready (yet?!). + if !strings.HasPrefix(line, "rpc error: code = Unknown desc = Error: No such container:") && + !strings.HasPrefix(line, "unable to retrieve container logs for ") && + !strings.HasPrefix(line, "Unable to retrieve container logs for ") { + if first { + // Because the same log might be written to multiple times + // in different test instances, log an extra line to separate them. + // Also provides some useful extra information. + if prefix == "" { + fmt.Fprintf(out, "==== start of pod log for container %s ====\n", name) + } else { + fmt.Fprintf(out, "%s==== start of pod log ====\n", prefix) + } + first = false + } + fmt.Fprintf(out, "%s%s\n", prefix, line) + } + } + }() + active[name] = true + started[id] = true + } + } + } + + // Watch events to see whether we can start logging + // and log interesting ones. + check() + for { + select { + case <-watcher.ResultChan(): + check() + case <-ctx.Done(): + return + } + } + }() + + return nil +} + +// logsForPod starts reading the logs for a certain pod. If the pod has more than one +// container, opts.Container must be set. Reading stops when the context is done. +// The stream includes formatted error messages and ends with +// +// rpc error: code = Unknown desc = Error: No such container: 41a... +// +// when the pod gets deleted while streaming. +func logsForPod(ctx context.Context, cs clientset.Interface, ns, pod string, opts *v1.PodLogOptions) (io.ReadCloser, error) { + return cs.CoreV1().Pods(ns).GetLogs(pod, opts).Stream(ctx) +} diff --git a/test/k8s-integration/version.go b/test/k8s-integration/version.go index 0cbca8ee..a0f4c4ff 100644 --- a/test/k8s-integration/version.go +++ b/test/k8s-integration/version.go @@ -54,6 +54,10 @@ func (v *version) isGKEExtraVersion(extrastr string) bool { return gkeExtraVersionRegex.MatchString(extrastr) } +func (v *version) minorVersion() string { + return fmt.Sprintf("%d.%d", v.major(), v.minor()) +} + func extractGKEExtraVersion(extra string) (int, error) { m := gkeExtraVersionRegex.FindStringSubmatch(extra) if len(m) != 2 { diff --git a/test/remote/client-wrappers.go b/test/remote/client-wrappers.go index 748c0918..7c86e657 100644 --- a/test/remote/client-wrappers.go +++ b/test/remote/client-wrappers.go @@ -99,7 +99,7 @@ func (c *CsiClient) CloseConn() error { return c.conn.Close() } -func (c *CsiClient) CreateVolumeWithCaps(volName string, params map[string]string, sizeInGb int64, topReq *csipb.TopologyRequirement, caps []*csipb.VolumeCapability, volContentSrc *csipb.VolumeContentSource) (string, error) { +func (c *CsiClient) CreateVolumeWithCaps(volName string, params map[string]string, sizeInGb int64, topReq *csipb.TopologyRequirement, caps []*csipb.VolumeCapability, volContentSrc *csipb.VolumeContentSource) (*csipb.Volume, error) { capRange := &csipb.CapacityRange{ RequiredBytes: common.GbToBytes(sizeInGb), } @@ -117,12 +117,12 @@ func (c *CsiClient) CreateVolumeWithCaps(volName string, params map[string]strin } cresp, err := c.ctrlClient.CreateVolume(context.Background(), cvr) if err != nil { - return "", err + return nil, err } - return cresp.GetVolume().GetVolumeId(), nil + return cresp.Volume, nil } -func (c *CsiClient) CreateVolume(volName string, params map[string]string, sizeInGb int64, topReq *csipb.TopologyRequirement, volContentSrc *csipb.VolumeContentSource) (string, error) { +func (c *CsiClient) CreateVolume(volName string, params map[string]string, sizeInGb int64, topReq *csipb.TopologyRequirement, volContentSrc *csipb.VolumeContentSource) (*csipb.Volume, error) { return c.CreateVolumeWithCaps(volName, params, sizeInGb, topReq, stdVolCaps, volContentSrc) } @@ -134,13 +134,18 @@ func (c *CsiClient) DeleteVolume(volId string) error { return err } -func (c *CsiClient) ControllerPublishVolume(volId, nodeId string) error { +func (c *CsiClient) ControllerPublishVolume(volId, nodeId string, forceAttach bool) error { cpreq := &csipb.ControllerPublishVolumeRequest{ VolumeId: volId, NodeId: nodeId, VolumeCapability: stdVolCap, Readonly: false, } + if forceAttach { + cpreq.VolumeContext = map[string]string{ + "force-attach": "true", + } + } _, err := c.ctrlClient.ControllerPublishVolume(context.Background(), cpreq) return err } diff --git a/test/remote/instance.go b/test/remote/instance.go index c716dcef..8aa5b2fd 100644 --- a/test/remote/instance.go +++ b/test/remote/instance.go @@ -415,8 +415,8 @@ func generateMetadataWithPublicKey(pubKeyFile string) (*compute.Metadata, error) // isGCEError returns true if given error is a googleapi.Error with given // reason (e.g. "resourceInUseByAnotherResource") func isGCEError(err error, reason string) bool { - apiErr, ok := err.(*googleapi.Error) - if !ok { + var apiErr *googleapi.Error + if !errors.As(err, &apiErr) { return false } diff --git a/test/run-e2e-local.sh b/test/run-e2e-local.sh index be0455a1..6e60ccc8 100755 --- a/test/run-e2e-local.sh +++ b/test/run-e2e-local.sh @@ -2,7 +2,13 @@ set -o nounset set -o errexit +set -x + +echo Using GOPATH $GOPATH readonly PKGDIR=sigs.k8s.io/gcp-compute-persistent-disk-csi-driver -ginkgo --v "test/e2e/tests" -- --project "${PROJECT}" --service-account "${IAM_NAME}" --v=4 --logtostderr +# This requires application default credentials to be set up, eg by +# `gcloud auth application-default login` + +ginkgo --v "test/e2e/tests" -- --project "${PROJECT}" --service-account "${IAM_NAME}" --v=6 --logtostderr diff --git a/test/run-e2e.sh b/test/run-e2e.sh index e9722337..79144ea3 100755 --- a/test/run-e2e.sh +++ b/test/run-e2e.sh @@ -5,4 +5,4 @@ set -x readonly PKGDIR=sigs.k8s.io/gcp-compute-persistent-disk-csi-driver -go test --timeout 20m --v "${PKGDIR}/test/e2e/tests" --run-in-prow=true --delete-instances=true --logtostderr \ No newline at end of file +go test --timeout 30m --v "${PKGDIR}/test/e2e/tests" --run-in-prow=true --delete-instances=true --logtostderr diff --git a/test/run-k8s-integration-ci.sh b/test/run-k8s-integration-ci.sh index 2388ac64..5f199615 100755 --- a/test/run-k8s-integration-ci.sh +++ b/test/run-k8s-integration-ci.sh @@ -33,7 +33,7 @@ readonly test_disk_image_snapshot=${TEST_DISK_IMAGE_SNAPSHOT:-true} readonly GCE_PD_TEST_FOCUS="PersistentVolumes\sGCEPD|[V|v]olume\sexpand|\[sig-storage\]\sIn-tree\sVolumes\s\[Driver:\sgcepd\]|allowedTopologies|Pod\sDisks|PersistentVolumes\sDefault" -storage_classes=sc-balanced.yaml,sc-ssd.yaml +storage_classes=sc-balanced.yaml,sc-ssd.yaml,sc-xfs.yaml if [[ $test_pd_labels = true ]] ; then storage_classes=${storage_classes},sc-standard.yaml diff --git a/test/run-k8s-integration.sh b/test/run-k8s-integration.sh index 1b86f849..a72db9eb 100755 --- a/test/run-k8s-integration.sh +++ b/test/run-k8s-integration.sh @@ -14,10 +14,11 @@ 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 deployment_strategy=${DEPLOYMENT_STRATEGY:-gce} readonly gke_cluster_version=${GKE_CLUSTER_VERSION:-latest} -readonly kube_version=${GCE_PD_KUBE_VERSION:-master} -readonly test_version=${TEST_VERSION:-master} +readonly kube_version=${GCE_PD_KUBE_VERSION:-stable} +readonly test_version=${TEST_VERSION:-stable} readonly gce_zone=${GCE_CLUSTER_ZONE:-us-central1-b} readonly gce_region=${GCE_CLUSTER_REGION:-} readonly image_type=${IMAGE_TYPE:-cos_containerd} @@ -44,7 +45,8 @@ fi base_cmd="${PKGDIR}/bin/k8s-integration-test \ --run-in-prow=true --service-account-file=${E2E_GOOGLE_APPLICATION_CREDENTIALS} \ - --do-driver-build=${do_driver_build} --teardown-driver=${teardown_driver} --boskos-resource-type=${boskos_resource_type} \ + --do-driver-build=${do_driver_build} --teardown-driver=${teardown_driver} \ + --do-k8s-build=${do_k8s_build} --boskos-resource-type=${boskos_resource_type} \ --storageclass-files=sc-standard.yaml --snapshotclass-files=pd-volumesnapshotclass.yaml \ --deployment-strategy=${deployment_strategy} --test-version=${test_version} \ --num-nodes=3 --image-type=${image_type} --use-kubetest2=${use_kubetest2}" diff --git a/test/sanity/sanity_test.go b/test/sanity/sanity_test.go index a59cfb11..5e8d5344 100644 --- a/test/sanity/sanity_test.go +++ b/test/sanity/sanity_test.go @@ -81,12 +81,12 @@ func TestSanity(t *testing.T) { } mounter := mountmanager.NewFakeSafeMounter() - deviceUtils := deviceutils.NewFakeDeviceUtils() + deviceUtils := deviceutils.NewFakeDeviceUtils(true) // Initialize GCE Driver identityServer := driver.NewIdentityServer(gceDriver) controllerServer := driver.NewControllerServer(gceDriver, cloudProvider, 0, 5*time.Minute) - nodeServer := driver.NewNodeServer(gceDriver, mounter, deviceUtils, metadataservice.NewFakeService(), mountmanager.NewFakeStatter(mounter), &fakeCryptMapper{}, func(s string) (string, error) { return s, nil }) + nodeServer := driver.NewNodeServer(gceDriver, mounter, deviceUtils, metadataservice.NewFakeService(), mountmanager.NewFakeStatter(mounter), &fakeCryptMapper{}) err = gceDriver.SetupGCEDriver(driverName, vendorVersion, extraLabels, identityServer, controllerServer, nodeServer) if err != nil { t.Fatalf("Failed to initialize GCE CSI Driver: %v", err.Error())