From 0535c0d4f101a4c147a710c5fff74e81368dc7e3 Mon Sep 17 00:00:00 2001 From: Aaron Crickenberger Date: Wed, 16 Jan 2019 10:47:35 -0800 Subject: [PATCH 001/242] Initial commit from kubernetes-template-project --- CONTRIBUTING.md | 31 +++++++ LICENSE | 201 +++++++++++++++++++++++++++++++++++++++++++++ OWNERS | 6 ++ OWNERS_ALIASES | 20 +++++ README.md | 29 +++++++ RELEASE.md | 9 ++ SECURITY_CONTACTS | 14 ++++ code-of-conduct.md | 3 + 8 files changed, 313 insertions(+) create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE create mode 100644 OWNERS create mode 100644 OWNERS_ALIASES create mode 100644 README.md create mode 100644 RELEASE.md create mode 100644 SECURITY_CONTACTS create mode 100644 code-of-conduct.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..de471151 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,31 @@ +# Contributing Guidelines + +Welcome to Kubernetes. We are excited about the prospect of you joining our [community](https://github.com/kubernetes/community)! The Kubernetes community abides by the CNCF [code of conduct](code-of-conduct.md). Here is an excerpt: + +_As contributors and maintainers of this project, and in the interest of fostering an open and welcoming community, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities._ + +## Getting Started + +We have full documentation on how to get started contributing here: + + + +- [Contributor License Agreement](https://git.k8s.io/community/CLA.md) Kubernetes projects require that you sign a Contributor License Agreement (CLA) before we can accept your pull requests +- [Kubernetes Contributor Guide](http://git.k8s.io/community/contributors/guide) - Main contributor documentation, or you can just jump directly to the [contributing section](http://git.k8s.io/community/contributors/guide#contributing) +- [Contributor Cheat Sheet](https://git.k8s.io/community/contributors/guide/contributor-cheatsheet.md) - Common resources for existing developers + +## Mentorship + +- [Mentoring Initiatives](https://git.k8s.io/community/mentoring) - We have a diverse set of mentorship programs available that are always looking for volunteers! + + diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..8dada3ed --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + 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. diff --git a/OWNERS b/OWNERS new file mode 100644 index 00000000..e4c79b9d --- /dev/null +++ b/OWNERS @@ -0,0 +1,6 @@ +# See the OWNERS docs: https://git.k8s.io/community/contributors/guide/owners.md + +approvers: + # TODO: in your repo created from this template, you should replace the + # steering-committee with a list of project owners, see the doc linked above. + - steering-committee diff --git a/OWNERS_ALIASES b/OWNERS_ALIASES new file mode 100644 index 00000000..8bcd3a60 --- /dev/null +++ b/OWNERS_ALIASES @@ -0,0 +1,20 @@ +# See the OWNERS_ALIASES docs: https://git.k8s.io/community/contributors/guide/owners.md#owners_aliases + +aliases: + # TODO: remove this alias, it will go stale in your repo, and in your repo + # you should have your own set of approvers (see OWNERS) + # in the original template repo, we must maintain this list to approve changes + # to the template itself + steering-committee: + - bgrant0607 + - brendandburns + - derekwaynecarr + - dims + - jbeda + - michelleN + - philips + - pwittrock + - sarahnovotny + - smarterclayton + - spiffxp + - timothysc diff --git a/README.md b/README.md new file mode 100644 index 00000000..9431b7bb --- /dev/null +++ b/README.md @@ -0,0 +1,29 @@ +# Kubernetes Template Project + +The Kubernetes Template Project is a template for starting new projects in the GitHub organizations owned by Kubernetes. All Kubernetes projects, at minimum, must have the following files: + +- a `README.md` outlining the project goals, sponsoring sig, and community contact information +- an `OWNERS` with the project leads listed as approvers ([docs on `OWNERS` files][owners]) +- a `CONTRIBUTING.md` outlining how to contribute to the project +- an unmodified copy of `code-of-conduct.md` from this repo, which outlines community behavior and the consequences of breaking the code +- a `LICENSE` which must be Apache 2.0 for code projects, or [Creative Commons 4.0] for documentation repositories, without any custom content +- a `SECURITY_CONTACTS` with the contact points for the Product Security Team + to reach out to for triaging and handling of incoming issues. They must agree to abide by the + [Embargo Policy](https://github.com/kubernetes/sig-release/blob/master/security-release-process-documentation/security-release-process.md#embargo-policy) + and will be removed and replaced if they violate that agreement. + +## Community, discussion, contribution, and support + +Learn how to engage with the Kubernetes community on the [community page](http://kubernetes.io/community/). + +You can reach the maintainers of this project at: + +- [Slack](http://slack.k8s.io/) +- [Mailing List](https://groups.google.com/forum/#!forum/kubernetes-dev) + +### Code of conduct + +Participation in the Kubernetes community is governed by the [Kubernetes Code of Conduct](code-of-conduct.md). + +[owners]: https://git.k8s.io/community/contributors/guide/owners.md +[Creative Commons 4.0]: https://git.k8s.io/website/LICENSE diff --git a/RELEASE.md b/RELEASE.md new file mode 100644 index 00000000..7274b344 --- /dev/null +++ b/RELEASE.md @@ -0,0 +1,9 @@ +# Release Process + +The Kubernetes Template Project is released on an as-needed basis. The process is as follows: + +1. An issue is proposing a new release with a changelog since the last release +1. All [OWNERS](OWNERS) must LGTM this release +1. An OWNER runs `git tag -s $VERSION` and inserts the changelog and pushes the tag with `git push $VERSION` +1. The release issue is closed +1. An announcement email is sent to `kubernetes-dev@googlegroups.com` with the subject `[ANNOUNCE] kubernetes-template-project $VERSION is released` diff --git a/SECURITY_CONTACTS b/SECURITY_CONTACTS new file mode 100644 index 00000000..39689175 --- /dev/null +++ b/SECURITY_CONTACTS @@ -0,0 +1,14 @@ +# Defined below are the security contacts for this repo. +# +# They are the contact point for the Product Security Team to reach out +# to for triaging and handling of incoming issues. +# +# The below names agree to abide by the +# [Embargo Policy](https://github.com/kubernetes/sig-release/blob/master/security-release-process-documentation/security-release-process.md#embargo-policy) +# and will be removed and replaced if they violate that agreement. +# +# DO NOT REPORT SECURITY VULNERABILITIES DIRECTLY TO THESE NAMES, FOLLOW THE +# INSTRUCTIONS AT https://kubernetes.io/security/ + +bob +alice diff --git a/code-of-conduct.md b/code-of-conduct.md new file mode 100644 index 00000000..0d15c00c --- /dev/null +++ b/code-of-conduct.md @@ -0,0 +1,3 @@ +# Kubernetes Community Code of Conduct + +Please refer to our [Kubernetes Community Code of Conduct](https://git.k8s.io/community/code-of-conduct.md) From b41cac350d9dd1b9c478b16c398745aeb95390a6 Mon Sep 17 00:00:00 2001 From: Aaron Crickenberger Date: Wed, 16 Jan 2019 10:51:52 -0800 Subject: [PATCH 002/242] Add files from github.com/pohly/csi-build-rules --- README.md | 79 ++-- build.make | 1211 ++++++++++++++++++++++++++++++++++++++++++++++++++++ travis.yml | 14 + 3 files changed, 1275 insertions(+), 29 deletions(-) create mode 100644 build.make create mode 100644 travis.yml diff --git a/README.md b/README.md index 9431b7bb..c67e9308 100644 --- a/README.md +++ b/README.md @@ -1,29 +1,50 @@ -# Kubernetes Template Project - -The Kubernetes Template Project is a template for starting new projects in the GitHub organizations owned by Kubernetes. All Kubernetes projects, at minimum, must have the following files: - -- a `README.md` outlining the project goals, sponsoring sig, and community contact information -- an `OWNERS` with the project leads listed as approvers ([docs on `OWNERS` files][owners]) -- a `CONTRIBUTING.md` outlining how to contribute to the project -- an unmodified copy of `code-of-conduct.md` from this repo, which outlines community behavior and the consequences of breaking the code -- a `LICENSE` which must be Apache 2.0 for code projects, or [Creative Commons 4.0] for documentation repositories, without any custom content -- a `SECURITY_CONTACTS` with the contact points for the Product Security Team - to reach out to for triaging and handling of incoming issues. They must agree to abide by the - [Embargo Policy](https://github.com/kubernetes/sig-release/blob/master/security-release-process-documentation/security-release-process.md#embargo-policy) - and will be removed and replaced if they violate that agreement. - -## Community, discussion, contribution, and support - -Learn how to engage with the Kubernetes community on the [community page](http://kubernetes.io/community/). - -You can reach the maintainers of this project at: - -- [Slack](http://slack.k8s.io/) -- [Mailing List](https://groups.google.com/forum/#!forum/kubernetes-dev) - -### Code of conduct - -Participation in the Kubernetes community is governed by the [Kubernetes Code of Conduct](code-of-conduct.md). - -[owners]: https://git.k8s.io/community/contributors/guide/owners.md -[Creative Commons 4.0]: https://git.k8s.io/website/LICENSE +# [csi-build-rules](https://github.com/kubernetes-csi/csi-build-rules) + +These build and test rules can be shared between different Go projects +without modifications. Customization for the different projects happen +in the top-level Makefile. + +The rules include support for building and pushing Docker images, with +the following features: + - one or more command and image per project + - push canary and/or tagged release images + - automatically derive the image tag(s) from repo tags + - the source code revision is stored in a "revision" image label + - never overwrites an existing release image + +Usage +----- + +The expected repository layout is: + - `cmd/*/*.go` - source code for each command + - `cmd/*/Dockerfile` - docker file for each command or + Dockerfile in the root when only building a single command + - `Makefile` - includes `build-rules/build.make` and sets + configuration variables + - `.travis.yml` - a symlink to `build-rules/.travis.yml` + +To create a release, tag a certain revision with a name that +starts with `v`, for example `v1.0.0`, then `make push` +while that commit is checked out. + +It does not matter on which branch that revision exists, i.e. it is +possible to create releases directly from master. A release branch can +still be created for maintenance releases later if needed. + +Release branches are expected to be named `release-x.y` for releases +`x.y.z`. Building from such a branch creates `x.y-canary` +images. Building from master creates the main `canary` image. + +Sharing and updating +-------------------- + +[`git subtree`](https://github.com/git/git/blob/master/contrib/subtree/git-subtree.txt) +is the recommended way of maintaining a copy of the rules inside the +`build-rules` directory of a project. This way, it is possible to make +changes also locally, test them and then push them back to the shared +repository at a later time. + +Cheat sheet: + +- `git subtree pull --prefix=build-rules https://github.com/kubernetes-csi/csi-build-rules.git master` - update local copy to latest upstream +- edit, `git commit`, `git subtree push --prefix=build-rules git@github.com:/csi-build-rules.git ` - push to a new branch before submitting a PR diff --git a/build.make b/build.make new file mode 100644 index 00000000..460ee71c --- /dev/null +++ b/build.make @@ -0,0 +1,1211 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + csi-build-rules/build.make at master · pohly/csi-build-rules · GitHub + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Skip to content +
+ + + + + + + + + +
+ +
+ +
+ +
+ + + +
+
+
+ + + + + + + + + + + +
+
+ + + + + + + + Permalink + + + + + + +
+ +
+ + +
+
+
+
+ +
+
+
+
+ +
+ + Find file + + + Copy path + +
+ +
+ + + +
+ + + c03f108 + + Jan 9, 2019 + + + +
+ +
+ + + 1 contributor + + +
+ +

Users who have contributed to this file

+
+ + + +
+
+ +
+
+ + + + +
+ +
+ +
+ + +
+ Raw + Blame + History +
+ + + + +
+ +
+ 100 lines (83 sloc) + + 3.78 KB +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
# Copyright 2017 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.
+
.PHONY: build-% build container-% container push-% push clean test
+
# A space-separated list of all commands in the repository, must be
# set in main Makefile of a repository.
# CMDS=
+
# This is the default. It can be overridden in the main Makefile after
# including build.make.
REGISTRY_NAME=quay.io/k8scsi
+
# Revision that gets built into each binary via the main.version
# string. Uses the `git describe` output based on the most recent
# version tag with a short revision suffix or, if nothing has been
# tagged yet, just the revision.
#
# Beware that tags may also be missing in shallow clones as done by
# some CI systems (like TravisCI, which pulls only 50 commits).
REV=$(shell git describe --long --tags --match='v*' --dirty 2>/dev/null || git rev-list -n1 HEAD)
+
# A space-separated list of image tags under which the current build is to be pushed.
# Determined dynamically.
IMAGE_TAGS=
+
# A "canary" image gets built if the current commit is the head of the remote "master" branch.
# That branch does not exist when building some other branch in TravisCI.
IMAGE_TAGS+=$(shell if [ "$$(git rev-list -n1 HEAD)" = "$$(git rev-list -n1 origin/master 2>/dev/null)" ]; then echo "canary"; fi)
+
# A "X.Y.Z-canary" image gets built if the current commit is the head of a "origin/release-X.Y.Z" branch.
# The actual suffix does not matter, only the "release-" prefix is checked.
IMAGE_TAGS+=$(shell git branch -r --points-at=HEAD | grep 'origin/release-' | grep -v -e ' -> ' | sed -e 's;.*/release-\(.*\);\1-canary;')
+
# A release image "vX.Y.Z" gets built if there is a tag of that format for the current commit.
# --abbrev=0 suppresses long format, only showing the closest tag.
IMAGE_TAGS+=$(shell tagged="$$(git describe --tags --match='v*' --abbrev=0)"; if [ "$$tagged" ] && [ "$$(git rev-list -n1 HEAD)" = "$$(git rev-list -n1 $$tagged)" ]; then echo $$tagged; fi)
+
# Images are named after the command contained in them.
IMAGE_NAME=$(REGISTRY_NAME)/$*
+
ifdef V
TESTARGS = -v -args -alsologtostderr -v 5
else
TESTARGS =
endif
+
build-%:
mkdir -p bin
CGO_ENABLED=0 GOOS=linux go build -a -ldflags '-X main.version=$(REV) -extldflags "-static"' -o ./bin/$* ./cmd/$*
+
container-%: build-%
docker build -t $*:latest -f $(shell if [ -e ./cmd/$*/Dockerfile ]; then echo ./cmd/$*/Dockerfile; else echo Dockerfile; fi) --label revision=$(REV) .
+
push-%: container-%
set -ex; \
push_image () { \
docker tag $*:latest $(IMAGE_NAME):$$tag; \
docker push $(IMAGE_NAME):$$tag; \
}; \
for tag in $(IMAGE_TAGS); do \
if echo $$tag | grep -q -e '-canary$$'; then \
: "creating or overwriting canary image"; \
push_image; \
elif docker pull $(IMAGE_NAME):$$tag 2>&1 | tee /dev/stderr | grep -q "manifest for $(IMAGE_NAME):$$tag not found"; then \
: "creating release image"; \
push_image; \
else \
: "release image $(IMAGE_NAME):$$tag already exists, skipping push"; \
fi; \
done
+
build: $(CMDS:%=build-%)
container: $(CMDS:%=container-%)
push: $(CMDS:%=push-%)
+
clean:
-rm -rf bin
+
test:
go test `go list ./... | grep -v 'vendor'` $(TESTARGS)
go vet `go list ./... | grep -v vendor`
files=$$(find . -name '*.go' | grep -v './vendor'); \
if [ $$(gofmt -d $$files | wc -l) -ne 0 ]; then \
echo "formatting errors:"; \
gofmt -d $$files; \
false; \
fi
+ + + +
+ +
+ + + +
+ + +
+ + +
+
+ + + +
+ +
+ +
+
+ +
+ + + + + + +
+ + + You can’t perform that action at this time. +
+ + + + + + + + + +
+ + You signed in with another tab or window. Reload to refresh your session. + You signed out in another tab or window. Reload to refresh your session. +
+ + + + + + +
+ Press h to open a hovercard with more details. +
+ +
+ + + + diff --git a/travis.yml b/travis.yml new file mode 100644 index 00000000..a44b0017 --- /dev/null +++ b/travis.yml @@ -0,0 +1,14 @@ +language: go +sudo: required +services: + - docker +matrix: + include: + - go: 1.11.1 +script: +- make all test +after_success: + - if [ "${TRAVIS_PULL_REQUEST}" == "false" ]; then + docker login -u "${DOCKER_USERNAME}" -p "${DOCKER_PASSWORD}" quay.io; + make push; + fi From d23a16cb744734b468ac4e226c98ca8aaaea9125 Mon Sep 17 00:00:00 2001 From: Aaron Crickenberger Date: Wed, 16 Jan 2019 11:19:16 -0800 Subject: [PATCH 003/242] Port over information from kubernetes/org --- OWNERS | 11 ++++++++--- OWNERS_ALIASES | 20 -------------------- RELEASE.md | 8 +------- SECURITY_CONTACTS | 4 ++-- 4 files changed, 11 insertions(+), 32 deletions(-) delete mode 100644 OWNERS_ALIASES diff --git a/OWNERS b/OWNERS index e4c79b9d..6d2f474e 100644 --- a/OWNERS +++ b/OWNERS @@ -1,6 +1,11 @@ # See the OWNERS docs: https://git.k8s.io/community/contributors/guide/owners.md approvers: - # TODO: in your repo created from this template, you should replace the - # steering-committee with a list of project owners, see the doc linked above. - - steering-committee +- saad-ali +- msau42 +- pohly + +reviewers: +- saad-ali +- msau42 +- pohly diff --git a/OWNERS_ALIASES b/OWNERS_ALIASES deleted file mode 100644 index 8bcd3a60..00000000 --- a/OWNERS_ALIASES +++ /dev/null @@ -1,20 +0,0 @@ -# See the OWNERS_ALIASES docs: https://git.k8s.io/community/contributors/guide/owners.md#owners_aliases - -aliases: - # TODO: remove this alias, it will go stale in your repo, and in your repo - # you should have your own set of approvers (see OWNERS) - # in the original template repo, we must maintain this list to approve changes - # to the template itself - steering-committee: - - bgrant0607 - - brendandburns - - derekwaynecarr - - dims - - jbeda - - michelleN - - philips - - pwittrock - - sarahnovotny - - smarterclayton - - spiffxp - - timothysc diff --git a/RELEASE.md b/RELEASE.md index 7274b344..491044d2 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,9 +1,3 @@ # Release Process -The Kubernetes Template Project is released on an as-needed basis. The process is as follows: - -1. An issue is proposing a new release with a changelog since the last release -1. All [OWNERS](OWNERS) must LGTM this release -1. An OWNER runs `git tag -s $VERSION` and inserts the changelog and pushes the tag with `git push $VERSION` -1. The release issue is closed -1. An announcement email is sent to `kubernetes-dev@googlegroups.com` with the subject `[ANNOUNCE] kubernetes-template-project $VERSION is released` +TODO: describe the release process for this project diff --git a/SECURITY_CONTACTS b/SECURITY_CONTACTS index 39689175..2af1414e 100644 --- a/SECURITY_CONTACTS +++ b/SECURITY_CONTACTS @@ -10,5 +10,5 @@ # DO NOT REPORT SECURITY VULNERABILITIES DIRECTLY TO THESE NAMES, FOLLOW THE # INSTRUCTIONS AT https://kubernetes.io/security/ -bob -alice +saad-ali +msau42 From a1136470c29f970e0af87d352a1b3cb1520d09dc Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Mon, 21 Jan 2019 10:08:51 +0100 Subject: [PATCH 004/242] build.make: initial content The repo was created with an HTML version of the build.make file from https://github.com/pohly/csi-build-rules/. Here's the raw file. --- build.make | 1310 ++++------------------------------------------------ 1 file changed, 99 insertions(+), 1211 deletions(-) diff --git a/build.make b/build.make index 460ee71c..42146483 100644 --- a/build.make +++ b/build.make @@ -1,1211 +1,99 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - csi-build-rules/build.make at master · pohly/csi-build-rules · GitHub - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Skip to content -
- - - - - - - - - -
- -
- -
- -
- - - -
-
-
- - - - - - - - - - - -
-
- - - - - - - - Permalink - - - - - - -
- -
- - -
-
-
-
- -
-
-
-
- -
- - Find file - - - Copy path - -
- -
- - - -
- - - c03f108 - - Jan 9, 2019 - - - -
- -
- - - 1 contributor - - -
- -

Users who have contributed to this file

-
- - - -
-
- -
-
- - - - -
- -
- -
- - -
- Raw - Blame - History -
- - - - -
- -
- 100 lines (83 sloc) - - 3.78 KB -
-
- - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Copyright 2017 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.
-
.PHONY: build-% build container-% container push-% push clean test
-
# A space-separated list of all commands in the repository, must be
# set in main Makefile of a repository.
# CMDS=
-
# This is the default. It can be overridden in the main Makefile after
# including build.make.
REGISTRY_NAME=quay.io/k8scsi
-
# Revision that gets built into each binary via the main.version
# string. Uses the `git describe` output based on the most recent
# version tag with a short revision suffix or, if nothing has been
# tagged yet, just the revision.
#
# Beware that tags may also be missing in shallow clones as done by
# some CI systems (like TravisCI, which pulls only 50 commits).
REV=$(shell git describe --long --tags --match='v*' --dirty 2>/dev/null || git rev-list -n1 HEAD)
-
# A space-separated list of image tags under which the current build is to be pushed.
# Determined dynamically.
IMAGE_TAGS=
-
# A "canary" image gets built if the current commit is the head of the remote "master" branch.
# That branch does not exist when building some other branch in TravisCI.
IMAGE_TAGS+=$(shell if [ "$$(git rev-list -n1 HEAD)" = "$$(git rev-list -n1 origin/master 2>/dev/null)" ]; then echo "canary"; fi)
-
# A "X.Y.Z-canary" image gets built if the current commit is the head of a "origin/release-X.Y.Z" branch.
# The actual suffix does not matter, only the "release-" prefix is checked.
IMAGE_TAGS+=$(shell git branch -r --points-at=HEAD | grep 'origin/release-' | grep -v -e ' -> ' | sed -e 's;.*/release-\(.*\);\1-canary;')
-
# A release image "vX.Y.Z" gets built if there is a tag of that format for the current commit.
# --abbrev=0 suppresses long format, only showing the closest tag.
IMAGE_TAGS+=$(shell tagged="$$(git describe --tags --match='v*' --abbrev=0)"; if [ "$$tagged" ] && [ "$$(git rev-list -n1 HEAD)" = "$$(git rev-list -n1 $$tagged)" ]; then echo $$tagged; fi)
-
# Images are named after the command contained in them.
IMAGE_NAME=$(REGISTRY_NAME)/$*
-
ifdef V
TESTARGS = -v -args -alsologtostderr -v 5
else
TESTARGS =
endif
-
build-%:
mkdir -p bin
CGO_ENABLED=0 GOOS=linux go build -a -ldflags '-X main.version=$(REV) -extldflags "-static"' -o ./bin/$* ./cmd/$*
-
container-%: build-%
docker build -t $*:latest -f $(shell if [ -e ./cmd/$*/Dockerfile ]; then echo ./cmd/$*/Dockerfile; else echo Dockerfile; fi) --label revision=$(REV) .
-
push-%: container-%
set -ex; \
push_image () { \
docker tag $*:latest $(IMAGE_NAME):$$tag; \
docker push $(IMAGE_NAME):$$tag; \
}; \
for tag in $(IMAGE_TAGS); do \
if echo $$tag | grep -q -e '-canary$$'; then \
: "creating or overwriting canary image"; \
push_image; \
elif docker pull $(IMAGE_NAME):$$tag 2>&1 | tee /dev/stderr | grep -q "manifest for $(IMAGE_NAME):$$tag not found"; then \
: "creating release image"; \
push_image; \
else \
: "release image $(IMAGE_NAME):$$tag already exists, skipping push"; \
fi; \
done
-
build: $(CMDS:%=build-%)
container: $(CMDS:%=container-%)
push: $(CMDS:%=push-%)
-
clean:
-rm -rf bin
-
test:
go test `go list ./... | grep -v 'vendor'` $(TESTARGS)
go vet `go list ./... | grep -v vendor`
files=$$(find . -name '*.go' | grep -v './vendor'); \
if [ $$(gofmt -d $$files | wc -l) -ne 0 ]; then \
echo "formatting errors:"; \
gofmt -d $$files; \
false; \
fi
- - - -
- -
- - - -
- - -
- - -
-
- - - -
- -
- -
-
- -
- - - - - - -
- - - You can’t perform that action at this time. -
- - - - - - - - - -
- - You signed in with another tab or window. Reload to refresh your session. - You signed out in another tab or window. Reload to refresh your session. -
- - - - - - -
- Press h to open a hovercard with more details. -
- -
- - - - +# Copyright 2019 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. + +.PHONY: build-% build container-% container push-% push clean test + +# A space-separated list of all commands in the repository, must be +# set in main Makefile of a repository. +# CMDS= + +# This is the default. It can be overridden in the main Makefile after +# including build.make. +REGISTRY_NAME=quay.io/k8scsi + +# Revision that gets built into each binary via the main.version +# string. Uses the `git describe` output based on the most recent +# version tag with a short revision suffix or, if nothing has been +# tagged yet, just the revision. +# +# Beware that tags may also be missing in shallow clones as done by +# some CI systems (like TravisCI, which pulls only 50 commits). +REV=$(shell git describe --long --tags --match='v*' --dirty 2>/dev/null || git rev-list -n1 HEAD) + +# A space-separated list of image tags under which the current build is to be pushed. +# Determined dynamically. +IMAGE_TAGS= + +# A "canary" image gets built if the current commit is the head of the remote "master" branch. +# That branch does not exist when building some other branch in TravisCI. +IMAGE_TAGS+=$(shell if [ "$$(git rev-list -n1 HEAD)" = "$$(git rev-list -n1 origin/master 2>/dev/null)" ]; then echo "canary"; fi) + +# A "X.Y.Z-canary" image gets built if the current commit is the head of a "origin/release-X.Y.Z" branch. +# The actual suffix does not matter, only the "release-" prefix is checked. +IMAGE_TAGS+=$(shell git branch -r --points-at=HEAD | grep 'origin/release-' | grep -v -e ' -> ' | sed -e 's;.*/release-\(.*\);\1-canary;') + +# A release image "vX.Y.Z" gets built if there is a tag of that format for the current commit. +# --abbrev=0 suppresses long format, only showing the closest tag. +IMAGE_TAGS+=$(shell tagged="$$(git describe --tags --match='v*' --abbrev=0)"; if [ "$$tagged" ] && [ "$$(git rev-list -n1 HEAD)" = "$$(git rev-list -n1 $$tagged)" ]; then echo $$tagged; fi) + +# Images are named after the command contained in them. +IMAGE_NAME=$(REGISTRY_NAME)/$* + +ifdef V +TESTARGS = -v -args -alsologtostderr -v 5 +else +TESTARGS = +endif + +build-%: + mkdir -p bin + CGO_ENABLED=0 GOOS=linux go build -a -ldflags '-X main.version=$(REV) -extldflags "-static"' -o ./bin/$* ./cmd/$* + +container-%: build-% + docker build -t $*:latest -f $(shell if [ -e ./cmd/$*/Dockerfile ]; then echo ./cmd/$*/Dockerfile; else echo Dockerfile; fi) --label revision=$(REV) . + +push-%: container-% + set -ex; \ + push_image () { \ + docker tag $*:latest $(IMAGE_NAME):$$tag; \ + docker push $(IMAGE_NAME):$$tag; \ + }; \ + for tag in $(IMAGE_TAGS); do \ + if echo $$tag | grep -q -e '-canary$$'; then \ + : "creating or overwriting canary image"; \ + push_image; \ + elif docker pull $(IMAGE_NAME):$$tag 2>&1 | tee /dev/stderr | grep -q "manifest for $(IMAGE_NAME):$$tag not found"; then \ + : "creating release image"; \ + push_image; \ + else \ + : "release image $(IMAGE_NAME):$$tag already exists, skipping push"; \ + fi; \ + done + +build: $(CMDS:%=build-%) +container: $(CMDS:%=container-%) +push: $(CMDS:%=push-%) + +clean: + -rm -rf bin + +test: + go test `go list ./... | grep -v 'vendor'` $(TESTARGS) + go vet `go list ./... | grep -v vendor` + files=$$(find . -name '*.go' | grep -v './vendor'); \ + if [ $$(gofmt -d $$files | wc -l) -ne 0 ]; then \ + echo "formatting errors:"; \ + gofmt -d $$files; \ + false; \ + fi From 51e16be615359fa450d223f3a7381a85dacc62fb Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Mon, 21 Jan 2019 10:18:56 +0100 Subject: [PATCH 005/242] RELEASE.md: clarify release process It's worth calling out explicitly that only the master branch is maintained. --- RELEASE.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/RELEASE.md b/RELEASE.md index 491044d2..a0fd815b 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,3 +1,5 @@ # Release Process -TODO: describe the release process for this project +No tagged releases are planned at this point. The intention is to keep +the master branch in a state such that it can be used for all +supported branches in downstream repos which use these files. From c876547b7f4b22447c963a68cc81529e181105ba Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Mon, 21 Jan 2019 10:26:11 +0100 Subject: [PATCH 006/242] README.md: update repo name, add initial setup step The actual repository was not named like the prototype repo. --- README.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index c67e9308..286be88d 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# [csi-build-rules](https://github.com/kubernetes-csi/csi-build-rules) +# [csi-release-tools](https://github.com/kubernetes-csi/csi-release-tools) These build and test rules can be shared between different Go projects without modifications. Customization for the different projects happen @@ -19,9 +19,9 @@ The expected repository layout is: - `cmd/*/*.go` - source code for each command - `cmd/*/Dockerfile` - docker file for each command or Dockerfile in the root when only building a single command - - `Makefile` - includes `build-rules/build.make` and sets + - `Makefile` - includes `release-tools/build.make` and sets configuration variables - - `.travis.yml` - a symlink to `build-rules/.travis.yml` + - `.travis.yml` - a symlink to `release-tools/.travis.yml` To create a release, tag a certain revision with a name that starts with `v`, for example `v1.0.0`, then `make push` @@ -40,11 +40,12 @@ Sharing and updating [`git subtree`](https://github.com/git/git/blob/master/contrib/subtree/git-subtree.txt) is the recommended way of maintaining a copy of the rules inside the -`build-rules` directory of a project. This way, it is possible to make +`release-tools` directory of a project. This way, it is possible to make changes also locally, test them and then push them back to the shared repository at a later time. Cheat sheet: -- `git subtree pull --prefix=build-rules https://github.com/kubernetes-csi/csi-build-rules.git master` - update local copy to latest upstream -- edit, `git commit`, `git subtree push --prefix=build-rules git@github.com:/csi-build-rules.git ` - push to a new branch before submitting a PR +- `git subtree add --prefix=release-tools https://github.com/pohly/csi-release-tools.git master` - add release tools to a repo which does not have them yet (only once) +- `git subtree pull --prefix=release-tools https://github.com/kubernetes-csi/csi-release-tools.git master` - update local copy to latest upstream (whenever upstream changes) +- edit, `git commit`, `git subtree push --prefix=release-tools git@github.com:/csi-release-tools.git ` - push to a new branch before submitting a PR From f49080e0865b38254f20b372cf6da8aab23917b9 Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Tue, 22 Jan 2019 10:28:11 +0100 Subject: [PATCH 007/242] README.md: fix repo URL for initial setup Copy-and-paste error from the time when the kubernetes-csi/csi-release-tools repo didn't have the code... --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 286be88d..56d2248c 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,6 @@ repository at a later time. Cheat sheet: -- `git subtree add --prefix=release-tools https://github.com/pohly/csi-release-tools.git master` - add release tools to a repo which does not have them yet (only once) +- `git subtree add --prefix=release-tools https://github.com/kubernetes-csi/csi-release-tools.git master` - add release tools to a repo which does not have them yet (only once) - `git subtree pull --prefix=release-tools https://github.com/kubernetes-csi/csi-release-tools.git master` - update local copy to latest upstream (whenever upstream changes) - edit, `git commit`, `git subtree push --prefix=release-tools git@github.com:/csi-release-tools.git ` - push to a new branch before submitting a PR From 73db45967f57f911fbe707032c7b241af82ad5d7 Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Wed, 23 Jan 2019 14:41:26 +0100 Subject: [PATCH 008/242] verify-subtree.sh: ensure that there are no local commits The goal is to enforce that changes get merged upstream first and only get into the local repo via a normal "git subtree merge". --- verify-subtree.sh | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100755 verify-subtree.sh diff --git a/verify-subtree.sh b/verify-subtree.sh new file mode 100755 index 00000000..ce8375fc --- /dev/null +++ b/verify-subtree.sh @@ -0,0 +1,41 @@ +#! /bin/sh -e +# +# Copyright 2019 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. + +# This script verifies that the content of a directory managed +# by "git subtree" has not been modified locally. It does that +# by looking for commits that modify the files with the +# subtree prefix (aka directory) while ignoring merge +# commits. Merge commits are where "git subtree" pulls the +# upstream files into the directory. +# +# Theoretically a developer can subvert this check by modifying files +# in a merge commit, but in practice that shouldn't happen. + +DIR="$1" +if [ ! "$DIR" ]; then + echo "usage: $0 " >&2 + exit 1 +fi + +REV=$(git log -n1 --format=format:%H --no-merges -- "$DIR") +if [ "$REV" ]; then + echo "Directory '$DIR' contains non-upstream changes:" + echo + git log --no-merges -- "$DIR" + exit 1 +else + echo "$DIR is a clean copy of upstream." +fi From 9132a016e9465b0f6af506a9aa372b45aa1bfbe0 Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Wed, 23 Jan 2019 14:49:07 +0100 Subject: [PATCH 009/242] test: split up into individual targets, run all "make test" used to abort after the first test failure. That was partly intentional: if the simple tests already fail (for example, because of a syntax error), then there is no point in continuing to test. However, it also makes it harder to find all errors in a CI system when the errors are unrelated (first error shows up, gets fixed, next error shows up, etc.). Now "make test" still aborts early, but "make -k test" is used in the CI and will run all individual tests because they are split up into different targets. --- build.make | 15 +++++++++++++++ travis.yml | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/build.make b/build.make index 42146483..4818b512 100644 --- a/build.make +++ b/build.make @@ -89,8 +89,23 @@ clean: -rm -rf bin test: + +.PHONY: test-go +test: test-go +test-go: + @ echo; echo $@ go test `go list ./... | grep -v 'vendor'` $(TESTARGS) + +.PHONY: test-vet +test: test-vet +test-vet: + @ echo; echo $@ go vet `go list ./... | grep -v vendor` + +.PHONY: test-fmt +test: test-fmt +test-fmt: + @ echo; echo $@ files=$$(find . -name '*.go' | grep -v './vendor'); \ if [ $$(gofmt -d $$files | wc -l) -ne 0 ]; then \ echo "formatting errors:"; \ diff --git a/travis.yml b/travis.yml index a44b0017..b5a360af 100644 --- a/travis.yml +++ b/travis.yml @@ -6,7 +6,7 @@ matrix: include: - go: 1.11.1 script: -- make all test +- make -k all test after_success: - if [ "${TRAVIS_PULL_REQUEST}" == "false" ]; then docker login -u "${DOCKER_USERNAME}" -p "${DOCKER_PASSWORD}" quay.io; From f28c6b60aaa5f1ab61cb606744f25cc0ed8081a1 Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Wed, 23 Jan 2019 14:52:09 +0100 Subject: [PATCH 010/242] test: verify that 'release-tools' subtree is clean We don't want to allow local modifications in the subtree. Everything should go to the csi-release-tools repo first. --- build.make | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/build.make b/build.make index 4818b512..f07f25e8 100644 --- a/build.make +++ b/build.make @@ -112,3 +112,9 @@ test-fmt: gofmt -d $$files; \ false; \ fi + +.PHONY: test-subtree +test: test-subtree +test-subtree: + @ echo; echo $@ + ./release-tools/verify-subtree.sh release-tools From 154e33d434e49657651e669956eac56c7d43e073 Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Thu, 24 Jan 2019 16:42:23 +0100 Subject: [PATCH 011/242] build.make: clarify usage of "make V=1" This may or may not work, depending on which packages have tests and whether they contain glog. --- build.make | 1 + 1 file changed, 1 insertion(+) diff --git a/build.make b/build.make index f07f25e8..010dcb94 100644 --- a/build.make +++ b/build.make @@ -51,6 +51,7 @@ IMAGE_TAGS+=$(shell tagged="$$(git describe --tags --match='v*' --abbrev=0)"; if IMAGE_NAME=$(REGISTRY_NAME)/$* ifdef V +# Adding "-alsologtostderr" assumes that all test binaries contain glog. This is not guaranteed. TESTARGS = -v -args -alsologtostderr -v 5 else TESTARGS = From 147892c95429680cf2caa4a6ce32461fa50422d3 Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Thu, 24 Jan 2019 16:43:24 +0100 Subject: [PATCH 012/242] build.make: support suppressing checks Individual repos may have to filter out certain packages from testing. For example, in csi-test the cmd/csi-sanity directory contains a special test that depends on additional parameters that set the CSI driver to test against. --- build.make | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/build.make b/build.make index 010dcb94..dfc405e0 100644 --- a/build.make +++ b/build.make @@ -57,6 +57,9 @@ else TESTARGS = endif +# Specific packages can be excluded from each of the tests below by setting the *_FILTER_CMD variables +# to something like "| grep -v 'github.com/kubernetes-csi/project/pkg/foobar'". See usage below. + build-%: mkdir -p bin CGO_ENABLED=0 GOOS=linux go build -a -ldflags '-X main.version=$(REV) -extldflags "-static"' -o ./bin/$* ./cmd/$* @@ -95,19 +98,19 @@ test: test: test-go test-go: @ echo; echo $@ - go test `go list ./... | grep -v 'vendor'` $(TESTARGS) + go test `go list ./... | grep -v 'vendor' $(TEST_GO_FILTER_CMD)` $(TESTARGS) .PHONY: test-vet test: test-vet test-vet: @ echo; echo $@ - go vet `go list ./... | grep -v vendor` + go vet `go list ./... | grep -v vendor $(TEST_VET_FILTER_CMD)` .PHONY: test-fmt test: test-fmt test-fmt: @ echo; echo $@ - files=$$(find . -name '*.go' | grep -v './vendor'); \ + files=$$(find . -name '*.go' | grep -v './vendor' $(TEST_FMT_FILTER_CMD)); \ if [ $$(gofmt -d $$files | wc -l) -ne 0 ]; then \ echo "formatting errors:"; \ gofmt -d $$files; \ From 09436b9f9011cbb997f9226f243347bd4e802a3d Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Fri, 25 Jan 2019 11:48:59 +0100 Subject: [PATCH 013/242] build.make: fix pushing of "canary" image from master branch After merging into external-attacher, the next Travis CI run did not push the "canary" image because the check for "canary" only covered the case where "-canary" is used as suffix (https://travis-ci.org/kubernetes-csi/external-attacher/builds/484095261). --- build.make | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.make b/build.make index f07f25e8..a6a8916e 100644 --- a/build.make +++ b/build.make @@ -70,7 +70,7 @@ push-%: container-% docker push $(IMAGE_NAME):$$tag; \ }; \ for tag in $(IMAGE_TAGS); do \ - if echo $$tag | grep -q -e '-canary$$'; then \ + if [ "$$tag" = "canary" ] || echo "$$tag" | grep -q -e '-canary$$'; then \ : "creating or overwriting canary image"; \ push_image; \ elif docker pull $(IMAGE_NAME):$$tag 2>&1 | tee /dev/stderr | grep -q "manifest for $(IMAGE_NAME):$$tag not found"; then \ From b0336b553c3770a34f67336a320ef8d1f77b28f8 Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Fri, 25 Jan 2019 11:53:36 +0100 Subject: [PATCH 014/242] build.make: more readable "make test" output The introduction for each individual test looked like an actual command: test-subtree ./release-tools/verify-subtree.sh release-tools Directory 'release-tools' contains non-upstream changes: ... It's better to make it look like a shell comment and increase its visibility with a longer prefix: ### test-subtree: ./release-tools/verify-subtree.sh release-tools ... --- build.make | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/build.make b/build.make index dfc405e0..4296ff47 100644 --- a/build.make +++ b/build.make @@ -97,19 +97,19 @@ test: .PHONY: test-go test: test-go test-go: - @ echo; echo $@ + @ echo; echo "### $@:" go test `go list ./... | grep -v 'vendor' $(TEST_GO_FILTER_CMD)` $(TESTARGS) .PHONY: test-vet test: test-vet test-vet: - @ echo; echo $@ + @ echo; echo "### $@:" go vet `go list ./... | grep -v vendor $(TEST_VET_FILTER_CMD)` .PHONY: test-fmt test: test-fmt test-fmt: - @ echo; echo $@ + @ echo; echo "### $@:" files=$$(find . -name '*.go' | grep -v './vendor' $(TEST_FMT_FILTER_CMD)); \ if [ $$(gofmt -d $$files | wc -l) -ne 0 ]; then \ echo "formatting errors:"; \ @@ -120,5 +120,5 @@ test-fmt: .PHONY: test-subtree test: test-subtree test-subtree: - @ echo; echo $@ + @ echo; echo "### $@:" ./release-tools/verify-subtree.sh release-tools From cc564f929a4e32a829d35272533242b94797aa22 Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Wed, 6 Mar 2019 17:23:07 +0100 Subject: [PATCH 015/242] verify-subtree.sh: relax check and ignore old content If for whatever reasons a repo already had a `release-tools` directory before doing a clean import of it with `git subtree`, the check used to fail because it found those old commits. This can be fixed by telling `git log` to stop when the directory disappears from the repo. There has to be a commit with removes the old content, because otherwise `git subtree add` doesn't work. Fixes: https://github.com/kubernetes-csi/external-resizer/issues/21 --- verify-subtree.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/verify-subtree.sh b/verify-subtree.sh index ce8375fc..f04a9fa2 100755 --- a/verify-subtree.sh +++ b/verify-subtree.sh @@ -30,7 +30,7 @@ if [ ! "$DIR" ]; then exit 1 fi -REV=$(git log -n1 --format=format:%H --no-merges -- "$DIR") +REV=$(git log -n1 --remove-empty --format=format:%H --no-merges -- "$DIR") if [ "$REV" ]; then echo "Directory '$DIR' contains non-upstream changes:" echo From 94fc1e31d8acc93663992d117ecf9fc3ca9fceb0 Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Fri, 15 Mar 2019 11:08:53 +0100 Subject: [PATCH 016/242] build.make: avoid unit-testing E2E test suite In repos that have a test/e2e, that test suite should be run separately because it depends on a running cluster. --- build.make | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.make b/build.make index 8ca0b2c2..6ea32795 100644 --- a/build.make +++ b/build.make @@ -98,7 +98,7 @@ test: test: test-go test-go: @ echo; echo "### $@:" - go test `go list ./... | grep -v 'vendor' $(TEST_GO_FILTER_CMD)` $(TESTARGS) + go test `go list ./... | grep -v -e 'vendor' -e '/test/e2e$$' $(TEST_GO_FILTER_CMD)` $(TESTARGS) .PHONY: test-vet test: test-vet From fb13c5198f899657baac7bb44156abc6d0f20724 Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Fri, 15 Mar 2019 11:55:06 +0100 Subject: [PATCH 017/242] verify-shellcheck.sh: import from Kubernetes This is an unmodified copy of kubernetes/hack/verify-shellcheck.sh revision d5a3db003916b1d33b503ccd2e4897e094d8af77. --- util.sh | 839 +++++++++++++++++++++++++++++++++++++++++++ verify-shellcheck.sh | 187 ++++++++++ 2 files changed, 1026 insertions(+) create mode 100755 util.sh create mode 100755 verify-shellcheck.sh diff --git a/util.sh b/util.sh new file mode 100755 index 00000000..31ce9fc4 --- /dev/null +++ b/util.sh @@ -0,0 +1,839 @@ +#!/usr/bin/env bash + +# Copyright 2014 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. + +function kube::util::sourced_variable { + # Call this function to tell shellcheck that a variable is supposed to + # be used from other calling context. This helps quiet an "unused + # variable" warning from shellcheck and also document your code. + true +} + +kube::util::sortable_date() { + date "+%Y%m%d-%H%M%S" +} + +# arguments: target, item1, item2, item3, ... +# returns 0 if target is in the given items, 1 otherwise. +kube::util::array_contains() { + local search="$1" + local element + shift + for element; do + if [[ "${element}" == "${search}" ]]; then + return 0 + fi + done + return 1 +} + +kube::util::wait_for_url() { + local url=$1 + local prefix=${2:-} + local wait=${3:-1} + local times=${4:-30} + local maxtime=${5:-1} + + command -v curl >/dev/null || { + kube::log::usage "curl must be installed" + exit 1 + } + + local i + for i in $(seq 1 "${times}"); do + local out + if out=$(curl --max-time "${maxtime}" -gkfs "${url}" 2>/dev/null); then + kube::log::status "On try ${i}, ${prefix}: ${out}" + return 0 + fi + sleep "${wait}" + done + kube::log::error "Timed out waiting for ${prefix} to answer at ${url}; tried ${times} waiting ${wait} between each" + return 1 +} + +# Example: kube::util::trap_add 'echo "in trap DEBUG"' DEBUG +# See: http://stackoverflow.com/questions/3338030/multiple-bash-traps-for-the-same-signal +kube::util::trap_add() { + local trap_add_cmd + trap_add_cmd=$1 + shift + + for trap_add_name in "$@"; do + local existing_cmd + local new_cmd + + # Grab the currently defined trap commands for this trap + existing_cmd=$(trap -p "${trap_add_name}" | awk -F"'" '{print $2}') + + if [[ -z "${existing_cmd}" ]]; then + new_cmd="${trap_add_cmd}" + else + new_cmd="${trap_add_cmd};${existing_cmd}" + fi + + # Assign the test. Disable the shellcheck warning telling that trap + # commands should be single quoted to avoid evaluating them at this + # point instead evaluating them at run time. The logic of adding new + # commands to a single trap requires them to be evaluated right away. + # shellcheck disable=SC2064 + trap "${new_cmd}" "${trap_add_name}" + done +} + +# Opposite of kube::util::ensure-temp-dir() +kube::util::cleanup-temp-dir() { + rm -rf "${KUBE_TEMP}" +} + +# Create a temp dir that'll be deleted at the end of this bash session. +# +# Vars set: +# KUBE_TEMP +kube::util::ensure-temp-dir() { + if [[ -z ${KUBE_TEMP-} ]]; then + KUBE_TEMP=$(mktemp -d 2>/dev/null || mktemp -d -t kubernetes.XXXXXX) + kube::util::trap_add kube::util::cleanup-temp-dir EXIT + fi +} + +kube::util::host_os() { + local host_os + case "$(uname -s)" in + Darwin) + host_os=darwin + ;; + Linux) + host_os=linux + ;; + *) + kube::log::error "Unsupported host OS. Must be Linux or Mac OS X." + exit 1 + ;; + esac + echo "${host_os}" +} + +kube::util::host_arch() { + local host_arch + case "$(uname -m)" in + x86_64*) + host_arch=amd64 + ;; + i?86_64*) + host_arch=amd64 + ;; + amd64*) + host_arch=amd64 + ;; + aarch64*) + host_arch=arm64 + ;; + arm64*) + host_arch=arm64 + ;; + arm*) + host_arch=arm + ;; + i?86*) + host_arch=x86 + ;; + s390x*) + host_arch=s390x + ;; + ppc64le*) + host_arch=ppc64le + ;; + *) + kube::log::error "Unsupported host arch. Must be x86_64, 386, arm, arm64, s390x or ppc64le." + exit 1 + ;; + esac + echo "${host_arch}" +} + +# This figures out the host platform without relying on golang. We need this as +# we don't want a golang install to be a prerequisite to building yet we need +# this info to figure out where the final binaries are placed. +kube::util::host_platform() { + echo "$(kube::util::host_os)/$(kube::util::host_arch)" +} + +kube::util::find-binary-for-platform() { + local -r lookfor="$1" + local -r platform="$2" + local locations=( + "${KUBE_ROOT}/_output/bin/${lookfor}" + "${KUBE_ROOT}/_output/dockerized/bin/${platform}/${lookfor}" + "${KUBE_ROOT}/_output/local/bin/${platform}/${lookfor}" + "${KUBE_ROOT}/platforms/${platform}/${lookfor}" + ) + # Also search for binary in bazel build tree. + # The bazel go rules place some binaries in subtrees like + # "bazel-bin/source/path/linux_amd64_pure_stripped/binaryname", so make sure + # the platform name is matched in the path. + while IFS=$'\n' read -r location; do + locations+=("$location"); + done < <(find "${KUBE_ROOT}/bazel-bin/" -type f -executable \ + \( -path "*/${platform/\//_}*/${lookfor}" -o -path "*/${lookfor}" \) 2>/dev/null || true) + + # List most recently-updated location. + local -r bin=$( (ls -t "${locations[@]}" 2>/dev/null || true) | head -1 ) + echo -n "${bin}" +} + +kube::util::find-binary() { + kube::util::find-binary-for-platform "$1" "$(kube::util::host_platform)" +} + +# Run all known doc generators (today gendocs and genman for kubectl) +# $1 is the directory to put those generated documents +kube::util::gen-docs() { + local dest="$1" + + # Find binary + gendocs=$(kube::util::find-binary "gendocs") + genkubedocs=$(kube::util::find-binary "genkubedocs") + genman=$(kube::util::find-binary "genman") + genyaml=$(kube::util::find-binary "genyaml") + genfeddocs=$(kube::util::find-binary "genfeddocs") + + # TODO: If ${genfeddocs} is not used from anywhere (it isn't used at + # least from k/k tree), remove it completely. + kube::util::sourced_variable "${genfeddocs}" + + mkdir -p "${dest}/docs/user-guide/kubectl/" + "${gendocs}" "${dest}/docs/user-guide/kubectl/" + mkdir -p "${dest}/docs/admin/" + "${genkubedocs}" "${dest}/docs/admin/" "kube-apiserver" + "${genkubedocs}" "${dest}/docs/admin/" "kube-controller-manager" + "${genkubedocs}" "${dest}/docs/admin/" "cloud-controller-manager" + "${genkubedocs}" "${dest}/docs/admin/" "kube-proxy" + "${genkubedocs}" "${dest}/docs/admin/" "kube-scheduler" + "${genkubedocs}" "${dest}/docs/admin/" "kubelet" + "${genkubedocs}" "${dest}/docs/admin/" "kubeadm" + + mkdir -p "${dest}/docs/man/man1/" + "${genman}" "${dest}/docs/man/man1/" "kube-apiserver" + "${genman}" "${dest}/docs/man/man1/" "kube-controller-manager" + "${genman}" "${dest}/docs/man/man1/" "cloud-controller-manager" + "${genman}" "${dest}/docs/man/man1/" "kube-proxy" + "${genman}" "${dest}/docs/man/man1/" "kube-scheduler" + "${genman}" "${dest}/docs/man/man1/" "kubelet" + "${genman}" "${dest}/docs/man/man1/" "kubectl" + "${genman}" "${dest}/docs/man/man1/" "kubeadm" + + mkdir -p "${dest}/docs/yaml/kubectl/" + "${genyaml}" "${dest}/docs/yaml/kubectl/" + + # create the list of generated files + pushd "${dest}" > /dev/null || return 1 + touch docs/.generated_docs + find . -type f | cut -sd / -f 2- | LC_ALL=C sort > docs/.generated_docs + popd > /dev/null || return 1 +} + +# Removes previously generated docs-- we don't want to check them in. $KUBE_ROOT +# must be set. +kube::util::remove-gen-docs() { + if [ -e "${KUBE_ROOT}/docs/.generated_docs" ]; then + # remove all of the old docs; we don't want to check them in. + while read -r file; do + rm "${KUBE_ROOT}/${file}" 2>/dev/null || true + done <"${KUBE_ROOT}/docs/.generated_docs" + # The docs/.generated_docs file lists itself, so we don't need to explicitly + # delete it. + fi +} + +# Takes a group/version and returns the path to its location on disk, sans +# "pkg". E.g.: +# * default behavior: extensions/v1beta1 -> apis/extensions/v1beta1 +# * default behavior for only a group: experimental -> apis/experimental +# * Special handling for empty group: v1 -> api/v1, unversioned -> api/unversioned +# * Special handling for groups suffixed with ".k8s.io": foo.k8s.io/v1 -> apis/foo/v1 +# * Very special handling for when both group and version are "": / -> api +kube::util::group-version-to-pkg-path() { + local group_version="$1" + + while IFS=$'\n' read -r api; do + if [[ "${api}" = "${group_version/.*k8s.io/}" ]]; then + echo "vendor/k8s.io/api/${group_version/.*k8s.io/}" + return + fi + done < <(cd "${KUBE_ROOT}/staging/src/k8s.io/api" && find . -name types.go -exec dirname {} \; | sed "s|\./||g" | sort) + + # "v1" is the API GroupVersion + if [[ "${group_version}" == "v1" ]]; then + echo "vendor/k8s.io/api/core/v1" + return + fi + + # Special cases first. + # TODO(lavalamp): Simplify this by moving pkg/api/v1 and splitting pkg/api, + # moving the results to pkg/apis/api. + case "${group_version}" in + # both group and version are "", this occurs when we generate deep copies for internal objects of the legacy v1 API. + __internal) + echo "pkg/apis/core" + ;; + meta/v1) + echo "vendor/k8s.io/apimachinery/pkg/apis/meta/v1" + ;; + meta/v1beta1) + echo "vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1" + ;; + *.k8s.io) + echo "pkg/apis/${group_version%.*k8s.io}" + ;; + *.k8s.io/*) + echo "pkg/apis/${group_version/.*k8s.io/}" + ;; + *) + echo "pkg/apis/${group_version%__internal}" + ;; + esac +} + +# Takes a group/version and returns the swagger-spec file name. +# default behavior: extensions/v1beta1 -> extensions_v1beta1 +# special case for v1: v1 -> v1 +kube::util::gv-to-swagger-name() { + local group_version="$1" + case "${group_version}" in + v1) + echo "v1" + ;; + *) + echo "${group_version%/*}_${group_version#*/}" + ;; + esac +} + +# Returns the name of the upstream remote repository name for the local git +# repo, e.g. "upstream" or "origin". +kube::util::git_upstream_remote_name() { + git remote -v | grep fetch |\ + grep -E 'github.com[/:]kubernetes/kubernetes|k8s.io/kubernetes' |\ + head -n 1 | awk '{print $1}' +} + +# Ensures the current directory is a git tree for doing things like restoring or +# validating godeps +kube::util::create-fake-git-tree() { + local -r target_dir=${1:-$(pwd)} + + pushd "${target_dir}" >/dev/null || return 1 + git init >/dev/null + git config --local user.email "nobody@k8s.io" + git config --local user.name "$0" + git add . >/dev/null + git commit -q -m "Snapshot" >/dev/null + if (( ${KUBE_VERBOSE:-5} >= 6 )); then + kube::log::status "${target_dir} is now a git tree." + fi + popd >/dev/null || return 1 +} + +# Checks whether godep restore was run in the current GOPATH, i.e. that all referenced repos exist +# and are checked out to the referenced rev. +kube::util::godep_restored() { + local -r godeps_json=${1:-Godeps/Godeps.json} + local -r gopath=${2:-${GOPATH%:*}} + + kube::util::require-jq + + local root + local old_rev="" + while read -r path rev; do + rev="${rev//[\'\"]}" # remove quotes which are around revs sometimes + + if [[ "${rev}" == "${old_rev}" ]] && [[ "${path}" == "${root}"* ]]; then + # avoid checking the same git/hg root again + continue + fi + + root="${path}" + while [ "${root}" != "." ] && [ ! -d "${gopath}/src/${root}/.git" ] && [ ! -d "${gopath}/src/${root}/.hg" ]; do + root=$(dirname "${root}") + done + if [ "${root}" == "." ]; then + echo "No checkout of ${path} found in GOPATH \"${gopath}\"." 1>&2 + return 1 + fi + local head + if [ -d "${gopath}/src/${root}/.git" ]; then + head="$(cd "${gopath}/src/${root}" && git rev-parse HEAD)" + else + head="$(cd "${gopath}/src/${root}" && hg parent --template '{node}')" + fi + if [ "${head}" != "${rev}" ]; then + echo "Unexpected HEAD '${head}' at ${gopath}/src/${root}, expected '${rev}'." 1>&2 + return 1 + fi + old_rev="${rev}" + done < <(jq '.Deps|.[]|.ImportPath + " " + .Rev' -r < "${godeps_json}") + return 0 +} + +# Exits script if working directory is dirty. If it's run interactively in the terminal +# the user can commit changes in a second terminal. This script will wait. +kube::util::ensure_clean_working_dir() { + while ! git diff HEAD --exit-code &>/dev/null; do + echo -e "\nUnexpected dirty working directory:\n" + if tty -s; then + git status -s + else + git diff -a # be more verbose in log files without tty + exit 1 + fi | sed 's/^/ /' + echo -e "\nCommit your changes in another terminal and then continue here by pressing enter." + read -r + done 1>&2 +} + +# Ensure that the given godep version is installed and in the path. Almost +# nobody should use any version but the default. +# +# Sets: +# KUBE_GODEP: The path to the godep binary +# +kube::util::ensure_godep_version() { + local godep_target_version=${1:-"v80-k8s-r1"} # this version is known to work + + # If KUBE_GODEP is already set, and it's the right version, then use it. + if [[ -n "${KUBE_GODEP:-}" && "$(${KUBE_GODEP:?} version 2>/dev/null)" == *"godep ${godep_target_version}"* ]]; then + kube::log::status "Using ${KUBE_GODEP}" + return + fi + + # Otherwise, install forked godep + kube::log::status "Installing godep version ${godep_target_version}" + GOBIN="${KUBE_OUTPUT_BINPATH}" go install k8s.io/kubernetes/third_party/forked/godep + export KUBE_GODEP="${KUBE_OUTPUT_BINPATH}/godep" + kube::log::status "Installed ${KUBE_GODEP}" + + # Verify that the installed godep from fork is what we expect + if [[ "$(${KUBE_GODEP:?} version 2>/dev/null)" != *"godep ${godep_target_version}"* ]]; then + kube::log::error "Expected godep ${godep_target_version} from ${KUBE_GODEP}, got $(${KUBE_GODEP:?} version)" + return 1 + fi +} + +# Ensure that none of the staging repos is checked out in the GOPATH because this +# easily confused godep. +kube::util::ensure_no_staging_repos_in_gopath() { + kube::util::ensure_single_dir_gopath + local error=0 + for repo_file in "${KUBE_ROOT}"/staging/src/k8s.io/*; do + if [[ ! -d "${repo_file}" ]]; then + # not a directory or there were no files + continue; + fi + repo="$(basename "${repo_file}")" + if [ -e "${GOPATH}/src/k8s.io/${repo}" ]; then + echo "k8s.io/${repo} exists in GOPATH. Remove before running godep-save.sh." 1>&2 + error=1 + fi + done + if [ "${error}" = "1" ]; then + exit 1 + fi +} + +# Checks that the GOPATH is simple, i.e. consists only of one directory, not multiple. +kube::util::ensure_single_dir_gopath() { + if [[ "${GOPATH}" == *:* ]]; then + echo "GOPATH must consist of a single directory." 1>&2 + exit 1 + fi +} + +# Find the base commit using: +# $PULL_BASE_SHA if set (from Prow) +# current ref from the remote upstream branch +kube::util::base_ref() { + local -r git_branch=$1 + + if [[ -n ${PULL_BASE_SHA:-} ]]; then + echo "${PULL_BASE_SHA}" + return + fi + + full_branch="$(kube::util::git_upstream_remote_name)/${git_branch}" + + # make sure the branch is valid, otherwise the check will pass erroneously. + if ! git describe "${full_branch}" >/dev/null; then + # abort! + exit 1 + fi + + echo "${full_branch}" +} + +# Checks whether there are any files matching pattern $2 changed between the +# current branch and upstream branch named by $1. +# Returns 1 (false) if there are no changes +# 0 (true) if there are changes detected. +kube::util::has_changes() { + local -r git_branch=$1 + local -r pattern=$2 + local -r not_pattern=${3:-totallyimpossiblepattern} + + local base_ref + base_ref=$(kube::util::base_ref "${git_branch}") + echo "Checking for '${pattern}' changes against '${base_ref}'" + + # notice this uses ... to find the first shared ancestor + if git diff --name-only "${base_ref}...HEAD" | grep -v -E "${not_pattern}" | grep "${pattern}" > /dev/null; then + return 0 + fi + # also check for pending changes + if git status --porcelain | grep -v -E "${not_pattern}" | grep "${pattern}" > /dev/null; then + echo "Detected '${pattern}' uncommitted changes." + return 0 + fi + echo "No '${pattern}' changes detected." + return 1 +} + +kube::util::download_file() { + local -r url=$1 + local -r destination_file=$2 + + rm "${destination_file}" 2&> /dev/null || true + + for i in $(seq 5) + do + if ! curl -fsSL --retry 3 --keepalive-time 2 "${url}" -o "${destination_file}"; then + echo "Downloading ${url} failed. $((5-i)) retries left." + sleep 1 + else + echo "Downloading ${url} succeed" + return 0 + fi + done + return 1 +} + +# Test whether openssl is installed. +# Sets: +# OPENSSL_BIN: The path to the openssl binary to use +function kube::util::test_openssl_installed { + if ! openssl version >& /dev/null; then + echo "Failed to run openssl. Please ensure openssl is installed" + exit 1 + fi + + OPENSSL_BIN=$(command -v openssl) +} + +# creates a client CA, args are sudo, dest-dir, ca-id, purpose +# purpose is dropped in after "key encipherment", you usually want +# '"client auth"' +# '"server auth"' +# '"client auth","server auth"' +function kube::util::create_signing_certkey { + local sudo=$1 + local dest_dir=$2 + local id=$3 + local purpose=$4 + # Create client ca + ${sudo} /usr/bin/env bash -e < "${dest_dir}/${id}-ca-config.json" +EOF +} + +# signs a client certificate: args are sudo, dest-dir, CA, filename (roughly), username, groups... +function kube::util::create_client_certkey { + local sudo=$1 + local dest_dir=$2 + local ca=$3 + local id=$4 + local cn=${5:-$4} + local groups="" + local SEP="" + shift 5 + while [ -n "${1:-}" ]; do + groups+="${SEP}{\"O\":\"$1\"}" + SEP="," + shift 1 + done + ${sudo} /usr/bin/env bash -e < /dev/null +apiVersion: v1 +kind: Config +clusters: + - cluster: + certificate-authority: ${ca_file} + server: https://${api_host}:${api_port}/ + name: local-up-cluster +users: + - user: + token: ${token} + client-certificate: ${dest_dir}/client-${client_id}.crt + client-key: ${dest_dir}/client-${client_id}.key + name: local-up-cluster +contexts: + - context: + cluster: local-up-cluster + user: local-up-cluster + name: local-up-cluster +current-context: local-up-cluster +EOF + + # flatten the kubeconfig files to make them self contained + username=$(whoami) + ${sudo} /usr/bin/env bash -e < "/tmp/${client_id}.kubeconfig" + mv -f "/tmp/${client_id}.kubeconfig" "${dest_dir}/${client_id}.kubeconfig" + chown ${username} "${dest_dir}/${client_id}.kubeconfig" +EOF +} + +# Determines if docker can be run, failures may simply require that the user be added to the docker group. +function kube::util::ensure_docker_daemon_connectivity { + IFS=" " read -ra DOCKER <<< "${DOCKER_OPTS}" + # Expand ${DOCKER[@]} only if it's not unset. This is to work around + # Bash 3 issue with unbound variable. + DOCKER=(docker ${DOCKER[@]:+"${DOCKER[@]}"}) + if ! "${DOCKER[@]}" info > /dev/null 2>&1 ; then + cat <<'EOF' >&2 +Can't connect to 'docker' daemon. please fix and retry. + +Possible causes: + - Docker Daemon not started + - Linux: confirm via your init system + - macOS w/ docker-machine: run `docker-machine ls` and `docker-machine start ` + - macOS w/ Docker for Mac: Check the menu bar and start the Docker application + - DOCKER_HOST hasn't been set or is set incorrectly + - Linux: domain socket is used, DOCKER_* should be unset. In Bash run `unset ${!DOCKER_*}` + - macOS w/ docker-machine: run `eval "$(docker-machine env )"` + - macOS w/ Docker for Mac: domain socket is used, DOCKER_* should be unset. In Bash run `unset ${!DOCKER_*}` + - Other things to check: + - Linux: User isn't in 'docker' group. Add and relogin. + - Something like 'sudo usermod -a -G docker ${USER}' + - RHEL7 bug and workaround: https://bugzilla.redhat.com/show_bug.cgi?id=1119282#c8 +EOF + return 1 + fi +} + +# Wait for background jobs to finish. Return with +# an error status if any of the jobs failed. +kube::util::wait-for-jobs() { + local fail=0 + local job + for job in $(jobs -p); do + wait "${job}" || fail=$((fail + 1)) + done + return ${fail} +} + +# kube::util::join +# Concatenates the list elements with the delimiter passed as first parameter +# +# Ex: kube::util::join , a b c +# -> a,b,c +function kube::util::join { + local IFS="$1" + shift + echo "$*" +} + +# Downloads cfssl/cfssljson into $1 directory if they do not already exist in PATH +# +# Assumed vars: +# $1 (cfssl directory) (optional) +# +# Sets: +# CFSSL_BIN: The path of the installed cfssl binary +# CFSSLJSON_BIN: The path of the installed cfssljson binary +# +function kube::util::ensure-cfssl { + if command -v cfssl &>/dev/null && command -v cfssljson &>/dev/null; then + CFSSL_BIN=$(command -v cfssl) + CFSSLJSON_BIN=$(command -v cfssljson) + return 0 + fi + + host_arch=$(kube::util::host_arch) + + if [[ "${host_arch}" != "amd64" ]]; then + echo "Cannot download cfssl on non-amd64 hosts and cfssl does not appear to be installed." + echo "Please install cfssl and cfssljson and verify they are in \$PATH." + echo "Hint: export PATH=\$PATH:\$GOPATH/bin; go get -u github.com/cloudflare/cfssl/cmd/..." + exit 1 + fi + + # Create a temp dir for cfssl if no directory was given + local cfssldir=${1:-} + if [[ -z "${cfssldir}" ]]; then + kube::util::ensure-temp-dir + cfssldir="${KUBE_TEMP}/cfssl" + fi + + mkdir -p "${cfssldir}" + pushd "${cfssldir}" > /dev/null || return 1 + + echo "Unable to successfully run 'cfssl' from ${PATH}; downloading instead..." + kernel=$(uname -s) + case "${kernel}" in + Linux) + curl --retry 10 -L -o cfssl https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 + curl --retry 10 -L -o cfssljson https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 + ;; + Darwin) + curl --retry 10 -L -o cfssl https://pkg.cfssl.org/R1.2/cfssl_darwin-amd64 + curl --retry 10 -L -o cfssljson https://pkg.cfssl.org/R1.2/cfssljson_darwin-amd64 + ;; + *) + echo "Unknown, unsupported platform: ${kernel}." >&2 + echo "Supported platforms: Linux, Darwin." >&2 + exit 2 + esac + + chmod +x cfssl || true + chmod +x cfssljson || true + + CFSSL_BIN="${cfssldir}/cfssl" + CFSSLJSON_BIN="${cfssldir}/cfssljson" + if [[ ! -x ${CFSSL_BIN} || ! -x ${CFSSLJSON_BIN} ]]; then + echo "Failed to download 'cfssl'. Please install cfssl and cfssljson and verify they are in \$PATH." + echo "Hint: export PATH=\$PATH:\$GOPATH/bin; go get -u github.com/cloudflare/cfssl/cmd/..." + exit 1 + fi + popd > /dev/null || return 1 +} + +# kube::util::ensure_dockerized +# Confirms that the script is being run inside a kube-build image +# +function kube::util::ensure_dockerized { + if [[ -f /kube-build-image ]]; then + return 0 + else + echo "ERROR: This script is designed to be run inside a kube-build container" + exit 1 + fi +} + +# kube::util::ensure-gnu-sed +# Determines which sed binary is gnu-sed on linux/darwin +# +# Sets: +# SED: The name of the gnu-sed binary +# +function kube::util::ensure-gnu-sed { + if LANG=C sed --help 2>&1 | grep -q GNU; then + SED="sed" + elif command -v gsed &>/dev/null; then + SED="gsed" + else + kube::log::error "Failed to find GNU sed as sed or gsed. If you are on Mac: brew install gnu-sed." >&2 + return 1 + fi + kube::util::sourced_variable "${SED}" +} + +# kube::util::check-file-in-alphabetical-order +# Check that the file is in alphabetical order +# +function kube::util::check-file-in-alphabetical-order { + local failure_file="$1" + if ! diff -u "${failure_file}" <(LC_ALL=C sort "${failure_file}"); then + { + echo + echo "${failure_file} is not in alphabetical order. Please sort it:" + echo + echo " LC_ALL=C sort -o ${failure_file} ${failure_file}" + echo + } >&2 + false + fi +} + +# kube::util::require-jq +# Checks whether jq is installed. +function kube::util::require-jq { + if ! command -v jq &>/dev/null; then + echo "jq not found. Please install." 1>&2 + return 1 + fi +} + +# Some useful colors. +if [[ -z "${color_start-}" ]]; then + declare -r color_start="\033[" + declare -r color_red="${color_start}0;31m" + declare -r color_yellow="${color_start}0;33m" + declare -r color_green="${color_start}0;32m" + declare -r color_blue="${color_start}1;34m" + declare -r color_cyan="${color_start}1;36m" + declare -r color_norm="${color_start}0m" + + kube::util::sourced_variable "${color_start}" + kube::util::sourced_variable "${color_red}" + kube::util::sourced_variable "${color_yellow}" + kube::util::sourced_variable "${color_green}" + kube::util::sourced_variable "${color_blue}" + kube::util::sourced_variable "${color_cyan}" + kube::util::sourced_variable "${color_norm}" +fi + +# ex: ts=2 sw=2 et filetype=sh diff --git a/verify-shellcheck.sh b/verify-shellcheck.sh new file mode 100755 index 00000000..1b882fa8 --- /dev/null +++ b/verify-shellcheck.sh @@ -0,0 +1,187 @@ +#!/usr/bin/env bash + +# 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. + +set -o errexit +set -o nounset +set -o pipefail + +KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/.. +source "${KUBE_ROOT}/hack/lib/init.sh" +source "${KUBE_ROOT}/hack/lib/util.sh" + +# required version for this script, if not installed on the host we will +# use the official docker image instead. keep this in sync with SHELLCHECK_IMAGE +SHELLCHECK_VERSION="0.6.0" +# upstream shellcheck latest stable image as of January 10th, 2019 +SHELLCHECK_IMAGE="koalaman/shellcheck-alpine:v0.6.0@sha256:7d4d712a2686da99d37580b4e2f45eb658b74e4b01caf67c1099adc294b96b52" + +# fixed name for the shellcheck docker container so we can reliably clean it up +SHELLCHECK_CONTAINER="k8s-shellcheck" + +# disabled lints +disabled=( + # this lint disallows non-constant source, which we use extensively without + # any known bugs + 1090 + # this lint prefers command -v to which, they are not the same + 2230 +) +# comma separate for passing to shellcheck +join_by() { + local IFS="$1"; + shift; + echo "$*"; +} +SHELLCHECK_DISABLED="$(join_by , "${disabled[@]}")" +readonly SHELLCHECK_DISABLED + +# creates the shellcheck container for later use +create_container () { + # TODO(bentheelder): this is a performance hack, we create the container with + # a sleep MAX_INT32 so that it is effectively paused. + # We then repeatedly exec to it to run each shellcheck, and later rm it when + # we're done. + # This is incredibly much faster than creating a container for each shellcheck + # call ... + docker run --name "${SHELLCHECK_CONTAINER}" -d --rm -v "${KUBE_ROOT}:${KUBE_ROOT}" -w "${KUBE_ROOT}" --entrypoint="sleep" "${SHELLCHECK_IMAGE}" 2147483647 +} +# removes the shellcheck container +remove_container () { + docker rm -f "${SHELLCHECK_CONTAINER}" &> /dev/null || true +} + +# ensure we're linting the k8s source tree +cd "${KUBE_ROOT}" + +# find all shell scripts excluding ./_*, ./.git/*, ./vendor*, +# and anything git-ignored +all_shell_scripts=() +while IFS=$'\n' read -r script; + do git check-ignore -q "$script" || all_shell_scripts+=("$script"); +done < <(find . -name "*.sh" \ + -not \( \ + -path ./_\* -o \ + -path ./.git\* -o \ + -path ./vendor\* \ + \)) + +# make sure known failures are sorted +failure_file="${KUBE_ROOT}/hack/.shellcheck_failures" +kube::util::check-file-in-alphabetical-order "${failure_file}" + +# load known failure files +failing_files=() +while IFS=$'\n' read -r script; + do failing_files+=("$script"); +done < <(cat "${failure_file}") + +# detect if the host machine has the required shellcheck version installed +# if so, we will use that instead. +HAVE_SHELLCHECK=false +if which shellcheck &>/dev/null; then + detected_version="$(shellcheck --version | grep 'version: .*')" + if [[ "${detected_version}" = "version: ${SHELLCHECK_VERSION}" ]]; then + HAVE_SHELLCHECK=true + fi +fi + +# tell the user which we've selected and possibly set up the container +if ${HAVE_SHELLCHECK}; then + echo "Using host shellcheck ${SHELLCHECK_VERSION} binary." +else + echo "Using shellcheck ${SHELLCHECK_VERSION} docker image." + # remove any previous container, ensure we will attempt to cleanup on exit, + # and create the container + remove_container + kube::util::trap_add 'remove_container' EXIT + if ! output="$(create_container 2>&1)"; then + { + echo "Failed to create shellcheck container with output: " + echo "" + echo "${output}" + } >&2 + exit 1 + fi +fi + +# lint each script, tracking failures +errors=() +not_failing=() +for f in "${all_shell_scripts[@]}"; do + set +o errexit + if ${HAVE_SHELLCHECK}; then + failedLint=$(shellcheck --exclude="${SHELLCHECK_DISABLED}" "${f}") + else + failedLint=$(docker exec -t ${SHELLCHECK_CONTAINER} \ + shellcheck --exclude="${SHELLCHECK_DISABLED}" "${f}") + fi + set -o errexit + kube::util::array_contains "${f}" "${failing_files[@]}" && in_failing=$? || in_failing=$? + if [[ -n "${failedLint}" ]] && [[ "${in_failing}" -ne "0" ]]; then + errors+=( "${failedLint}" ) + fi + if [[ -z "${failedLint}" ]] && [[ "${in_failing}" -eq "0" ]]; then + not_failing+=( "${f}" ) + fi +done + +# Check to be sure all the packages that should pass lint are. +if [ ${#errors[@]} -eq 0 ]; then + echo 'Congratulations! All shell files are passing lint (excluding those in hack/.shellcheck_failures).' +else + { + echo "Errors from shellcheck:" + for err in "${errors[@]}"; do + echo "$err" + done + echo + echo 'Please review the above warnings. You can test via "./hack/verify-shellcheck"' + echo 'If the above warnings do not make sense, you can exempt this package from shellcheck' + echo 'checking by adding it to hack/.shellcheck_failures (if your reviewer is okay with it).' + echo + } >&2 + false +fi + +if [[ ${#not_failing[@]} -gt 0 ]]; then + { + echo "Some packages in hack/.shellcheck_failures are passing shellcheck. Please remove them." + echo + for f in "${not_failing[@]}"; do + echo " $f" + done + echo + } >&2 + false +fi + +# Check that all failing_packages actually still exist +gone=() +for f in "${failing_files[@]}"; do + kube::util::array_contains "$f" "${all_shell_scripts[@]}" || gone+=( "$f" ) +done + +if [[ ${#gone[@]} -gt 0 ]]; then + { + echo "Some files in hack/.shellcheck_failures do not exist anymore. Please remove them." + echo + for f in "${gone[@]}"; do + echo " $f" + done + echo + } >&2 + false +fi From e6db50df7eefbc7a0f116e5dff79b01d9cc22741 Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Wed, 27 Mar 2019 17:39:43 +0100 Subject: [PATCH 018/242] check vendor directory This runs "dep check" to verify that the vendor directory is up-to-date and meets expectations (= done with dep >= 0.5.0). --- build.make | 10 ++++++++++ travis.yml | 5 +++++ 2 files changed, 15 insertions(+) diff --git a/build.make b/build.make index 8ca0b2c2..b4084061 100644 --- a/build.make +++ b/build.make @@ -117,6 +117,16 @@ test-fmt: false; \ fi +# This test only runs when dep >= 0.5 is installed, which is the case for the CI setup. +.PHONY: test-vendor +test: test-vendor +test-vendor: + @ echo; echo "### $@:" + @ case "$$(dep version 2>/dev/null | grep 'version *:')" in \ + *v0.[56789]*) dep check && echo "vendor up-to-date" || false;; \ + *) echo "skipping check, dep >= 0.5 required";; \ + esac + .PHONY: test-subtree test: test-subtree test-subtree: diff --git a/travis.yml b/travis.yml index b5a360af..1c05dfd9 100644 --- a/travis.yml +++ b/travis.yml @@ -5,6 +5,11 @@ services: matrix: include: - go: 1.11.1 +before_script: +- mkdir -p bin +- wget https://github.com/golang/dep/releases/download/v0.5.1/dep-linux-amd64 -O bin/dep +- chmod u+x bin/dep +- export PATH=$PWD/bin:$PATH script: - make -k all test after_success: From 104a1ac9699f22e815c54afc2620aef85bf490e2 Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Fri, 15 Mar 2019 11:08:53 +0100 Subject: [PATCH 019/242] build.make: avoid unit-testing E2E test suite In repos that have a test/e2e, that test suite should be run separately because it depends on a running cluster. --- build.make | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.make b/build.make index 8ca0b2c2..6ea32795 100644 --- a/build.make +++ b/build.make @@ -98,7 +98,7 @@ test: test: test-go test-go: @ echo; echo "### $@:" - go test `go list ./... | grep -v 'vendor' $(TEST_GO_FILTER_CMD)` $(TESTARGS) + go test `go list ./... | grep -v -e 'vendor' -e '/test/e2e$$' $(TEST_GO_FILTER_CMD)` $(TESTARGS) .PHONY: test-vet test: test-vet From b2d25d4f4d7886b1d9ad40943dd06748e0f06874 Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Fri, 15 Mar 2019 16:42:10 +0100 Subject: [PATCH 020/242] verify-shellcheck.sh: make it usable in csi-release-tools These are the modifications that were necessary to call this outside of Kubernetes. The support for excluding files from checking gets removed to simplify the script. It shouldn't be needed, because linting can be enabled after fixing whatever scripts might fail the check. --- util.sh | 691 ------------------------------------------- verify-shellcheck.sh | 71 +---- 2 files changed, 15 insertions(+), 747 deletions(-) diff --git a/util.sh b/util.sh index 31ce9fc4..abeb1b2e 100755 --- a/util.sh +++ b/util.sh @@ -39,31 +39,6 @@ kube::util::array_contains() { return 1 } -kube::util::wait_for_url() { - local url=$1 - local prefix=${2:-} - local wait=${3:-1} - local times=${4:-30} - local maxtime=${5:-1} - - command -v curl >/dev/null || { - kube::log::usage "curl must be installed" - exit 1 - } - - local i - for i in $(seq 1 "${times}"); do - local out - if out=$(curl --max-time "${maxtime}" -gkfs "${url}" 2>/dev/null); then - kube::log::status "On try ${i}, ${prefix}: ${out}" - return 0 - fi - sleep "${wait}" - done - kube::log::error "Timed out waiting for ${prefix} to answer at ${url}; tried ${times} waiting ${wait} between each" - return 1 -} - # Example: kube::util::trap_add 'echo "in trap DEBUG"' DEBUG # See: http://stackoverflow.com/questions/3338030/multiple-bash-traps-for-the-same-signal kube::util::trap_add() { @@ -93,422 +68,6 @@ kube::util::trap_add() { done } -# Opposite of kube::util::ensure-temp-dir() -kube::util::cleanup-temp-dir() { - rm -rf "${KUBE_TEMP}" -} - -# Create a temp dir that'll be deleted at the end of this bash session. -# -# Vars set: -# KUBE_TEMP -kube::util::ensure-temp-dir() { - if [[ -z ${KUBE_TEMP-} ]]; then - KUBE_TEMP=$(mktemp -d 2>/dev/null || mktemp -d -t kubernetes.XXXXXX) - kube::util::trap_add kube::util::cleanup-temp-dir EXIT - fi -} - -kube::util::host_os() { - local host_os - case "$(uname -s)" in - Darwin) - host_os=darwin - ;; - Linux) - host_os=linux - ;; - *) - kube::log::error "Unsupported host OS. Must be Linux or Mac OS X." - exit 1 - ;; - esac - echo "${host_os}" -} - -kube::util::host_arch() { - local host_arch - case "$(uname -m)" in - x86_64*) - host_arch=amd64 - ;; - i?86_64*) - host_arch=amd64 - ;; - amd64*) - host_arch=amd64 - ;; - aarch64*) - host_arch=arm64 - ;; - arm64*) - host_arch=arm64 - ;; - arm*) - host_arch=arm - ;; - i?86*) - host_arch=x86 - ;; - s390x*) - host_arch=s390x - ;; - ppc64le*) - host_arch=ppc64le - ;; - *) - kube::log::error "Unsupported host arch. Must be x86_64, 386, arm, arm64, s390x or ppc64le." - exit 1 - ;; - esac - echo "${host_arch}" -} - -# This figures out the host platform without relying on golang. We need this as -# we don't want a golang install to be a prerequisite to building yet we need -# this info to figure out where the final binaries are placed. -kube::util::host_platform() { - echo "$(kube::util::host_os)/$(kube::util::host_arch)" -} - -kube::util::find-binary-for-platform() { - local -r lookfor="$1" - local -r platform="$2" - local locations=( - "${KUBE_ROOT}/_output/bin/${lookfor}" - "${KUBE_ROOT}/_output/dockerized/bin/${platform}/${lookfor}" - "${KUBE_ROOT}/_output/local/bin/${platform}/${lookfor}" - "${KUBE_ROOT}/platforms/${platform}/${lookfor}" - ) - # Also search for binary in bazel build tree. - # The bazel go rules place some binaries in subtrees like - # "bazel-bin/source/path/linux_amd64_pure_stripped/binaryname", so make sure - # the platform name is matched in the path. - while IFS=$'\n' read -r location; do - locations+=("$location"); - done < <(find "${KUBE_ROOT}/bazel-bin/" -type f -executable \ - \( -path "*/${platform/\//_}*/${lookfor}" -o -path "*/${lookfor}" \) 2>/dev/null || true) - - # List most recently-updated location. - local -r bin=$( (ls -t "${locations[@]}" 2>/dev/null || true) | head -1 ) - echo -n "${bin}" -} - -kube::util::find-binary() { - kube::util::find-binary-for-platform "$1" "$(kube::util::host_platform)" -} - -# Run all known doc generators (today gendocs and genman for kubectl) -# $1 is the directory to put those generated documents -kube::util::gen-docs() { - local dest="$1" - - # Find binary - gendocs=$(kube::util::find-binary "gendocs") - genkubedocs=$(kube::util::find-binary "genkubedocs") - genman=$(kube::util::find-binary "genman") - genyaml=$(kube::util::find-binary "genyaml") - genfeddocs=$(kube::util::find-binary "genfeddocs") - - # TODO: If ${genfeddocs} is not used from anywhere (it isn't used at - # least from k/k tree), remove it completely. - kube::util::sourced_variable "${genfeddocs}" - - mkdir -p "${dest}/docs/user-guide/kubectl/" - "${gendocs}" "${dest}/docs/user-guide/kubectl/" - mkdir -p "${dest}/docs/admin/" - "${genkubedocs}" "${dest}/docs/admin/" "kube-apiserver" - "${genkubedocs}" "${dest}/docs/admin/" "kube-controller-manager" - "${genkubedocs}" "${dest}/docs/admin/" "cloud-controller-manager" - "${genkubedocs}" "${dest}/docs/admin/" "kube-proxy" - "${genkubedocs}" "${dest}/docs/admin/" "kube-scheduler" - "${genkubedocs}" "${dest}/docs/admin/" "kubelet" - "${genkubedocs}" "${dest}/docs/admin/" "kubeadm" - - mkdir -p "${dest}/docs/man/man1/" - "${genman}" "${dest}/docs/man/man1/" "kube-apiserver" - "${genman}" "${dest}/docs/man/man1/" "kube-controller-manager" - "${genman}" "${dest}/docs/man/man1/" "cloud-controller-manager" - "${genman}" "${dest}/docs/man/man1/" "kube-proxy" - "${genman}" "${dest}/docs/man/man1/" "kube-scheduler" - "${genman}" "${dest}/docs/man/man1/" "kubelet" - "${genman}" "${dest}/docs/man/man1/" "kubectl" - "${genman}" "${dest}/docs/man/man1/" "kubeadm" - - mkdir -p "${dest}/docs/yaml/kubectl/" - "${genyaml}" "${dest}/docs/yaml/kubectl/" - - # create the list of generated files - pushd "${dest}" > /dev/null || return 1 - touch docs/.generated_docs - find . -type f | cut -sd / -f 2- | LC_ALL=C sort > docs/.generated_docs - popd > /dev/null || return 1 -} - -# Removes previously generated docs-- we don't want to check them in. $KUBE_ROOT -# must be set. -kube::util::remove-gen-docs() { - if [ -e "${KUBE_ROOT}/docs/.generated_docs" ]; then - # remove all of the old docs; we don't want to check them in. - while read -r file; do - rm "${KUBE_ROOT}/${file}" 2>/dev/null || true - done <"${KUBE_ROOT}/docs/.generated_docs" - # The docs/.generated_docs file lists itself, so we don't need to explicitly - # delete it. - fi -} - -# Takes a group/version and returns the path to its location on disk, sans -# "pkg". E.g.: -# * default behavior: extensions/v1beta1 -> apis/extensions/v1beta1 -# * default behavior for only a group: experimental -> apis/experimental -# * Special handling for empty group: v1 -> api/v1, unversioned -> api/unversioned -# * Special handling for groups suffixed with ".k8s.io": foo.k8s.io/v1 -> apis/foo/v1 -# * Very special handling for when both group and version are "": / -> api -kube::util::group-version-to-pkg-path() { - local group_version="$1" - - while IFS=$'\n' read -r api; do - if [[ "${api}" = "${group_version/.*k8s.io/}" ]]; then - echo "vendor/k8s.io/api/${group_version/.*k8s.io/}" - return - fi - done < <(cd "${KUBE_ROOT}/staging/src/k8s.io/api" && find . -name types.go -exec dirname {} \; | sed "s|\./||g" | sort) - - # "v1" is the API GroupVersion - if [[ "${group_version}" == "v1" ]]; then - echo "vendor/k8s.io/api/core/v1" - return - fi - - # Special cases first. - # TODO(lavalamp): Simplify this by moving pkg/api/v1 and splitting pkg/api, - # moving the results to pkg/apis/api. - case "${group_version}" in - # both group and version are "", this occurs when we generate deep copies for internal objects of the legacy v1 API. - __internal) - echo "pkg/apis/core" - ;; - meta/v1) - echo "vendor/k8s.io/apimachinery/pkg/apis/meta/v1" - ;; - meta/v1beta1) - echo "vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1" - ;; - *.k8s.io) - echo "pkg/apis/${group_version%.*k8s.io}" - ;; - *.k8s.io/*) - echo "pkg/apis/${group_version/.*k8s.io/}" - ;; - *) - echo "pkg/apis/${group_version%__internal}" - ;; - esac -} - -# Takes a group/version and returns the swagger-spec file name. -# default behavior: extensions/v1beta1 -> extensions_v1beta1 -# special case for v1: v1 -> v1 -kube::util::gv-to-swagger-name() { - local group_version="$1" - case "${group_version}" in - v1) - echo "v1" - ;; - *) - echo "${group_version%/*}_${group_version#*/}" - ;; - esac -} - -# Returns the name of the upstream remote repository name for the local git -# repo, e.g. "upstream" or "origin". -kube::util::git_upstream_remote_name() { - git remote -v | grep fetch |\ - grep -E 'github.com[/:]kubernetes/kubernetes|k8s.io/kubernetes' |\ - head -n 1 | awk '{print $1}' -} - -# Ensures the current directory is a git tree for doing things like restoring or -# validating godeps -kube::util::create-fake-git-tree() { - local -r target_dir=${1:-$(pwd)} - - pushd "${target_dir}" >/dev/null || return 1 - git init >/dev/null - git config --local user.email "nobody@k8s.io" - git config --local user.name "$0" - git add . >/dev/null - git commit -q -m "Snapshot" >/dev/null - if (( ${KUBE_VERBOSE:-5} >= 6 )); then - kube::log::status "${target_dir} is now a git tree." - fi - popd >/dev/null || return 1 -} - -# Checks whether godep restore was run in the current GOPATH, i.e. that all referenced repos exist -# and are checked out to the referenced rev. -kube::util::godep_restored() { - local -r godeps_json=${1:-Godeps/Godeps.json} - local -r gopath=${2:-${GOPATH%:*}} - - kube::util::require-jq - - local root - local old_rev="" - while read -r path rev; do - rev="${rev//[\'\"]}" # remove quotes which are around revs sometimes - - if [[ "${rev}" == "${old_rev}" ]] && [[ "${path}" == "${root}"* ]]; then - # avoid checking the same git/hg root again - continue - fi - - root="${path}" - while [ "${root}" != "." ] && [ ! -d "${gopath}/src/${root}/.git" ] && [ ! -d "${gopath}/src/${root}/.hg" ]; do - root=$(dirname "${root}") - done - if [ "${root}" == "." ]; then - echo "No checkout of ${path} found in GOPATH \"${gopath}\"." 1>&2 - return 1 - fi - local head - if [ -d "${gopath}/src/${root}/.git" ]; then - head="$(cd "${gopath}/src/${root}" && git rev-parse HEAD)" - else - head="$(cd "${gopath}/src/${root}" && hg parent --template '{node}')" - fi - if [ "${head}" != "${rev}" ]; then - echo "Unexpected HEAD '${head}' at ${gopath}/src/${root}, expected '${rev}'." 1>&2 - return 1 - fi - old_rev="${rev}" - done < <(jq '.Deps|.[]|.ImportPath + " " + .Rev' -r < "${godeps_json}") - return 0 -} - -# Exits script if working directory is dirty. If it's run interactively in the terminal -# the user can commit changes in a second terminal. This script will wait. -kube::util::ensure_clean_working_dir() { - while ! git diff HEAD --exit-code &>/dev/null; do - echo -e "\nUnexpected dirty working directory:\n" - if tty -s; then - git status -s - else - git diff -a # be more verbose in log files without tty - exit 1 - fi | sed 's/^/ /' - echo -e "\nCommit your changes in another terminal and then continue here by pressing enter." - read -r - done 1>&2 -} - -# Ensure that the given godep version is installed and in the path. Almost -# nobody should use any version but the default. -# -# Sets: -# KUBE_GODEP: The path to the godep binary -# -kube::util::ensure_godep_version() { - local godep_target_version=${1:-"v80-k8s-r1"} # this version is known to work - - # If KUBE_GODEP is already set, and it's the right version, then use it. - if [[ -n "${KUBE_GODEP:-}" && "$(${KUBE_GODEP:?} version 2>/dev/null)" == *"godep ${godep_target_version}"* ]]; then - kube::log::status "Using ${KUBE_GODEP}" - return - fi - - # Otherwise, install forked godep - kube::log::status "Installing godep version ${godep_target_version}" - GOBIN="${KUBE_OUTPUT_BINPATH}" go install k8s.io/kubernetes/third_party/forked/godep - export KUBE_GODEP="${KUBE_OUTPUT_BINPATH}/godep" - kube::log::status "Installed ${KUBE_GODEP}" - - # Verify that the installed godep from fork is what we expect - if [[ "$(${KUBE_GODEP:?} version 2>/dev/null)" != *"godep ${godep_target_version}"* ]]; then - kube::log::error "Expected godep ${godep_target_version} from ${KUBE_GODEP}, got $(${KUBE_GODEP:?} version)" - return 1 - fi -} - -# Ensure that none of the staging repos is checked out in the GOPATH because this -# easily confused godep. -kube::util::ensure_no_staging_repos_in_gopath() { - kube::util::ensure_single_dir_gopath - local error=0 - for repo_file in "${KUBE_ROOT}"/staging/src/k8s.io/*; do - if [[ ! -d "${repo_file}" ]]; then - # not a directory or there were no files - continue; - fi - repo="$(basename "${repo_file}")" - if [ -e "${GOPATH}/src/k8s.io/${repo}" ]; then - echo "k8s.io/${repo} exists in GOPATH. Remove before running godep-save.sh." 1>&2 - error=1 - fi - done - if [ "${error}" = "1" ]; then - exit 1 - fi -} - -# Checks that the GOPATH is simple, i.e. consists only of one directory, not multiple. -kube::util::ensure_single_dir_gopath() { - if [[ "${GOPATH}" == *:* ]]; then - echo "GOPATH must consist of a single directory." 1>&2 - exit 1 - fi -} - -# Find the base commit using: -# $PULL_BASE_SHA if set (from Prow) -# current ref from the remote upstream branch -kube::util::base_ref() { - local -r git_branch=$1 - - if [[ -n ${PULL_BASE_SHA:-} ]]; then - echo "${PULL_BASE_SHA}" - return - fi - - full_branch="$(kube::util::git_upstream_remote_name)/${git_branch}" - - # make sure the branch is valid, otherwise the check will pass erroneously. - if ! git describe "${full_branch}" >/dev/null; then - # abort! - exit 1 - fi - - echo "${full_branch}" -} - -# Checks whether there are any files matching pattern $2 changed between the -# current branch and upstream branch named by $1. -# Returns 1 (false) if there are no changes -# 0 (true) if there are changes detected. -kube::util::has_changes() { - local -r git_branch=$1 - local -r pattern=$2 - local -r not_pattern=${3:-totallyimpossiblepattern} - - local base_ref - base_ref=$(kube::util::base_ref "${git_branch}") - echo "Checking for '${pattern}' changes against '${base_ref}'" - - # notice this uses ... to find the first shared ancestor - if git diff --name-only "${base_ref}...HEAD" | grep -v -E "${not_pattern}" | grep "${pattern}" > /dev/null; then - return 0 - fi - # also check for pending changes - if git status --porcelain | grep -v -E "${not_pattern}" | grep "${pattern}" > /dev/null; then - echo "Detected '${pattern}' uncommitted changes." - return 0 - fi - echo "No '${pattern}' changes detected." - return 1 -} - kube::util::download_file() { local -r url=$1 local -r destination_file=$2 @@ -528,152 +87,6 @@ kube::util::download_file() { return 1 } -# Test whether openssl is installed. -# Sets: -# OPENSSL_BIN: The path to the openssl binary to use -function kube::util::test_openssl_installed { - if ! openssl version >& /dev/null; then - echo "Failed to run openssl. Please ensure openssl is installed" - exit 1 - fi - - OPENSSL_BIN=$(command -v openssl) -} - -# creates a client CA, args are sudo, dest-dir, ca-id, purpose -# purpose is dropped in after "key encipherment", you usually want -# '"client auth"' -# '"server auth"' -# '"client auth","server auth"' -function kube::util::create_signing_certkey { - local sudo=$1 - local dest_dir=$2 - local id=$3 - local purpose=$4 - # Create client ca - ${sudo} /usr/bin/env bash -e < "${dest_dir}/${id}-ca-config.json" -EOF -} - -# signs a client certificate: args are sudo, dest-dir, CA, filename (roughly), username, groups... -function kube::util::create_client_certkey { - local sudo=$1 - local dest_dir=$2 - local ca=$3 - local id=$4 - local cn=${5:-$4} - local groups="" - local SEP="" - shift 5 - while [ -n "${1:-}" ]; do - groups+="${SEP}{\"O\":\"$1\"}" - SEP="," - shift 1 - done - ${sudo} /usr/bin/env bash -e < /dev/null -apiVersion: v1 -kind: Config -clusters: - - cluster: - certificate-authority: ${ca_file} - server: https://${api_host}:${api_port}/ - name: local-up-cluster -users: - - user: - token: ${token} - client-certificate: ${dest_dir}/client-${client_id}.crt - client-key: ${dest_dir}/client-${client_id}.key - name: local-up-cluster -contexts: - - context: - cluster: local-up-cluster - user: local-up-cluster - name: local-up-cluster -current-context: local-up-cluster -EOF - - # flatten the kubeconfig files to make them self contained - username=$(whoami) - ${sudo} /usr/bin/env bash -e < "/tmp/${client_id}.kubeconfig" - mv -f "/tmp/${client_id}.kubeconfig" "${dest_dir}/${client_id}.kubeconfig" - chown ${username} "${dest_dir}/${client_id}.kubeconfig" -EOF -} - -# Determines if docker can be run, failures may simply require that the user be added to the docker group. -function kube::util::ensure_docker_daemon_connectivity { - IFS=" " read -ra DOCKER <<< "${DOCKER_OPTS}" - # Expand ${DOCKER[@]} only if it's not unset. This is to work around - # Bash 3 issue with unbound variable. - DOCKER=(docker ${DOCKER[@]:+"${DOCKER[@]}"}) - if ! "${DOCKER[@]}" info > /dev/null 2>&1 ; then - cat <<'EOF' >&2 -Can't connect to 'docker' daemon. please fix and retry. - -Possible causes: - - Docker Daemon not started - - Linux: confirm via your init system - - macOS w/ docker-machine: run `docker-machine ls` and `docker-machine start ` - - macOS w/ Docker for Mac: Check the menu bar and start the Docker application - - DOCKER_HOST hasn't been set or is set incorrectly - - Linux: domain socket is used, DOCKER_* should be unset. In Bash run `unset ${!DOCKER_*}` - - macOS w/ docker-machine: run `eval "$(docker-machine env )"` - - macOS w/ Docker for Mac: domain socket is used, DOCKER_* should be unset. In Bash run `unset ${!DOCKER_*}` - - Other things to check: - - Linux: User isn't in 'docker' group. Add and relogin. - - Something like 'sudo usermod -a -G docker ${USER}' - - RHEL7 bug and workaround: https://bugzilla.redhat.com/show_bug.cgi?id=1119282#c8 -EOF - return 1 - fi -} - # Wait for background jobs to finish. Return with # an error status if any of the jobs failed. kube::util::wait-for-jobs() { @@ -696,101 +109,6 @@ function kube::util::join { echo "$*" } -# Downloads cfssl/cfssljson into $1 directory if they do not already exist in PATH -# -# Assumed vars: -# $1 (cfssl directory) (optional) -# -# Sets: -# CFSSL_BIN: The path of the installed cfssl binary -# CFSSLJSON_BIN: The path of the installed cfssljson binary -# -function kube::util::ensure-cfssl { - if command -v cfssl &>/dev/null && command -v cfssljson &>/dev/null; then - CFSSL_BIN=$(command -v cfssl) - CFSSLJSON_BIN=$(command -v cfssljson) - return 0 - fi - - host_arch=$(kube::util::host_arch) - - if [[ "${host_arch}" != "amd64" ]]; then - echo "Cannot download cfssl on non-amd64 hosts and cfssl does not appear to be installed." - echo "Please install cfssl and cfssljson and verify they are in \$PATH." - echo "Hint: export PATH=\$PATH:\$GOPATH/bin; go get -u github.com/cloudflare/cfssl/cmd/..." - exit 1 - fi - - # Create a temp dir for cfssl if no directory was given - local cfssldir=${1:-} - if [[ -z "${cfssldir}" ]]; then - kube::util::ensure-temp-dir - cfssldir="${KUBE_TEMP}/cfssl" - fi - - mkdir -p "${cfssldir}" - pushd "${cfssldir}" > /dev/null || return 1 - - echo "Unable to successfully run 'cfssl' from ${PATH}; downloading instead..." - kernel=$(uname -s) - case "${kernel}" in - Linux) - curl --retry 10 -L -o cfssl https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 - curl --retry 10 -L -o cfssljson https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 - ;; - Darwin) - curl --retry 10 -L -o cfssl https://pkg.cfssl.org/R1.2/cfssl_darwin-amd64 - curl --retry 10 -L -o cfssljson https://pkg.cfssl.org/R1.2/cfssljson_darwin-amd64 - ;; - *) - echo "Unknown, unsupported platform: ${kernel}." >&2 - echo "Supported platforms: Linux, Darwin." >&2 - exit 2 - esac - - chmod +x cfssl || true - chmod +x cfssljson || true - - CFSSL_BIN="${cfssldir}/cfssl" - CFSSLJSON_BIN="${cfssldir}/cfssljson" - if [[ ! -x ${CFSSL_BIN} || ! -x ${CFSSLJSON_BIN} ]]; then - echo "Failed to download 'cfssl'. Please install cfssl and cfssljson and verify they are in \$PATH." - echo "Hint: export PATH=\$PATH:\$GOPATH/bin; go get -u github.com/cloudflare/cfssl/cmd/..." - exit 1 - fi - popd > /dev/null || return 1 -} - -# kube::util::ensure_dockerized -# Confirms that the script is being run inside a kube-build image -# -function kube::util::ensure_dockerized { - if [[ -f /kube-build-image ]]; then - return 0 - else - echo "ERROR: This script is designed to be run inside a kube-build container" - exit 1 - fi -} - -# kube::util::ensure-gnu-sed -# Determines which sed binary is gnu-sed on linux/darwin -# -# Sets: -# SED: The name of the gnu-sed binary -# -function kube::util::ensure-gnu-sed { - if LANG=C sed --help 2>&1 | grep -q GNU; then - SED="sed" - elif command -v gsed &>/dev/null; then - SED="gsed" - else - kube::log::error "Failed to find GNU sed as sed or gsed. If you are on Mac: brew install gnu-sed." >&2 - return 1 - fi - kube::util::sourced_variable "${SED}" -} - # kube::util::check-file-in-alphabetical-order # Check that the file is in alphabetical order # @@ -808,15 +126,6 @@ function kube::util::check-file-in-alphabetical-order { fi } -# kube::util::require-jq -# Checks whether jq is installed. -function kube::util::require-jq { - if ! command -v jq &>/dev/null; then - echo "jq not found. Please install." 1>&2 - return 1 - fi -} - # Some useful colors. if [[ -z "${color_start-}" ]]; then declare -r color_start="\033[" diff --git a/verify-shellcheck.sh b/verify-shellcheck.sh index 1b882fa8..fd28021a 100755 --- a/verify-shellcheck.sh +++ b/verify-shellcheck.sh @@ -18,9 +18,12 @@ set -o errexit set -o nounset set -o pipefail -KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/.. -source "${KUBE_ROOT}/hack/lib/init.sh" -source "${KUBE_ROOT}/hack/lib/util.sh" +# The csi-release-tools directory. +TOOLS="$(dirname "${BASH_SOURCE[0]}")" +. "${TOOLS}/util.sh" + +# Directory to check. Default is the parent of the tools themselves. +ROOT="${1:-${TOOLS}/..}" # required version for this script, if not installed on the host we will # use the official docker image instead. keep this in sync with SHELLCHECK_IMAGE @@ -56,15 +59,15 @@ create_container () { # we're done. # This is incredibly much faster than creating a container for each shellcheck # call ... - docker run --name "${SHELLCHECK_CONTAINER}" -d --rm -v "${KUBE_ROOT}:${KUBE_ROOT}" -w "${KUBE_ROOT}" --entrypoint="sleep" "${SHELLCHECK_IMAGE}" 2147483647 + docker run --name "${SHELLCHECK_CONTAINER}" -d --rm -v "${ROOT}:${ROOT}" -w "${ROOT}" --entrypoint="sleep" "${SHELLCHECK_IMAGE}" 2147483647 } # removes the shellcheck container remove_container () { docker rm -f "${SHELLCHECK_CONTAINER}" &> /dev/null || true } -# ensure we're linting the k8s source tree -cd "${KUBE_ROOT}" +# ensure we're linting the source tree +cd "${ROOT}" # find all shell scripts excluding ./_*, ./.git/*, ./vendor*, # and anything git-ignored @@ -78,16 +81,6 @@ done < <(find . -name "*.sh" \ -path ./vendor\* \ \)) -# make sure known failures are sorted -failure_file="${KUBE_ROOT}/hack/.shellcheck_failures" -kube::util::check-file-in-alphabetical-order "${failure_file}" - -# load known failure files -failing_files=() -while IFS=$'\n' read -r script; - do failing_files+=("$script"); -done < <(cat "${failure_file}") - # detect if the host machine has the required shellcheck version installed # if so, we will use that instead. HAVE_SHELLCHECK=false @@ -119,7 +112,6 @@ fi # lint each script, tracking failures errors=() -not_failing=() for f in "${all_shell_scripts[@]}"; do set +o errexit if ${HAVE_SHELLCHECK}; then @@ -129,18 +121,14 @@ for f in "${all_shell_scripts[@]}"; do shellcheck --exclude="${SHELLCHECK_DISABLED}" "${f}") fi set -o errexit - kube::util::array_contains "${f}" "${failing_files[@]}" && in_failing=$? || in_failing=$? - if [[ -n "${failedLint}" ]] && [[ "${in_failing}" -ne "0" ]]; then - errors+=( "${failedLint}" ) - fi - if [[ -z "${failedLint}" ]] && [[ "${in_failing}" -eq "0" ]]; then - not_failing+=( "${f}" ) + if [[ -n "${failedLint}" ]]; then + errors+=( "${failedLint}" ) fi done # Check to be sure all the packages that should pass lint are. if [ ${#errors[@]} -eq 0 ]; then - echo 'Congratulations! All shell files are passing lint (excluding those in hack/.shellcheck_failures).' + echo 'Congratulations! All shell files are passing lint.' else { echo "Errors from shellcheck:" @@ -149,38 +137,9 @@ else done echo echo 'Please review the above warnings. You can test via "./hack/verify-shellcheck"' - echo 'If the above warnings do not make sense, you can exempt this package from shellcheck' - echo 'checking by adding it to hack/.shellcheck_failures (if your reviewer is okay with it).' - echo - } >&2 - false -fi - -if [[ ${#not_failing[@]} -gt 0 ]]; then - { - echo "Some packages in hack/.shellcheck_failures are passing shellcheck. Please remove them." - echo - for f in "${not_failing[@]}"; do - echo " $f" - done - echo - } >&2 - false -fi - -# Check that all failing_packages actually still exist -gone=() -for f in "${failing_files[@]}"; do - kube::util::array_contains "$f" "${all_shell_scripts[@]}" || gone+=( "$f" ) -done - -if [[ ${#gone[@]} -gt 0 ]]; then - { - echo "Some files in hack/.shellcheck_failures do not exist anymore. Please remove them." - echo - for f in "${gone[@]}"; do - echo " $f" - done + echo 'If the above warnings do not make sense, you can exempt them from shellcheck' + echo 'checking by adding the "shellcheck disable" directive' + echo '(https://github.com/koalaman/shellcheck/wiki/Directive#disable).' echo } >&2 false From 6c7ba1be0fbb012b6b3d6d204fcc363164bce12d Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Tue, 26 Mar 2019 13:09:00 +0100 Subject: [PATCH 021/242] build.make: integrate shellcheck into "make test" By default this only tests the scripts inside the "release-tools" directory, which is useful when making experimental changes to them in a component that uses csi-release-tools. But a component can also enable checking for other directories. --- README.md | 12 ++++++++++++ build.make | 15 +++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/README.md b/README.md index 56d2248c..cb028154 100644 --- a/README.md +++ b/README.md @@ -49,3 +49,15 @@ Cheat sheet: - `git subtree add --prefix=release-tools https://github.com/kubernetes-csi/csi-release-tools.git master` - add release tools to a repo which does not have them yet (only once) - `git subtree pull --prefix=release-tools https://github.com/kubernetes-csi/csi-release-tools.git master` - update local copy to latest upstream (whenever upstream changes) - edit, `git commit`, `git subtree push --prefix=release-tools git@github.com:/csi-release-tools.git ` - push to a new branch before submitting a PR + +verify-shellcheck.sh +-------------------- + +The [verify-shellcheck.sh](./verify-shellcheck.sh) script in this repo +is a stripped down copy of the [corresponding +script](https://github.com/kubernetes/kubernetes/blob/release-1.14/hack/verify-shellcheck.sh) +in the Kubernetes repository. It can be used to check for certain +errors shell scripts, like missing quotation marks. The default +`test-shellcheck` target in [build.make](./build.make) only checks the +scripts in this directory. Components can add more directories to +`TEST_SHELLCHECK_DIRS` to check also other scripts. diff --git a/build.make b/build.make index 6ea32795..3cac9d30 100644 --- a/build.make +++ b/build.make @@ -122,3 +122,18 @@ test: test-subtree test-subtree: @ echo; echo "### $@:" ./release-tools/verify-subtree.sh release-tools + +# Components can extend the set of directories which must pass shellcheck. +# The default is to check only the release-tools directory itself. +TEST_SHELLCHECK_DIRS=release-tools +.PHONY: test-shellcheck +test: test-shellcheck +test-shellcheck: + @ echo; echo "### $@:" + @ ret=0; \ + for dir in $(abspath $(TEST_SHELLCHECK_DIRS)); do \ + echo; \ + echo "$$dir:"; \ + ./release-tools/verify-shellcheck.sh "$$dir" || ret=1; \ + done; \ + return $$ret From 55212ff2b4f6a83c22cf2344b101d31cd11ec271 Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Fri, 15 Mar 2019 16:45:16 +0100 Subject: [PATCH 022/242] initial Prow test job This enables testing of other repos and of this repo itself inside Prow. Currently supported is unit testing ("make test") and E2E testing (either via a local test suite or the Kubernetes E2E test suite applied to the hostpath driver example deployment). The script passes shellcheck and uses Prow to verify that for future PRs. --- .prow.sh | 7 + README.md | 45 +++ filter-junit.go | 133 +++++++ prow.sh | 916 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 1101 insertions(+) create mode 100755 .prow.sh create mode 100644 filter-junit.go create mode 100755 prow.sh diff --git a/.prow.sh b/.prow.sh new file mode 100755 index 00000000..b18c5358 --- /dev/null +++ b/.prow.sh @@ -0,0 +1,7 @@ +#! /bin/bash -e +# +# This is for testing csi-release-tools itself in Prow. All other +# repos use prow.sh for that, but as csi-release-tools isn't a normal +# repo with some Go code in it, it has a custom Prow test script. + +./verify-shellcheck.sh "$(pwd)" diff --git a/README.md b/README.md index cb028154..bc061aee 100644 --- a/README.md +++ b/README.md @@ -61,3 +61,48 @@ errors shell scripts, like missing quotation marks. The default `test-shellcheck` target in [build.make](./build.make) only checks the scripts in this directory. Components can add more directories to `TEST_SHELLCHECK_DIRS` to check also other scripts. + +End-to-end testing +------------------ + +A repo that wants to opt into testing via Prow must set up a top-level +`.prow.sh`. Typically that will source `prow.sh` and then transfer +control to it: + +``` bash +#! /bin/bash -e + +. release-tools/prow.sh +main +``` + +All Kubernetes-CSI repos are expected to switch to Prow. For details +on what is enabled in Prow, see +https://github.com/kubernetes/test-infra/tree/master/config/jobs/kubernetes-csi + +Test results for periodic jobs are visible in +https://testgrid.k8s.io/sig-storage-csi + +It is possible to reproduce the Prow testing locally on a suitable machine: +- Linux host +- Docker installed +- code to be tested checkout out in `$GOPATH/src/` +- `cd $GOPATH/src/ && ./.prow.sh` + +Beware that the script intentionally doesn't clean up after itself and +modifies the content of `$GOPATH`, in particular the `kubernetes` and +`kind` repositories there. Better run it in an empty, disposable +`$GOPATH`. + +When it terminates, the following command can be used to get access to +the Kubernetes cluster that was brought up for testing (assuming that +this step succeeded): + + export KUBECONFIG="$(kind get kubeconfig-path --name="csi-prow")" + +It is possible to control the execution via environment variables. See +`prow.sh` for details. Particularly useful is testing against different +Kubernetes releases: + + CSI_PROW_KUBERNETES_VERSION=1.13.3 ./.prow.sh + CSI_PROW_KUBERNETES_VERSION=latest ./.prow.sh diff --git a/filter-junit.go b/filter-junit.go new file mode 100644 index 00000000..2f51be00 --- /dev/null +++ b/filter-junit.go @@ -0,0 +1,133 @@ +/* +Copyright 2019 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. +*/ + +/* + * This command filters a JUnit file such that only tests with a name + * matching a regular expression are passed through. By concatenating + * multiple input files it is possible to merge them into a single file. + */ +package main + +import ( + "encoding/xml" + "flag" + "io/ioutil" + "os" + "regexp" +) + +var ( + output = flag.String("o", "-", "junit file to write, - for stdout") + tests = flag.String("t", "", "regular expression matching the test names that are to be included in the output") +) + +/* + * TestSuite represents a JUnit file. Due to how encoding/xml works, we have + * represent all fields that we want to be passed through. It's therefore + * not a complete solution, but good enough for Ginkgo + Spyglass. + */ +type TestSuite struct { + XMLName string `xml:"testsuite"` + TestCases []TestCase `xml:"testcase"` +} + +type TestCase struct { + Name string `xml:"name,attr"` + Time string `xml:"time,attr"` + SystemOut string `xml:"system-out,omitempty"` + Failure string `xml:"failure,omitempty"` + Skipped SkipReason `xml:"skipped,omitempty"` +} + +// SkipReason deals with the special : +// if present, we must re-encode it, even if empty. +type SkipReason string + +func (s *SkipReason) UnmarshalText(text []byte) error { + *s = SkipReason(text) + if *s == "" { + *s = " " + } + return nil +} + +func (s SkipReason) MarshalText() ([]byte, error) { + if s == " " { + return []byte{}, nil + } + return []byte(s), nil +} + +func main() { + var junit TestSuite + var data []byte + + flag.Parse() + + re := regexp.MustCompile(*tests) + + // Read all input files. + for _, input := range flag.Args() { + if input == "-" { + if _, err := os.Stdin.Read(data); err != nil { + panic(err) + } + } else { + var err error + data, err = ioutil.ReadFile(input) + if err != nil { + panic(err) + } + } + if err := xml.Unmarshal(data, &junit); err != nil { + panic(err) + } + } + + // Keep only matching testcases. Testcases skipped in all test runs are only stored once. + filtered := map[string]TestCase{} + for _, testcase := range junit.TestCases { + if !re.MatchString(testcase.Name) { + continue + } + entry, ok := filtered[testcase.Name] + if !ok || // not present yet + entry.Skipped != "" && testcase.Skipped == "" { // replaced skipped test with real test run + filtered[testcase.Name] = testcase + } + } + junit.TestCases = nil + for _, testcase := range filtered { + junit.TestCases = append(junit.TestCases, testcase) + } + + // Re-encode. + data, err := xml.MarshalIndent(junit, "", " ") + if err != nil { + panic(err) + } + + // Write to output. + if *output == "-" { + if _, err := os.Stdout.Write(data); err != nil { + panic(err) + } + } else { + if err := ioutil.WriteFile(*output, data, 0644); err != nil { + panic(err) + } + } +} diff --git a/prow.sh b/prow.sh new file mode 100755 index 00000000..17e8ae4a --- /dev/null +++ b/prow.sh @@ -0,0 +1,916 @@ +#! /bin/bash +# +# Copyright 2019 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. + + +# This script runs inside a Prow job. It runs unit tests ("make test") +# and E2E testing. This E2E testing covers different scenarios (see +# https://github.com/kubernetes/enhancements/pull/807): +# - running the stable hostpath example against a Kubernetes release +# - running the canary hostpath example against a Kubernetes release +# - building the component in the current repo and running the +# stable hostpath example with that one component replaced against +# a Kubernetes release +# +# The intended usage of this script is that individual repos import +# csi-release-tools, then link their top-level prow.sh to this or +# include it in that file. When including it, several of the variables +# can be overridden in the top-level prow.sh to customize the script +# for the repo. +# +# The expected environment is: +# - $GOPATH/src/ for the repository that is to be tested, +# with PR branch merged (when testing a PR) +# - running on linux-amd64 +# - bazel installed (when testing against Kubernetes master), must be recent +# enough for Kubernetes master +# - kind (https://github.com/kubernetes-sigs/kind) installed +# - optional: Go already installed + +# Sets the default value for a variable if not set already and logs the value. +# Any variable set this way is usually something that a repo's .prow.sh +# or the job can set. +configvar () { + # Ignore: Word is of the form "A"B"C" (B indicated). Did you mean "ABC" or "A\"B\"C"? + # shellcheck disable=SC2140 + eval : \$\{"$1":="\$2"\} + eval echo "\$3:" "$1=\${$1}" +} + +# Go versions can be specified seperately for different tasks +# If the pre-installed Go is missing or a different +# version, the required version here will get installed +# from https://golang.org/dl/. +configvar CSI_PROW_GO_VERSION_BUILD 1.11.4 "Go version for building the component" # depends on component's source code +configvar CSI_PROW_GO_VERSION_K8S 1.12.1 "Go version for building Kubernetes for the test cluster" # depends on Kubernetes version +configvar CSI_PROW_GO_VERSION_E2E 1.12.1 "Go version for building the Kubernetes E2E test suite" # depends on CSI_PROW_E2E settings below +configvar CSI_PROW_GO_VERSION_SANITY "${CSI_PROW_GO_VERSION_BUILD}" "Go version for building the csi-sanity test suite" # depends on CSI_PROW_SANITY settings below +configvar CSI_PROW_GO_VERSION_KIND "${CSI_PROW_GO_VERSION_BUILD}" "Go version for building 'kind'" # depends on CSI_PROW_KIND_VERSION below +configvar CSI_PROW_GO_VERSION_GINKGO "${CSI_PROW_GO_VERSION_BUILD}" "Go version for building ginkgo" # depends on CSI_PROW_GINKGO_VERSION below + +# kind version to use. If the pre-installed version is different, +# the desired version is downloaded from https://github.com/kubernetes-sigs/kind/releases/download/ +# (if available), otherwise it is built from source. +configvar CSI_PROW_KIND_VERSION 0.2.1 "kind" + +# ginkgo test runner version to use. If the pre-installed version is +# different, the desired version is built from source. +configvar CSI_PROW_GINKGO_VERSION v1.7.0 "Ginkgo" + +# Ginkgo runs the E2E test in parallel. The default is based on the number +# of CPUs, but typically this can be set to something higher in the job. +configvar CSI_PROW_GINKO_PARALLEL "-p" "Ginko parallelism parameter(s)" + +# Enables building the code in the repository. On by default, can be +# disabled in jobs which only use pre-built components. +configvar CSI_PROW_BUILD_JOB true "building code in repo enabled" + +# Kubernetes version to test against. This must be a version number +# (like 1.13.3) for which there is a pre-built kind image (see +# https://hub.docker.com/r/kindest/node/tags), "latest" (builds +# Kubernetes from the master branch) or "release-x.yy" (builds +# Kubernetes from a release branch). +# +# This can also be a version that was not released yet at the time +# that the settings below were chose. The script will then +# use the same settings as for "latest" Kubernetes. This works +# as long as there are no breaking changes in Kubernetes, like +# deprecating or changing the implementation of an alpha feature. +configvar CSI_PROW_KUBERNETES_VERSION 1.13.3 "Kubernetes" + +# CSI_PROW_KUBERNETES_VERSION reduced to first two version numbers and +# with underscore (1_13 instead of 1.13.3) and in uppercase (LATEST +# instead of latest). +# +# This is used to derive the right defaults for the variables below +# when a Prow job just defines the Kubernetes version. +csi_prow_kubernetes_version_suffix="$(echo "${CSI_PROW_KUBERNETES_VERSION}" | tr . _ | tr '[:lower:]' '[:upper:]' | sed -e 's/^RELEASE-//' -e 's/\([0-9]*\)_\([0-9]*\).*/\1_\2/')" + +# Work directory. It has to allow running executables, therefore /tmp +# is avoided. Cleaning up after the script is intentionally left to +# the caller. +configvar CSI_PROW_WORK "$(mkdir -p "$GOPATH/pkg" && mktemp -d "$GOPATH/pkg/csiprow.XXXXXXXXXX")" "work directory" + +# The hostpath deployment script is searched for in several places. +# +# - The "deploy" directory in the current repository: this is useful +# for the situation that a component becomes incompatible with the +# shared deployment, because then it can (temporarily!) provide its +# own example until the shared one can be updated; it's also how +# csi-driver-host-path itself provides the example. +# +# - CSI_PROW_HOSTPATH_VERSION of the CSI_PROW_HOSTPATH_REPO is checked +# out: this allows other repos to reference a version of the example +# that is known to be compatible. +# +# - The csi-driver-host-path/deploy directory has multiple sub-directories, +# each with different deployments (stable set of images for Kubernetes 1.13, +# stable set of images for Kubernetes 1.14, canary for latest Kubernetes, etc.). +# This is necessary because there may be incompatible changes in the +# "API" of a component (for example, its command line options or RBAC rules) +# or in its support for different Kubernetes versions (CSIDriverInfo as +# CRD in Kubernetes 1.13 vs builtin API in Kubernetes 1.14). +# +# When testing an update for a component in a PR job, the +# CSI_PROW_DEPLOYMENT variable can be set in the +# .prow.sh of each component when there are breaking changes +# that require using a non-default deployment. The default +# is a deployment named "kubernetes-x.yy" (if available), +# otherwise "kubernetes-latest". +# "none" disables the deployment of the hostpath driver. +# +# When no deploy script is found (nothing in `deploy` directory, +# CSI_PROW_HOSTPATH_REPO=none), nothing gets deployed. +# +# TODO: merge https://github.com/kubernetes-csi/csi-driver-host-path/pull/29, switch to revision from master +configvar CSI_PROW_HOSTPATH_VERSION deployment "hostpath driver" +configvar CSI_PROW_HOSTPATH_REPO https://github.com/pohly/csi-driver-host-path "hostpath repo" +# Ignore 'See if you can use ${variable//search/replace} instead.' +# shellcheck disable=SC2001 +configvar CSI_PROW_DEPLOYMENT "" "deployment" + +# If CSI_PROW_HOSTPATH_CANARY is set (typically to "canary", but also +# "1.0-canary"), then all image versions are replaced with that +# version tag. +configvar CSI_PROW_HOSTPATH_CANARY "" "hostpath image" + +# The E2E testing can come from an arbitrary repo. The expectation is that +# the repo supports "go test ./test/e2e -args --storage.testdriver" (https://github.com/kubernetes/kubernetes/pull/72836) +# after setting KUBECONFIG. As a special case, if the repository is Kubernetes, +# then `make WHAT=test/e2e/e2e.test` is called first to ensure that +# all generated files are present. +# +# CSI_PROW_E2E_REPO=none disables E2E testing. +configvar CSI_PROW_E2E_VERSION v1.14.0 "E2E version" +configvar CSI_PROW_E2E_REPO https://github.com/kubernetes/kubernetes "E2E repo" +configvar CSI_PROW_E2E_IMPORT_PATH k8s.io/kubernetes "E2E package" + +# csi-sanity testing from the csi-test repo can be run against the installed +# CSI driver. For this to work, deploying the driver must expose the Unix domain +# csi.sock as a TCP service for use by the csi-sanity command, which runs outside +# of the cluster. The alternative would have been to (cross-)compile csi-sanity +# and install it inside the cluster, which is not necessarily easier. +configvar CSI_PROW_SANITY_REPO https://github.com/kubernetes-csi/csi-test "csi-test repo" +configvar CSI_PROW_SANITY_VERSION 5421d9f3c37be3b95b241b44a094a3db11bee789 "csi-test version" # latest master +configvar CSI_PROW_SANITY_IMPORT_PATH github.com/kubernetes-csi/csi-test "csi-test package" +configvar CSI_PROW_SANITY_SERVICE "hostpath-service" "Kubernetes TCP service name that exposes csi.sock" +configvar CSI_PROW_SANITY_POD "csi-hostpathplugin-0" "Kubernetes pod with CSI driver" +configvar CSI_PROW_SANITY_CONTAINER "hostpath" "Kubernetes container with CSI driver" + +# Each job can run one or more of the following tests, identified by +# a single word: +# - unit testing +# - parallel excluding alpha features +# - serial excluding alpha features +# - parallel, only alpha feature +# - serial, only alpha features +# - sanity +# +# Sanity testing with csi-sanity only covers the CSI driver itself and thus +# is off by default. A CSI driver can change that default in its .prow.sh +# by setting CSI_PROW_TESTS_SANITY. +configvar CSI_PROW_TESTS "unit parallel serial parallel-alpha serial-alpha ${CSI_PROW_TESTS_SANITY}" "tests to run" +test_enabled () { + echo "${CSI_PROW_TESTS}" | grep -q -w -e "$1" +} + +# Serial vs. parallel is always determined by these regular expressions. +# Individual regular expressions are seperated by spaces for readability +# and expected to not contain spaces. Use dots instead. The complete +# regex for Ginkgo will be created by joining the individual terms. +configvar CSI_PROW_E2E_SERIAL '\[Serial\] \[Disruptive\]' "tags for serial E2E tests" +regex_join () { + echo "$@" | sed -e 's/ */|/g' -e 's/^|*//' -e 's/|*$//' -e 's/^$/this-matches-nothing/g' +} + +# Prints the value of a variable + version suffix, falling back to variable + "LATEST". +get_versioned_variable () { + local var="$1" + local version="$2" + local value + + eval value="\${${var}_${version}}" + if ! [ "$value" ]; then + eval value="\${${var}_LATEST}" + fi + echo "$value" +} + +# Which tests are alpha depends on the Kubernetes version. The same +# E2E test suite is used for all Kubernetes versions, including older +# Kubernetes. +# +# Feature tags in the test are set based on what is an alpha +# feature in the Kubernetes version that contains the E2E test suite's +# source code. +# +# So when testing against an older Kubernetes release, some tests +# might be enabled by default which don't pass for that older +# Kubernetes version. In that case, the +# CSI_PROW_E2E_ALPHA_ variable cannot just +# be based on the `Feature` tag, it also must contain the names +# of tests that used to be alpha but no longer have that tag. +# +# is just major+minor version separated by +# underscore. "latest" matches master. It is also used for +# unknown versions, so when master gets released there is +# no need to add a new versioned variable. That only needs to be +# done when updating something in the configuration that leads +# to "latest" no longer being suitable. +configvar CSI_PROW_E2E_ALPHA_1_13 '\[Feature: \[Testpattern:.Dynamic.PV..block.volmode.\] should.create.and.delete.block.persistent.volumes' "alpha tests for Kubernetes 1.13" # Raw block was an alpha feature in 1.13. +configvar CSI_PROW_E2E_ALPHA_LATEST '\[Feature:' "alpha tests for Kubernetes master" +configvar CSI_PROW_E2E_ALPHA "$(get_versioned_variable CSI_PROW_E2E_ALPHA "${csi_prow_kubernetes_version_suffix}")" "alpha tests" + +# After the parallel E2E test without alpha features, a test cluster +# with alpha features is brought up and tests that were previously +# disabled are run. The alpha gates in each release have to be listed +# explicitly. If none are set (= variable empty), alpha testing +# is skipped. +# +# Testing against "latest" Kubernetes is problematic because some alpha +# feature which used to work might stop working or change their behavior +# such that the current tests no longer pass. If that happens, +# kubernetes-csi components must be updated, either by disabling +# the failing test for "latest" or by updating the test and not running +# it anymore for older releases. +configvar CSI_PROW_E2E_ALPHA_GATES_1_13 'VolumeSnapshotDataSource=true,BlockVolume=true,CSIBlockVolume=true' "alpha feature gates for Kubernetes 1.13" +configvar CSI_PROW_E2E_ALPHA_GATES_LATEST 'VolumeSnapshotDataSource=true' "alpha feature gates for latest Kubernetes" +configvar CSI_PROW_E2E_ALPHA_GATES "$(get_versioned_variable CSI_PROW_E2E_ALPHA_GATES "${csi_prow_kubernetes_version_suffix}")" "alpha E2E feature gates" + +# Some tests are known to be unusable in a KinD cluster. For example, +# stopping kubelet with "ssh systemctl stop kubelet" simply +# doesn't work. Such tests should be written in a way that they verify +# whether they can run with the current cluster provider, but until +# they are, we filter them out by name. Like the other test selection +# variables, this is again a space separated list of regular expressions. +configvar CSI_PROW_E2E_SKIP 'while.kubelet.is.down.*Disruptive' "tests that need to be skipped" + +# This is the directory for additional result files. Usually set by Prow, but +# if not (for example, when invoking manually) it defaults to the work directory. +configvar ARTIFACTS "${CSI_PROW_WORK}/artifacts" "artifacts" +mkdir -p "${ARTIFACTS}" + +RELEASE_TOOLS_ROOT="$(realpath "$(dirname "${BASH_SOURCE[0]}")")" +REPO_DIR="$(pwd)" + +run () { + echo "$(date) $(go version | sed -e 's/.*version \(go[^ ]*\).*/\1/') $(if [ "$(pwd)" != "${REPO_DIR}" ]; then pwd; fi)\$" "$@" >&2 + "$@" +} + +info () { + echo >&2 INFO: "$@" +} + +warn () { + echo >&2 WARNING: "$@" +} + +die () { + echo >&2 ERROR: "$@" + exit 1 +} + +# For additional tools. +CSI_PROW_BIN="${CSI_PROW_WORK}/bin" +mkdir -p "${CSI_PROW_BIN}" +PATH="${CSI_PROW_BIN}:$PATH" + +# Ensure that PATH has the desired version of the Go tools, then run command given as argument. +run_with_go () { + local version + version="$1" + shift + + if go version 2>/dev/null | grep -q "go$version"; then + run "$@" + else + if ! [ -d "${CSI_PROW_WORK}/go-$version" ]; then + run curl --fail --location "https://dl.google.com/go/go$version.linux-amd64.tar.gz" | tar -C "${CSI_PROW_WORK}" -zxf - || die "installation of Go $version failed" + mv "${CSI_PROW_WORK}/go" "${CSI_PROW_WORK}/go-$version" + fi + PATH="${CSI_PROW_WORK}/go-$version/bin:$PATH" run "$@" + fi +} + +# Ensure that we have the desired version of kind. +install_kind () { + if kind --version 2>/dev/null | grep -q " ${CSI_PROW_KIND_VERSION}$"; then + return + fi + if run curl --fail --location -o "${CSI_PROW_WORK}/bin/kind" "https://github.com/kubernetes-sigs/kind/releases/download/${CSI_PROW_KIND_VERSION}/kind-linux-amd64"; then + chmod u+x "${CSI_PROW_WORK}/bin/kind" + else + git_checkout https://github.com/kubernetes-sigs/kind "$GOPATH/src/sigs.k8s.io/kind" "${CSI_PROW_KIND_VERSION}" --depth=1 && + run_with_go "${CSI_PROW_GO_VERSION_KIND}" go build -o "${CSI_PROW_WORK}/bin/kind" sigs.k8s.io/kind + fi +} + +# Ensure that we have the desired version of the ginkgo test runner. +install_ginkgo () { + # CSI_PROW_GINKGO_VERSION contains the tag with v prefix, the command line output does not. + if [ "v$(ginkgo version 2>/dev/null | sed -e 's/.* //')" = "${CSI_PROW_GINKGO_VERSION}" ]; then + return + fi + git_checkout https://github.com/onsi/ginkgo "$GOPATH/src/github.com/onsi/ginkgo" "${CSI_PROW_GINKGO_VERSION}" --depth=1 && + # We have to get dependencies and hence can't call just "go build". + run_with_go "${CSI_PROW_GO_VERSION_GINKGO}" go get github.com/onsi/ginkgo/ginkgo || die "building ginkgo failed" && + mv "$GOPATH/bin/ginkgo" "${CSI_PROW_BIN}" +} + +# This checks out a repo ("https://github.com/kubernetes/kubernetes") +# in a certain location ("$GOPATH/src/k8s.io/kubernetes") at +# a certain revision (a hex commit hash, v1.13.1, master). It's okay +# for that directory to exist already. +git_checkout () { + local repo path revision + repo="$1" + shift + path="$1" + shift + revision="$1" + shift + + mkdir -p "$path" + if ! [ -d "$path/.git" ]; then + run git init "$path" + fi + if (cd "$path" && run git fetch "$@" "$repo" "$revision"); then + (cd "$path" && run git checkout FETCH_HEAD) || die "checking out $repo $revision failed" + else + # Might have been because fetching by revision is not + # supported by GitHub (https://github.com/isaacs/github/issues/436). + # Fall back to fetching everything. + (cd "$path" && run git fetch "$repo" '+refs/heads/*:refs/remotes/csiprow/heads/*' '+refs/tags/*:refs/tags/*') || die "fetching $repo failed" + (cd "$path" && run git checkout "$revision") || die "checking out $repo $revision failed" + fi +} + +list_gates () ( + set -f; IFS=',' + # Ignore: Double quote to prevent globbing and word splitting. + # shellcheck disable=SC2086 + set -- $1 + while [ "$1" ]; do + # Ignore: See if you can use ${variable//search/replace} instead. + # shellcheck disable=SC2001 + echo "$1" | sed -e 's/ *\([^ =]*\) *= *\([^ ]*\) */ \1: \2/' + shift + done +) + +csi_prow_kind_have_kubernetes=false +# Brings up a Kubernetes cluster and sets KUBECONFIG. +# Accepts additional feature gates in the form gate1=true|false,gate2=... +start_cluster () { + local image gates + gates="$1" + + if kind get clusters | grep -q csi-prow; then + run kind delete cluster --name=csi-prow || die "kind delete failed" + fi + + # Build from source? + if [[ "${CSI_PROW_KUBERNETES_VERSION}" =~ ^release-|^latest$ ]]; then + if ! ${csi_prow_kind_have_kubernetes}; then + local version="${CSI_PROW_KUBERNETES_VERSION}" + if [ "$version" = "latest" ]; then + version=master + fi + git_checkout https://github.com/kubernetes/kubernetes "$GOPATH/src/k8s.io/kubernetes" "$version" --depth=1 || die "checking out Kubernetes $version failed" + + # "kind build" and/or the Kubernetes build rules need at least one tag, which we don't have + # when doing a shallow fetch. Therefore we fake one. For some reason, v1.0.0 didn't work + # while v1.14.0-fake.1 did. + (cd "$GOPATH/src/k8s.io/kubernetes" && run git tag -f v1.14.0-fake.1) || die "git tag failed" + + run_with_go "${CSI_PROW_GO_VERSION_K8S}" kind build node-image --type bazel --image csiprow/node:latest --kube-root "$GOPATH/src/k8s.io/kubernetes" || die "'kind build node-image' failed" + csi_prow_kind_have_kubernetes=true + fi + image="csiprow/node:latest" + else + image="kindest/node:v${CSI_PROW_KUBERNETES_VERSION}" + fi + cat >"${CSI_PROW_WORK}/kind-config.yaml" </dev/null; wait) + info "For container output see job artifacts." + die "deploying the hostpath driver with ${deploy_hostpath} failed" + fi +} + +# collect logs and cluster status (like the version of all components, Kubernetes version, test version) +collect_cluster_info () { + cat <>"${ARTIFACTS}/$pod/$container.log" & + echo "$!" + done + done +} + +# Makes the E2E test suite binary available as "${CSI_PROW_WORK}/e2e.test". +install_e2e () { + if [ -e "${CSI_PROW_WORK}/e2e.test" ]; then + return + fi + + git_checkout "${CSI_PROW_E2E_REPO}" "${GOPATH}/src/${CSI_PROW_E2E_IMPORT_PATH}" "${CSI_PROW_E2E_VERSION}" --depth=1 && + if [ "${CSI_PROW_E2E_IMPORT_PATH}" = "k8s.io/kubernetes" ]; then + run_with_go "${CSI_PROW_GO_VERSION_E2E}" make WHAT=test/e2e/e2e.test "-C${GOPATH}/src/${CSI_PROW_E2E_IMPORT_PATH}" && + ln -s "${GOPATH}/src/${CSI_PROW_E2E_IMPORT_PATH}/_output/bin/e2e.test" "${CSI_PROW_WORK}" + else + run_with_go "${CSI_PROW_GO_VERSION_E2E}" go test -c -o "${CSI_PROW_WORK}/e2e.test" "${CSI_PROW_E2E_IMPORT_PATH}/test/e2e" + fi +} + +# Makes the csi-sanity test suite binary available as +# "${CSI_PROW_WORK}/csi-sanity". +install_sanity () ( + if [ -e "${CSI_PROW_WORK}/csi-sanity" ]; then + return + fi + + git_checkout "${CSI_PROW_SANITY_REPO}" "${GOPATH}/src/${CSI_PROW_SANITY_IMPORT_PATH}" "${CSI_PROW_SANITY_VERSION}" --depth=1 || die "checking out csi-sanity failed" + run_with_go "${CSI_PROW_GO_VERSION_SANITY}" go test -c -o "${CSI_PROW_WORK}/csi-sanity" "${CSI_PROW_SANITY_IMPORT_PATH}/cmd/csi-sanity" || die "building csi-sanity failed" +) + +# Whether the hostpath driver supports raw block devices depends on which version +# we are testing. It would be much nicer if we could determine that by querying the +# installed driver. +hostpath_supports_block () { + if [ -e "cmd/hostpathplugin" ] && ${CSI_PROW_BUILD_JOB}; then + # The assumption is that if we build the hostpath driver, then it is + # a current version with support. + echo true + return + fi + + case "${CSI_PROW_DEPLOYMENT}" in kubernetes-1.13) echo false;; # wasn't supported and probably won't be backported + *) echo true;; # probably all other deployments have a recent driver + esac +} + +# Captures pod output while running some other command. +run_with_loggers () ( + loggers=$(start_loggers -f) + trap 'kill $loggers' EXIT + + run "$@" +) + +# Invokes the filter-junit.go tool. +run_filter_junit () { + run_with_go "${CSI_PROW_GO_VERSION_BUILD}" go run "${RELEASE_TOOLS_ROOT}/filter-junit.go" "$@" +} + +# Runs the E2E test suite in a sub-shell. +run_e2e () ( + name="$1" + shift + + install_e2e || die "building e2e.test failed" + install_ginkgo || die "installing ginkgo failed" + + # TODO (?): multi-node cluster (depends on https://github.com/kubernetes-csi/csi-driver-host-path/pull/14). + # When running on a multi-node cluster, we need to figure out where the + # hostpath driver was deployed and set ClientNodeName accordingly. + + # The content of this file depends on both what the E2E suite expects and + # what the installed hostpath driver supports. Generating it here seems + # prone to breakage, but it is uncertain where a better place might be. + cat >"${CSI_PROW_WORK}/hostpath-test-driver.yaml" </dev/null >/dev/null; then + run_filter_junit -t="External Storage" -o "${ARTIFACTS}/junit_${name}.xml" "${ARTIFACTS}"/junit_[0-9]*.xml && rm -f "${ARTIFACTS}"/junit_[0-9]*.xml + fi + } + trap move_junit EXIT + + cd "${GOPATH}/src/${CSI_PROW_E2E_IMPORT_PATH}" && + run_with_loggers ginkgo -v "$@" "${CSI_PROW_WORK}/e2e.test" -- -report-dir "${ARTIFACTS}" -storage.testdriver="${CSI_PROW_WORK}/hostpath-test-driver.yaml" +) + +# Run csi-sanity against installed CSI driver. +run_sanity () ( + install_sanity || die "installing csi-sanity failed" + + cat >"${CSI_PROW_WORK}/mkdir_in_pod.sh" <"${CSI_PROW_WORK}/rmdir_in_pod.sh" </\>/g' -e 's/\x1B...//g' +} + +# The "make test" output starts each test with "### :" +# and then ends when the next test starts or with "make: *** +# [] Error 1" when there was a failure. Here we read each +# line of that output, split it up into individual tests and generate +# a make-test.xml file in JUnit format. +make_test_to_junit () { + local ret out testname testoutput + ret=0 + # Plain make-test.xml was not delivered as text/xml by the web + # server and ignored by spyglass. It seems that the name has to + # match junit*.xml. + out="${ARTIFACTS}/junit_make_test.xml" + testname= + echo "" >>"$out" + + while IFS= read -r line; do + echo "$line" # pass through + if echo "$line" | grep -q "^### [^ ]*:$"; then + if [ "$testname" ]; then + # previous test succesful + echo " " >>"$out" + echo " " >>"$out" + fi + # Ignore: See if you can use ${variable//search/replace} instead. + # shellcheck disable=SC2001 + # + # start new test + testname="$(echo "$line" | sed -e 's/^### \([^ ]*\):$/\1/')" + testoutput= + echo " " >>"$out" + echo " " >>"$out" + elif echo "$line" | grep -q '^make: .*Error [0-9]*$'; then + if [ "$testname" ]; then + # Ignore: Consider using { cmd1; cmd2; } >> file instead of individual redirects. + # shellcheck disable=SC2129 + # + # end test with failure + echo " " >>"$out" + # Include the same text as in also in , + # because then it is easier to view in spyglass (shown directly + # instead of having to click through to stdout). + echo " " >>"$out" + echo -n "$testoutput" | ascii_to_xml >>"$out" + echo " " >>"$out" + echo " " >>"$out" + fi + # remember failure for exit code + ret=1 + # not currently inside a test + testname= + else + if [ "$testname" ]; then + # Test output. + echo "$line" | ascii_to_xml >>"$out" + testoutput="$testoutput$line +" + fi + fi + done + # if still in a test, close it now + if [ "$testname" ]; then + echo " " >>"$out" + echo " " >>"$out" + fi + echo "" >>"$out" + + # this makes the error more visible in spyglass + if [ "$ret" -ne 0 ]; then + echo "ERROR: 'make test' failed" + return 1 + fi +} + +main () { + local images ret + ret=0 + + images= + if ${CSI_PROW_BUILD_JOB}; then + # A successful build is required for testing. + run_with_go "${CSI_PROW_GO_VERSION_BUILD}" make all || die "'make all' failed" + # We don't want test failures to prevent E2E testing below, because the failure + # might have been minor or unavoidable, for example when experimenting with + # changes in "release-tools" in a PR (that fails the "is release-tools unmodified" + # test). + if test_enabled "unit"; then + if ! run_with_go "${CSI_PROW_GO_VERSION_BUILD}" make -k test 2>&1 | make_test_to_junit; then + warn "'make test' failed, proceeding anyway" + ret=1 + fi + fi + # Required for E2E testing. + run_with_go "${CSI_PROW_GO_VERSION_BUILD}" make container || die "'make container' failed" + fi + + install_kind || die "installing kind failed" + start_cluster || die "starting the cluster failed" + + if ${CSI_PROW_BUILD_JOB}; then + cmds="$(grep '^\s*CMDS\s*=' Makefile | sed -e 's/\s*CMDS\s*=//')" + # Get the image that was just built (if any) from the + # top-level Makefile CMDS variable and set the + # deploy-hostpath.sh env variables for it. We also need to + # side-load those images into the cluster. + for i in $cmds; do + e=$(echo "$i" | tr '[:lower:]' '[:upper:]' | tr - _) + images="$images ${e}_REGISTRY=none ${e}_TAG=csiprow" + + # We must avoid the tag "latest" because that implies + # always pulling the image + # (https://github.com/kubernetes-sigs/kind/issues/328). + docker tag "$i:latest" "$i:csiprow" || die "tagging the locally built container image for $i failed" + kind load docker-image --name csi-prow "$i:csiprow" || die "could not load the $i:latest image into the kind cluster" + done + + if [ -e deploy/kubernetes/rbac.yaml ]; then + # This is one of those components which has its own RBAC rules (like external-provisioner). + # We are testing a locally built image and also want to test with the the current, + # potentially modified RBAC rules. + if [ "$(echo "$cmds" | wc -w)" != 1 ]; then + die "ambiguous deploy/kubernetes/rbac.yaml: need exactly one command, got: $cmds" + fi + e=$(echo "$cmds" | tr '[:lower:]' '[:upper:]' | tr - _) + images="$images ${e}_RBAC=$(pwd)/deploy/kubernetes/rbac.yaml" + fi + fi + + # Installing the driver might be disabled, in which case we bail out early. + if ! install_hostpath "$images"; then + info "hostpath driver installation disabled, skipping E2E testing" + return "$ret" + fi + + collect_cluster_info + + if test_enabled "sanity"; then + if ! run_sanity; then + ret=1 + fi + fi + + if test_enabled "parallel"; then + # Ignore: Double quote to prevent globbing and word splitting. + # shellcheck disable=SC2086 + if ! run_e2e parallel ${CSI_PROW_GINKO_PARALLEL} \ + -focus="External.Storage" \ + -skip="$(regex_join "${CSI_PROW_E2E_SERIAL}" "${CSI_PROW_E2E_ALPHA}" "${CSI_PROW_E2E_SKIP}")"; then + warn "E2E parallel failed" + ret=1 + fi + fi + + if test_enabled "serial"; then + if ! run_e2e serial \ + -focus="External.Storage.*($(regex_join "${CSI_PROW_E2E_SERIAL}"))" \ + -skip="$(regex_join "${CSI_PROW_E2E_ALPHA}" "${CSI_PROW_E2E_SKIP}")"; then + warn "E2E serial failed" + ret=1 + fi + fi + + if (test_enabled "parallel-alpha" || test_enabled "serial-alpha") && [ "${CSI_PROW_E2E_ALPHA_GATES}" ]; then + # Need to (re)create the cluster. + start_cluster "${CSI_PROW_E2E_ALPHA_GATES}" || die "starting alpha cluster failed" + if ${CSI_PROW_BUILD_JOB}; then + # Ignore: Double quote to prevent globbing and word splitting. + # Ignore: To read lines rather than words, pipe/redirect to a 'while read' loop. + # shellcheck disable=SC2086 disable=SC2013 + for i in $(grep '^\s*CMDS\s*=' Makefile | sed -e 's/\s*CMDS\s*=//'); do + kind load docker-image --name csi-prow $i:csiprow || die "could not load the $i:latest image into the kind cluster" + done + fi + install_hostpath "$images" || die "hostpath driver installation failed unexpectedly on alpha cluster" + + if test_enabled "parallel-alpha"; then + # Ignore: Double quote to prevent globbing and word splitting. + # shellcheck disable=SC2086 + if ! run_e2e parallel-alpha ${CSI_PROW_GINKO_PARALLEL} \ + -focus="External.Storage.*($(regex_join "${CSI_PROW_E2E_ALPHA}"))" \ + -skip="$(regex_join "${CSI_PROW_E2E_SERIAL}" "${CSI_PROW_E2E_SKIP}")"; then + warn "E2E parallel alpha failed" + ret=1 + fi + fi + + if test_enabled "serial-alpha"; then + if ! run_e2e serial-alpha \ + -focus="External.Storage.*(($(regex_join "${CSI_PROW_E2E_SERIAL}")).*($(regex_join "${CSI_PROW_E2E_ALPHA}"))|($(regex_join "${CSI_PROW_E2E_ALPHA}")).*($(regex_join "${CSI_PROW_E2E_SERIAL}")))" \ + -skip="$(regex_join "${CSI_PROW_E2E_SKIP}")"; then + warn "E2E serial alpha failed" + ret=1 + fi + fi + fi + + # Merge all junit files into one. This gets rid of duplicated "skipped" tests. + if ls "${ARTIFACTS}"/junit_*.xml 2>/dev/null >&2; then + run_filter_junit -o "${CSI_PROW_WORK}/junit_final.xml" "${ARTIFACTS}"/junit_*.xml && rm "${ARTIFACTS}"/junit_*.xml && mv "${CSI_PROW_WORK}/junit_final.xml" "${ARTIFACTS}" + fi + + return "$ret" +} From 0a0fd49b8b146c21e9c90ffbfd696b83b6ed86b7 Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Tue, 2 Apr 2019 20:53:08 +0200 Subject: [PATCH 023/242] prow.sh: comment clarification --- prow.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prow.sh b/prow.sh index 17e8ae4a..faa5c361 100755 --- a/prow.sh +++ b/prow.sh @@ -15,7 +15,7 @@ # limitations under the License. -# This script runs inside a Prow job. It runs unit tests ("make test") +# This script runs inside a Prow job. It can run unit tests ("make test") # and E2E testing. This E2E testing covers different scenarios (see # https://github.com/kubernetes/enhancements/pull/807): # - running the stable hostpath example against a Kubernetes release From 429581c52d1cdbd1d1c3f9c25411fe6aa8c66610 Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Tue, 2 Apr 2019 20:53:12 +0200 Subject: [PATCH 024/242] prow.sh: pull Go version from travis.yml The travis.yml is now the only place where the Go version for the component itself needs to be configured. --- prow.sh | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/prow.sh b/prow.sh index faa5c361..bab7eb04 100755 --- a/prow.sh +++ b/prow.sh @@ -39,6 +39,9 @@ # - kind (https://github.com/kubernetes-sigs/kind) installed # - optional: Go already installed +RELEASE_TOOLS_ROOT="$(realpath "$(dirname "${BASH_SOURCE[0]}")")" +REPO_DIR="$(pwd)" + # Sets the default value for a variable if not set already and logs the value. # Any variable set this way is usually something that a repo's .prow.sh # or the job can set. @@ -53,7 +56,10 @@ configvar () { # If the pre-installed Go is missing or a different # version, the required version here will get installed # from https://golang.org/dl/. -configvar CSI_PROW_GO_VERSION_BUILD 1.11.4 "Go version for building the component" # depends on component's source code +go_from_travis_yml () { + grep "^ *- go:" "${RELEASE_TOOLS_ROOT}/travis.yml" | sed -e 's/.*go: *//' +} +configvar CSI_PROW_GO_VERSION_BUILD "$(go_from_travis_yml)" "Go version for building the component" # depends on component's source code configvar CSI_PROW_GO_VERSION_K8S 1.12.1 "Go version for building Kubernetes for the test cluster" # depends on Kubernetes version configvar CSI_PROW_GO_VERSION_E2E 1.12.1 "Go version for building the Kubernetes E2E test suite" # depends on CSI_PROW_E2E settings below configvar CSI_PROW_GO_VERSION_SANITY "${CSI_PROW_GO_VERSION_BUILD}" "Go version for building the csi-sanity test suite" # depends on CSI_PROW_SANITY settings below @@ -262,9 +268,6 @@ configvar CSI_PROW_E2E_SKIP 'while.kubelet.is.down.*Disruptive' "tests that need configvar ARTIFACTS "${CSI_PROW_WORK}/artifacts" "artifacts" mkdir -p "${ARTIFACTS}" -RELEASE_TOOLS_ROOT="$(realpath "$(dirname "${BASH_SOURCE[0]}")")" -REPO_DIR="$(pwd)" - run () { echo "$(date) $(go version | sed -e 's/.*version \(go[^ ]*\).*/\1/') $(if [ "$(pwd)" != "${REPO_DIR}" ]; then pwd; fi)\$" "$@" >&2 "$@" From 29545bb012b6cbeab74ffbced61951e9b36137d2 Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Wed, 3 Apr 2019 12:38:33 +0200 Subject: [PATCH 025/242] prow.sh: take Go version from Kubernetes source Using the same (recent) Go version for all Kubernetes versions can break for older versions when there are incompatible changes in Go. To avoid that, we use exactly the minimum version of Go required for each Kubernetes version. This is based on the assumption that this combination was tested successfully. When building the E2E suite from Kubernetes (the default) we do the same, but still allow building it from elsewhere. We allow the Go version to be empty when it doesn't matter. --- prow.sh | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/prow.sh b/prow.sh index bab7eb04..6fd55cc2 100755 --- a/prow.sh +++ b/prow.sh @@ -60,8 +60,7 @@ go_from_travis_yml () { grep "^ *- go:" "${RELEASE_TOOLS_ROOT}/travis.yml" | sed -e 's/.*go: *//' } configvar CSI_PROW_GO_VERSION_BUILD "$(go_from_travis_yml)" "Go version for building the component" # depends on component's source code -configvar CSI_PROW_GO_VERSION_K8S 1.12.1 "Go version for building Kubernetes for the test cluster" # depends on Kubernetes version -configvar CSI_PROW_GO_VERSION_E2E 1.12.1 "Go version for building the Kubernetes E2E test suite" # depends on CSI_PROW_E2E settings below +configvar CSI_PROW_GO_VERSION_E2E "" "override Go version for building the Kubernetes E2E test suite" # normally doesn't need to be set, see install_e2e configvar CSI_PROW_GO_VERSION_SANITY "${CSI_PROW_GO_VERSION_BUILD}" "Go version for building the csi-sanity test suite" # depends on CSI_PROW_SANITY settings below configvar CSI_PROW_GO_VERSION_KIND "${CSI_PROW_GO_VERSION_BUILD}" "Go version for building 'kind'" # depends on CSI_PROW_KIND_VERSION below configvar CSI_PROW_GO_VERSION_GINKGO "${CSI_PROW_GO_VERSION_BUILD}" "Go version for building ginkgo" # depends on CSI_PROW_GINKGO_VERSION below @@ -292,12 +291,14 @@ mkdir -p "${CSI_PROW_BIN}" PATH="${CSI_PROW_BIN}:$PATH" # Ensure that PATH has the desired version of the Go tools, then run command given as argument. +# Empty parameter uses the already installed Go. In Prow, that version is kept up-to-date by +# bumping the container image regularly. run_with_go () { local version version="$1" shift - if go version 2>/dev/null | grep -q "go$version"; then + if ! [ "$version" ] || go version 2>/dev/null | grep -q "go$version"; then run "$@" else if ! [ -d "${CSI_PROW_WORK}/go-$version" ]; then @@ -374,6 +375,20 @@ list_gates () ( done ) +go_version_for_kubernetes () ( + local path="$1" + local version="$2" + local go_version + + # We use the minimal Go version specified for each K8S release (= minimum_go_version in hack/lib/golang.sh). + # More recent versions might also work, but we don't want to count on that. + go_version="$(grep minimum_go_version= "$path/hack/lib/golang.sh" | sed -e 's/.*=go//')" + if ! [ "$go_version" ]; then + die "Unable to determine Go version for Kubernetes $version from hack/lib/golang.sh." + fi + echo "$go_version" +) + csi_prow_kind_have_kubernetes=false # Brings up a Kubernetes cluster and sets KUBECONFIG. # Accepts additional feature gates in the form gate1=true|false,gate2=... @@ -399,7 +414,8 @@ start_cluster () { # while v1.14.0-fake.1 did. (cd "$GOPATH/src/k8s.io/kubernetes" && run git tag -f v1.14.0-fake.1) || die "git tag failed" - run_with_go "${CSI_PROW_GO_VERSION_K8S}" kind build node-image --type bazel --image csiprow/node:latest --kube-root "$GOPATH/src/k8s.io/kubernetes" || die "'kind build node-image' failed" + go_version="$(go_version_for_kubernetes "$GOPATH/src/k8s.io/kubernetes" "$version")" || die "cannot proceed without knowing Go version for Kubernetes" + run_with_go "$go_version" kind build node-image --type bazel --image csiprow/node:latest --kube-root "$GOPATH/src/k8s.io/kubernetes" || die "'kind build node-image' failed" csi_prow_kind_have_kubernetes=true fi image="csiprow/node:latest" @@ -563,7 +579,8 @@ install_e2e () { git_checkout "${CSI_PROW_E2E_REPO}" "${GOPATH}/src/${CSI_PROW_E2E_IMPORT_PATH}" "${CSI_PROW_E2E_VERSION}" --depth=1 && if [ "${CSI_PROW_E2E_IMPORT_PATH}" = "k8s.io/kubernetes" ]; then - run_with_go "${CSI_PROW_GO_VERSION_E2E}" make WHAT=test/e2e/e2e.test "-C${GOPATH}/src/${CSI_PROW_E2E_IMPORT_PATH}" && + go_version="${CSI_PROW_GO_VERSION_E2E:-$(go_version_for_kubernetes "${GOPATH}/src/${CSI_PROW_E2E_IMPORT_PATH}" "${CSI_PROW_E2E_VERSION}")}" && + run_with_go "$go_version" make WHAT=test/e2e/e2e.test "-C${GOPATH}/src/${CSI_PROW_E2E_IMPORT_PATH}" && ln -s "${GOPATH}/src/${CSI_PROW_E2E_IMPORT_PATH}/_output/bin/e2e.test" "${CSI_PROW_WORK}" else run_with_go "${CSI_PROW_GO_VERSION_E2E}" go test -c -o "${CSI_PROW_WORK}/e2e.test" "${CSI_PROW_E2E_IMPORT_PATH}/test/e2e" From 741319bd308c10b6c7b16c3cce71ef941cb7086b Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Wed, 3 Apr 2019 12:42:33 +0200 Subject: [PATCH 026/242] prow.sh: improve building Kubernetes from source While switching back and forth between release-1.13 and release-1.14 locally, there was the problem that the local kind image kept using the wrong kubelet binary despite rebuilding from source. The problem went away after cleaning the Bazel cache. Exact root cause unknown, but perhaps using unique tags and properly cleaning the repo helps. If not, then the unique tags at least will show what the problem is. --- prow.sh | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/prow.sh b/prow.sh index 6fd55cc2..a7ea66f2 100755 --- a/prow.sh +++ b/prow.sh @@ -360,6 +360,9 @@ git_checkout () { (cd "$path" && run git fetch "$repo" '+refs/heads/*:refs/remotes/csiprow/heads/*' '+refs/tags/*:refs/tags/*') || die "fetching $repo failed" (cd "$path" && run git checkout "$revision") || die "checking out $repo $revision failed" fi + # This is useful for local testing or when switching between different revisions in the same + # repo. + (cd "$path" && run git clean -fdx) || die "failed to clean $path" } list_gates () ( @@ -410,10 +413,20 @@ start_cluster () { git_checkout https://github.com/kubernetes/kubernetes "$GOPATH/src/k8s.io/kubernetes" "$version" --depth=1 || die "checking out Kubernetes $version failed" # "kind build" and/or the Kubernetes build rules need at least one tag, which we don't have - # when doing a shallow fetch. Therefore we fake one. For some reason, v1.0.0 didn't work - # while v1.14.0-fake.1 did. - (cd "$GOPATH/src/k8s.io/kubernetes" && run git tag -f v1.14.0-fake.1) || die "git tag failed" - + # when doing a shallow fetch. Therefore we fake one: + # release-1.12 -> v1.12.0-release..csiprow + # latest or -> v1.14.0-.csiprow + case "${CSI_PROW_KUBERNETES_VERSION}" in + release-*) + # Ignore: See if you can use ${variable//search/replace} instead. + # shellcheck disable=SC2001 + tag="$(echo "${CSI_PROW_KUBERNETES_VERSION}" | sed -e 's/release-\(.*\)/v\1.0-release./')";; + *) + # We have to make something up. v1.0.0 did not work for some reasons. + tag="v1.14.0-";; + esac + tag="$tag$(cd "$GOPATH/src/k8s.io/kubernetes" && git rev-list --abbrev-commit HEAD).csiprow" + (cd "$GOPATH/src/k8s.io/kubernetes" && run git tag -f "$tag") || die "git tag failed" go_version="$(go_version_for_kubernetes "$GOPATH/src/k8s.io/kubernetes" "$version")" || die "cannot proceed without knowing Go version for Kubernetes" run_with_go "$go_version" kind build node-image --type bazel --image csiprow/node:latest --kube-root "$GOPATH/src/k8s.io/kubernetes" || die "'kind build node-image' failed" csi_prow_kind_have_kubernetes=true From 6602d38bfbce6a526f9225c39aa6b86adbd86978 Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Wed, 3 Apr 2019 13:54:01 +0200 Subject: [PATCH 027/242] prow.sh: different E2E suite depending on Kubernetes version Instead of always using the latest E2E tests for all Kubernetes versions, the plan now is to use the tests that match the Kubernetes version. However, for 1.13 we have to make an exception because the suite for that version did not support the necessary --storage.testdriver parameter. --- prow.sh | 72 ++++++++++++++++++++++++++++----------------------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/prow.sh b/prow.sh index a7ea66f2..c54a81b4 100755 --- a/prow.sh +++ b/prow.sh @@ -52,6 +52,19 @@ configvar () { eval echo "\$3:" "$1=\${$1}" } +# Prints the value of a variable + version suffix, falling back to variable + "LATEST". +get_versioned_variable () { + local var="$1" + local version="$2" + local value + + eval value="\${${var}_${version}}" + if ! [ "$value" ]; then + eval value="\${${var}_LATEST}" + fi + echo "$value" +} + # Go versions can be specified seperately for different tasks # If the pre-installed Go is missing or a different # version, the required version here will get installed @@ -158,9 +171,15 @@ configvar CSI_PROW_HOSTPATH_CANARY "" "hostpath image" # all generated files are present. # # CSI_PROW_E2E_REPO=none disables E2E testing. -configvar CSI_PROW_E2E_VERSION v1.14.0 "E2E version" -configvar CSI_PROW_E2E_REPO https://github.com/kubernetes/kubernetes "E2E repo" -configvar CSI_PROW_E2E_IMPORT_PATH k8s.io/kubernetes "E2E package" +configvar CSI_PROW_E2E_VERSION_1_13 v1.14.0 "E2E version for Kubernetes 1.13.x" # we can't use the one from 1.13.x because it didn't have --storage.testdriver +configvar CSI_PROW_E2E_VERSION_1_14 v1.14.0 "E2E version for Kubernetes 1.14.x" +# TODO: add new CSI_PROW_E2E_VERSION entry for future Kubernetes releases +configvar CSI_PROW_E2E_VERSION_LATEST master "E2E version for Kubernetes master" # testing against Kubernetes master is already tracking a moving target, so we might as well use a moving E2E version +configvar CSI_PROW_E2E_REPO_LATEST https://github.com/kubernetes/kubernetes "E2E repo for Kubernetes >= 1.13.x" # currently the same for all versions +configvar CSI_PROW_E2E_IMPORT_PATH_LATEST k8s.io/kubernetes "E2E package for Kubernetes >= 1.13.x" # currently the same for all versions +configvar CSI_PROW_E2E_VERSION "$(get_versioned_variable CSI_PROW_E2E_VERSION "${csi_prow_kubernetes_version_suffix}")" "E2E version" +configvar CSI_PROW_E2E_REPO "$(get_versioned_variable CSI_PROW_E2E_REPO "${csi_prow_kubernetes_version_suffix}")" "E2E repo" +configvar CSI_PROW_E2E_IMPORT_PATH "$(get_versioned_variable CSI_PROW_E2E_IMPORT_PATH "${csi_prow_kubernetes_version_suffix}")" "E2E package" # csi-sanity testing from the csi-test repo can be run against the installed # CSI driver. For this to work, deploying the driver must expose the Unix domain @@ -200,42 +219,22 @@ regex_join () { echo "$@" | sed -e 's/ */|/g' -e 's/^|*//' -e 's/|*$//' -e 's/^$/this-matches-nothing/g' } -# Prints the value of a variable + version suffix, falling back to variable + "LATEST". -get_versioned_variable () { - local var="$1" - local version="$2" - local value - - eval value="\${${var}_${version}}" - if ! [ "$value" ]; then - eval value="\${${var}_LATEST}" - fi - echo "$value" -} - -# Which tests are alpha depends on the Kubernetes version. The same -# E2E test suite is used for all Kubernetes versions, including older -# Kubernetes. -# -# Feature tags in the test are set based on what is an alpha -# feature in the Kubernetes version that contains the E2E test suite's -# source code. +# Which tests are alpha depends on the Kubernetes version. We could +# use the same E2E test for all Kubernetes version. This would have +# the advantage that new tests can be applied to older versions +# without having to backport tests. # -# So when testing against an older Kubernetes release, some tests -# might be enabled by default which don't pass for that older -# Kubernetes version. In that case, the -# CSI_PROW_E2E_ALPHA_ variable cannot just -# be based on the `Feature` tag, it also must contain the names -# of tests that used to be alpha but no longer have that tag. +# But the feature tag gets removed from E2E tests when the corresponding +# feature becomes beta, so we would have to track which tests were +# alpha in previous Kubernetes releases. This was considered too +# error prone. Therefore we use E2E tests that match the Kubernetes +# version that is getting tested. # -# is just major+minor version separated by -# underscore. "latest" matches master. It is also used for -# unknown versions, so when master gets released there is -# no need to add a new versioned variable. That only needs to be -# done when updating something in the configuration that leads -# to "latest" no longer being suitable. +# However, for 1.13.x testing we have to use the E2E tests from 1.14 +# because 1.13 didn't have --storage.testdriver yet, so for that (and only +# that version) we have to define alpha tests differently. configvar CSI_PROW_E2E_ALPHA_1_13 '\[Feature: \[Testpattern:.Dynamic.PV..block.volmode.\] should.create.and.delete.block.persistent.volumes' "alpha tests for Kubernetes 1.13" # Raw block was an alpha feature in 1.13. -configvar CSI_PROW_E2E_ALPHA_LATEST '\[Feature:' "alpha tests for Kubernetes master" +configvar CSI_PROW_E2E_ALPHA_LATEST '\[Feature:' "alpha tests for Kubernetes >= 1.14" # there's no need to update this, adding a new case for CSI_PROW_E2E for a new Kubernetes is enough configvar CSI_PROW_E2E_ALPHA "$(get_versioned_variable CSI_PROW_E2E_ALPHA "${csi_prow_kubernetes_version_suffix}")" "alpha tests" # After the parallel E2E test without alpha features, a test cluster @@ -251,6 +250,7 @@ configvar CSI_PROW_E2E_ALPHA "$(get_versioned_variable CSI_PROW_E2E_ALPHA "${csi # the failing test for "latest" or by updating the test and not running # it anymore for older releases. configvar CSI_PROW_E2E_ALPHA_GATES_1_13 'VolumeSnapshotDataSource=true,BlockVolume=true,CSIBlockVolume=true' "alpha feature gates for Kubernetes 1.13" +# TODO: add new CSI_PROW_ALPHA_GATES entry for future Kubernetes releases configvar CSI_PROW_E2E_ALPHA_GATES_LATEST 'VolumeSnapshotDataSource=true' "alpha feature gates for latest Kubernetes" configvar CSI_PROW_E2E_ALPHA_GATES "$(get_versioned_variable CSI_PROW_E2E_ALPHA_GATES "${csi_prow_kubernetes_version_suffix}")" "alpha E2E feature gates" From d87eccb46dca47496f7f03bce1909e9ba548f00e Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Wed, 3 Apr 2019 14:59:33 +0200 Subject: [PATCH 028/242] prow.sh: switch back to upstream csi-driver-host-path The temporary fork was merged, we can use the upstream repo again. --- prow.sh | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/prow.sh b/prow.sh index c54a81b4..490fe99f 100755 --- a/prow.sh +++ b/prow.sh @@ -151,12 +151,8 @@ configvar CSI_PROW_WORK "$(mkdir -p "$GOPATH/pkg" && mktemp -d "$GOPATH/pkg/csip # # When no deploy script is found (nothing in `deploy` directory, # CSI_PROW_HOSTPATH_REPO=none), nothing gets deployed. -# -# TODO: merge https://github.com/kubernetes-csi/csi-driver-host-path/pull/29, switch to revision from master -configvar CSI_PROW_HOSTPATH_VERSION deployment "hostpath driver" -configvar CSI_PROW_HOSTPATH_REPO https://github.com/pohly/csi-driver-host-path "hostpath repo" -# Ignore 'See if you can use ${variable//search/replace} instead.' -# shellcheck disable=SC2001 +configvar CSI_PROW_HOSTPATH_VERSION 486074dc3beef59955faf7bb5210418d9844e0a7 "hostpath driver" # pre-1.1.0 +configvar CSI_PROW_HOSTPATH_REPO https://github.com/kubernetes-csi/csi-driver-host-path "hostpath repo" configvar CSI_PROW_DEPLOYMENT "" "deployment" # If CSI_PROW_HOSTPATH_CANARY is set (typically to "canary", but also From f5014439fc2b977a357ff3b49fd6aab052302f7c Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Fri, 5 Apr 2019 08:44:53 +0200 Subject: [PATCH 029/242] prow.sh: AllAlpha=true for unknown Kubernetes versions This ensures that also new, currently unknown alpha gates are enabled when testing against a future Kubernetes versions. For all currently known Kubernetes versions we just use the minimal set of alpha gates, which ensures that we don't miss any of them in our documentation. --- prow.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/prow.sh b/prow.sh index 490fe99f..5a636bc3 100755 --- a/prow.sh +++ b/prow.sh @@ -246,8 +246,9 @@ configvar CSI_PROW_E2E_ALPHA "$(get_versioned_variable CSI_PROW_E2E_ALPHA "${csi # the failing test for "latest" or by updating the test and not running # it anymore for older releases. configvar CSI_PROW_E2E_ALPHA_GATES_1_13 'VolumeSnapshotDataSource=true,BlockVolume=true,CSIBlockVolume=true' "alpha feature gates for Kubernetes 1.13" +configvar CSI_PROW_E2E_ALPHA_GATES_1_14 'VolumeSnapshotDataSource=true' "alpha feature gates for Kubernetes 1.14" # TODO: add new CSI_PROW_ALPHA_GATES entry for future Kubernetes releases -configvar CSI_PROW_E2E_ALPHA_GATES_LATEST 'VolumeSnapshotDataSource=true' "alpha feature gates for latest Kubernetes" +configvar CSI_PROW_E2E_ALPHA_GATES_LATEST 'AllAlpha=true' "alpha feature gates for latest Kubernetes" configvar CSI_PROW_E2E_ALPHA_GATES "$(get_versioned_variable CSI_PROW_E2E_ALPHA_GATES "${csi_prow_kubernetes_version_suffix}")" "alpha E2E feature gates" # Some tests are known to be unusable in a KinD cluster. For example, From 31dfaf31dc6fb132255f9696a4562ab3e8a741ae Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Mon, 8 Apr 2019 08:44:10 +0200 Subject: [PATCH 030/242] prow.sh: fix running of just "alpha" tests "grep -w" treated "serial-alpha" as two words and therefore CSI_PROW_TESTS sometimes ran too many tests. --- prow.sh | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/prow.sh b/prow.sh index 5a636bc3..f39b3394 100755 --- a/prow.sh +++ b/prow.sh @@ -203,7 +203,16 @@ configvar CSI_PROW_SANITY_CONTAINER "hostpath" "Kubernetes container with CSI dr # by setting CSI_PROW_TESTS_SANITY. configvar CSI_PROW_TESTS "unit parallel serial parallel-alpha serial-alpha ${CSI_PROW_TESTS_SANITY}" "tests to run" test_enabled () { - echo "${CSI_PROW_TESTS}" | grep -q -w -e "$1" + local test="$1" + # We want word-splitting here, so ignore: Double quote to prevent globbing and word splitting. + # shellcheck disable=SC2086 + set ${CSI_PROW_TESTS} + for t in "$@"; do + if [ "$t" = "$test" ]; then + return + fi + done + return 1 } # Serial vs. parallel is always determined by these regular expressions. From f3d1d2df5c85dede9cf25201c69634551a538b92 Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Mon, 8 Apr 2019 08:47:15 +0200 Subject: [PATCH 031/242] prow.sh: fix hostpath driver version check The previous logic failed for canary jobs, those also deploy a recent driver. Instead of guessing what driver gets installed based on job parameters, check what really runs in the cluster and base the decision on that. We only need to maintain this blacklist for 1.0.x until we replace it with 1.1.0, then this entire hostpath_supports_block can be removed. --- prow.sh | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/prow.sh b/prow.sh index f39b3394..cd041319 100755 --- a/prow.sh +++ b/prow.sh @@ -619,18 +619,18 @@ install_sanity () ( # Whether the hostpath driver supports raw block devices depends on which version # we are testing. It would be much nicer if we could determine that by querying the -# installed driver. +# installed driver's capabilities instead of having to do a version check. hostpath_supports_block () { - if [ -e "cmd/hostpathplugin" ] && ${CSI_PROW_BUILD_JOB}; then - # The assumption is that if we build the hostpath driver, then it is - # a current version with support. - echo true - return - fi - - case "${CSI_PROW_DEPLOYMENT}" in kubernetes-1.13) echo false;; # wasn't supported and probably won't be backported - *) echo true;; # probably all other deployments have a recent driver - esac + local result + result="$(docker exec csi-prow-control-plane docker image ls --format='{{.Repository}} {{.Tag}} {{.ID}}' | grep hostpath | while read -r repo tag id; do + if [ "$tag" == "v1.0.1" ]; then + # Old version because the revision label is missing: didn't have support yet. + echo "false" + return + fi + done)" + # If not set, then it must be a newer driver with support. + echo "${result:-true}" } # Captures pod output while running some other command. From aa45a1cd9b9fafde60f7d8a8e314287e3b8a7794 Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Mon, 8 Apr 2019 08:51:11 +0200 Subject: [PATCH 032/242] prow.sh: more efficient execution of individual tests When running only some tests, sometimes extra, unnecessarily work was done, like bringing up the cluster without alpha gates. --- prow.sh | 214 ++++++++++++++++++++++++++++++-------------------------- 1 file changed, 116 insertions(+), 98 deletions(-) diff --git a/prow.sh b/prow.sh index cd041319..72be16f5 100755 --- a/prow.sh +++ b/prow.sh @@ -202,18 +202,30 @@ configvar CSI_PROW_SANITY_CONTAINER "hostpath" "Kubernetes container with CSI dr # is off by default. A CSI driver can change that default in its .prow.sh # by setting CSI_PROW_TESTS_SANITY. configvar CSI_PROW_TESTS "unit parallel serial parallel-alpha serial-alpha ${CSI_PROW_TESTS_SANITY}" "tests to run" -test_enabled () { - local test="$1" - # We want word-splitting here, so ignore: Double quote to prevent globbing and word splitting. - # shellcheck disable=SC2086 - set ${CSI_PROW_TESTS} - for t in "$@"; do - if [ "$t" = "$test" ]; then - return - fi +tests_enabled () { + local t1 t2 + # We want word-splitting here, so ignore: Quote to prevent word splitting, or split robustly with mapfile or read -a. + # shellcheck disable=SC2206 + local tests=(${CSI_PROW_TESTS}) + for t1 in "$@"; do + for t2 in "${tests[@]}"; do + if [ "$t1" = "$t2" ]; then + return + fi + done done return 1 } +tests_need_kind () { + tests_enabled "sanity" "parallel" "serial" "serial-alpha" "parallel-alpha" +} +tests_need_non_alpha_cluster () { + tests_enabled "sanity" "parallel" "serial" +} +tests_need_alpha_cluster () { + tests_enabled "parallel-alpha" "serial-alpha" +} + # Serial vs. parallel is always determined by these regular expressions. # Individual regular expressions are seperated by spaces for readability @@ -521,6 +533,15 @@ install_hostpath () { return 1 fi + if ${CSI_PROW_BUILD_JOB}; then + # Ignore: Double quote to prevent globbing and word splitting. + # Ignore: To read lines rather than words, pipe/redirect to a 'while read' loop. + # shellcheck disable=SC2086 disable=SC2013 + for i in $(grep '^\s*CMDS\s*=' Makefile | sed -e 's/\s*CMDS\s*=//'); do + kind load docker-image --name csi-prow $i:csiprow || die "could not load the $i:latest image into the kind cluster" + done + fi + if deploy_hostpath="$(find_deployment "$(pwd)/deploy")"; then : elif [ "${CSI_PROW_HOSTPATH_REPO}" = "none" ]; then @@ -836,7 +857,7 @@ main () { # might have been minor or unavoidable, for example when experimenting with # changes in "release-tools" in a PR (that fails the "is release-tools unmodified" # test). - if test_enabled "unit"; then + if tests_enabled "unit"; then if ! run_with_go "${CSI_PROW_GO_VERSION_BUILD}" make -k test 2>&1 | make_test_to_junit; then warn "'make test' failed, proceeding anyway" ret=1 @@ -846,102 +867,99 @@ main () { run_with_go "${CSI_PROW_GO_VERSION_BUILD}" make container || die "'make container' failed" fi - install_kind || die "installing kind failed" - start_cluster || die "starting the cluster failed" + if tests_need_kind; then + install_kind || die "installing kind failed" - if ${CSI_PROW_BUILD_JOB}; then - cmds="$(grep '^\s*CMDS\s*=' Makefile | sed -e 's/\s*CMDS\s*=//')" - # Get the image that was just built (if any) from the - # top-level Makefile CMDS variable and set the - # deploy-hostpath.sh env variables for it. We also need to - # side-load those images into the cluster. - for i in $cmds; do - e=$(echo "$i" | tr '[:lower:]' '[:upper:]' | tr - _) - images="$images ${e}_REGISTRY=none ${e}_TAG=csiprow" - - # We must avoid the tag "latest" because that implies - # always pulling the image - # (https://github.com/kubernetes-sigs/kind/issues/328). - docker tag "$i:latest" "$i:csiprow" || die "tagging the locally built container image for $i failed" - kind load docker-image --name csi-prow "$i:csiprow" || die "could not load the $i:latest image into the kind cluster" - done + if ${CSI_PROW_BUILD_JOB}; then + cmds="$(grep '^\s*CMDS\s*=' Makefile | sed -e 's/\s*CMDS\s*=//')" + # Get the image that was just built (if any) from the + # top-level Makefile CMDS variable and set the + # deploy-hostpath.sh env variables for it. We also need to + # side-load those images into the cluster. + for i in $cmds; do + e=$(echo "$i" | tr '[:lower:]' '[:upper:]' | tr - _) + images="$images ${e}_REGISTRY=none ${e}_TAG=csiprow" + + # We must avoid the tag "latest" because that implies + # always pulling the image + # (https://github.com/kubernetes-sigs/kind/issues/328). + docker tag "$i:latest" "$i:csiprow" || die "tagging the locally built container image for $i failed" + done - if [ -e deploy/kubernetes/rbac.yaml ]; then - # This is one of those components which has its own RBAC rules (like external-provisioner). - # We are testing a locally built image and also want to test with the the current, - # potentially modified RBAC rules. - if [ "$(echo "$cmds" | wc -w)" != 1 ]; then - die "ambiguous deploy/kubernetes/rbac.yaml: need exactly one command, got: $cmds" + if [ -e deploy/kubernetes/rbac.yaml ]; then + # This is one of those components which has its own RBAC rules (like external-provisioner). + # We are testing a locally built image and also want to test with the the current, + # potentially modified RBAC rules. + if [ "$(echo "$cmds" | wc -w)" != 1 ]; then + die "ambiguous deploy/kubernetes/rbac.yaml: need exactly one command, got: $cmds" + fi + e=$(echo "$cmds" | tr '[:lower:]' '[:upper:]' | tr - _) + images="$images ${e}_RBAC=$(pwd)/deploy/kubernetes/rbac.yaml" fi - e=$(echo "$cmds" | tr '[:lower:]' '[:upper:]' | tr - _) - images="$images ${e}_RBAC=$(pwd)/deploy/kubernetes/rbac.yaml" - fi - fi - - # Installing the driver might be disabled, in which case we bail out early. - if ! install_hostpath "$images"; then - info "hostpath driver installation disabled, skipping E2E testing" - return "$ret" - fi - - collect_cluster_info - - if test_enabled "sanity"; then - if ! run_sanity; then - ret=1 - fi - fi - - if test_enabled "parallel"; then - # Ignore: Double quote to prevent globbing and word splitting. - # shellcheck disable=SC2086 - if ! run_e2e parallel ${CSI_PROW_GINKO_PARALLEL} \ - -focus="External.Storage" \ - -skip="$(regex_join "${CSI_PROW_E2E_SERIAL}" "${CSI_PROW_E2E_ALPHA}" "${CSI_PROW_E2E_SKIP}")"; then - warn "E2E parallel failed" - ret=1 fi - fi - - if test_enabled "serial"; then - if ! run_e2e serial \ - -focus="External.Storage.*($(regex_join "${CSI_PROW_E2E_SERIAL}"))" \ - -skip="$(regex_join "${CSI_PROW_E2E_ALPHA}" "${CSI_PROW_E2E_SKIP}")"; then - warn "E2E serial failed" - ret=1 - fi - fi - if (test_enabled "parallel-alpha" || test_enabled "serial-alpha") && [ "${CSI_PROW_E2E_ALPHA_GATES}" ]; then - # Need to (re)create the cluster. - start_cluster "${CSI_PROW_E2E_ALPHA_GATES}" || die "starting alpha cluster failed" - if ${CSI_PROW_BUILD_JOB}; then - # Ignore: Double quote to prevent globbing and word splitting. - # Ignore: To read lines rather than words, pipe/redirect to a 'while read' loop. - # shellcheck disable=SC2086 disable=SC2013 - for i in $(grep '^\s*CMDS\s*=' Makefile | sed -e 's/\s*CMDS\s*=//'); do - kind load docker-image --name csi-prow $i:csiprow || die "could not load the $i:latest image into the kind cluster" - done - fi - install_hostpath "$images" || die "hostpath driver installation failed unexpectedly on alpha cluster" - - if test_enabled "parallel-alpha"; then - # Ignore: Double quote to prevent globbing and word splitting. - # shellcheck disable=SC2086 - if ! run_e2e parallel-alpha ${CSI_PROW_GINKO_PARALLEL} \ - -focus="External.Storage.*($(regex_join "${CSI_PROW_E2E_ALPHA}"))" \ - -skip="$(regex_join "${CSI_PROW_E2E_SERIAL}" "${CSI_PROW_E2E_SKIP}")"; then - warn "E2E parallel alpha failed" - ret=1 + if tests_need_non_alpha_cluster; then + start_cluster || die "starting the non-alpha cluster failed" + + # Installing the driver might be disabled. + if install_hostpath "$images"; then + collect_cluster_info + + if tests_enabled "sanity"; then + if ! run_sanity; then + ret=1 + fi + fi + + if tests_enabled "parallel"; then + # Ignore: Double quote to prevent globbing and word splitting. + # shellcheck disable=SC2086 + if ! run_e2e parallel ${CSI_PROW_GINKO_PARALLEL} \ + -focus="External.Storage" \ + -skip="$(regex_join "${CSI_PROW_E2E_SERIAL}" "${CSI_PROW_E2E_ALPHA}" "${CSI_PROW_E2E_SKIP}")"; then + warn "E2E parallel failed" + ret=1 + fi + fi + + if tests_enabled "serial"; then + if ! run_e2e serial \ + -focus="External.Storage.*($(regex_join "${CSI_PROW_E2E_SERIAL}"))" \ + -skip="$(regex_join "${CSI_PROW_E2E_ALPHA}" "${CSI_PROW_E2E_SKIP}")"; then + warn "E2E serial failed" + ret=1 + fi + fi fi fi - if test_enabled "serial-alpha"; then - if ! run_e2e serial-alpha \ - -focus="External.Storage.*(($(regex_join "${CSI_PROW_E2E_SERIAL}")).*($(regex_join "${CSI_PROW_E2E_ALPHA}"))|($(regex_join "${CSI_PROW_E2E_ALPHA}")).*($(regex_join "${CSI_PROW_E2E_SERIAL}")))" \ - -skip="$(regex_join "${CSI_PROW_E2E_SKIP}")"; then - warn "E2E serial alpha failed" - ret=1 + if tests_need_alpha_cluster && [ "${CSI_PROW_E2E_ALPHA_GATES}" ]; then + # Need to (re)create the cluster. + start_cluster "${CSI_PROW_E2E_ALPHA_GATES}" || die "starting alpha cluster failed" + + # Installing the driver might be disabled. + if install_hostpath "$images"; then + collect_cluster_info + + if tests_enabled "parallel-alpha"; then + # Ignore: Double quote to prevent globbing and word splitting. + # shellcheck disable=SC2086 + if ! run_e2e parallel-alpha ${CSI_PROW_GINKO_PARALLEL} \ + -focus="External.Storage.*($(regex_join "${CSI_PROW_E2E_ALPHA}"))" \ + -skip="$(regex_join "${CSI_PROW_E2E_SERIAL}" "${CSI_PROW_E2E_SKIP}")"; then + warn "E2E parallel alpha failed" + ret=1 + fi + fi + + if tests_enabled "serial-alpha"; then + if ! run_e2e serial-alpha \ + -focus="External.Storage.*(($(regex_join "${CSI_PROW_E2E_SERIAL}")).*($(regex_join "${CSI_PROW_E2E_ALPHA}"))|($(regex_join "${CSI_PROW_E2E_ALPHA}")).*($(regex_join "${CSI_PROW_E2E_SERIAL}")))" \ + -skip="$(regex_join "${CSI_PROW_E2E_SKIP}")"; then + warn "E2E serial alpha failed" + ret=1 + fi + fi fi fi fi From 9b0d9cd74370bff4dfaf86c4ab75973ec9aa56a2 Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Mon, 8 Apr 2019 11:37:01 +0200 Subject: [PATCH 033/242] build.make: skip shellcheck if Docker is not available Not all environments have Docker. The simplifying assumption here is that if the Docker command is available, it's also usable. --- build.make | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/build.make b/build.make index 078100c9..e5769c58 100644 --- a/build.make +++ b/build.make @@ -141,6 +141,10 @@ test: test-shellcheck test-shellcheck: @ echo; echo "### $@:" @ ret=0; \ + if ! command -v docker; then \ + echo "skipped, no Docker"; \ + return 0; \ + fi; \ for dir in $(abspath $(TEST_SHELLCHECK_DIRS)); do \ echo; \ echo "$$dir:"; \ From 546d5504a1902276561ee1bfc3811afb61346855 Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Mon, 8 Apr 2019 19:42:38 +0200 Subject: [PATCH 034/242] prow.sh: debug failing KinD cluster creation When KinD fails in a Prow job, we need additional information to understand why it failed. --- prow.sh | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/prow.sh b/prow.sh index 72be16f5..c2075685 100755 --- a/prow.sh +++ b/prow.sh @@ -488,7 +488,17 @@ $(list_gates "$gates") featureGates: $(list_gates "$gates") EOF - run kind create cluster --name csi-prow --config "${CSI_PROW_WORK}/kind-config.yaml" --wait 5m --image "$image" || die "'kind create cluster' failed" + info "kind-config.yaml:" + cat "${CSI_PROW_WORK}/kind-config.yaml" + if ! run kind create cluster --name csi-prow --config "${CSI_PROW_WORK}/kind-config.yaml" --wait 5m --image "$image"; then + warn "Cluster creation failed. Will try again with higher verbosity." + info "Available Docker images:" + docker image ls + if ! run kind --loglevel debug create cluster --retain --name csi-prow --config "${CSI_PROW_WORK}/kind-config.yaml" --wait 5m --image "$image"; then + run kind export logs --name csi-prow "$ARTIFACTS/kind-cluster" + die "Cluster creation failed again, giving up. See the 'kind-cluster' artifact directory for additional logs." + fi + fi KUBECONFIG="$(kind get kubeconfig-path --name=csi-prow)" export KUBECONFIG } From cda2fc5874b42ed68b68cbb60e92fff6ab7ba4c0 Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Mon, 8 Apr 2019 19:45:44 +0200 Subject: [PATCH 035/242] prow.sh: avoid AllAlpha=true It turned out to not work. Instead of reverting the commit which introduced this, let's better document this explicitly. --- prow.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/prow.sh b/prow.sh index c2075685..0a2b37d7 100755 --- a/prow.sh +++ b/prow.sh @@ -267,9 +267,9 @@ configvar CSI_PROW_E2E_ALPHA "$(get_versioned_variable CSI_PROW_E2E_ALPHA "${csi # the failing test for "latest" or by updating the test and not running # it anymore for older releases. configvar CSI_PROW_E2E_ALPHA_GATES_1_13 'VolumeSnapshotDataSource=true,BlockVolume=true,CSIBlockVolume=true' "alpha feature gates for Kubernetes 1.13" -configvar CSI_PROW_E2E_ALPHA_GATES_1_14 'VolumeSnapshotDataSource=true' "alpha feature gates for Kubernetes 1.14" +configvar CSI_PROW_E2E_ALPHA_GATES_1_14 'VolumeSnapshotDataSource=true,ExpandCSIVolumes=true' "alpha feature gates for Kubernetes 1.14" # TODO: add new CSI_PROW_ALPHA_GATES entry for future Kubernetes releases -configvar CSI_PROW_E2E_ALPHA_GATES_LATEST 'AllAlpha=true' "alpha feature gates for latest Kubernetes" +configvar CSI_PROW_E2E_ALPHA_GATES_LATEST 'AllAlpha=true,ExpandCSIVolumes=true' "alpha feature gates for latest Kubernetes" configvar CSI_PROW_E2E_ALPHA_GATES "$(get_versioned_variable CSI_PROW_E2E_ALPHA_GATES "${csi_prow_kubernetes_version_suffix}")" "alpha E2E feature gates" # Some tests are known to be unusable in a KinD cluster. For example, From 7aaac225719beb59cf984b885bd8241c699723e7 Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Wed, 10 Apr 2019 08:44:54 +0200 Subject: [PATCH 036/242] prow.sh: remove AllAlpha=all, part II This was already meant to be done earlier in cda2fc5874b42ed68b. While at it, extend the permanent TODO with guidance on future feature gates. --- prow.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/prow.sh b/prow.sh index 0a2b37d7..57415d43 100755 --- a/prow.sh +++ b/prow.sh @@ -268,8 +268,9 @@ configvar CSI_PROW_E2E_ALPHA "$(get_versioned_variable CSI_PROW_E2E_ALPHA "${csi # it anymore for older releases. configvar CSI_PROW_E2E_ALPHA_GATES_1_13 'VolumeSnapshotDataSource=true,BlockVolume=true,CSIBlockVolume=true' "alpha feature gates for Kubernetes 1.13" configvar CSI_PROW_E2E_ALPHA_GATES_1_14 'VolumeSnapshotDataSource=true,ExpandCSIVolumes=true' "alpha feature gates for Kubernetes 1.14" -# TODO: add new CSI_PROW_ALPHA_GATES entry for future Kubernetes releases -configvar CSI_PROW_E2E_ALPHA_GATES_LATEST 'AllAlpha=true,ExpandCSIVolumes=true' "alpha feature gates for latest Kubernetes" +# TODO: add new CSI_PROW_ALPHA_GATES_xxx entry for future Kubernetes releases and +# add new gates to CSI_PROW_E2E_ALPHA_GATES_LATEST. +configvar CSI_PROW_E2E_ALPHA_GATES_LATEST 'VolumeSnapshotDataSource=true,ExpandCSIVolumes=true' "alpha feature gates for latest Kubernetes" configvar CSI_PROW_E2E_ALPHA_GATES "$(get_versioned_variable CSI_PROW_E2E_ALPHA_GATES "${csi_prow_kubernetes_version_suffix}")" "alpha E2E feature gates" # Some tests are known to be unusable in a KinD cluster. For example, From ff9bce4a71feb31e69d3e5a8ed9874da542066f1 Mon Sep 17 00:00:00 2001 From: Pengzhi Sun Date: Thu, 11 Apr 2019 17:42:44 +0800 Subject: [PATCH 037/242] Replace 'return' to 'exit' to fix shellcheck error --- build.make | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.make b/build.make index e5769c58..e3d4795d 100644 --- a/build.make +++ b/build.make @@ -143,11 +143,11 @@ test-shellcheck: @ ret=0; \ if ! command -v docker; then \ echo "skipped, no Docker"; \ - return 0; \ + exit 0; \ fi; \ for dir in $(abspath $(TEST_SHELLCHECK_DIRS)); do \ echo; \ echo "$$dir:"; \ ./release-tools/verify-shellcheck.sh "$$dir" || ret=1; \ done; \ - return $$ret + exit $$ret From 0b10f6a4b026a52bdda5d8d63b80a45b79b84ff3 Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Thu, 11 Apr 2019 13:37:43 +0200 Subject: [PATCH 038/242] prow.sh: update csi-driver-host-path This pulls in https://github.com/kubernetes-csi/csi-driver-host-path/pull/37, which turned out to be necessary for pre-submit testing of the livenessprobe. --- prow.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prow.sh b/prow.sh index 57415d43..ab3a1a57 100755 --- a/prow.sh +++ b/prow.sh @@ -151,7 +151,7 @@ configvar CSI_PROW_WORK "$(mkdir -p "$GOPATH/pkg" && mktemp -d "$GOPATH/pkg/csip # # When no deploy script is found (nothing in `deploy` directory, # CSI_PROW_HOSTPATH_REPO=none), nothing gets deployed. -configvar CSI_PROW_HOSTPATH_VERSION 486074dc3beef59955faf7bb5210418d9844e0a7 "hostpath driver" # pre-1.1.0 +configvar CSI_PROW_HOSTPATH_VERSION fc52d13ba07922c80555a24616a5b16480350c3f "hostpath driver" # pre-1.1.0 configvar CSI_PROW_HOSTPATH_REPO https://github.com/kubernetes-csi/csi-driver-host-path "hostpath repo" configvar CSI_PROW_DEPLOYMENT "" "deployment" From 0fafc663dc8c0d43cbc411b69ad68a74ecacbc8b Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Thu, 11 Apr 2019 22:32:01 +0200 Subject: [PATCH 039/242] prow.sh: skip sanity testing if component doesn't support it Whether a component supports sanity testing depends on the component. For example, csi-driver-host-path enables it because it makes sense there (and only there). Letting the prow.sh script decide whether it actually runs simplifies the job definitions in test-infra. --- prow.sh | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/prow.sh b/prow.sh index ab3a1a57..204cc294 100755 --- a/prow.sh +++ b/prow.sh @@ -198,10 +198,13 @@ configvar CSI_PROW_SANITY_CONTAINER "hostpath" "Kubernetes container with CSI dr # - serial, only alpha features # - sanity # -# Sanity testing with csi-sanity only covers the CSI driver itself and thus -# is off by default. A CSI driver can change that default in its .prow.sh -# by setting CSI_PROW_TESTS_SANITY. -configvar CSI_PROW_TESTS "unit parallel serial parallel-alpha serial-alpha ${CSI_PROW_TESTS_SANITY}" "tests to run" +# Unknown or unsupported entries are ignored. +# +# Sanity testing with csi-sanity only covers the CSI driver itself and +# thus only makes sense in repos which provide their own CSI +# driver. Repos can enable sanity testing by setting +# CSI_PROW_TESTS_SANITY=sanity. +configvar CSI_PROW_TESTS "unit parallel serial parallel-alpha serial-alpha sanity" "tests to run" tests_enabled () { local t1 t2 # We want word-splitting here, so ignore: Quote to prevent word splitting, or split robustly with mapfile or read -a. @@ -216,11 +219,16 @@ tests_enabled () { done return 1 } +sanity_enabled () { + [ "${CSI_PROW_TESTS_SANITY}" = "sanity" ] && tests_enabled "sanity" +} tests_need_kind () { - tests_enabled "sanity" "parallel" "serial" "serial-alpha" "parallel-alpha" + tests_enabled "parallel" "serial" "serial-alpha" "parallel-alpha" || + sanity_enabled } tests_need_non_alpha_cluster () { - tests_enabled "sanity" "parallel" "serial" + tests_enabled "parallel" "serial" || + sanity_enabled } tests_need_alpha_cluster () { tests_enabled "parallel-alpha" "serial-alpha" @@ -916,7 +924,7 @@ main () { if install_hostpath "$images"; then collect_cluster_info - if tests_enabled "sanity"; then + if sanity_enabled; then if ! run_sanity; then ret=1 fi From e157b6b514ace191f46d4c879491cb7d11684659 Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Mon, 15 Apr 2019 09:45:23 +0200 Subject: [PATCH 040/242] update to Go 1.12.4 Kubernetes also requires 1.12. We pick the latest stable release for CI builds. --- travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/travis.yml b/travis.yml index 1c05dfd9..5b042522 100644 --- a/travis.yml +++ b/travis.yml @@ -4,7 +4,7 @@ services: - docker matrix: include: - - go: 1.11.1 + - go: 1.12.4 before_script: - mkdir -p bin - wget https://github.com/golang/dep/releases/download/v0.5.1/dep-linux-amd64 -O bin/dep From 066143d146253748b9391445b25804e85b5cc208 Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Fri, 10 May 2019 17:37:49 +0200 Subject: [PATCH 041/242] build.make: allow repos to use 'go mod' for vendoring How a repo does vendoring is detected based on the presence of Gopkg.toml. The vendor check with `dep` was all done locally, but the corresponding check for `go mod` requires network access. The check therefore gets skipped when running in the Prow CI in situations where we are sure that it isn't needed (for example, in a periodic job). --- build.make | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/build.make b/build.make index e3d4795d..142c8578 100644 --- a/build.make +++ b/build.make @@ -118,14 +118,39 @@ test-fmt: fi # This test only runs when dep >= 0.5 is installed, which is the case for the CI setup. +# When using 'go mod', we allow the test to be skipped in the Prow CI under some special +# circumstances, because it depends on accessing all remote repos and thus +# running it all the time would defeat the purpose of vendoring: +# - not handling a PR or +# - the fabricated merge commit leaves go.mod, go.sum and vendor dir unchanged +# - release-tools also didn't change (changing rules or Go version might lead to +# a different result and thus must be tested) .PHONY: test-vendor test: test-vendor test-vendor: @ echo; echo "### $@:" - @ case "$$(dep version 2>/dev/null | grep 'version *:')" in \ - *v0.[56789]*) dep check && echo "vendor up-to-date" || false;; \ - *) echo "skipping check, dep >= 0.5 required";; \ - esac + @ if [ -f Gopkg.toml ]; then \ + echo "Repo uses 'dep' for vendoring."; \ + case "$$(dep version 2>/dev/null | grep 'version *:')" in \ + *v0.[56789]*) dep check && echo "vendor up-to-date" || false;; \ + *) echo "skipping check, dep >= 0.5 required";; \ + esac; \ + else \ + echo "Repo uses 'go mod' for vendoring."; \ + if [ "$${JOB_NAME}" ] && \ + ( [ "$${JOB_TYPE}" != "presubmit" ] || \ + [ $$(git diff "${PULL_BASE_SHA}..HEAD" -- go.mod go.sum vendor release-tools | wc -l) -eq 0 ] ); then \ + echo "Skipping vendor check because the Prow pre-submit job does not change vendoring."; \ + elif ! GO111MODULE=on go mod vendor; then \ + echo "ERROR: vendor check failed."; \ + false; \ + elif [ $$(git status --porcelain -- vendor | wc -l) -gt 0 ]; then \ + echo "ERROR: vendor directory *not* up-to-date, it did get modified by 'GO111MODULE=on go mod vendor':"; \ + git status -- vendor; \ + git diff -- vendor; \ + false; \ + fi; \ + fi; .PHONY: test-subtree test: test-subtree From b2f4e051d4ffeadffc0980db745a33bacf84f36c Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Mon, 8 Jul 2019 20:36:55 +0200 Subject: [PATCH 042/242] prow.sh: flexible test driver config By moving the code into a separate function, other CSI drivers have a chance to overwrite it. For the hostpath driver itself we need the ability to set the driver name depending on which revision is getting installed. --- prow.sh | 44 ++++++++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/prow.sh b/prow.sh index 204cc294..dd335540 100755 --- a/prow.sh +++ b/prow.sh @@ -154,6 +154,7 @@ configvar CSI_PROW_WORK "$(mkdir -p "$GOPATH/pkg" && mktemp -d "$GOPATH/pkg/csip configvar CSI_PROW_HOSTPATH_VERSION fc52d13ba07922c80555a24616a5b16480350c3f "hostpath driver" # pre-1.1.0 configvar CSI_PROW_HOSTPATH_REPO https://github.com/kubernetes-csi/csi-driver-host-path "hostpath repo" configvar CSI_PROW_DEPLOYMENT "" "deployment" +configvar CSI_PROW_HOSTPATH_DRIVER_NAME "csi-hostpath" "the driver (aka provisioner) name of the chosen hostpath driver" # If CSI_PROW_HOSTPATH_CANARY is set (typically to "canary", but also # "1.0-canary"), then all image versions are replaced with that @@ -673,6 +674,29 @@ hostpath_supports_block () { echo "${result:-true}" } +# The default implementation of this function generates a external +# driver test configuration for the hostpath driver. +# +# The content depends on both what the E2E suite expects and what the +# installed hostpath driver supports. Generating it here seems prone +# to breakage, but it is uncertain where a better place might be. +generate_test_driver () { + cat <"${CSI_PROW_WORK}/hostpath-test-driver.yaml" <"${CSI_PROW_WORK}/test-driver.yaml" || die "generating test-driver.yaml failed" # Rename, merge and filter JUnit files. Necessary in case that we run the E2E suite again # and to avoid the large number of "skipped" tests that we get from using @@ -727,7 +735,7 @@ EOF trap move_junit EXIT cd "${GOPATH}/src/${CSI_PROW_E2E_IMPORT_PATH}" && - run_with_loggers ginkgo -v "$@" "${CSI_PROW_WORK}/e2e.test" -- -report-dir "${ARTIFACTS}" -storage.testdriver="${CSI_PROW_WORK}/hostpath-test-driver.yaml" + run_with_loggers ginkgo -v "$@" "${CSI_PROW_WORK}/e2e.test" -- -report-dir "${ARTIFACTS}" -storage.testdriver="${CSI_PROW_WORK}/test-driver.yaml" ) # Run csi-sanity against installed CSI driver. From a6f21d4054a1b70f9efd957a6eebe8f85892b666 Mon Sep 17 00:00:00 2001 From: Michelle Au Date: Thu, 11 Jul 2019 14:33:47 -0700 Subject: [PATCH 043/242] Add variables for 1.15 --- prow.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/prow.sh b/prow.sh index dd335540..fc562b05 100755 --- a/prow.sh +++ b/prow.sh @@ -170,6 +170,7 @@ configvar CSI_PROW_HOSTPATH_CANARY "" "hostpath image" # CSI_PROW_E2E_REPO=none disables E2E testing. configvar CSI_PROW_E2E_VERSION_1_13 v1.14.0 "E2E version for Kubernetes 1.13.x" # we can't use the one from 1.13.x because it didn't have --storage.testdriver configvar CSI_PROW_E2E_VERSION_1_14 v1.14.0 "E2E version for Kubernetes 1.14.x" +configvar CSI_PROW_E2E_VERSION_1_15 v1.15.0 "E2E version for Kubernetes 1.15.x" # TODO: add new CSI_PROW_E2E_VERSION entry for future Kubernetes releases configvar CSI_PROW_E2E_VERSION_LATEST master "E2E version for Kubernetes master" # testing against Kubernetes master is already tracking a moving target, so we might as well use a moving E2E version configvar CSI_PROW_E2E_REPO_LATEST https://github.com/kubernetes/kubernetes "E2E repo for Kubernetes >= 1.13.x" # currently the same for all versions @@ -277,6 +278,7 @@ configvar CSI_PROW_E2E_ALPHA "$(get_versioned_variable CSI_PROW_E2E_ALPHA "${csi # it anymore for older releases. configvar CSI_PROW_E2E_ALPHA_GATES_1_13 'VolumeSnapshotDataSource=true,BlockVolume=true,CSIBlockVolume=true' "alpha feature gates for Kubernetes 1.13" configvar CSI_PROW_E2E_ALPHA_GATES_1_14 'VolumeSnapshotDataSource=true,ExpandCSIVolumes=true' "alpha feature gates for Kubernetes 1.14" +configvar CSI_PROW_E2E_ALPHA_GATES_1_15 'VolumeSnapshotDataSource=true,ExpandCSIVolumes=true' "alpha feature gates for Kubernetes 1.15" # TODO: add new CSI_PROW_ALPHA_GATES_xxx entry for future Kubernetes releases and # add new gates to CSI_PROW_E2E_ALPHA_GATES_LATEST. configvar CSI_PROW_E2E_ALPHA_GATES_LATEST 'VolumeSnapshotDataSource=true,ExpandCSIVolumes=true' "alpha feature gates for latest Kubernetes" From ecc79187c50d2c9aa2f27851b2dc5a59190032e2 Mon Sep 17 00:00:00 2001 From: Michelle Au Date: Thu, 11 Jul 2019 14:42:59 -0700 Subject: [PATCH 044/242] Update kind to v0.4.0. This requires overriding Kubernetes versions with specific patch versions that kind 0.4.0 supports. Also, feature gate setting is only supported on 1.15+ due to kind.sigs.k8s.io/v1alpha3 and kubeadm.k8s.io/v1beta2 dependencies. --- prow.sh | 105 +++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 74 insertions(+), 31 deletions(-) diff --git a/prow.sh b/prow.sh index fc562b05..be49ff57 100755 --- a/prow.sh +++ b/prow.sh @@ -52,6 +52,26 @@ configvar () { eval echo "\$3:" "$1=\${$1}" } +# Takes the minor version of $CSI_PROW_KUBERNETES_VERSION and overrides it to +# $1 if they are equal minor versions. Ignores versions that begin with +# "release-". +override_k8s_version () { + local current_minor_version + local override_minor_version + + # Ignore: See if you can use ${variable//search/replace} instead. + # shellcheck disable=SC2001 + current_minor_version="$(echo "${CSI_PROW_KUBERNETES_VERSION}" | sed -e 's/\([0-9]*\)\.\([0-9]*\).*/\1\.\2/')" + + # Ignore: See if you can use ${variable//search/replace} instead. + # shellcheck disable=SC2001 + override_minor_version="$(echo "${1}" | sed -e 's/\([0-9]*\)\.\([0-9]*\).*/\1\.\2/')" + if [ "${current_minor_version}" == "${override_minor_version}" ]; then + CSI_PROW_KUBERNETES_VERSION="$1" + echo "Overriding CSI_PROW_KUBERNETES_VERSION with $1: $CSI_PROW_KUBERNETES_VERSION" + fi +} + # Prints the value of a variable + version suffix, falling back to variable + "LATEST". get_versioned_variable () { local var="$1" @@ -81,7 +101,7 @@ configvar CSI_PROW_GO_VERSION_GINKGO "${CSI_PROW_GO_VERSION_BUILD}" "Go version # kind version to use. If the pre-installed version is different, # the desired version is downloaded from https://github.com/kubernetes-sigs/kind/releases/download/ # (if available), otherwise it is built from source. -configvar CSI_PROW_KIND_VERSION 0.2.1 "kind" +configvar CSI_PROW_KIND_VERSION v0.4.0 "kind" # ginkgo test runner version to use. If the pre-installed version is # different, the desired version is built from source. @@ -108,6 +128,18 @@ configvar CSI_PROW_BUILD_JOB true "building code in repo enabled" # deprecating or changing the implementation of an alpha feature. configvar CSI_PROW_KUBERNETES_VERSION 1.13.3 "Kubernetes" +# This is a hack to workaround the issue that each version +# of kind currently only supports specific patch versions of +# Kubernetes. We need to override CSI_PROW_KUBERNETES_VERSION +# passed in by our CI/pull jobs to the versions that +# kind v0.4.0 supports. +# +# If the version is prefixed with "release-", then nothing +# is overridden. +override_k8s_version "1.13.7" +override_k8s_version "1.14.3" +override_k8s_version "1.15.0" + # CSI_PROW_KUBERNETES_VERSION reduced to first two version numbers and # with underscore (1_13 instead of 1.13.3) and in uppercase (LATEST # instead of latest). @@ -466,40 +498,51 @@ start_cluster () { image="kindest/node:v${CSI_PROW_KUBERNETES_VERSION}" fi cat >"${CSI_PROW_WORK}/kind-config.yaml" <>"${CSI_PROW_WORK}/kind-config.yaml" < Date: Thu, 11 Jul 2019 14:57:27 -0700 Subject: [PATCH 045/242] Update hostpath version for sidecar testing to v1.2.0-rc2 --- prow.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prow.sh b/prow.sh index be49ff57..d998ebba 100755 --- a/prow.sh +++ b/prow.sh @@ -183,7 +183,7 @@ configvar CSI_PROW_WORK "$(mkdir -p "$GOPATH/pkg" && mktemp -d "$GOPATH/pkg/csip # # When no deploy script is found (nothing in `deploy` directory, # CSI_PROW_HOSTPATH_REPO=none), nothing gets deployed. -configvar CSI_PROW_HOSTPATH_VERSION fc52d13ba07922c80555a24616a5b16480350c3f "hostpath driver" # pre-1.1.0 +configvar CSI_PROW_HOSTPATH_VERSION "v1.2.0-rc2" "hostpath driver" configvar CSI_PROW_HOSTPATH_REPO https://github.com/kubernetes-csi/csi-driver-host-path "hostpath repo" configvar CSI_PROW_DEPLOYMENT "" "deployment" configvar CSI_PROW_HOSTPATH_DRIVER_NAME "csi-hostpath" "the driver (aka provisioner) name of the chosen hostpath driver" From 4e31f078a2fb7a891a7cbcdf2299b94891d030ce Mon Sep 17 00:00:00 2001 From: Michelle Au Date: Thu, 11 Jul 2019 17:13:06 -0700 Subject: [PATCH 046/242] Change default hostpath driver name to hostpath.csi.k8s.io --- prow.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prow.sh b/prow.sh index d998ebba..f1f0a1b2 100755 --- a/prow.sh +++ b/prow.sh @@ -186,7 +186,7 @@ configvar CSI_PROW_WORK "$(mkdir -p "$GOPATH/pkg" && mktemp -d "$GOPATH/pkg/csip configvar CSI_PROW_HOSTPATH_VERSION "v1.2.0-rc2" "hostpath driver" configvar CSI_PROW_HOSTPATH_REPO https://github.com/kubernetes-csi/csi-driver-host-path "hostpath repo" configvar CSI_PROW_DEPLOYMENT "" "deployment" -configvar CSI_PROW_HOSTPATH_DRIVER_NAME "csi-hostpath" "the driver (aka provisioner) name of the chosen hostpath driver" +configvar CSI_PROW_HOSTPATH_DRIVER_NAME "hostpath.csi.k8s.io" "the hostpath driver name" # If CSI_PROW_HOSTPATH_CANARY is set (typically to "canary", but also # "1.0-canary"), then all image versions are replaced with that From 0c0dc300cafca09a27dd7206547a8191baae477e Mon Sep 17 00:00:00 2001 From: Michelle Au Date: Mon, 15 Jul 2019 12:42:20 -0700 Subject: [PATCH 047/242] prow.sh: tag master images with a large version number --- prow.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prow.sh b/prow.sh index f1f0a1b2..dcfcec61 100755 --- a/prow.sh +++ b/prow.sh @@ -485,7 +485,7 @@ start_cluster () { tag="$(echo "${CSI_PROW_KUBERNETES_VERSION}" | sed -e 's/release-\(.*\)/v\1.0-release./')";; *) # We have to make something up. v1.0.0 did not work for some reasons. - tag="v1.14.0-";; + tag="v999.999.999-";; esac tag="$tag$(cd "$GOPATH/src/k8s.io/kubernetes" && git rev-list --abbrev-commit HEAD).csiprow" (cd "$GOPATH/src/k8s.io/kubernetes" && run git tag -f "$tag") || die "git tag failed" From f46191d9a8924babaa9c74c7620c5f4caa5cae24 Mon Sep 17 00:00:00 2001 From: Michelle Au Date: Mon, 5 Aug 2019 09:45:55 -0700 Subject: [PATCH 048/242] Kubernetes master changed the way that releases are tagged, which needed changes to kind. There are 3 changes made to prow.sh: 1. Use a master commit of kind that includes the fix for Kubernetes master. 2. Use git clone instead of git checkout (shallow) to source Kubernetes. This lets kind correctly figure out the Kubernetes release tag. 3. Build kind with make install. The kind fix was not working correctly when built with go build. --- prow.sh | 52 +++++++++++++++++++++++++++++----------------------- 1 file changed, 29 insertions(+), 23 deletions(-) diff --git a/prow.sh b/prow.sh index dcfcec61..fd32f79e 100755 --- a/prow.sh +++ b/prow.sh @@ -101,7 +101,7 @@ configvar CSI_PROW_GO_VERSION_GINKGO "${CSI_PROW_GO_VERSION_BUILD}" "Go version # kind version to use. If the pre-installed version is different, # the desired version is downloaded from https://github.com/kubernetes-sigs/kind/releases/download/ # (if available), otherwise it is built from source. -configvar CSI_PROW_KIND_VERSION v0.4.0 "kind" +configvar CSI_PROW_KIND_VERSION 2555d8e09d5a77ee718414cec9f6083dfa028dc5 "kind" # ginkgo test runner version to use. If the pre-installed version is # different, the desired version is built from source. @@ -322,7 +322,7 @@ configvar CSI_PROW_E2E_ALPHA_GATES "$(get_versioned_variable CSI_PROW_E2E_ALPHA_ # whether they can run with the current cluster provider, but until # they are, we filter them out by name. Like the other test selection # variables, this is again a space separated list of regular expressions. -configvar CSI_PROW_E2E_SKIP 'while.kubelet.is.down.*Disruptive' "tests that need to be skipped" +configvar CSI_PROW_E2E_SKIP 'Disruptive' "tests that need to be skipped" # This is the directory for additional result files. Usually set by Prow, but # if not (for example, when invoking manually) it defaults to the work directory. @@ -379,8 +379,8 @@ install_kind () { if run curl --fail --location -o "${CSI_PROW_WORK}/bin/kind" "https://github.com/kubernetes-sigs/kind/releases/download/${CSI_PROW_KIND_VERSION}/kind-linux-amd64"; then chmod u+x "${CSI_PROW_WORK}/bin/kind" else - git_checkout https://github.com/kubernetes-sigs/kind "$GOPATH/src/sigs.k8s.io/kind" "${CSI_PROW_KIND_VERSION}" --depth=1 && - run_with_go "${CSI_PROW_GO_VERSION_KIND}" go build -o "${CSI_PROW_WORK}/bin/kind" sigs.k8s.io/kind + git_checkout https://github.com/kubernetes-sigs/kind "${GOPATH}/src/sigs.k8s.io/kind" "${CSI_PROW_KIND_VERSION}" --depth=1 && + (cd "${GOPATH}/src/sigs.k8s.io/kind" && make install INSTALL_DIR="${CSI_PROW_WORK}/bin") fi } @@ -427,6 +427,27 @@ git_checkout () { (cd "$path" && run git clean -fdx) || die "failed to clean $path" } +# This clones a repo ("https://github.com/kubernetes/kubernetes") +# in a certain location ("$GOPATH/src/k8s.io/kubernetes") at +# a the head of a specific branch (i.e., release-1.13, master). +# The directory cannot exist. +git_clone_branch () { + local repo path branch parent + repo="$1" + shift + path="$1" + shift + branch="$1" + shift + + parent="$(dirname "$path")" + mkdir -p "$parent" + (cd "$parent" && run git clone --single-branch --branch "$branch" "$repo" "$path") || die "cloning $repo" failed + # This is useful for local testing or when switching between different revisions in the same + # repo. + (cd "$path" && run git clean -fdx) || die "failed to clean $path" +} + list_gates () ( set -f; IFS=',' # Ignore: Double quote to prevent globbing and word splitting. @@ -472,25 +493,10 @@ start_cluster () { if [ "$version" = "latest" ]; then version=master fi - git_checkout https://github.com/kubernetes/kubernetes "$GOPATH/src/k8s.io/kubernetes" "$version" --depth=1 || die "checking out Kubernetes $version failed" - - # "kind build" and/or the Kubernetes build rules need at least one tag, which we don't have - # when doing a shallow fetch. Therefore we fake one: - # release-1.12 -> v1.12.0-release..csiprow - # latest or -> v1.14.0-.csiprow - case "${CSI_PROW_KUBERNETES_VERSION}" in - release-*) - # Ignore: See if you can use ${variable//search/replace} instead. - # shellcheck disable=SC2001 - tag="$(echo "${CSI_PROW_KUBERNETES_VERSION}" | sed -e 's/release-\(.*\)/v\1.0-release./')";; - *) - # We have to make something up. v1.0.0 did not work for some reasons. - tag="v999.999.999-";; - esac - tag="$tag$(cd "$GOPATH/src/k8s.io/kubernetes" && git rev-list --abbrev-commit HEAD).csiprow" - (cd "$GOPATH/src/k8s.io/kubernetes" && run git tag -f "$tag") || die "git tag failed" - go_version="$(go_version_for_kubernetes "$GOPATH/src/k8s.io/kubernetes" "$version")" || die "cannot proceed without knowing Go version for Kubernetes" - run_with_go "$go_version" kind build node-image --type bazel --image csiprow/node:latest --kube-root "$GOPATH/src/k8s.io/kubernetes" || die "'kind build node-image' failed" + git_clone_branch https://github.com/kubernetes/kubernetes "${CSI_PROW_WORK}/src/kubernetes" "$version" || die "checking out Kubernetes $version failed" + + go_version="$(go_version_for_kubernetes "${CSI_PROW_WORK}/src/kubernetes" "$version")" || die "cannot proceed without knowing Go version for Kubernetes" + run_with_go "$go_version" kind build node-image --type bazel --image csiprow/node:latest --kube-root "${CSI_PROW_WORK}/src/kubernetes" || die "'kind build node-image' failed" csi_prow_kind_have_kubernetes=true fi image="csiprow/node:latest" From dc0a5d8380459b2ddb8ac11307dd91749fd43b99 Mon Sep 17 00:00:00 2001 From: Michelle Au Date: Wed, 21 Aug 2019 15:19:39 -0700 Subject: [PATCH 049/242] Update kind to v0.5.0 --- prow.sh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/prow.sh b/prow.sh index fd32f79e..c334a5dd 100755 --- a/prow.sh +++ b/prow.sh @@ -101,7 +101,7 @@ configvar CSI_PROW_GO_VERSION_GINKGO "${CSI_PROW_GO_VERSION_BUILD}" "Go version # kind version to use. If the pre-installed version is different, # the desired version is downloaded from https://github.com/kubernetes-sigs/kind/releases/download/ # (if available), otherwise it is built from source. -configvar CSI_PROW_KIND_VERSION 2555d8e09d5a77ee718414cec9f6083dfa028dc5 "kind" +configvar CSI_PROW_KIND_VERSION "v0.5.0" "kind" # ginkgo test runner version to use. If the pre-installed version is # different, the desired version is built from source. @@ -126,19 +126,19 @@ configvar CSI_PROW_BUILD_JOB true "building code in repo enabled" # use the same settings as for "latest" Kubernetes. This works # as long as there are no breaking changes in Kubernetes, like # deprecating or changing the implementation of an alpha feature. -configvar CSI_PROW_KUBERNETES_VERSION 1.13.3 "Kubernetes" +configvar CSI_PROW_KUBERNETES_VERSION 1.15.3 "Kubernetes" # This is a hack to workaround the issue that each version # of kind currently only supports specific patch versions of # Kubernetes. We need to override CSI_PROW_KUBERNETES_VERSION # passed in by our CI/pull jobs to the versions that -# kind v0.4.0 supports. +# kind v0.5.0 supports. # # If the version is prefixed with "release-", then nothing # is overridden. -override_k8s_version "1.13.7" -override_k8s_version "1.14.3" -override_k8s_version "1.15.0" +override_k8s_version "1.13.10" +override_k8s_version "1.14.6" +override_k8s_version "1.15.3" # CSI_PROW_KUBERNETES_VERSION reduced to first two version numbers and # with underscore (1_13 instead of 1.13.3) and in uppercase (LATEST From 9fba09b41405b93a9bad8cd0d39544e21cdc99e3 Mon Sep 17 00:00:00 2001 From: Deep Debroy Date: Wed, 28 Aug 2019 06:24:26 -0700 Subject: [PATCH 050/242] Add rule for building Windows binaries Signed-off-by: Deep Debroy --- build.make | 1 + 1 file changed, 1 insertion(+) diff --git a/build.make b/build.make index 142c8578..f8b737f9 100644 --- a/build.make +++ b/build.make @@ -63,6 +63,7 @@ endif build-%: mkdir -p bin CGO_ENABLED=0 GOOS=linux go build -a -ldflags '-X main.version=$(REV) -extldflags "-static"' -o ./bin/$* ./cmd/$* + CGO_ENABLED=0 GOOS=windows go build -a -ldflags '-X main.version=$(REV) -extldflags "-static"' -o ./bin/$* ./cmd/$* container-%: build-% docker build -t $*:latest -f $(shell if [ -e ./cmd/$*/Dockerfile ]; then echo ./cmd/$*/Dockerfile; else echo Dockerfile; fi) --label revision=$(REV) . From 35ceaedcbddf39c13651ae07ca8fd73083d4f3e4 Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Thu, 29 Aug 2019 15:00:21 +0200 Subject: [PATCH 051/242] prow.sh: install dep if needed "make test-vendor" depends on dep if the current project uses dep. Without it, the vendor directory checking was skipped under Prow. --- prow.sh | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/prow.sh b/prow.sh index c334a5dd..33d93e49 100755 --- a/prow.sh +++ b/prow.sh @@ -223,6 +223,10 @@ configvar CSI_PROW_SANITY_SERVICE "hostpath-service" "Kubernetes TCP service nam configvar CSI_PROW_SANITY_POD "csi-hostpathplugin-0" "Kubernetes pod with CSI driver" configvar CSI_PROW_SANITY_CONTAINER "hostpath" "Kubernetes container with CSI driver" +# The version of dep to use for 'make test-vendor'. Ignored if the project doesn't +# use dep. Only binary releases of dep are supported (https://github.com/golang/dep/releases). +configvar CSI_PROW_DEP_VERSION v0.5.1 "golang dep version to be used for vendor checking" + # Each job can run one or more of the following tests, identified by # a single word: # - unit testing @@ -396,6 +400,15 @@ install_ginkgo () { mv "$GOPATH/bin/ginkgo" "${CSI_PROW_BIN}" } +# Ensure that we have the desired version of dep. +install_dep () { + if dep version 2>/dev/null | grep -q "version:.*${CSI_PROW_DEP_VERSION}$"; then + return + fi + run curl --fail --location -o "${CSI_PROW_WORK}/bin/dep" "https://github.com/golang/dep/releases/download/v0.5.4/dep-linux-amd64" && + chmod u+x "${CSI_PROW_WORK}/bin/dep" +} + # This checks out a repo ("https://github.com/kubernetes/kubernetes") # in a certain location ("$GOPATH/src/k8s.io/kubernetes") at # a certain revision (a hex commit hash, v1.13.1, master). It's okay @@ -936,6 +949,10 @@ main () { # changes in "release-tools" in a PR (that fails the "is release-tools unmodified" # test). if tests_enabled "unit"; then + if [ -f Gopkg.toml ] && ! install_dep; then + warn "installing 'dep' failed, cannot test vendoring" + ret=1 + fi if ! run_with_go "${CSI_PROW_GO_VERSION_BUILD}" make -k test 2>&1 | make_test_to_junit; then warn "'make test' failed, proceeding anyway" ret=1 From a8ea8bcc5c6b440cb85cb5341f751b63e063fe62 Mon Sep 17 00:00:00 2001 From: Mucahit Kurt Date: Sat, 7 Sep 2019 02:31:15 +0300 Subject: [PATCH 052/242] create 2-node kind cluster since topology support is added to hostpath driver Signed-off-by: Mucahit Kurt --- prow.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/prow.sh b/prow.sh index 33d93e49..5e7277a3 100755 --- a/prow.sh +++ b/prow.sh @@ -521,6 +521,7 @@ kind: Cluster apiVersion: kind.sigs.k8s.io/v1alpha3 nodes: - role: control-plane +- role: worker EOF # kubeadm has API dependencies between apiVersion and Kubernetes version From ea2f1b5277eef96e0855d4d817ceae832079f59b Mon Sep 17 00:00:00 2001 From: Michelle Au Date: Fri, 6 Sep 2019 19:15:35 -0700 Subject: [PATCH 053/242] build windows binaries with .exe suffix --- build.make | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.make b/build.make index f8b737f9..36e19be4 100644 --- a/build.make +++ b/build.make @@ -63,7 +63,7 @@ endif build-%: mkdir -p bin CGO_ENABLED=0 GOOS=linux go build -a -ldflags '-X main.version=$(REV) -extldflags "-static"' -o ./bin/$* ./cmd/$* - CGO_ENABLED=0 GOOS=windows go build -a -ldflags '-X main.version=$(REV) -extldflags "-static"' -o ./bin/$* ./cmd/$* + CGO_ENABLED=0 GOOS=windows go build -a -ldflags '-X main.version=$(REV) -extldflags "-static"' -o ./bin/$*.exe ./cmd/$* container-%: build-% docker build -t $*:latest -f $(shell if [ -e ./cmd/$*/Dockerfile ]; then echo ./cmd/$*/Dockerfile; else echo Dockerfile; fi) --label revision=$(REV) . From 6208f6ab47bc2d2973db3c276fd270fe13ac60b5 Mon Sep 17 00:00:00 2001 From: Hemant Kumar Date: Mon, 16 Sep 2019 17:59:04 -0400 Subject: [PATCH 054/242] Enable hostpath expansion --- prow.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/prow.sh b/prow.sh index 5e7277a3..d93b6fa7 100755 --- a/prow.sh +++ b/prow.sh @@ -183,7 +183,7 @@ configvar CSI_PROW_WORK "$(mkdir -p "$GOPATH/pkg" && mktemp -d "$GOPATH/pkg/csip # # When no deploy script is found (nothing in `deploy` directory, # CSI_PROW_HOSTPATH_REPO=none), nothing gets deployed. -configvar CSI_PROW_HOSTPATH_VERSION "v1.2.0-rc2" "hostpath driver" +configvar CSI_PROW_HOSTPATH_VERSION "v1.2.0-rc8" "hostpath driver" configvar CSI_PROW_HOSTPATH_REPO https://github.com/kubernetes-csi/csi-driver-host-path "hostpath repo" configvar CSI_PROW_DEPLOYMENT "" "deployment" configvar CSI_PROW_HOSTPATH_DRIVER_NAME "hostpath.csi.k8s.io" "the hostpath driver name" @@ -759,6 +759,8 @@ DriverInfo: persistence: true dataSource: true multipods: true + nodeExpansion: true + controllerExpansion: true EOF } From 194289aa8eece02c19f537b26a361932cc0ff73d Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Fri, 4 Oct 2019 14:08:31 +0200 Subject: [PATCH 055/242] update Go mod support It turned out that changes like https://github.com/kubernetes-csi/csi-lib-utils/pull/33 should better have been committed after `go mod tidy` because that adds some indirect dependencies in that example. The revised `test-vendor` checks for that and (just in case that this ever becomes desired) allows projects to not have a vendor directory when using `go mod`. How to use `go mod` properly gets documented in the README.md, because there are such pitfalls. --- README.md | 34 +++++++++++++++++++++++++++++++++ build.make | 55 ++++++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 79 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index bc061aee..d5fdb3a0 100644 --- a/README.md +++ b/README.md @@ -106,3 +106,37 @@ Kubernetes releases: CSI_PROW_KUBERNETES_VERSION=1.13.3 ./.prow.sh CSI_PROW_KUBERNETES_VERSION=latest ./.prow.sh + +Dependencies and vendoring +-------------------------- + +Most projects will (eventually) use `go mod` to manage +dependencies. `dep` is also still supported by `csi-release-tools`, +but not documented here because it's not recommended anymore. + +The usual instructions for using [go +modules](https://github.com/golang/go/wiki/Modules) apply. Here's a cheat sheet +for some of the relevant commands: +- list available updates: `GO111MODULE=on go list -u -m all` +- update or add a single dependency: `GO111MODULE=on go get ` +- update all dependencies to their next minor or patch release: + `GO111MODULE=on go get ./...` (add `-u=patch` to limit to patch + releases) +- lock onto a specific version: `GO111MODULE=on go get @` +- clean up `go.mod`: `GO111MODULE=on go mod tidy` +- update vendor directory: `GO111MODULE=on go mod vendor` + +`GO111MODULE=on` can be left out when using Go >= 1.13 or when the +source is checked out outside of `$GOPATH`. + +`go mod tidy` must be used to ensure that the listed dependencies are +really still needed. Changing import statements or a tentative `go +get` can result in stale dependencies. + +The `test-vendor` verifies that it was used when run locally or in a +pre-merge CI job. If a `vendor` directory is present, it will also +verify that it's content is up-to-date. + +The `vendor` directory is optional. It is still present in projects +because it avoids downloading sources during CI builds. If this is no +longer deemed necessary, then a project can also remove the directory. diff --git a/build.make b/build.make index 142c8578..c8384c16 100644 --- a/build.make +++ b/build.make @@ -125,6 +125,26 @@ test-fmt: # - the fabricated merge commit leaves go.mod, go.sum and vendor dir unchanged # - release-tools also didn't change (changing rules or Go version might lead to # a different result and thus must be tested) +# - import statements not changed (because if they change, go.mod might have to be updated) +# +# "git diff" is intelligent enough to annotate changes inside the "import" block in +# the start of the diff hunk: +# +# diff --git a/rpc/common.go b/rpc/common.go +# index bb4a5c4..5fa4271 100644 +# --- a/rpc/common.go +# +++ b/rpc/common.go +# @@ -21,7 +21,6 @@ import ( +# "fmt" +# "time" +# +# - "google.golang.org/grpc" +# "google.golang.org/grpc/codes" +# "google.golang.org/grpc/status" +# +# We rely on that to find such changes. +# +# Vendoring is optional when using go.mod. .PHONY: test-vendor test: test-vendor test-vendor: @@ -135,22 +155,37 @@ test-vendor: *v0.[56789]*) dep check && echo "vendor up-to-date" || false;; \ *) echo "skipping check, dep >= 0.5 required";; \ esac; \ - else \ - echo "Repo uses 'go mod' for vendoring."; \ + elif [ -f go.mod ]; then \ + echo "Repo uses 'go mod'."; \ if [ "$${JOB_NAME}" ] && \ ( [ "$${JOB_TYPE}" != "presubmit" ] || \ - [ $$(git diff "${PULL_BASE_SHA}..HEAD" -- go.mod go.sum vendor release-tools | wc -l) -eq 0 ] ); then \ - echo "Skipping vendor check because the Prow pre-submit job does not change vendoring."; \ - elif ! GO111MODULE=on go mod vendor; then \ + [ $$( (git diff "${PULL_BASE_SHA}..HEAD" -- go.mod go.sum vendor release-tools; \ + git diff "${PULL_BASE_SHA}..HEAD" | grep -e '^@@.*@@ import (' -e '^[+-]import') | \ + wc -l) -eq 0 ] ); then \ + echo "Skipping vendor check because the Prow pre-submit job does not affect dependencies."; \ + elif ! GO111MODULE=on go mod tidy; then \ echo "ERROR: vendor check failed."; \ false; \ - elif [ $$(git status --porcelain -- vendor | wc -l) -gt 0 ]; then \ - echo "ERROR: vendor directory *not* up-to-date, it did get modified by 'GO111MODULE=on go mod vendor':"; \ - git status -- vendor; \ - git diff -- vendor; \ + elif [ $$(git status --porcelain -- go.mod go.sum | wc -l) -gt 0 ]; then \ + echo "ERROR: go module files *not* up-to-date, they did get modified by 'GO111MODULE=on go mod tidy':"; \ + git diff -- go.mod go.sum; \ false; \ + elif [ -d vendor ]; then \ + if ! GO111MODULE=on go mod vendor; then \ + echo "ERROR: vendor check failed."; \ + false; \ + elif [ $$(git status --porcelain -- vendor | wc -l) -gt 0 ]; then \ + echo "ERROR: vendor directory *not* up-to-date, it did get modified by 'GO111MODULE=on go mod vendor':"; \ + git status -- vendor; \ + git diff -- vendor; \ + false; \ + else \ + echo "Go dependencies and vendor directory up-to-date."; \ + fi; \ + else \ + echo "Go dependencies up-to-date."; \ fi; \ - fi; + fi .PHONY: test-subtree test: test-subtree From c1078a6585735bfcad4d273dee57860544d6fd2a Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Mon, 7 Oct 2019 12:21:09 +0200 Subject: [PATCH 056/242] go-get-kubernetes.sh: automate Kubernetes dependency handling This script handles the necessary "replace" statements and determines which packages need to be updated in lockstep. --- README.md | 20 +++++++++ go-get-kubernetes.sh | 104 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 124 insertions(+) create mode 100755 go-get-kubernetes.sh diff --git a/README.md b/README.md index d5fdb3a0..cc40f161 100644 --- a/README.md +++ b/README.md @@ -140,3 +140,23 @@ verify that it's content is up-to-date. The `vendor` directory is optional. It is still present in projects because it avoids downloading sources during CI builds. If this is no longer deemed necessary, then a project can also remove the directory. + +When using packages that are part of the Kubernetes source code, the +commands above are not enough because the [lack of semantic +versioning](https://github.com/kubernetes/kubernetes/issues/72638) +prevents `go mod` from finding newer releases. Importing directly from +`kubernetes/kubernetes` also needs `replace` statements to override +the fake `v0.0.0` versions +(https://github.com/kubernetes/kubernetes/issues/79384). The +`go-get-kubernetes.sh` script can be used to update all packages in +lockstep to a different Kubernetes version. It takes a single version +number like "1.16.0". + +Conversion of a repository that uses `dep` to `go mod` can be done with: + + GO111MODULE=on go mod init + release-tools/go-get-kubernetes.sh + GO111MODULE=on go mod tidy + GO111MODULE=on go mod vendor + git rm -f Gopkg.toml Gopkg.lock + git add go.mod go.sum vendor diff --git a/go-get-kubernetes.sh b/go-get-kubernetes.sh new file mode 100755 index 00000000..8c4e3024 --- /dev/null +++ b/go-get-kubernetes.sh @@ -0,0 +1,104 @@ +#!/usr/bin/env bash + +# Copyright 2019 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. +# +# This script can be used while converting a repo from "dep" to "go mod" +# by calling it after "go mod init" or to update the Kubernetes packages +# in a repo that has already been converted. Only packages that are +# part of kubernetes/kubernetes and thus part of a Kubernetes release +# are modified. Other k8.io packages (like k8s.io/klog, k8s.io/utils) +# need to be updated separately. + +set -o pipefail + +cmd=$0 + +function help () { + echo "$cmd - update all components from kubernetes/kubernetes to that version" +} + +if [ $# -ne 1 ]; then + help + exit 1 +fi +case "$1" in -h|--help|help) help; exit 0;; esac + +die () { + echo >&2 "$@" + exit 1 +} + +k8s="$1" + +# If the repo imports k8s.io/kubernetes (directly or indirectly), then +# "go mod" will try to find "v0.0.0" versions because +# k8s.io/kubernetes has those in it's go.mod file +# (https://github.com/kubernetes/kubernetes/blob/2bd9643cee5b3b3a5ecbd3af49d09018f0773c77/go.mod#L146-L157). +# (https://github.com/kubernetes/kubernetes/issues/79384). +# +# We need to replicate the replace statements to override those fake +# versions also in our go.mod file (idea and some code from +# https://github.com/kubernetes/kubernetes/issues/79384#issuecomment-521493597). +mods=$( (set -x; curl --silent --show-error --fail "https://raw.githubusercontent.com/kubernetes/kubernetes/v${k8s}/go.mod") | + sed -n 's|.*k8s.io/\(.*\) => ./staging/src/k8s.io/.*|k8s.io/\1|p' + ) || die "failed to determine Kubernetes staging modules" +for mod in $mods; do + # The presence of a potentially incomplete go.mod file affects this command, + # so move elsewhere. + modinfo=$(set -x; cd /; env GO111MODULE=on go mod download -json "$mod@kubernetes-${k8s}") || + die "failed to determine version of $mod: $modinfo" + v=$(echo "$modinfo" | sed -n 's|.*"Version": "\(.*\)".*|\1|p') + (set -x; env GO111MODULE=on go mod edit "-replace=$mod=$mod@$v") || die "'go mod edit' failed" +done + +packages= + +# Beware that we have to work with packages, not modules (i.e. no -m +# flag), because some modules trigger a "no Go code except tests" +# error. Getting their packages works. +if ! packages=$( (set -x; env GO111MODULE=on go list all) | grep ^k8s.io/ | sed -e 's; *;;'); then + cat >&2 <&2 <" go.mod; then + deps="$deps $(echo "$package" | sed -e "s;\$;@kubernetes-$k8s;" -e 's;^k8s.io/kubernetes\(/.*\)@kubernetes-;k8s.io/kubernetes\1@v;')" + fi +done + +# shellcheck disable=SC2086 +(set -x; env GO111MODULE=on go get $deps 2>&1) || die "go get failed" +echo "SUCCESS" From 2d6b3ce85f79a020c4929f8951840dcd1785434b Mon Sep 17 00:00:00 2001 From: Deep Debroy Date: Mon, 7 Oct 2019 16:38:04 -0700 Subject: [PATCH 057/242] Build Windows only for amd64 Signed-off-by: Deep Debroy --- build.make | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/build.make b/build.make index 36e19be4..8d715e49 100644 --- a/build.make +++ b/build.make @@ -57,13 +57,17 @@ else TESTARGS = endif +ARCH := $(if $(GOARCH),$(GOARCH),$(shell go env GOARCH)) + # Specific packages can be excluded from each of the tests below by setting the *_FILTER_CMD variables # to something like "| grep -v 'github.com/kubernetes-csi/project/pkg/foobar'". See usage below. build-%: mkdir -p bin CGO_ENABLED=0 GOOS=linux go build -a -ldflags '-X main.version=$(REV) -extldflags "-static"' -o ./bin/$* ./cmd/$* - CGO_ENABLED=0 GOOS=windows go build -a -ldflags '-X main.version=$(REV) -extldflags "-static"' -o ./bin/$*.exe ./cmd/$* + if [ "$$ARCH" = "amd64" ]; then \ + CGO_ENABLED=0 GOOS=windows go build -a -ldflags '-X main.version=$(REV) -extldflags "-static"' -o ./bin/$*.exe ./cmd/$* ; \ + fi container-%: build-% docker build -t $*:latest -f $(shell if [ -e ./cmd/$*/Dockerfile ]; then echo ./cmd/$*/Dockerfile; else echo Dockerfile; fi) --label revision=$(REV) . From f1697d2cac2e184d60b96d45720ed7a37a4ef9ed Mon Sep 17 00:00:00 2001 From: Michelle Au Date: Tue, 8 Oct 2019 14:44:56 -0700 Subject: [PATCH 058/242] Do full git clones in travis. Shallow clones are causing test-subtree errors when the depth is exactly 50. --- travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/travis.yml b/travis.yml index 5b042522..a713bed3 100644 --- a/travis.yml +++ b/travis.yml @@ -2,6 +2,8 @@ language: go sudo: required services: - docker +git: + depth: false matrix: include: - go: 1.12.4 From e0fde8c4f5684f5c259c8c7a1d116def587cabf0 Mon Sep 17 00:00:00 2001 From: Michelle Au Date: Wed, 30 Oct 2019 18:08:41 -0700 Subject: [PATCH 059/242] Add new variables for 1.16 and remove 1.13 --- prow.sh | 38 ++++++++++---------------------------- 1 file changed, 10 insertions(+), 28 deletions(-) diff --git a/prow.sh b/prow.sh index d93b6fa7..e3308e77 100755 --- a/prow.sh +++ b/prow.sh @@ -101,7 +101,8 @@ configvar CSI_PROW_GO_VERSION_GINKGO "${CSI_PROW_GO_VERSION_BUILD}" "Go version # kind version to use. If the pre-installed version is different, # the desired version is downloaded from https://github.com/kubernetes-sigs/kind/releases/download/ # (if available), otherwise it is built from source. -configvar CSI_PROW_KIND_VERSION "v0.5.0" "kind" +# TODO: https://github.com/kubernetes-csi/csi-release-tools/issues/39 +configvar CSI_PROW_KIND_VERSION "86bc23d84ac12dcb56a0528890736e2c347c2dc3" "kind" # ginkgo test runner version to use. If the pre-installed version is # different, the desired version is built from source. @@ -136,7 +137,6 @@ configvar CSI_PROW_KUBERNETES_VERSION 1.15.3 "Kubernetes" # # If the version is prefixed with "release-", then nothing # is overridden. -override_k8s_version "1.13.10" override_k8s_version "1.14.6" override_k8s_version "1.15.3" @@ -183,7 +183,7 @@ configvar CSI_PROW_WORK "$(mkdir -p "$GOPATH/pkg" && mktemp -d "$GOPATH/pkg/csip # # When no deploy script is found (nothing in `deploy` directory, # CSI_PROW_HOSTPATH_REPO=none), nothing gets deployed. -configvar CSI_PROW_HOSTPATH_VERSION "v1.2.0-rc8" "hostpath driver" +configvar CSI_PROW_HOSTPATH_VERSION "v1.2.0" "hostpath driver" configvar CSI_PROW_HOSTPATH_REPO https://github.com/kubernetes-csi/csi-driver-host-path "hostpath repo" configvar CSI_PROW_DEPLOYMENT "" "deployment" configvar CSI_PROW_HOSTPATH_DRIVER_NAME "hostpath.csi.k8s.io" "the hostpath driver name" @@ -200,9 +200,10 @@ configvar CSI_PROW_HOSTPATH_CANARY "" "hostpath image" # all generated files are present. # # CSI_PROW_E2E_REPO=none disables E2E testing. -configvar CSI_PROW_E2E_VERSION_1_13 v1.14.0 "E2E version for Kubernetes 1.13.x" # we can't use the one from 1.13.x because it didn't have --storage.testdriver +# TOOO: remove versioned variables and make e2e version match k8s version configvar CSI_PROW_E2E_VERSION_1_14 v1.14.0 "E2E version for Kubernetes 1.14.x" configvar CSI_PROW_E2E_VERSION_1_15 v1.15.0 "E2E version for Kubernetes 1.15.x" +configvar CSI_PROW_E2E_VERSION_1_16 v1.16.0 "E2E version for Kubernetes 1.16.x" # TODO: add new CSI_PROW_E2E_VERSION entry for future Kubernetes releases configvar CSI_PROW_E2E_VERSION_LATEST master "E2E version for Kubernetes master" # testing against Kubernetes master is already tracking a moving target, so we might as well use a moving E2E version configvar CSI_PROW_E2E_REPO_LATEST https://github.com/kubernetes/kubernetes "E2E repo for Kubernetes >= 1.13.x" # currently the same for all versions @@ -292,11 +293,6 @@ regex_join () { # alpha in previous Kubernetes releases. This was considered too # error prone. Therefore we use E2E tests that match the Kubernetes # version that is getting tested. -# -# However, for 1.13.x testing we have to use the E2E tests from 1.14 -# because 1.13 didn't have --storage.testdriver yet, so for that (and only -# that version) we have to define alpha tests differently. -configvar CSI_PROW_E2E_ALPHA_1_13 '\[Feature: \[Testpattern:.Dynamic.PV..block.volmode.\] should.create.and.delete.block.persistent.volumes' "alpha tests for Kubernetes 1.13" # Raw block was an alpha feature in 1.13. configvar CSI_PROW_E2E_ALPHA_LATEST '\[Feature:' "alpha tests for Kubernetes >= 1.14" # there's no need to update this, adding a new case for CSI_PROW_E2E for a new Kubernetes is enough configvar CSI_PROW_E2E_ALPHA "$(get_versioned_variable CSI_PROW_E2E_ALPHA "${csi_prow_kubernetes_version_suffix}")" "alpha tests" @@ -312,12 +308,12 @@ configvar CSI_PROW_E2E_ALPHA "$(get_versioned_variable CSI_PROW_E2E_ALPHA "${csi # kubernetes-csi components must be updated, either by disabling # the failing test for "latest" or by updating the test and not running # it anymore for older releases. -configvar CSI_PROW_E2E_ALPHA_GATES_1_13 'VolumeSnapshotDataSource=true,BlockVolume=true,CSIBlockVolume=true' "alpha feature gates for Kubernetes 1.13" configvar CSI_PROW_E2E_ALPHA_GATES_1_14 'VolumeSnapshotDataSource=true,ExpandCSIVolumes=true' "alpha feature gates for Kubernetes 1.14" configvar CSI_PROW_E2E_ALPHA_GATES_1_15 'VolumeSnapshotDataSource=true,ExpandCSIVolumes=true' "alpha feature gates for Kubernetes 1.15" +configvar CSI_PROW_E2E_ALPHA_GATES_1_16 'VolumeSnapshotDataSource=true' "alpha feature gates for Kubernetes 1.16" # TODO: add new CSI_PROW_ALPHA_GATES_xxx entry for future Kubernetes releases and # add new gates to CSI_PROW_E2E_ALPHA_GATES_LATEST. -configvar CSI_PROW_E2E_ALPHA_GATES_LATEST 'VolumeSnapshotDataSource=true,ExpandCSIVolumes=true' "alpha feature gates for latest Kubernetes" +configvar CSI_PROW_E2E_ALPHA_GATES_LATEST 'VolumeSnapshotDataSource=true' "alpha feature gates for latest Kubernetes" configvar CSI_PROW_E2E_ALPHA_GATES "$(get_versioned_variable CSI_PROW_E2E_ALPHA_GATES "${csi_prow_kubernetes_version_suffix}")" "alpha E2E feature gates" # Some tests are known to be unusable in a KinD cluster. For example, @@ -723,22 +719,6 @@ install_sanity () ( run_with_go "${CSI_PROW_GO_VERSION_SANITY}" go test -c -o "${CSI_PROW_WORK}/csi-sanity" "${CSI_PROW_SANITY_IMPORT_PATH}/cmd/csi-sanity" || die "building csi-sanity failed" ) -# Whether the hostpath driver supports raw block devices depends on which version -# we are testing. It would be much nicer if we could determine that by querying the -# installed driver's capabilities instead of having to do a version check. -hostpath_supports_block () { - local result - result="$(docker exec csi-prow-control-plane docker image ls --format='{{.Repository}} {{.Tag}} {{.ID}}' | grep hostpath | while read -r repo tag id; do - if [ "$tag" == "v1.0.1" ]; then - # Old version because the revision label is missing: didn't have support yet. - echo "false" - return - fi - done)" - # If not set, then it must be a newer driver with support. - echo "${result:-true}" -} - # The default implementation of this function generates a external # driver test configuration for the hostpath driver. # @@ -755,12 +735,14 @@ SnapshotClass: DriverInfo: Name: ${CSI_PROW_HOSTPATH_DRIVER_NAME} Capabilities: - block: $(hostpath_supports_block) + block: true persistence: true dataSource: true multipods: true nodeExpansion: true controllerExpansion: true + snapshotDataSource: true + singleNodeVolume: true EOF } From 5e773d2db08fa624d3b9352dd577f885efb7a2b2 Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Thu, 31 Oct 2019 08:43:31 +0100 Subject: [PATCH 060/242] update CI to use Go 1.13.3 This is the latest release. Updating is useful to ensure that we have all of the latest fixes and enhancements. --- travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/travis.yml b/travis.yml index a713bed3..494c1144 100644 --- a/travis.yml +++ b/travis.yml @@ -6,7 +6,7 @@ git: depth: false matrix: include: - - go: 1.12.4 + - go: 1.13.3 before_script: - mkdir -p bin - wget https://github.com/golang/dep/releases/download/v0.5.1/dep-linux-amd64 -O bin/dep From c8a1c4af933311a7e63765cd2b64ca45a0fb7dba Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Thu, 31 Oct 2019 11:49:23 +0100 Subject: [PATCH 061/242] better handling of Go version Some operations are sensitive to the version of Go that is used. In the past, formatting of source differed depending on the version. Right now it is the content of the vendor directory which changes when switch back and forth between 1.12 and 1.13. We don't want to impose a certain workflow on developers, like forcing all invocations of Go to run inside a container. If developers want that, they can set up their development environment accordingly. But we should warn about this aspect to raise awareness. "make" invocations which involve Go now compare against the projects Go version (specified in travis.yml) once at the beginning. This is only a warning because we don't know which future version will be compatible with the project. Vendor directory handling gets updated, too: verification is now a separate script (became too complex for make) and there is a corresponding "update-vendor.sh". In contrast to verification, updating vendor is not integrated into make and thus itself invokes the go version check. --- build.make | 50 ++++++++---------------------------- update-vendor.sh | 23 +++++++++++++++++ verify-go-version.sh | 51 +++++++++++++++++++++++++++++++++++++ verify-vendor.sh | 60 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 145 insertions(+), 39 deletions(-) create mode 100755 update-vendor.sh create mode 100755 verify-go-version.sh create mode 100755 verify-vendor.sh diff --git a/build.make b/build.make index cbf6d455..6b89f5b2 100644 --- a/build.make +++ b/build.make @@ -62,7 +62,7 @@ ARCH := $(if $(GOARCH),$(GOARCH),$(shell go env GOARCH)) # Specific packages can be excluded from each of the tests below by setting the *_FILTER_CMD variables # to something like "| grep -v 'github.com/kubernetes-csi/project/pkg/foobar'". See usage below. -build-%: +build-%: check-go-version-go mkdir -p bin CGO_ENABLED=0 GOOS=linux go build -a -ldflags '-X main.version=$(REV) -extldflags "-static"' -o ./bin/$* ./cmd/$* if [ "$$ARCH" = "amd64" ]; then \ @@ -97,7 +97,7 @@ push: $(CMDS:%=push-%) clean: -rm -rf bin -test: +test: check-go-version-go .PHONY: test-go test: test-go @@ -154,43 +154,7 @@ test-fmt: test: test-vendor test-vendor: @ echo; echo "### $@:" - @ if [ -f Gopkg.toml ]; then \ - echo "Repo uses 'dep' for vendoring."; \ - case "$$(dep version 2>/dev/null | grep 'version *:')" in \ - *v0.[56789]*) dep check && echo "vendor up-to-date" || false;; \ - *) echo "skipping check, dep >= 0.5 required";; \ - esac; \ - elif [ -f go.mod ]; then \ - echo "Repo uses 'go mod'."; \ - if [ "$${JOB_NAME}" ] && \ - ( [ "$${JOB_TYPE}" != "presubmit" ] || \ - [ $$( (git diff "${PULL_BASE_SHA}..HEAD" -- go.mod go.sum vendor release-tools; \ - git diff "${PULL_BASE_SHA}..HEAD" | grep -e '^@@.*@@ import (' -e '^[+-]import') | \ - wc -l) -eq 0 ] ); then \ - echo "Skipping vendor check because the Prow pre-submit job does not affect dependencies."; \ - elif ! GO111MODULE=on go mod tidy; then \ - echo "ERROR: vendor check failed."; \ - false; \ - elif [ $$(git status --porcelain -- go.mod go.sum | wc -l) -gt 0 ]; then \ - echo "ERROR: go module files *not* up-to-date, they did get modified by 'GO111MODULE=on go mod tidy':"; \ - git diff -- go.mod go.sum; \ - false; \ - elif [ -d vendor ]; then \ - if ! GO111MODULE=on go mod vendor; then \ - echo "ERROR: vendor check failed."; \ - false; \ - elif [ $$(git status --porcelain -- vendor | wc -l) -gt 0 ]; then \ - echo "ERROR: vendor directory *not* up-to-date, it did get modified by 'GO111MODULE=on go mod vendor':"; \ - git status -- vendor; \ - git diff -- vendor; \ - false; \ - else \ - echo "Go dependencies and vendor directory up-to-date."; \ - fi; \ - else \ - echo "Go dependencies up-to-date."; \ - fi; \ - fi + @ ./release-tools/verify-vendor.sh .PHONY: test-subtree test: test-subtree @@ -216,3 +180,11 @@ test-shellcheck: ./release-tools/verify-shellcheck.sh "$$dir" || ret=1; \ done; \ exit $$ret + +# Targets in the makefile can depend on check-go-version- +# to trigger a warning if the x.y version of that binary does not match +# what the project uses. Make ensures that this is only checked once per +# invocation. +.PHONY: check-go-version-% +check-go-version-%: + ./release-tools/verify-go-version.sh "$*" diff --git a/update-vendor.sh b/update-vendor.sh new file mode 100755 index 00000000..6f4c27ae --- /dev/null +++ b/update-vendor.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash + +# Copyright 2019 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. + +if [ -f Gopkg.toml ]; then + echo "Repo uses 'dep' for vendoring." + (set -x; dep ensure) +elif [ -f go.mod ]; then + release-tools/verify-go-version.sh "go" + (set -x; env GO111MODULE=on go mod tidy && env GO111MODULE=on go mod vendor) +fi diff --git a/verify-go-version.sh b/verify-go-version.sh new file mode 100755 index 00000000..f242e769 --- /dev/null +++ b/verify-go-version.sh @@ -0,0 +1,51 @@ +#!/usr/bin/env bash + +# Copyright 2019 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. + +GO="$1" + +if [ ! "$GO" ]; then + echo >&2 "usage: $0 " + exit 1 +fi + +die () { + echo "ERROR: $*" + exit 1 +} + +version=$("$GO" version) || die "determining version of $GO failed" +# shellcheck disable=SC2001 +majorminor=$(echo "$version" | sed -e 's/.*go\([0-9]*\)\.\([0-9]*\).*/\1.\2/') +# shellcheck disable=SC2001 +expected=$(grep "^ *- go:" "release-tools/travis.yml" | sed -e 's/.*go: *\([0-9]*\)\.\([0-9]*\).*/\1.\2/') + +if [ "$majorminor" != "$expected" ]; then + cat >&2 </dev/null | grep 'version *:')" in + *v0.[56789]*) + if dep check; then + echo "vendor up-to-date" + else + exit 1 + fi + ;; + *) echo "skipping check, dep >= 0.5 required";; + esac +elif [ -f go.mod ]; then + echo "Repo uses 'go mod'." + # shellcheck disable=SC2235 + if [ "${JOB_NAME}" ] && + ( [ "${JOB_TYPE}" != "presubmit" ] || + [ "$( (git diff "${PULL_BASE_SHA}..HEAD" -- go.mod go.sum vendor release-tools; + git diff "${PULL_BASE_SHA}..HEAD" | grep -e '^@@.*@@ import (' -e '^[+-]import') | + wc -l)" -eq 0 ] ); then + echo "Skipping vendor check because the Prow pre-submit job does not affect dependencies." + elif ! (set -x; env GO111MODULE=on go mod tidy); then + echo "ERROR: vendor check failed." + exit 1 + elif [ "$(git status --porcelain -- go.mod go.sum | wc -l)" -gt 0 ]; then + echo "ERROR: go module files *not* up-to-date, they did get modified by 'GO111MODULE=on go mod tidy':"; + git diff -- go.mod go.sum + exit 1 + elif [ -d vendor ]; then + if ! (set -x; env GO111MODULE=on go mod vendor); then + echo "ERROR: vendor check failed." + exit 1 + elif [ "$(git status --porcelain -- vendor | wc -l)" -gt 0 ]; then + echo "ERROR: vendor directory *not* up-to-date, it did get modified by 'GO111MODULE=on go mod vendor':" + git status -- vendor + git diff -- vendor + exit 1 + else + echo "Go dependencies and vendor directory up-to-date." + fi + else + echo "Go dependencies up-to-date." + fi +fi From 23df4aef51ee82896bc8326a693c3fdbd0baa07f Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Mon, 4 Nov 2019 11:16:38 +0100 Subject: [PATCH 062/242] prow.sh: use vendor directory if available This avoids dependencies on the Go module cache or the upstream code hosting. --- build.make | 11 +++++++---- prow.sh | 12 +++++++++--- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/build.make b/build.make index 6b89f5b2..1b6f35fe 100644 --- a/build.make +++ b/build.make @@ -22,6 +22,9 @@ # including build.make. REGISTRY_NAME=quay.io/k8scsi +# Can be set to -mod=vendor to ensure that the "vendor" directory is used. +GOFLAGS_VENDOR= + # Revision that gets built into each binary via the main.version # string. Uses the `git describe` output based on the most recent # version tag with a short revision suffix or, if nothing has been @@ -64,9 +67,9 @@ ARCH := $(if $(GOARCH),$(GOARCH),$(shell go env GOARCH)) build-%: check-go-version-go mkdir -p bin - CGO_ENABLED=0 GOOS=linux go build -a -ldflags '-X main.version=$(REV) -extldflags "-static"' -o ./bin/$* ./cmd/$* + CGO_ENABLED=0 GOOS=linux go build $(GOFLAGS_VENDOR) -a -ldflags '-X main.version=$(REV) -extldflags "-static"' -o ./bin/$* ./cmd/$* if [ "$$ARCH" = "amd64" ]; then \ - CGO_ENABLED=0 GOOS=windows go build -a -ldflags '-X main.version=$(REV) -extldflags "-static"' -o ./bin/$*.exe ./cmd/$* ; \ + CGO_ENABLED=0 GOOS=windows go build $(GOFLAGS_VENDOR) -a -ldflags '-X main.version=$(REV) -extldflags "-static"' -o ./bin/$*.exe ./cmd/$* ; \ fi container-%: build-% @@ -103,13 +106,13 @@ test: check-go-version-go test: test-go test-go: @ echo; echo "### $@:" - go test `go list ./... | grep -v -e 'vendor' -e '/test/e2e$$' $(TEST_GO_FILTER_CMD)` $(TESTARGS) + go test $(GOFLAGS_VENDOR) `go list $(GOFLAGS_VENDOR) ./... | grep -v -e 'vendor' -e '/test/e2e$$' $(TEST_GO_FILTER_CMD)` $(TESTARGS) .PHONY: test-vet test: test-vet test-vet: @ echo; echo "### $@:" - go vet `go list ./... | grep -v vendor $(TEST_VET_FILTER_CMD)` + go test $(GOFLAGS_VENDOR) `go list $(GOFLAGS_VENDOR) ./... | grep -v vendor $(TEST_VET_FILTER_CMD)` .PHONY: test-fmt test: test-fmt diff --git a/prow.sh b/prow.sh index e3308e77..fe68bb7d 100755 --- a/prow.sh +++ b/prow.sh @@ -85,6 +85,12 @@ get_versioned_variable () { echo "$value" } +# If we have a vendor directory, then use it. We must be careful to only +# use this for "make" invocations inside the project's repo itself because +# setting it globally can break other go usages (like "go get " +# which is disabled with GOFLAGS=-mod=vendor). +configvar GOFLAGS_VENDOR "$( [ -d vendor ] && echo '-mod=vendor' )" "Go flags for using the vendor directory" + # Go versions can be specified seperately for different tasks # If the pre-installed Go is missing or a different # version, the required version here will get installed @@ -928,7 +934,7 @@ main () { images= if ${CSI_PROW_BUILD_JOB}; then # A successful build is required for testing. - run_with_go "${CSI_PROW_GO_VERSION_BUILD}" make all || die "'make all' failed" + run_with_go "${CSI_PROW_GO_VERSION_BUILD}" make all "GOFLAGS_VENDOR=${GOFLAGS_VENDOR}" || die "'make all' failed" # We don't want test failures to prevent E2E testing below, because the failure # might have been minor or unavoidable, for example when experimenting with # changes in "release-tools" in a PR (that fails the "is release-tools unmodified" @@ -938,13 +944,13 @@ main () { warn "installing 'dep' failed, cannot test vendoring" ret=1 fi - if ! run_with_go "${CSI_PROW_GO_VERSION_BUILD}" make -k test 2>&1 | make_test_to_junit; then + if ! run_with_go "${CSI_PROW_GO_VERSION_BUILD}" make -k test "GOFLAGS_VENDOR=${GOFLAGS_VENDOR}" 2>&1 | make_test_to_junit; then warn "'make test' failed, proceeding anyway" ret=1 fi fi # Required for E2E testing. - run_with_go "${CSI_PROW_GO_VERSION_BUILD}" make container || die "'make container' failed" + run_with_go "${CSI_PROW_GO_VERSION_BUILD}" make container "GOFLAGS_VENDOR=${GOFLAGS_VENDOR}" || die "'make container' failed" fi if tests_need_kind; then From 806784565969caa302d40f98f6fb6dd3dafb39ba Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Mon, 4 Nov 2019 15:40:31 +0100 Subject: [PATCH 063/242] travis.yml: also use vendor directory --- travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/travis.yml b/travis.yml index 494c1144..bfd7647b 100644 --- a/travis.yml +++ b/travis.yml @@ -13,9 +13,9 @@ before_script: - chmod u+x bin/dep - export PATH=$PWD/bin:$PATH script: -- make -k all test +- make -k all test GOFLAGS_VENDOR=$( [ -d vendor ] && echo '-mod=vendor' ) after_success: - if [ "${TRAVIS_PULL_REQUEST}" == "false" ]; then docker login -u "${DOCKER_USERNAME}" -p "${DOCKER_PASSWORD}" quay.io; - make push; + make push GOFLAGS_VENDOR=$( [ -d vendor ] && echo '-mod=vendor' ); fi From f41c1351a38ad936cbdec298fff3f49b8e2e8613 Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Tue, 5 Nov 2019 16:40:29 +0100 Subject: [PATCH 064/242] prow.sh: also log output of system containers Depending on the error, those logs are needed to debug failures. --- prow.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/prow.sh b/prow.sh index e3308e77..0777ae37 100755 --- a/prow.sh +++ b/prow.sh @@ -677,16 +677,16 @@ EOF } -# Gets logs of all containers in the default namespace. When passed -f, kubectl will +# Gets logs of all containers in all namespaces. When passed -f, kubectl will # keep running and capture new output. Prints the pid of all background processes. # The caller must kill (when using -f) and/or wait for them. # # May be called multiple times and thus appends. start_loggers () { - kubectl get pods -o go-template --template='{{range .items}}{{.metadata.name}} {{range .spec.containers}}{{.name}} {{end}}{{"\n"}}{{end}}' | while read -r pod containers; do + kubectl get pods --all-namespaces -o go-template --template='{{range .items}}{{.metadata.namespace}} {{.metadata.name}} {{range .spec.containers}}{{.name}} {{end}}{{"\n"}}{{end}}' | while read -r namespace pod containers; do for container in $containers; do - mkdir -p "${ARTIFACTS}/$pod" - kubectl logs "$@" "$pod" "$container" >>"${ARTIFACTS}/$pod/$container.log" & + mkdir -p "${ARTIFACTS}/$namespace/$pod" + kubectl logs -n "$namespace" "$@" "$pod" "$container" >>"${ARTIFACTS}/$namespace/$pod/$container.log" & echo "$!" done done From 83a4ef15dfda6403862437f8acf3606f255e888a Mon Sep 17 00:00:00 2001 From: Peeyush Gupta Date: Tue, 19 Nov 2019 08:58:58 -0500 Subject: [PATCH 065/242] Adding build for ppc64le --- build.make | 1 + 1 file changed, 1 insertion(+) diff --git a/build.make b/build.make index 1b6f35fe..7075a37e 100644 --- a/build.make +++ b/build.make @@ -70,6 +70,7 @@ build-%: check-go-version-go CGO_ENABLED=0 GOOS=linux go build $(GOFLAGS_VENDOR) -a -ldflags '-X main.version=$(REV) -extldflags "-static"' -o ./bin/$* ./cmd/$* if [ "$$ARCH" = "amd64" ]; then \ CGO_ENABLED=0 GOOS=windows go build $(GOFLAGS_VENDOR) -a -ldflags '-X main.version=$(REV) -extldflags "-static"' -o ./bin/$*.exe ./cmd/$* ; \ + CGO_ENABLED=0 GOOS=linux GOARCH=ppc64le go build $(GOFLAGS_VENDOR) -a -ldflags '-X main.version=$(REV) -extldflags "-static"' -o ./bin/$*-ppc64le ./cmd/$* fi container-%: build-% From 1eaaaa1cb49713e8e4af87d009c24d310cf66260 Mon Sep 17 00:00:00 2001 From: Mucahit Kurt Date: Sat, 16 Nov 2019 06:23:08 +0300 Subject: [PATCH 066/242] Delete kind cluster after tests run. Inside a real Prow job it is better to clean up at runtime instead of leaving that to the Prow job cleanup code because the later sometimes times out. Signed-off-by: Mucahit Kurt --- prow.sh | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/prow.sh b/prow.sh index 3b9621a2..8b431c56 100755 --- a/prow.sh +++ b/prow.sh @@ -580,6 +580,19 @@ EOF export KUBECONFIG } +# Deletes kind cluster inside a prow job +delete_cluster_inside_prow_job() { + # Inside a real Prow job it is better to clean up at runtime + # instead of leaving that to the Prow job cleanup code + # because the later sometimes times out (https://github.com/kubernetes-csi/csi-release-tools/issues/24#issuecomment-554765872). + if [ "$JOB_NAME" ]; then + if kind get clusters | grep -q csi-prow; then + run kind delete cluster --name=csi-prow || die "kind delete failed" + fi + unset KUBECONFIG + fi +} + # Looks for the deployment as specified by CSI_PROW_DEPLOYMENT and CSI_PROW_KUBERNETES_VERSION # in the given directory. find_deployment () { @@ -1017,6 +1030,7 @@ main () { fi fi fi + delete_cluster_inside_prow_job fi if tests_need_alpha_cluster && [ "${CSI_PROW_E2E_ALPHA_GATES}" ]; then @@ -1047,6 +1061,7 @@ main () { fi fi fi + delete_cluster_inside_prow_job fi fi From 003c14b2d4ae3b1463db5e5b3ff91f39b03f5ba8 Mon Sep 17 00:00:00 2001 From: Grant Griffiths Date: Mon, 11 Nov 2019 23:49:42 -0800 Subject: [PATCH 067/242] Add snapshotter CRDs after cluster setup Signed-off-by: Grant Griffiths --- prow.sh | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/prow.sh b/prow.sh index 3b9621a2..bc9c9f03 100755 --- a/prow.sh +++ b/prow.sh @@ -322,6 +322,9 @@ configvar CSI_PROW_E2E_ALPHA_GATES_1_16 'VolumeSnapshotDataSource=true' "alpha f configvar CSI_PROW_E2E_ALPHA_GATES_LATEST 'VolumeSnapshotDataSource=true' "alpha feature gates for latest Kubernetes" configvar CSI_PROW_E2E_ALPHA_GATES "$(get_versioned_variable CSI_PROW_E2E_ALPHA_GATES "${csi_prow_kubernetes_version_suffix}")" "alpha E2E feature gates" +# Which external-snapshotter tag to use for the snapshotter CRD and snapshot-controller deployment +configvar CSI_SNAPSHOTTER_VERSION 'v2.0.0-rc4' "external-snapshotter version tag" + # Some tests are known to be unusable in a KinD cluster. For example, # stopping kubelet with "ssh systemctl stop kubelet" simply # doesn't work. Such tests should be written in a way that they verify @@ -657,6 +660,59 @@ install_hostpath () { fi } +# Installs all nessesary snapshotter CRDs +install_snapshot_crds() { + # Wait until volumesnapshot CRDs are in place. + CRD_BASE_DIR="https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/${CSI_SNAPSHOTTER_VERSION}/config/crd" + kubectl apply -f "${CRD_BASE_DIR}/snapshot.storage.k8s.io_volumesnapshotclasses.yaml" --validate=false + kubectl apply -f "${CRD_BASE_DIR}/snapshot.storage.k8s.io_volumesnapshots.yaml" --validate=false + kubectl apply -f "${CRD_BASE_DIR}/snapshot.storage.k8s.io_volumesnapshotcontents.yaml" --validate=false + cnt=0 + until kubectl get volumesnapshotclasses.snapshot.storage.k8s.io \ + && kubectl get volumesnapshots.snapshot.storage.k8s.io \ + && kubectl get volumesnapshotcontents.snapshot.storage.k8s.io; do + if [ $cnt -gt 30 ]; then + echo >&2 "ERROR: snapshot CRDs not ready after over 1 min" + exit 1 + fi + echo "$(date +%H:%M:%S)" "waiting for snapshot CRDs, attempt #$cnt" + cnt=$((cnt + 1)) + sleep 2 + done +} + +# Install snapshot controller and associated RBAC, retrying until the pod is running. +install_snapshot_controller() { + kubectl apply -f "https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/${CSI_SNAPSHOTTER_VERSION}/deploy/kubernetes/snapshot-controller/rbac-snapshot-controller.yaml" + cnt=0 + until kubectl get clusterrolebinding snapshot-controller-role; do + if [ $cnt -gt 30 ]; then + echo "Cluster role bindings:" + kubectl describe clusterrolebinding + echo >&2 "ERROR: snapshot controller RBAC not ready after over 5 min" + exit 1 + fi + echo "$(date +%H:%M:%S)" "waiting for snapshot RBAC setup complete, attempt #$cnt" + cnt=$((cnt + 1)) + sleep 10 + done + + + kubectl apply -f "https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/${CSI_SNAPSHOTTER_VERSION}/deploy/kubernetes/snapshot-controller/setup-snapshot-controller.yaml" + cnt=0 + until kubectl get statefulset snapshot-controller | grep snapshot-controller | grep "1/1"; do + if [ $cnt -gt 30 ]; then + echo "Running statefulsets:" + kubectl describe statefulsets + echo >&2 "ERROR: snapshot controller not ready after over 5 min" + exit 1 + fi + echo "$(date +%H:%M:%S)" "waiting for snapshot controller deployment to complete, attempt #$cnt" + cnt=$((cnt + 1)) + sleep 10 + done +} + # collect logs and cluster status (like the version of all components, Kubernetes version, test version) collect_cluster_info () { cat < Date: Sat, 30 Nov 2019 00:29:00 +0530 Subject: [PATCH 068/242] Use kind v0.6.0 kind v0.6.0 appends the kubeconfig with the default config at ~/.kube/config. --- prow.sh | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/prow.sh b/prow.sh index d719e980..b8823062 100755 --- a/prow.sh +++ b/prow.sh @@ -107,8 +107,7 @@ configvar CSI_PROW_GO_VERSION_GINKGO "${CSI_PROW_GO_VERSION_BUILD}" "Go version # kind version to use. If the pre-installed version is different, # the desired version is downloaded from https://github.com/kubernetes-sigs/kind/releases/download/ # (if available), otherwise it is built from source. -# TODO: https://github.com/kubernetes-csi/csi-release-tools/issues/39 -configvar CSI_PROW_KIND_VERSION "86bc23d84ac12dcb56a0528890736e2c347c2dc3" "kind" +configvar CSI_PROW_KIND_VERSION "v0.6.0" "kind" # ginkgo test runner version to use. If the pre-installed version is # different, the desired version is built from source. @@ -579,8 +578,7 @@ EOF die "Cluster creation failed again, giving up. See the 'kind-cluster' artifact directory for additional logs." fi fi - KUBECONFIG="$(kind get kubeconfig-path --name=csi-prow)" - export KUBECONFIG + export KUBECONFIG="${HOME}/.kube/config" } # Deletes kind cluster inside a prow job From 9a7a685ee169d669a0182532315aeecd8a8715dc Mon Sep 17 00:00:00 2001 From: Michelle Au Date: Mon, 2 Dec 2019 17:45:57 -0800 Subject: [PATCH 069/242] Create a kind cluster with two worker nodes so that the topology feature can be tested. Test cases that test accessing volumes from multiple nodes need to be skipped --- prow.sh | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/prow.sh b/prow.sh index b8823062..815bc9d8 100755 --- a/prow.sh +++ b/prow.sh @@ -330,7 +330,11 @@ configvar CSI_SNAPSHOTTER_VERSION 'v2.0.0-rc4' "external-snapshotter version tag # whether they can run with the current cluster provider, but until # they are, we filter them out by name. Like the other test selection # variables, this is again a space separated list of regular expressions. -configvar CSI_PROW_E2E_SKIP 'Disruptive' "tests that need to be skipped" +# +# "different node" test skips can be removed once +# https://github.com/kubernetes/kubernetes/pull/82678 has been backported +# to all the K8s versions we test against +configvar CSI_PROW_E2E_SKIP 'Disruptive|different\s+node' "tests that need to be skipped" # This is the directory for additional result files. Usually set by Prow, but # if not (for example, when invoking manually) it defaults to the work directory. @@ -526,6 +530,7 @@ apiVersion: kind.sigs.k8s.io/v1alpha3 nodes: - role: control-plane - role: worker +- role: worker EOF # kubeadm has API dependencies between apiVersion and Kubernetes version @@ -840,10 +845,6 @@ run_e2e () ( install_e2e || die "building e2e.test failed" install_ginkgo || die "installing ginkgo failed" - # TODO (?): multi-node cluster (depends on https://github.com/kubernetes-csi/csi-driver-host-path/pull/14). - # When running on a multi-node cluster, we need to figure out where the - # hostpath driver was deployed and set ClientNodeName accordingly. - generate_test_driver >"${CSI_PROW_WORK}/test-driver.yaml" || die "generating test-driver.yaml failed" # Rename, merge and filter JUnit files. Necessary in case that we run the E2E suite again From 53888ae7d59b862bfded46b883570c98f5fc5fff Mon Sep 17 00:00:00 2001 From: Michelle Au Date: Tue, 3 Dec 2019 18:18:38 -0800 Subject: [PATCH 070/242] Improve README by adding an explicit Kubernetes dependency section --- README.md | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index cc40f161..08c82884 100644 --- a/README.md +++ b/README.md @@ -141,17 +141,6 @@ The `vendor` directory is optional. It is still present in projects because it avoids downloading sources during CI builds. If this is no longer deemed necessary, then a project can also remove the directory. -When using packages that are part of the Kubernetes source code, the -commands above are not enough because the [lack of semantic -versioning](https://github.com/kubernetes/kubernetes/issues/72638) -prevents `go mod` from finding newer releases. Importing directly from -`kubernetes/kubernetes` also needs `replace` statements to override -the fake `v0.0.0` versions -(https://github.com/kubernetes/kubernetes/issues/79384). The -`go-get-kubernetes.sh` script can be used to update all packages in -lockstep to a different Kubernetes version. It takes a single version -number like "1.16.0". - Conversion of a repository that uses `dep` to `go mod` can be done with: GO111MODULE=on go mod init @@ -160,3 +149,18 @@ Conversion of a repository that uses `dep` to `go mod` can be done with: GO111MODULE=on go mod vendor git rm -f Gopkg.toml Gopkg.lock git add go.mod go.sum vendor + +### Updating Kubernetes dependencies + +When using packages that are part of the Kubernetes source code, the +commands above are not enough because the [lack of semantic +versioning](https://github.com/kubernetes/kubernetes/issues/72638) +prevents `go mod` from finding newer releases. Importing directly from +`kubernetes/kubernetes` also needs `replace` statements to override +the fake `v0.0.0` versions +(https://github.com/kubernetes/kubernetes/issues/79384). The +`go-get-kubernetes.sh` script can be used to update all packages in +lockstep to a different Kubernetes version. Example usage: +``` +$ ./release-tools/go-get-kubernetes.sh 1.16.4 +``` From 4ad69492c97834b52d74d0b67b6f47b0590e4be1 Mon Sep 17 00:00:00 2001 From: Grant Griffiths Date: Tue, 3 Dec 2019 23:48:29 -0800 Subject: [PATCH 071/242] Improve snapshot pod running checks and improve version_gt Signed-off-by: Grant Griffiths --- prow.sh | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/prow.sh b/prow.sh index d719e980..27c70512 100755 --- a/prow.sh +++ b/prow.sh @@ -713,10 +713,11 @@ install_snapshot_controller() { kubectl apply -f "https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/${CSI_SNAPSHOTTER_VERSION}/deploy/kubernetes/snapshot-controller/setup-snapshot-controller.yaml" cnt=0 - until kubectl get statefulset snapshot-controller | grep snapshot-controller | grep "1/1"; do + expected_running_pods=$(curl https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/"${CSI_SNAPSHOTTER_VERSION}"/deploy/kubernetes/snapshot-controller/setup-snapshot-controller.yaml | grep replicas | cut -d ':' -f 2-) + while [ "$(kubectl get pods -l app=snapshot-controller | grep 'Running' -c)" -lt "$expected_running_pods" ]; do if [ $cnt -gt 30 ]; then - echo "Running statefulsets:" - kubectl describe statefulsets + echo "snapshot-controller pod status:" + kubectl describe pods -l app=snapshot-controller echo >&2 "ERROR: snapshot controller not ready after over 5 min" exit 1 fi @@ -996,8 +997,30 @@ make_test_to_junit () { fi } +# version_gt returns true if arg1 is greater than arg2. +# +# This function expects versions to be one of the following formats: +# X.Y.Z, release-X.Y.Z, vX.Y.Z +# +# where X,Y, and Z are any number. +# +# Partial versions (1.2, release-1.2) work as well. +# The follow substrings are stripped before version comparison: +# - "v" +# - "release-" +# +# Usage: +# version_gt release-1.3 v1.2.0 (returns true) +# version_gt v1.1.1 v1.2.0 (returns false) +# version_gt 1.1.1 v1.2.0 (returns false) +# version_gt 1.3.1 v1.2.0 (returns true) +# version_gt 1.1.1 release-1.2.0 (returns false) +# version_gt 1.2.0 1.2.2 (returns false) function version_gt() { - test "$(printf '%s\n' "$@" | sort -V | head -n 1)" != "$1"; + versions=$(for ver in "$@"; do ver=${ver#release-}; echo "${ver#v}"; done) + greaterVersion=${1#"release-"}; + greaterVersion=${greaterVersion#"v"}; + test "$(printf '%s' "$versions" | sort -V | head -n 1)" != "$greaterVersion" } main () { From a4e629966848d0097461f49f8aab0dfeb68d7a68 Mon Sep 17 00:00:00 2001 From: Michelle Au Date: Wed, 4 Dec 2019 14:12:50 -0800 Subject: [PATCH 072/242] fix syntax for ppc64le build --- build.make | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.make b/build.make index 7075a37e..a9b9d25d 100644 --- a/build.make +++ b/build.make @@ -70,7 +70,7 @@ build-%: check-go-version-go CGO_ENABLED=0 GOOS=linux go build $(GOFLAGS_VENDOR) -a -ldflags '-X main.version=$(REV) -extldflags "-static"' -o ./bin/$* ./cmd/$* if [ "$$ARCH" = "amd64" ]; then \ CGO_ENABLED=0 GOOS=windows go build $(GOFLAGS_VENDOR) -a -ldflags '-X main.version=$(REV) -extldflags "-static"' -o ./bin/$*.exe ./cmd/$* ; \ - CGO_ENABLED=0 GOOS=linux GOARCH=ppc64le go build $(GOFLAGS_VENDOR) -a -ldflags '-X main.version=$(REV) -extldflags "-static"' -o ./bin/$*-ppc64le ./cmd/$* + CGO_ENABLED=0 GOOS=linux GOARCH=ppc64le go build $(GOFLAGS_VENDOR) -a -ldflags '-X main.version=$(REV) -extldflags "-static"' -o ./bin/$*-ppc64le ./cmd/$* ; \ fi container-%: build-% From b98b2aed087f4e768db673a9d43dff4c7abd1482 Mon Sep 17 00:00:00 2001 From: Michelle Au Date: Mon, 16 Dec 2019 19:13:38 -0800 Subject: [PATCH 073/242] Enable snapshot tests in 1.17 to be run in non-alpha jobs. This requires adding one more parallel e2e test run with a special focus flag because snapshot tests are still guarded with a "[Feature:VolumeSnapshotDataSource]" tag. The setting that skips all tests with "[Feature:.*]" has to be removed because it overrides the focus. We don't have serial snapshot tests yet. This needs to be modified again if we add any in the future. --- prow.sh | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/prow.sh b/prow.sh index 9bfdc2e2..c160f886 100755 --- a/prow.sh +++ b/prow.sh @@ -132,7 +132,7 @@ configvar CSI_PROW_BUILD_JOB true "building code in repo enabled" # use the same settings as for "latest" Kubernetes. This works # as long as there are no breaking changes in Kubernetes, like # deprecating or changing the implementation of an alpha feature. -configvar CSI_PROW_KUBERNETES_VERSION 1.15.3 "Kubernetes" +configvar CSI_PROW_KUBERNETES_VERSION 1.17.0 "Kubernetes" # This is a hack to workaround the issue that each version # of kind currently only supports specific patch versions of @@ -142,7 +142,6 @@ configvar CSI_PROW_KUBERNETES_VERSION 1.15.3 "Kubernetes" # # If the version is prefixed with "release-", then nothing # is overridden. -override_k8s_version "1.14.6" override_k8s_version "1.15.3" # CSI_PROW_KUBERNETES_VERSION reduced to first two version numbers and @@ -206,9 +205,9 @@ configvar CSI_PROW_HOSTPATH_CANARY "" "hostpath image" # # CSI_PROW_E2E_REPO=none disables E2E testing. # TOOO: remove versioned variables and make e2e version match k8s version -configvar CSI_PROW_E2E_VERSION_1_14 v1.14.0 "E2E version for Kubernetes 1.14.x" configvar CSI_PROW_E2E_VERSION_1_15 v1.15.0 "E2E version for Kubernetes 1.15.x" configvar CSI_PROW_E2E_VERSION_1_16 v1.16.0 "E2E version for Kubernetes 1.16.x" +configvar CSI_PROW_E2E_VERSION_1_17 v1.17.0 "E2E version for Kubernetes 1.17.x" # TODO: add new CSI_PROW_E2E_VERSION entry for future Kubernetes releases configvar CSI_PROW_E2E_VERSION_LATEST master "E2E version for Kubernetes master" # testing against Kubernetes master is already tracking a moving target, so we might as well use a moving E2E version configvar CSI_PROW_E2E_REPO_LATEST https://github.com/kubernetes/kubernetes "E2E repo for Kubernetes >= 1.13.x" # currently the same for all versions @@ -278,6 +277,14 @@ tests_need_alpha_cluster () { tests_enabled "parallel-alpha" "serial-alpha" } +# Regex for non-alpha, feature-tagged tests that should be run. +# +# Starting with 1.17, snapshots is beta, but the E2E tests still have the +# [Feature:] tag. They need to be explicitly enabled. +configvar CSI_PROW_E2E_FOCUS_1_15 '^' "non-alpha, feature-tagged tests for Kubernetes = 1.15" # no tests to run, match nothing +configvar CSI_PROW_E2E_FOCUS_1_16 '^' "non-alpha, feature-tagged tests for Kubernetes = 1.16" # no tests to run, match nothing +configvar CSI_PROW_E2E_FOCUS_LATEST '\[Feature:VolumeSnapshotDataSource\]' "non-alpha, feature-tagged tests for Kubernetes >= 1.17" +configvar CSI_PROW_E2E_FOCUS "$(get_versioned_variable CSI_PROW_E2E_FOCUS "${csi_prow_kubernetes_version_suffix}")" "non-alpha, feature-tagged tests" # Serial vs. parallel is always determined by these regular expressions. # Individual regular expressions are seperated by spaces for readability @@ -313,12 +320,11 @@ configvar CSI_PROW_E2E_ALPHA "$(get_versioned_variable CSI_PROW_E2E_ALPHA "${csi # kubernetes-csi components must be updated, either by disabling # the failing test for "latest" or by updating the test and not running # it anymore for older releases. -configvar CSI_PROW_E2E_ALPHA_GATES_1_14 'VolumeSnapshotDataSource=true,ExpandCSIVolumes=true' "alpha feature gates for Kubernetes 1.14" configvar CSI_PROW_E2E_ALPHA_GATES_1_15 'VolumeSnapshotDataSource=true,ExpandCSIVolumes=true' "alpha feature gates for Kubernetes 1.15" configvar CSI_PROW_E2E_ALPHA_GATES_1_16 'VolumeSnapshotDataSource=true' "alpha feature gates for Kubernetes 1.16" # TODO: add new CSI_PROW_ALPHA_GATES_xxx entry for future Kubernetes releases and # add new gates to CSI_PROW_E2E_ALPHA_GATES_LATEST. -configvar CSI_PROW_E2E_ALPHA_GATES_LATEST 'VolumeSnapshotDataSource=true' "alpha feature gates for latest Kubernetes" +configvar CSI_PROW_E2E_ALPHA_GATES_LATEST '' "alpha feature gates for latest Kubernetes" configvar CSI_PROW_E2E_ALPHA_GATES "$(get_versioned_variable CSI_PROW_E2E_ALPHA_GATES "${csi_prow_kubernetes_version_suffix}")" "alpha E2E feature gates" # Which external-snapshotter tag to use for the snapshotter CRD and snapshot-controller deployment @@ -1111,6 +1117,16 @@ main () { warn "E2E parallel failed" ret=1 fi + + # Run tests that are feature tagged, but non-alpha + # Ignore: Double quote to prevent globbing and word splitting. + # shellcheck disable=SC2086 + if ! run_e2e parallel ${CSI_PROW_GINKO_PARALLEL} \ + -focus="External.Storage.*($(regex_join "${CSI_PROW_E2E_FOCUS}"))" \ + -skip="$(regex_join "${CSI_PROW_E2E_SERIAL}")"; then + warn "E2E parallel features failed" + ret=1 + fi fi if tests_enabled "serial"; then From fc80975954a9720a1611fa9a5195cbfc48b64167 Mon Sep 17 00:00:00 2001 From: Grant Griffiths Date: Fri, 20 Dec 2019 16:30:25 -0800 Subject: [PATCH 074/242] Fix version_gt to work with kubernetes prefix Signed-off-by: Grant Griffiths --- prow.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/prow.sh b/prow.sh index c160f886..832da1ee 100755 --- a/prow.sh +++ b/prow.sh @@ -1013,6 +1013,7 @@ make_test_to_junit () { # The follow substrings are stripped before version comparison: # - "v" # - "release-" +# - "kubernetes-" # # Usage: # version_gt release-1.3 v1.2.0 (returns true) @@ -1022,8 +1023,9 @@ make_test_to_junit () { # version_gt 1.1.1 release-1.2.0 (returns false) # version_gt 1.2.0 1.2.2 (returns false) function version_gt() { - versions=$(for ver in "$@"; do ver=${ver#release-}; echo "${ver#v}"; done) + versions=$(for ver in "$@"; do ver=${ver#release-}; ver=${ver#kubernetes-}; echo "${ver#v}"; done) greaterVersion=${1#"release-"}; + greaterVersion=${greaterVersion#"kubernetes-"}; greaterVersion=${greaterVersion#"v"}; test "$(printf '%s' "$versions" | sort -V | head -n 1)" != "$greaterVersion" } From af9549b5a11c4849ff7b4a1a42a7b8aea59137c3 Mon Sep 17 00:00:00 2001 From: saad-ali Date: Thu, 2 Jan 2020 14:29:40 -0800 Subject: [PATCH 075/242] Update prow hostpath driver version to 1.3.0-rc2 --- prow.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prow.sh b/prow.sh index 832da1ee..ae51947d 100755 --- a/prow.sh +++ b/prow.sh @@ -187,7 +187,7 @@ configvar CSI_PROW_WORK "$(mkdir -p "$GOPATH/pkg" && mktemp -d "$GOPATH/pkg/csip # # When no deploy script is found (nothing in `deploy` directory, # CSI_PROW_HOSTPATH_REPO=none), nothing gets deployed. -configvar CSI_PROW_HOSTPATH_VERSION "v1.2.0" "hostpath driver" +configvar CSI_PROW_HOSTPATH_VERSION "v1.3.0-rc2" "hostpath driver" configvar CSI_PROW_HOSTPATH_REPO https://github.com/kubernetes-csi/csi-driver-host-path "hostpath repo" configvar CSI_PROW_DEPLOYMENT "" "deployment" configvar CSI_PROW_HOSTPATH_DRIVER_NAME "hostpath.csi.k8s.io" "the hostpath driver name" From 8b0316c7e4d94a3206cdab0ea2e8d7f7b3be637b Mon Sep 17 00:00:00 2001 From: Michelle Au Date: Thu, 2 Jan 2020 14:33:46 -0800 Subject: [PATCH 076/242] Fix overriding of junit results by using unique names for each e2e run --- prow.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prow.sh b/prow.sh index ae51947d..e21a7ba9 100755 --- a/prow.sh +++ b/prow.sh @@ -1123,7 +1123,7 @@ main () { # Run tests that are feature tagged, but non-alpha # Ignore: Double quote to prevent globbing and word splitting. # shellcheck disable=SC2086 - if ! run_e2e parallel ${CSI_PROW_GINKO_PARALLEL} \ + if ! run_e2e parallel-features ${CSI_PROW_GINKO_PARALLEL} \ -focus="External.Storage.*($(regex_join "${CSI_PROW_E2E_FOCUS}"))" \ -skip="$(regex_join "${CSI_PROW_E2E_SERIAL}")"; then warn "E2E parallel features failed" From 8191eab6ffe694d11bf1e0d254330287c961dc77 Mon Sep 17 00:00:00 2001 From: Grant Griffiths Date: Tue, 7 Jan 2020 18:09:31 -0800 Subject: [PATCH 077/242] Update snapshotter to version v2.0.0 Signed-off-by: Grant Griffiths --- prow.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prow.sh b/prow.sh index e21a7ba9..eb451ef1 100755 --- a/prow.sh +++ b/prow.sh @@ -328,7 +328,7 @@ configvar CSI_PROW_E2E_ALPHA_GATES_LATEST '' "alpha feature gates for latest Kub configvar CSI_PROW_E2E_ALPHA_GATES "$(get_versioned_variable CSI_PROW_E2E_ALPHA_GATES "${csi_prow_kubernetes_version_suffix}")" "alpha E2E feature gates" # Which external-snapshotter tag to use for the snapshotter CRD and snapshot-controller deployment -configvar CSI_SNAPSHOTTER_VERSION 'v2.0.0-rc4' "external-snapshotter version tag" +configvar CSI_SNAPSHOTTER_VERSION 'v2.0.0' "external-snapshotter version tag" # Some tests are known to be unusable in a KinD cluster. For example, # stopping kubelet with "ssh systemctl stop kubelet" simply From 6582f2ff3bd584e662035b7da2a90efc52184b1b Mon Sep 17 00:00:00 2001 From: Michelle Au Date: Thu, 9 Jan 2020 17:25:38 -0800 Subject: [PATCH 078/242] Update hostpath driver version to get fix for connection-timeout --- prow.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prow.sh b/prow.sh index e21a7ba9..27309a79 100755 --- a/prow.sh +++ b/prow.sh @@ -187,7 +187,7 @@ configvar CSI_PROW_WORK "$(mkdir -p "$GOPATH/pkg" && mktemp -d "$GOPATH/pkg/csip # # When no deploy script is found (nothing in `deploy` directory, # CSI_PROW_HOSTPATH_REPO=none), nothing gets deployed. -configvar CSI_PROW_HOSTPATH_VERSION "v1.3.0-rc2" "hostpath driver" +configvar CSI_PROW_HOSTPATH_VERSION "v1.3.0-rc3" "hostpath driver" configvar CSI_PROW_HOSTPATH_REPO https://github.com/kubernetes-csi/csi-driver-host-path "hostpath repo" configvar CSI_PROW_DEPLOYMENT "" "deployment" configvar CSI_PROW_HOSTPATH_DRIVER_NAME "hostpath.csi.k8s.io" "the hostpath driver name" From ac8a0212b93cad817689029be503839ad1959e21 Mon Sep 17 00:00:00 2001 From: Michelle Au Date: Wed, 11 Dec 2019 17:56:08 -0800 Subject: [PATCH 079/242] Document the process for releasing a new sidecar --- SIDECAR_RELEASE_PROCESS.md | 90 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 SIDECAR_RELEASE_PROCESS.md diff --git a/SIDECAR_RELEASE_PROCESS.md b/SIDECAR_RELEASE_PROCESS.md new file mode 100644 index 00000000..91a1e1b8 --- /dev/null +++ b/SIDECAR_RELEASE_PROCESS.md @@ -0,0 +1,90 @@ +# Sidecar Release Process + +This page describes the process for releasing a kubernetes-csi sidecar. + +## Prerequisites + +The release manager must: + +* Be a member of the kubernetes-csi organization. Open an + [issue](https://github.com/kubernetes/org/issues/new?assignees=&labels=area%2Fgithub-membership&template=membership.md&title=REQUEST%3A+New+membership+for+%3Cyour-GH-handle%3E) in + kubernetes/org to request membership +* Be a top level approver for the repository. To become a top level approver, + the candidate must demonstrate ownership and deep knowledge of the repository + through active maintainence, responding to and fixing issues, reviewing PRs, + test triage. +* Be part of the maintainers or admin group for the repository. admin is a + superset of maintainers, only maintainers level is required for cutting a + release. Membership can be requested by submitting a PR to kubernetes/org. + [Example](https://github.com/kubernetes/org/pull/1467) + +## Updating CI Jobs +Whenever a new Kubernetes minor version is released, our kubernetes-csi CI jobs +must be updated. + +[Our CI jobs](https://k8s-testgrid.appspot.com/sig-storage-csi-ci) have the +naming convention `-on-`. + +1. Jobs should be actively monitored to find and fix failures in sidecars and + infrastructure changes early in the development cycle. Test failures are sent + to kubernetes-sig-storage-test-failures@googlegroups.com. +1. "-on-master" jobs are the closest reflection to the new Kubernetes version. +1. Fixes to our prow.sh CI script can be tested in the [CSI hostpath + repo](https://github.com/kubernetes-csi/csi-driver-host-path) by modifying + [prow.sh](https://github.com/kubernetes-csi/csi-driver-host-path/blob/master/release-tools/prow.sh) + along with any overrides in + [.prow.sh](https://github.com/kubernetes-csi/csi-driver-host-path/blob/master/.prow.sh) + to mirror the failing environment. Once e2e tests are passing (verify-unit tests + will fail), then the prow.sh changes can be submitted to [csi-release-tools](https://github.com/kubernetes-csi/csi-release-tools). +1. Changes can then be updated in all the sidecar repos and hostpath driver repo + by following the [update + instructions](https://github.com/kubernetes-csi/csi-release-tools/blob/master/README.md#sharing-and-updating). +1. New pull and CI jobs are configured by + [gen-jobs.sh](https://github.com/kubernetes/test-infra/blob/master/config/jobs/kubernetes-csi/gen-jobs.sh). + New pull jobs that have been unverified should be initially made optional. + [Example](https://github.com/kubernetes/test-infra/pull/15055) +1. Once new pull and CI jobs have been verified, and the new Kubernetes version + is released, we can make the optional jobs required, and also remove the + Kubernetes versions that are no longer supported. + +## Release Process +1. Identify all issues and ongoing PRs that should go into the release, and + drive them to resolution. +1. Download [K8s release notes + generator](https://github.com/kubernetes/release/tree/master/cmd/release-notes) +1. Generate release notes for the release. Replace arguments with the relevant + information. + ``` + GITHUB_TOKEN= ./release-notes --start-sha=0ed6978fd199e3ca10326b82b4b8b8e916211c9b --end-sha=3cb3d2f18ed8cb40371c6d8886edcabd1f27e7b9 \ + --github-org=kubernetes-csi --github-repo=external-attacher -branch=master -output out.md + ``` + * `--start-sha` should point to the last release from the same branch. For + example: + * `1.X-1.0` tag when releasing `1.X.0` + * `1.X.Y-1` tag when releasing `1.X.Y` +1. Compare the generated output to the new commits for the release to check if + any notable change missed a release note. +1. Reword release notes as needed. Make sure to check notes for breaking + changes and deprecations. +1. If release is a new major/minor version, create a new `CHANGELOG-..md` + file. Otherwise, add the release notes to the top of the existing CHANGELOG + file for that minor version. +1. Submit a PR for the CHANGELOG changes. +1. Submit a PR for README changes, in particular, Compatibility, Feature status, + and any other sections that may need updating. +1. Check that all [canary CI + jobs](https://k8s-testgrid.appspot.com/sig-storage-csi-ci) are passing, + and that test coverage is adequate for the changes that are going into the release. +1. Make sure that no new PRs have merged in the meantime, and no PRs are in + flight and soon to be merged. +1. Create a new release following a previous release as a template. Be sure to select the correct + branch. This requires Github release permissions as required by the prerequisites. + [external-provisioner example](https://github.com/kubernetes-csi/external-provisioner/releases/new) +1. If release was a new major/minor version, create a new `release-` + branch at that commit. +1. Update [kubernetes-csi/docs](https://github.com/kubernetes-csi/docs) sidecar + and feature pages with the new released version. +1. After all the sidecars have been released, update + CSI hostpath driver with the new sidecars in the [CSI repo](https://github.com/kubernetes-csi/csi-driver-host-path/tree/master/deploy) + and [k/k + in-tree](https://github.com/kubernetes/kubernetes/tree/master/test/e2e/testing-manifests/storage-csi/hostpath/hostpath) From fa90abd07862e6fa0a7b66ea2435b9db364ce6c9 Mon Sep 17 00:00:00 2001 From: wangzheng03 Date: Sun, 19 Jan 2020 09:42:26 +0800 Subject: [PATCH 080/242] fix incorrect link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 08c82884..60eab2a9 100644 --- a/README.md +++ b/README.md @@ -81,7 +81,7 @@ on what is enabled in Prow, see https://github.com/kubernetes/test-infra/tree/master/config/jobs/kubernetes-csi Test results for periodic jobs are visible in -https://testgrid.k8s.io/sig-storage-csi +https://testgrid.k8s.io/sig-storage-csi-ci It is possible to reproduce the Prow testing locally on a suitable machine: - Linux host From 84f78b120e891b76b3e368cb0d20502baec026ea Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Mon, 10 Feb 2020 13:08:33 +0100 Subject: [PATCH 081/242] prow.sh: generic driver installation This relies on a slightly different deployment script: a "deploy.sh" must exist which knows that it has to dump a test driver configurion into the file pointed to with CSI_PROW_TEST_DRIVER, if that env variable is set. That way, we no longer need to know what capabilities the installed driver has. --- prow.sh | 104 +++++++++++++++++++++++--------------------------------- 1 file changed, 43 insertions(+), 61 deletions(-) diff --git a/prow.sh b/prow.sh index 118c5bd1..bb80741e 100755 --- a/prow.sh +++ b/prow.sh @@ -157,7 +157,9 @@ csi_prow_kubernetes_version_suffix="$(echo "${CSI_PROW_KUBERNETES_VERSION}" | tr # the caller. configvar CSI_PROW_WORK "$(mkdir -p "$GOPATH/pkg" && mktemp -d "$GOPATH/pkg/csiprow.XXXXXXXXXX")" "work directory" -# The hostpath deployment script is searched for in several places. +# By default, this script tests sidecars with the CSI hostpath driver, +# using the install_csi_driver function. That function depends on +# a deployment script that it searches for in several places: # # - The "deploy" directory in the current repository: this is useful # for the situation that a component becomes incompatible with the @@ -165,11 +167,11 @@ configvar CSI_PROW_WORK "$(mkdir -p "$GOPATH/pkg" && mktemp -d "$GOPATH/pkg/csip # own example until the shared one can be updated; it's also how # csi-driver-host-path itself provides the example. # -# - CSI_PROW_HOSTPATH_VERSION of the CSI_PROW_HOSTPATH_REPO is checked +# - CSI_PROW_DRIVER_VERSION of the CSI_PROW_DRIVER_REPO is checked # out: this allows other repos to reference a version of the example # that is known to be compatible. # -# - The csi-driver-host-path/deploy directory has multiple sub-directories, +# - The /deploy directory can have multiple sub-directories, # each with different deployments (stable set of images for Kubernetes 1.13, # stable set of images for Kubernetes 1.14, canary for latest Kubernetes, etc.). # This is necessary because there may be incompatible changes in the @@ -186,16 +188,26 @@ configvar CSI_PROW_WORK "$(mkdir -p "$GOPATH/pkg" && mktemp -d "$GOPATH/pkg/csip # "none" disables the deployment of the hostpath driver. # # When no deploy script is found (nothing in `deploy` directory, -# CSI_PROW_HOSTPATH_REPO=none), nothing gets deployed. -configvar CSI_PROW_HOSTPATH_VERSION "v1.3.0-rc3" "hostpath driver" -configvar CSI_PROW_HOSTPATH_REPO https://github.com/kubernetes-csi/csi-driver-host-path "hostpath repo" +# CSI_PROW_DRIVER_REPO=none), nothing gets deployed. +# +# If the deployment script is called with CSI_PROW_TEST_DRIVER= as +# environment variable, then it must write a suitable test driver configuration +# into that file in addition to installing the driver. +configvar CSI_PROW_DRIVER_VERSION "v1.3.0-rc4" "CSI driver version" +configvar CSI_PROW_DRIVER_REPO https://github.com/kubernetes-csi/csi-driver-host-path "CSI driver repo" configvar CSI_PROW_DEPLOYMENT "" "deployment" -configvar CSI_PROW_HOSTPATH_DRIVER_NAME "hostpath.csi.k8s.io" "the hostpath driver name" -# If CSI_PROW_HOSTPATH_CANARY is set (typically to "canary", but also -# "1.0-canary"), then all image versions are replaced with that -# version tag. -configvar CSI_PROW_HOSTPATH_CANARY "" "hostpath image" +# The install_csi_driver function may work also for other CSI drivers, +# as long as they follow the conventions of the CSI hostpath driver. +# If they don't, then a different install function can be provided in +# a .prow.sh file and this config variable can be overridden. +configvar CSI_PROW_DRIVER_INSTALL "install_csi_driver" "name of the shell function which installs the CSI driver" + +# If CSI_PROW_DRIVER_CANARY is set (typically to "canary", but also +# version tag. Usually empty. CSI_PROW_HOSTPATH_CANARY is +# accepted as alternative name because some test-infra jobs +# still use that name. +configvar CSI_PROW_DRIVER_CANARY "${CSI_PROW_HOSTPATH_CANARY}" "driver image override for canary images" # The E2E testing can come from an arbitrary repo. The expectation is that # the repo supports "go test ./test/e2e -args --storage.testdriver" (https://github.com/kubernetes/kubernetes/pull/72836) @@ -613,7 +625,7 @@ find_deployment () { # Fixed deployment name? Use it if it exists, otherwise fail. if [ "${CSI_PROW_DEPLOYMENT}" ]; then - file="$dir/${CSI_PROW_DEPLOYMENT}/deploy-hostpath.sh" + file="$dir/${CSI_PROW_DEPLOYMENT}/deploy.sh" if ! [ -e "$file" ]; then return 1 fi @@ -623,9 +635,9 @@ find_deployment () { # Ignore: See if you can use ${variable//search/replace} instead. # shellcheck disable=SC2001 - file="$dir/kubernetes-$(echo "${CSI_PROW_KUBERNETES_VERSION}" | sed -e 's/\([0-9]*\)\.\([0-9]*\).*/\1.\2/')/deploy-hostpath.sh" + file="$dir/kubernetes-$(echo "${CSI_PROW_KUBERNETES_VERSION}" | sed -e 's/\([0-9]*\)\.\([0-9]*\).*/\1.\2/')/deploy.sh" if ! [ -e "$file" ]; then - file="$dir/kubernetes-latest/deploy-hostpath.sh" + file="$dir/kubernetes-latest/deploy.sh" if ! [ -e "$file" ]; then return 1 fi @@ -633,12 +645,11 @@ find_deployment () { echo "$file" } -# This installs the hostpath driver example. CSI_PROW_HOSTPATH_CANARY overrides all -# image versions with that canary version. The parameters of install_hostpath can be -# used to override registry and/or tag of individual images (CSI_PROVISIONER_REGISTRY=localhost:9000 -# CSI_PROVISIONER_TAG=latest). -install_hostpath () { - local images deploy_hostpath +# This installs the CSI driver. It's called with a list of env variables +# that override the default images. CSI_PROW_DRIVER_CANARY overrides all +# image versions with that canary version. +install_csi_driver () { + local images deploy_driver images="$*" if [ "${CSI_PROW_DEPLOYMENT}" = "none" ]; then @@ -654,31 +665,31 @@ install_hostpath () { done fi - if deploy_hostpath="$(find_deployment "$(pwd)/deploy")"; then + if deploy_driver="$(find_deployment "$(pwd)/deploy")"; then : - elif [ "${CSI_PROW_HOSTPATH_REPO}" = "none" ]; then + elif [ "${CSI_PROW_DRIVER_REPO}" = "none" ]; then return 1 else - git_checkout "${CSI_PROW_HOSTPATH_REPO}" "${CSI_PROW_WORK}/hostpath" "${CSI_PROW_HOSTPATH_VERSION}" --depth=1 || die "checking out hostpath repo failed" - if deploy_hostpath="$(find_deployment "${CSI_PROW_WORK}/hostpath/deploy")"; then + git_checkout "${CSI_PROW_DRIVER_REPO}" "${CSI_PROW_WORK}/csi-driver" "${CSI_PROW_DRIVER_VERSION}" --depth=1 || die "checking out CSI driver repo failed" + if deploy_driver="$(find_deployment "${CSI_PROW_WORK}/csi-driver/deploy")"; then : else - die "deploy-hostpath.sh not found in ${CSI_PROW_HOSTPATH_REPO} ${CSI_PROW_HOSTPATH_VERSION}. To disable E2E testing, set CSI_PROW_HOSTPATH_REPO=none" + die "deploy.sh not found in ${CSI_PROW_DRIVER_REPO} ${CSI_PROW_DRIVER_VERSION}. To disable E2E testing, set CSI_PROW_DRIVER_REPO=none" fi fi - if [ "${CSI_PROW_HOSTPATH_CANARY}" != "stable" ]; then - images="$images IMAGE_TAG=${CSI_PROW_HOSTPATH_CANARY}" + if [ "${CSI_PROW_DRIVER_CANARY}" != "stable" ]; then + images="$images IMAGE_TAG=${CSI_PROW_DRIVER_CANARY}" fi # Ignore: Double quote to prevent globbing and word splitting. # It's intentional here for $images. # shellcheck disable=SC2086 - if ! run env $images "${deploy_hostpath}"; then + if ! run env "CSI_PROW_TEST_DRIVER=${CSI_PROW_WORK}/test-driver.yaml" $images "${deploy_driver}"; then # Collect information about failed deployment before failing. collect_cluster_info (start_loggers >/dev/null; wait) info "For container output see job artifacts." - die "deploying the hostpath driver with ${deploy_hostpath} failed" + die "deploying the CSI driver with ${deploy_driver} failed" fi } @@ -804,33 +815,6 @@ install_sanity () ( run_with_go "${CSI_PROW_GO_VERSION_SANITY}" go test -c -o "${CSI_PROW_WORK}/csi-sanity" "${CSI_PROW_SANITY_IMPORT_PATH}/cmd/csi-sanity" || die "building csi-sanity failed" ) -# The default implementation of this function generates a external -# driver test configuration for the hostpath driver. -# -# The content depends on both what the E2E suite expects and what the -# installed hostpath driver supports. Generating it here seems prone -# to breakage, but it is uncertain where a better place might be. -generate_test_driver () { - cat <"${CSI_PROW_WORK}/test-driver.yaml" || die "generating test-driver.yaml failed" - # Rename, merge and filter JUnit files. Necessary in case that we run the E2E suite again # and to avoid the large number of "skipped" tests that we get from using # the full Kubernetes E2E testsuite while only running a few tests. @@ -1063,7 +1045,7 @@ main () { cmds="$(grep '^\s*CMDS\s*=' Makefile | sed -e 's/\s*CMDS\s*=//')" # Get the image that was just built (if any) from the # top-level Makefile CMDS variable and set the - # deploy-hostpath.sh env variables for it. We also need to + # deploy.sh env variables for it. We also need to # side-load those images into the cluster. for i in $cmds; do e=$(echo "$i" | tr '[:lower:]' '[:upper:]' | tr - _) @@ -1101,7 +1083,7 @@ main () { fi # Installing the driver might be disabled. - if install_hostpath "$images"; then + if ${CSI_PROW_DRIVER_INSTALL} "$images"; then collect_cluster_info if sanity_enabled; then @@ -1158,7 +1140,7 @@ main () { fi # Installing the driver might be disabled. - if install_hostpath "$images"; then + if ${CSI_PROW_DRIVER_INSTALL} "$images"; then collect_cluster_info if tests_enabled "parallel-alpha"; then From 5f74333a466f0767cec812945c970c943a59cf7f Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Mon, 10 Feb 2020 11:06:31 +0100 Subject: [PATCH 082/242] prow.sh: also configure feature gates for kubelet That this hasn't been done before is an oversight. Apparently it hasn't been a problem because there never have been feature gates that mattered? --- prow.sh | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/prow.sh b/prow.sh index 118c5bd1..6778e8b8 100755 --- a/prow.sh +++ b/prow.sh @@ -568,6 +568,13 @@ kubeadmConfigPatches: nodeRegistration: kubeletExtraArgs: "feature-gates": "$gates" +- | + apiVersion: kubelet.config.k8s.io/v1beta1 + kind: KubeletConfiguration + metadata: + name: config + featureGates: +$(list_gates "$gates") - | apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration From fdb32183fea99d452a2e110ef9ca6bfd6f3e9fa3 Mon Sep 17 00:00:00 2001 From: Jan Wozniak Date: Thu, 13 Feb 2020 11:21:45 +0100 Subject: [PATCH 083/242] Change 'make test-vet' to call 'go vet' --- build.make | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.make b/build.make index a9b9d25d..3bf3391c 100644 --- a/build.make +++ b/build.make @@ -113,7 +113,7 @@ test-go: test: test-vet test-vet: @ echo; echo "### $@:" - go test $(GOFLAGS_VENDOR) `go list $(GOFLAGS_VENDOR) ./... | grep -v vendor $(TEST_VET_FILTER_CMD)` + go vet $(GOFLAGS_VENDOR) `go list $(GOFLAGS_VENDOR) ./... | grep -v vendor $(TEST_VET_FILTER_CMD)` .PHONY: test-fmt test: test-fmt From 7c5a89c8fcd634c4413837bc1042bd4bf27a93e6 Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Fri, 14 Feb 2020 09:38:16 +0100 Subject: [PATCH 084/242] prow.sh: use 1.3.0 hostpath driver for testing The final 1.3.0 release of the hostpath driver really uses the 1.3.0 driver image in its deployment, in contrast to the previous -rc candidates which still used 1.2.0. --- prow.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prow.sh b/prow.sh index 0331ac3f..d54dea51 100755 --- a/prow.sh +++ b/prow.sh @@ -193,7 +193,7 @@ configvar CSI_PROW_WORK "$(mkdir -p "$GOPATH/pkg" && mktemp -d "$GOPATH/pkg/csip # If the deployment script is called with CSI_PROW_TEST_DRIVER= as # environment variable, then it must write a suitable test driver configuration # into that file in addition to installing the driver. -configvar CSI_PROW_DRIVER_VERSION "v1.3.0-rc4" "CSI driver version" +configvar CSI_PROW_DRIVER_VERSION "v1.3.0" "CSI driver version" configvar CSI_PROW_DRIVER_REPO https://github.com/kubernetes-csi/csi-driver-host-path "CSI driver repo" configvar CSI_PROW_DEPLOYMENT "" "deployment" From 3863a0f674b70d87f34be95cad6dd464118713fa Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Wed, 4 Mar 2020 11:19:09 +0100 Subject: [PATCH 085/242] build for multiple platforms only in CI, add s390x Developers should not be forced to build for all platforms by default. We also don't want to copy-and-paste the go invocation for each new platform. To address both, the target platform(s) are now configurable via BUILD_PLATFORMS and additional platforms are only enabled in the Prow CI. For now this serves as a test that the source actually compiles for multiple platforms. Building images for different target platforms is a different problem. --- build.make | 21 ++++++++++++++------- prow.sh | 4 +++- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/build.make b/build.make index 3bf3391c..5c9793c2 100644 --- a/build.make +++ b/build.make @@ -60,18 +60,25 @@ else TESTARGS = endif -ARCH := $(if $(GOARCH),$(GOARCH),$(shell go env GOARCH)) - # Specific packages can be excluded from each of the tests below by setting the *_FILTER_CMD variables # to something like "| grep -v 'github.com/kubernetes-csi/project/pkg/foobar'". See usage below. +# BUILD_PLATFORMS contains a set of triplets, +# separated by semicolon. An empty variable or empty entry (= just a +# semicolon) builds for the default platform of the current Go +# toolchain. +BUILD_PLATFORMS = + +# This builds each command (= the sub-directories of ./cmd) for the target platform(s) +# defined by BUILD_PLATFORMS. build-%: check-go-version-go mkdir -p bin - CGO_ENABLED=0 GOOS=linux go build $(GOFLAGS_VENDOR) -a -ldflags '-X main.version=$(REV) -extldflags "-static"' -o ./bin/$* ./cmd/$* - if [ "$$ARCH" = "amd64" ]; then \ - CGO_ENABLED=0 GOOS=windows go build $(GOFLAGS_VENDOR) -a -ldflags '-X main.version=$(REV) -extldflags "-static"' -o ./bin/$*.exe ./cmd/$* ; \ - CGO_ENABLED=0 GOOS=linux GOARCH=ppc64le go build $(GOFLAGS_VENDOR) -a -ldflags '-X main.version=$(REV) -extldflags "-static"' -o ./bin/$*-ppc64le ./cmd/$* ; \ - fi + echo '$(BUILD_PLATFORMS)' | tr ';' '\n' | while read -r os arch suffix; do \ + if ! (set -x; CGO_ENABLED=0 GOOS="$$os" GOARCH="$$arch" go build $(GOFLAGS_VENDOR) -a -ldflags '-X main.version=$(REV) -extldflags "-static"' -o "./bin/$*$$suffix" ./cmd/$*); then \ + echo "Building $* for GOOS=$$os GOARCH=$$arch failed, see error(s) above."; \ + exit 1; \ + fi; \ + done container-%: build-% docker build -t $*:latest -f $(shell if [ -e ./cmd/$*/Dockerfile ]; then echo ./cmd/$*/Dockerfile; else echo Dockerfile; fi) --label revision=$(REV) . diff --git a/prow.sh b/prow.sh index d54dea51..30cb3842 100755 --- a/prow.sh +++ b/prow.sh @@ -85,6 +85,8 @@ get_versioned_variable () { echo "$value" } +configvar CSI_PROW_BUILD_PLATFORMS "linux amd64; windows amd64 .exe; linux ppc64le -ppc64le; linux s390x -s390x" "Go target platforms (= GOOS + GOARCH) and file suffix of the resulting binaries" + # If we have a vendor directory, then use it. We must be careful to only # use this for "make" invocations inside the project's repo itself because # setting it globally can break other go usages (like "go get " @@ -1026,7 +1028,7 @@ main () { images= if ${CSI_PROW_BUILD_JOB}; then # A successful build is required for testing. - run_with_go "${CSI_PROW_GO_VERSION_BUILD}" make all "GOFLAGS_VENDOR=${GOFLAGS_VENDOR}" || die "'make all' failed" + run_with_go "${CSI_PROW_GO_VERSION_BUILD}" make all "GOFLAGS_VENDOR=${GOFLAGS_VENDOR}" "BUILD_PLATFORMS=${CSI_PROW_BUILD_PLATFORMS}" || die "'make all' failed" # We don't want test failures to prevent E2E testing below, because the failure # might have been minor or unavoidable, for example when experimenting with # changes in "release-tools" in a PR (that fails the "is release-tools unmodified" From 7edc1461eacefed7f3112ac65ebefbdd2c4a64d1 Mon Sep 17 00:00:00 2001 From: Grant Griffiths Date: Wed, 11 Mar 2020 10:48:03 -0700 Subject: [PATCH 086/242] Update snapshotter to version 2.0.1 Signed-off-by: Grant Griffiths --- prow.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prow.sh b/prow.sh index 30cb3842..86b2bf05 100755 --- a/prow.sh +++ b/prow.sh @@ -342,7 +342,7 @@ configvar CSI_PROW_E2E_ALPHA_GATES_LATEST '' "alpha feature gates for latest Kub configvar CSI_PROW_E2E_ALPHA_GATES "$(get_versioned_variable CSI_PROW_E2E_ALPHA_GATES "${csi_prow_kubernetes_version_suffix}")" "alpha E2E feature gates" # Which external-snapshotter tag to use for the snapshotter CRD and snapshot-controller deployment -configvar CSI_SNAPSHOTTER_VERSION 'v2.0.0' "external-snapshotter version tag" +configvar CSI_SNAPSHOTTER_VERSION 'v2.0.1' "external-snapshotter version tag" # Some tests are known to be unusable in a KinD cluster. For example, # stopping kubelet with "ssh systemctl stop kubelet" simply From ea1f94aad7b211ecd18f05794582c60869bf9251 Mon Sep 17 00:00:00 2001 From: Michelle Au Date: Fri, 17 Apr 2020 09:02:07 -0700 Subject: [PATCH 087/242] update release tools instructions --- SIDECAR_RELEASE_PROCESS.md | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/SIDECAR_RELEASE_PROCESS.md b/SIDECAR_RELEASE_PROCESS.md index 91a1e1b8..c8aaa4e8 100644 --- a/SIDECAR_RELEASE_PROCESS.md +++ b/SIDECAR_RELEASE_PROCESS.md @@ -54,14 +54,21 @@ naming convention `-on-`. generator](https://github.com/kubernetes/release/tree/master/cmd/release-notes) 1. Generate release notes for the release. Replace arguments with the relevant information. - ``` - GITHUB_TOKEN= ./release-notes --start-sha=0ed6978fd199e3ca10326b82b4b8b8e916211c9b --end-sha=3cb3d2f18ed8cb40371c6d8886edcabd1f27e7b9 \ - --github-org=kubernetes-csi --github-repo=external-attacher -branch=master -output out.md - ``` - * `--start-sha` should point to the last release from the same branch. For - example: - * `1.X-1.0` tag when releasing `1.X.0` - * `1.X.Y-1` tag when releasing `1.X.Y` + * For new minor releases on master: + ``` + GITHUB_TOKEN= release-notes --discover=mergebase-to-latest + --github-org=kubernetes-csi --github-repo=external-provisioner + --required-author="" --output out.md + ``` + * For new patch releases on a release branch: + ``` + GITHUB_TOKEN= release-notes --branch=release-1.1 + --start-rev=v1.1.1 --end-sha=f0a9219b29cc9053047c39d149ce9b22bc7b918b + --github-org=kubernetes-csi --github-repo=external-provisioner + --required-author="" --output out.md + ``` + * `--start-rev` should point to the last patch release from the release branch. + * `--end-sha` should point to the latest commit from the release branch. 1. Compare the generated output to the new commits for the release to check if any notable change missed a release note. 1. Reword release notes as needed. Make sure to check notes for breaking From d8c76fee3e64e38a3427c9cf9df0f069801e3d74 Mon Sep 17 00:00:00 2001 From: Grant Griffiths Date: Wed, 15 Apr 2020 19:11:33 -0700 Subject: [PATCH 088/242] Support local snapshot RBAC for pull jobs Signed-off-by: Grant Griffiths --- prow.sh | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/prow.sh b/prow.sh index 86b2bf05..0b962f04 100755 --- a/prow.sh +++ b/prow.sh @@ -1064,18 +1064,24 @@ main () { # always pulling the image # (https://github.com/kubernetes-sigs/kind/issues/328). docker tag "$i:latest" "$i:csiprow" || die "tagging the locally built container image for $i failed" - done - if [ -e deploy/kubernetes/rbac.yaml ]; then - # This is one of those components which has its own RBAC rules (like external-provisioner). - # We are testing a locally built image and also want to test with the the current, - # potentially modified RBAC rules. - if [ "$(echo "$cmds" | wc -w)" != 1 ]; then - die "ambiguous deploy/kubernetes/rbac.yaml: need exactly one command, got: $cmds" + # For components with multiple cmds, the RBAC file should be in the following format: + # rbac-$cmd.yaml + # If this file cannot be found, we can default to the standard location: + # deploy/kubernetes/rbac.yaml + rbac_file_path=$(find . -type f -name "rbac-$i.yaml") + if [ "$rbac_file_path" == "" ]; then + rbac_file_path="$(pwd)/deploy/kubernetes/rbac.yaml" fi - e=$(echo "$cmds" | tr '[:lower:]' '[:upper:]' | tr - _) - images="$images ${e}_RBAC=$(pwd)/deploy/kubernetes/rbac.yaml" - fi + + if [ -e "$rbac_file_path" ]; then + # This is one of those components which has its own RBAC rules (like external-provisioner). + # We are testing a locally built image and also want to test with the the current, + # potentially modified RBAC rules. + e=$(echo "$i" | tr '[:lower:]' '[:upper:]' | tr - _) + images="$images ${e}_RBAC=$rbac_file_path" + fi + done fi if tests_need_non_alpha_cluster; then From 6f2322e80813459de15eb2aa0d17ddd53cb3efa8 Mon Sep 17 00:00:00 2001 From: Michelle Au Date: Thu, 23 Apr 2020 10:21:49 -0700 Subject: [PATCH 089/242] Update patch release notes generation command --- SIDECAR_RELEASE_PROCESS.md | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/SIDECAR_RELEASE_PROCESS.md b/SIDECAR_RELEASE_PROCESS.md index c8aaa4e8..6960607e 100644 --- a/SIDECAR_RELEASE_PROCESS.md +++ b/SIDECAR_RELEASE_PROCESS.md @@ -50,7 +50,7 @@ naming convention `-on-`. ## Release Process 1. Identify all issues and ongoing PRs that should go into the release, and drive them to resolution. -1. Download [K8s release notes +1. Download v2.8+ [K8s release notes generator](https://github.com/kubernetes/release/tree/master/cmd/release-notes) 1. Generate release notes for the release. Replace arguments with the relevant information. @@ -62,13 +62,10 @@ naming convention `-on-`. ``` * For new patch releases on a release branch: ``` - GITHUB_TOKEN= release-notes --branch=release-1.1 - --start-rev=v1.1.1 --end-sha=f0a9219b29cc9053047c39d149ce9b22bc7b918b + GITHUB_TOKEN= release-notes --discover=patch-to-latest --branch=release-1.1 --github-org=kubernetes-csi --github-repo=external-provisioner --required-author="" --output out.md ``` - * `--start-rev` should point to the last patch release from the release branch. - * `--end-sha` should point to the latest commit from the release branch. 1. Compare the generated output to the new commits for the release to check if any notable change missed a release note. 1. Reword release notes as needed. Make sure to check notes for breaking From bd416901d4b7cad7bc70a39f508b68e2a9fff1f6 Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Thu, 28 May 2020 10:22:20 +0200 Subject: [PATCH 090/242] cloud build: initial set of shared files The approach taken here extends the existing support for cross-compiling binaries on the build host and specifying the Go compiler: Go is installed if needed (as in Prow testing), binaries are build on the host, then one image is created for each platform, and finally those are combined into a single multi-architecture image. --- build.make | 63 +++++++++++++++++++++++++++++++++++++++++++++++++ cloudbuild.sh | 6 +++++ cloudbuild.yaml | 44 ++++++++++++++++++++++++++++++++++ prow.sh | 14 +++++++++++ 4 files changed, 127 insertions(+) create mode 100755 cloudbuild.sh create mode 100644 cloudbuild.yaml diff --git a/build.make b/build.make index 5c9793c2..e3a44f96 100644 --- a/build.make +++ b/build.make @@ -105,6 +105,69 @@ build: $(CMDS:%=build-%) container: $(CMDS:%=container-%) push: $(CMDS:%=push-%) +# Additional parameters are needed when pushing to a local registry, +# see https://github.com/docker/buildx/issues/94. +# However, that then runs into https://github.com/docker/cli/issues/2396. +# +# What works for local testing is: +# make push-multiarch PULL_BASE_REF=master REGISTRY_NAME= BUILD_PLATFORMS="linux amd64; windows amd64 .exe; linux ppc64le -ppc64le; linux s390x -s390x" +DOCKER_BUILDX_CREATE_ARGS ?= + +# This target builds a multiarch image for one command using Moby BuildKit builder toolkit. +# Docker Buildx is included in Docker 19.03. +# +# ./cmd//Dockerfile[.Windows] is used if found, otherwise Dockerfile[.Windows]. +# BUILD_PLATFORMS determines which individual images are included in the multiarch image. +# PULL_BASE_REF must be set to 'master', 'release-x.y', or a tag name, and determines +# the tag for the resulting multiarch image. +push-multiarch-%: check-pull-base-ref build-% + set -ex; \ + DOCKER_CLI_EXPERIMENTAL=enabled; \ + export DOCKER_CLI_EXPERIMENTAL; \ + docker buildx create $(DOCKER_BUILDX_CREATE_ARGS) --use --name multiarchimage-buildertest; \ + trap "docker buildx rm multiarchimage-buildertest" EXIT; \ + dockerfile_linux=$$(if [ -e ./cmd/$*/Dockerfile ]; then echo ./cmd/$*/Dockerfile; else echo Dockerfile; fi); \ + dockerfile_windows=$$(if [ -e ./cmd/$*/Dockerfile.Windows ]; then echo ./cmd/$*/Dockerfile.Windows; else echo Dockerfile.Windows; fi); \ + if [ '$(BUILD_PLATFORMS)' ]; then build_platforms='$(BUILD_PLATFORMS)'; else build_platforms="linux amd64"; fi; \ + pushMultiArch () { \ + tag=$$1; \ + echo "$$build_platforms" | tr ';' '\n' | while read -r os arch suffix; do \ + docker buildx build --push \ + --tag $(IMAGE_NAME):$$arch-$$os-$$tag \ + --platform=$$os/$$arch \ + --file $$(eval echo \$${dockerfile_$$os}) \ + --build-arg binary=./bin/$*$$suffix \ + --label revision=$(REV) \ + .; \ + done; \ + images=$$(echo "$$build_platforms" | tr ';' '\n' | while read -r os arch suffix; do echo $(IMAGE_NAME):$$arch-$$os-$$tag; done); \ + docker manifest create --amend $(IMAGE_NAME):$$tag $$images; \ + docker manifest push -p $(IMAGE_NAME):$$tag; \ + }; \ + if [ $(PULL_BASE_REF) = "master" ]; then \ + : "creating or overwriting canary image"; \ + pushMultiArch canary; \ + elif echo $(PULL_BASE_REF) | grep -q -e 'release-*' ; then \ + : "creating or overwriting canary image for release branch"; \ + release_canary_tag=$$(echo $(PULL_BASE_REF) | cut -f2 -d '-')-canary; \ + pushMultiArch $$release_canary_tag; \ + elif docker pull $(IMAGE_NAME):$(PULL_BASE_REF) 2>&1 | tee /dev/stderr | grep -q "manifest for $(IMAGE_NAME):$(PULL_BASE_REF) not found"; then \ + : "creating release image"; \ + pushMultiArch $(PULL_BASE_REF); \ + else \ + : "ERROR: release image $(IMAGE_NAME):$(PULL_BASE_REF) already exists: a new tag is required!"; \ + exit 1; \ + fi + +.PHONY: check-pull-base-ref +check-pull-base-ref: + if ! [ "$(PULL_BASE_REF)" ]; then \ + echo >&2 "ERROR: PULL_BASE_REF must be set to 'master', 'release-x.y', or a tag name."; \ + exit 1; \ + fi + +push-multiarch: $(CMDS:%=push-multiarch-%) + clean: -rm -rf bin diff --git a/cloudbuild.sh b/cloudbuild.sh new file mode 100755 index 00000000..3ba11eca --- /dev/null +++ b/cloudbuild.sh @@ -0,0 +1,6 @@ +#! /bin/bash + +# shellcheck disable=SC1091 +. release-tools/prow.sh + +gcr_cloud_build diff --git a/cloudbuild.yaml b/cloudbuild.yaml new file mode 100644 index 00000000..1def1499 --- /dev/null +++ b/cloudbuild.yaml @@ -0,0 +1,44 @@ +# A configuration file for multi-arch image building with the Google cloud build service. +# +# Repos using this file must: +# - import csi-release-tools +# - add a symlink cloudbuild.yaml -> release-tools/cloudbuild.yaml +# - add a .cloudbuild.sh which can be a custom file or a symlink +# to release-tools/cloudbuild.sh +# - accept "binary" as build argument in their Dockerfile(s) (see +# https://github.com/pohly/node-driver-registrar/blob/3018101987b0bb6da2a2657de607174d6e3728f7/Dockerfile#L4-L6) +# because binaries will get built for different architectures and then +# get copied from the built host into the container image +# +# See https://github.com/kubernetes/test-infra/blob/master/config/jobs/image-pushing/README.md +# for more details on image pushing process in Kubernetes. + +# This must be specified in seconds. If omitted, defaults to 600s (10 mins). +timeout: 1200s +# This prevents errors if you don't use both _GIT_TAG and _PULL_BASE_REF, +# or any new substitutions added in the future. +options: + substitution_option: ALLOW_LOOSE +steps: + # The image must contain bash and curl. Ideally it should also contain + # the desired version of Go (currently defined in release-tools/travis.yml), + # but that just speeds up the build and is not required. + - name: 'gcr.io/k8s-testimages/gcb-docker-gcloud:v20200421-a2bf5f8' + entrypoint: ./.cloudbuild.sh + env: + - GIT_TAG=${_GIT_TAG} + - PULL_BASE_REF=${_PULL_BASE_REF} + - REGISTRY_NAME=gcr.io/${_STAGING_PROJECT} + - HOME=/root +substitutions: + # _GIT_TAG will be filled with a git-based tag for the image, of the form vYYYYMMDD-hash, and + # can be used as a substitution. + _GIT_TAG: '12345' + # _PULL_BASE_REF will contain the ref that was pushed to trigger this build - + # a branch like 'master' or 'release-0.2', or a tag like 'v0.2'. + _PULL_BASE_REF: 'master' + # The default gcr.io staging project for Kubernetes-CSI + # (=> https://console.cloud.google.com/gcr/images/k8s-staging-csi/GLOBAL). + # Might be overridden in the Prow build job for a repo which wants + # images elsewhere. + _STAGING_PROJECT: 'k8s-staging-csi' diff --git a/prow.sh b/prow.sh index 0b962f04..93964e18 100755 --- a/prow.sh +++ b/prow.sh @@ -1189,3 +1189,17 @@ main () { return "$ret" } + +# This function can be called by a repo's top-level cloudbuild.sh: +# it handles environment set up in the GCR cloud build and then +# invokes "make push-multiarch" to do the actual image building. +gcr_cloud_build () { + # Register gcloud as a Docker credential helper. + # Required for "docker buildx build --push". + gcloud auth configure-docker + + # Extract tag-n-hash value from GIT_TAG (form vYYYYMMDD-tag-n-hash) for REV value. + REV=v$(echo "$GIT_TAG" | cut -f3- -d 'v') + + run_with_go "${CSI_PROW_GO_VERSION_BUILD}" make push-multiarch REV="${REV}" REGISTRY_NAME="${REGISTRY_NAME}" BUILD_PLATFORMS="${CSI_PROW_BUILD_PLATFORMS}" +} From 4569f27a8cf57336ea13d8ef3dc4423c76712913 Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Wed, 3 Jun 2020 11:03:47 +0200 Subject: [PATCH 091/242] build.make: fix push-multiarch ambiguity "make push-multiarch" matched both push-multiarch and push-%. This seems to be none-deterministic and in at least one repo (external-provisioner), make picked the wildcard rule which then failed because there is no "multiarch" command. This ambiguity gets resolved by instantiating the wildcard rules only for existing commands. The advantage also is that "make push-no-such-command" will fail with an obvious "No rule to make target 'push-no-such-command'" instead of attempting to build the command. --- build.make | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/build.make b/build.make index e3a44f96..0e4a9baa 100644 --- a/build.make +++ b/build.make @@ -71,7 +71,7 @@ BUILD_PLATFORMS = # This builds each command (= the sub-directories of ./cmd) for the target platform(s) # defined by BUILD_PLATFORMS. -build-%: check-go-version-go +$(CMDS:%=build-%): build-%: check-go-version-go mkdir -p bin echo '$(BUILD_PLATFORMS)' | tr ';' '\n' | while read -r os arch suffix; do \ if ! (set -x; CGO_ENABLED=0 GOOS="$$os" GOARCH="$$arch" go build $(GOFLAGS_VENDOR) -a -ldflags '-X main.version=$(REV) -extldflags "-static"' -o "./bin/$*$$suffix" ./cmd/$*); then \ @@ -80,10 +80,10 @@ build-%: check-go-version-go fi; \ done -container-%: build-% +$(CMDS:%=container-%): container-%: build-% docker build -t $*:latest -f $(shell if [ -e ./cmd/$*/Dockerfile ]; then echo ./cmd/$*/Dockerfile; else echo Dockerfile; fi) --label revision=$(REV) . -push-%: container-% +$(CMDS:%=push-%): push-%: container-% set -ex; \ push_image () { \ docker tag $*:latest $(IMAGE_NAME):$$tag; \ @@ -120,7 +120,7 @@ DOCKER_BUILDX_CREATE_ARGS ?= # BUILD_PLATFORMS determines which individual images are included in the multiarch image. # PULL_BASE_REF must be set to 'master', 'release-x.y', or a tag name, and determines # the tag for the resulting multiarch image. -push-multiarch-%: check-pull-base-ref build-% +$(CMDS:%=push-multiarch-%): push-multiarch-%: check-pull-base-ref build-% set -ex; \ DOCKER_CLI_EXPERIMENTAL=enabled; \ export DOCKER_CLI_EXPERIMENTAL; \ From 5231f05d8b2f7a6b656fb27d84abcb758000842b Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Wed, 3 Jun 2020 11:04:29 +0200 Subject: [PATCH 092/242] build.make: properly declare push-multiarch It's not a real file and thus should better be marked as phony. --- build.make | 1 + 1 file changed, 1 insertion(+) diff --git a/build.make b/build.make index 0e4a9baa..83d903e0 100644 --- a/build.make +++ b/build.make @@ -166,6 +166,7 @@ check-pull-base-ref: exit 1; \ fi +.PHONY: push-multiarch push-multiarch: $(CMDS:%=push-multiarch-%) clean: From 340e082f04321801f51cdff42576bd55dcfc3683 Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Wed, 3 Jun 2020 11:05:05 +0200 Subject: [PATCH 093/242] build.make: optional inclusion of Windows in multiarch images Most repos inherit the default BUILD_PLATFORMS, which includes Windows, but don't have the necessary Dockerfile.Windows yet. To simplify the rollout of multiarch image builds, Windows binary building continues to be tested (i.e. BUILD_PLATFORMS remains unchanged), but push-multiarch skips Windows if the Dockerfile.Windows is missing. --- build.make | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/build.make b/build.make index 83d903e0..c17a1c19 100644 --- a/build.make +++ b/build.make @@ -117,6 +117,10 @@ DOCKER_BUILDX_CREATE_ARGS ?= # Docker Buildx is included in Docker 19.03. # # ./cmd//Dockerfile[.Windows] is used if found, otherwise Dockerfile[.Windows]. +# It is currently optional: if no such file exists, Windows images are not included, +# even when Windows is listed in BUILD_PLATFORMS. That way, projects can test that +# Windows binaries can be built before adding a Dockerfile for it. +# # BUILD_PLATFORMS determines which individual images are included in the multiarch image. # PULL_BASE_REF must be set to 'master', 'release-x.y', or a tag name, and determines # the tag for the resulting multiarch image. @@ -129,6 +133,9 @@ $(CMDS:%=push-multiarch-%): push-multiarch-%: check-pull-base-ref build-% dockerfile_linux=$$(if [ -e ./cmd/$*/Dockerfile ]; then echo ./cmd/$*/Dockerfile; else echo Dockerfile; fi); \ dockerfile_windows=$$(if [ -e ./cmd/$*/Dockerfile.Windows ]; then echo ./cmd/$*/Dockerfile.Windows; else echo Dockerfile.Windows; fi); \ if [ '$(BUILD_PLATFORMS)' ]; then build_platforms='$(BUILD_PLATFORMS)'; else build_platforms="linux amd64"; fi; \ + if ! [ -f "$$dockerfile_windows" ]; then \ + build_platforms="$$(echo "$$build_platforms" | sed -e 's/windows *[^ ]* *.exe//g' -e 's/; *;/;/g')"; \ + fi; \ pushMultiArch () { \ tag=$$1; \ echo "$$build_platforms" | tr ';' '\n' | while read -r os arch suffix; do \ From db0c2a7dc80d5b6d65ac8e4e8c64026f342fd987 Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Thu, 4 Jun 2020 10:52:04 +0200 Subject: [PATCH 094/242] cloud build: initialize support for running commands in Dockerfile If the Dockerfile needs to run some command, that step fails unless QEMU is set up properly first: failed to solve: rpc error: code = Unknown desc = failed to load LLB: runtime execution on platform linux/ppc64le not supported --- prow.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/prow.sh b/prow.sh index 93964e18..32ec871a 100755 --- a/prow.sh +++ b/prow.sh @@ -1198,6 +1198,12 @@ gcr_cloud_build () { # Required for "docker buildx build --push". gcloud auth configure-docker + if find . -name Dockerfile | grep -v ^./vendor | xargs --no-run-if-empty cat | grep -q ^RUN; then + # Needed for "RUN" steps on non-linux/amd64 platforms. + # See https://github.com/multiarch/qemu-user-static#getting-started + (set -x; docker run --rm --privileged multiarch/qemu-user-static --reset -p yes) + fi + # Extract tag-n-hash value from GIT_TAG (form vYYYYMMDD-tag-n-hash) for REV value. REV=v$(echo "$GIT_TAG" | cut -f3- -d 'v') From 3df86b7d437d7126a1ffb79ff05b0e467748b920 Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Fri, 12 Jun 2020 15:48:26 +0200 Subject: [PATCH 095/242] cloud build: k8s-staging-sig-storage As discussed in https://github.com/kubernetes/k8s.io/pull/943, we want to consolidate under k8s-staging-sig-storage. --- cloudbuild.yaml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index 1def1499..a22c0e7a 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -12,6 +12,8 @@ # # See https://github.com/kubernetes/test-infra/blob/master/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/master/k8s.gcr.io/images/k8s-staging-sig-storage. # This must be specified in seconds. If omitted, defaults to 600s (10 mins). timeout: 1200s @@ -38,7 +40,7 @@ substitutions: # a branch like 'master' or 'release-0.2', or a tag like 'v0.2'. _PULL_BASE_REF: 'master' # The default gcr.io staging project for Kubernetes-CSI - # (=> https://console.cloud.google.com/gcr/images/k8s-staging-csi/GLOBAL). + # (=> https://console.cloud.google.com/gcr/images/k8s-staging-sig-storage/GLOBAL). # Might be overridden in the Prow build job for a repo which wants # images elsewhere. - _STAGING_PROJECT: 'k8s-staging-csi' + _STAGING_PROJECT: 'k8s-staging-sig-storage' From 43e50d6f6471f476acd5c90cd3788e198a86d9f8 Mon Sep 17 00:00:00 2001 From: Yibo Cai Date: Tue, 16 Jun 2020 10:45:09 +0800 Subject: [PATCH 096/242] prow.sh: enable building arm64 image --- prow.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prow.sh b/prow.sh index 32ec871a..9778635f 100755 --- a/prow.sh +++ b/prow.sh @@ -85,7 +85,7 @@ get_versioned_variable () { echo "$value" } -configvar CSI_PROW_BUILD_PLATFORMS "linux amd64; windows amd64 .exe; linux ppc64le -ppc64le; linux s390x -s390x" "Go target platforms (= GOOS + GOARCH) and file suffix of the resulting binaries" +configvar CSI_PROW_BUILD_PLATFORMS "linux amd64; windows amd64 .exe; linux ppc64le -ppc64le; linux s390x -s390x; linux arm64 -arm64" "Go target platforms (= GOOS + GOARCH) and file suffix of the resulting binaries" # If we have a vendor directory, then use it. We must be careful to only # use this for "make" invocations inside the project's repo itself because From 36ea4ffae0fabb9404ad1588be285fe739b6e565 Mon Sep 17 00:00:00 2001 From: Animesh Kumar Date: Wed, 17 Jun 2020 18:05:08 +0530 Subject: [PATCH 097/242] filter-junit: Fix golint error Signed-off-by: Animesh Kumar --- filter-junit.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/filter-junit.go b/filter-junit.go index 2f51be00..1da224a0 100644 --- a/filter-junit.go +++ b/filter-junit.go @@ -15,9 +15,9 @@ limitations under the License. */ /* - * This command filters a JUnit file such that only tests with a name - * matching a regular expression are passed through. By concatenating - * multiple input files it is possible to merge them into a single file. +This command filters a JUnit file such that only tests with a name +matching a regular expression are passed through. By concatenating +multiple input files it is possible to merge them into a single file. */ package main From 5a54e67d80858259793f0b970c227153db1f4c06 Mon Sep 17 00:00:00 2001 From: Animesh Kumar Date: Thu, 18 Jun 2020 13:07:40 +0530 Subject: [PATCH 098/242] filter-junit: Fix gofmt error Signed-off-by: Animesh Kumar --- filter-junit.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filter-junit.go b/filter-junit.go index 1da224a0..cf1cb4ab 100644 --- a/filter-junit.go +++ b/filter-junit.go @@ -18,7 +18,7 @@ limitations under the License. This command filters a JUnit file such that only tests with a name matching a regular expression are passed through. By concatenating multiple input files it is possible to merge them into a single file. - */ +*/ package main import ( From d738c820b42d36732f6886de50012c94f30fce81 Mon Sep 17 00:00:00 2001 From: Nikhita Raghunath Date: Thu, 25 Jun 2020 11:41:58 +0530 Subject: [PATCH 099/242] Initial commit --- CONTRIBUTING.md | 31 +++++++ LICENSE | 201 +++++++++++++++++++++++++++++++++++++++++++++ OWNERS | 6 ++ OWNERS_ALIASES | 15 ++++ README.md | 29 +++++++ RELEASE.md | 9 ++ SECURITY_CONTACTS | 14 ++++ code-of-conduct.md | 3 + 8 files changed, 308 insertions(+) create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE create mode 100644 OWNERS create mode 100644 OWNERS_ALIASES create mode 100644 README.md create mode 100644 RELEASE.md create mode 100644 SECURITY_CONTACTS create mode 100644 code-of-conduct.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..3cbbabb5 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,31 @@ +# Contributing Guidelines + +Welcome to Kubernetes. We are excited about the prospect of you joining our [community](https://git.k8s.io/community)! The Kubernetes community abides by the CNCF [code of conduct](code-of-conduct.md). Here is an excerpt: + +_As contributors and maintainers of this project, and in the interest of fostering an open and welcoming community, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities._ + +## Getting Started + +We have full documentation on how to get started contributing here: + + + +- [Contributor License Agreement](https://git.k8s.io/community/CLA.md) Kubernetes projects require that you sign a Contributor License Agreement (CLA) before we can accept your pull requests +- [Kubernetes Contributor Guide](https://git.k8s.io/community/contributors/guide) - Main contributor documentation, or you can just jump directly to the [contributing section](https://git.k8s.io/community/contributors/guide#contributing) +- [Contributor Cheat Sheet](https://git.k8s.io/community/contributors/guide/contributor-cheatsheet) - Common resources for existing developers + +## Mentorship + +- [Mentoring Initiatives](https://git.k8s.io/community/mentoring) - We have a diverse set of mentorship programs available that are always looking for volunteers! + + diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..8dada3ed --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + 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. diff --git a/OWNERS b/OWNERS new file mode 100644 index 00000000..f3508c95 --- /dev/null +++ b/OWNERS @@ -0,0 +1,6 @@ +# See the OWNERS docs at https://go.k8s.io/owners + +approvers: + # TODO: in your repo created from this template, you should replace the + # steering-committee with a list of project owners, see the doc linked above. + - steering-committee diff --git a/OWNERS_ALIASES b/OWNERS_ALIASES new file mode 100644 index 00000000..3a101b99 --- /dev/null +++ b/OWNERS_ALIASES @@ -0,0 +1,15 @@ +# See the OWNERS docs at https://go.k8s.io/owners#owners_aliases + +aliases: + # TODO: remove this alias, it will go stale in your repo, and in your repo + # you should have your own set of approvers (see OWNERS) + # in the original template repo, we must maintain this list to approve changes + # to the template itself + steering-committee: + - cblecker + - derekwaynecarr + - dims + - lachie83 + - nikhita + - parispittman + - spiffxp diff --git a/README.md b/README.md new file mode 100644 index 00000000..ba5444fd --- /dev/null +++ b/README.md @@ -0,0 +1,29 @@ +# Kubernetes Template Project + +The Kubernetes Template Project is a template for starting new projects in the GitHub organizations owned by Kubernetes. All Kubernetes projects, at minimum, must have the following files: + +- a `README.md` outlining the project goals, sponsoring sig, and community contact information +- an `OWNERS` with the project leads listed as approvers ([docs on `OWNERS` files][owners]) +- a `CONTRIBUTING.md` outlining how to contribute to the project +- an unmodified copy of `code-of-conduct.md` from this repo, which outlines community behavior and the consequences of breaking the code +- a `LICENSE` which must be Apache 2.0 for code projects, or [Creative Commons 4.0] for documentation repositories, without any custom content +- a `SECURITY_CONTACTS` with the contact points for the Product Security Team + to reach out to for triaging and handling of incoming issues. They must agree to abide by the + [Embargo Policy](https://git.k8s.io/security/private-distributors-list.md#embargo-policy) + and will be removed and replaced if they violate that agreement. + +## Community, discussion, contribution, and support + +Learn how to engage with the Kubernetes community on the [community page](http://kubernetes.io/community/). + +You can reach the maintainers of this project at: + +- [Slack](http://slack.k8s.io/) +- [Mailing List](https://groups.google.com/forum/#!forum/kubernetes-dev) + +### Code of conduct + +Participation in the Kubernetes community is governed by the [Kubernetes Code of Conduct](code-of-conduct.md). + +[owners]: https://git.k8s.io/community/contributors/guide/owners.md +[Creative Commons 4.0]: https://git.k8s.io/website/LICENSE diff --git a/RELEASE.md b/RELEASE.md new file mode 100644 index 00000000..7274b344 --- /dev/null +++ b/RELEASE.md @@ -0,0 +1,9 @@ +# Release Process + +The Kubernetes Template Project is released on an as-needed basis. The process is as follows: + +1. An issue is proposing a new release with a changelog since the last release +1. All [OWNERS](OWNERS) must LGTM this release +1. An OWNER runs `git tag -s $VERSION` and inserts the changelog and pushes the tag with `git push $VERSION` +1. The release issue is closed +1. An announcement email is sent to `kubernetes-dev@googlegroups.com` with the subject `[ANNOUNCE] kubernetes-template-project $VERSION is released` diff --git a/SECURITY_CONTACTS b/SECURITY_CONTACTS new file mode 100644 index 00000000..4dfb303b --- /dev/null +++ b/SECURITY_CONTACTS @@ -0,0 +1,14 @@ +# Defined below are the security contacts for this repo. +# +# They are the contact point for the Product Security Committee to reach out +# to for triaging and handling of incoming issues. +# +# The below names agree to abide by the +# [Embargo Policy](https://git.k8s.io/security/private-distributors-list.md#embargo-policy) +# and will be removed and replaced if they violate that agreement. +# +# DO NOT REPORT SECURITY VULNERABILITIES DIRECTLY TO THESE NAMES, FOLLOW THE +# INSTRUCTIONS AT https://kubernetes.io/security/ + +bob +alice diff --git a/code-of-conduct.md b/code-of-conduct.md new file mode 100644 index 00000000..0d15c00c --- /dev/null +++ b/code-of-conduct.md @@ -0,0 +1,3 @@ +# Kubernetes Community Code of Conduct + +Please refer to our [Kubernetes Community Code of Conduct](https://git.k8s.io/community/code-of-conduct.md) From 0d638f006f223489affe97f1bdeafcd142af685d Mon Sep 17 00:00:00 2001 From: Nikhita Raghunath Date: Thu, 25 Jun 2020 11:45:46 +0530 Subject: [PATCH 100/242] Update template files to include repo-specific info --- CONTRIBUTING.md | 9 ++------- OWNERS | 7 ++++--- OWNERS_ALIASES | 15 --------------- README.md | 21 ++++----------------- SECURITY_CONTACTS | 6 ++++-- 5 files changed, 14 insertions(+), 44 deletions(-) delete mode 100644 OWNERS_ALIASES diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3cbbabb5..38ec4ebc 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -20,12 +20,7 @@ If your repo has certain guidelines for contribution, put them here ahead of the - [Mentoring Initiatives](https://git.k8s.io/community/mentoring) - We have a diverse set of mentorship programs available that are always looking for volunteers! - +- [Slack](https://kubernetes.slack.com/messages/sig-storage) +- [Mailing List](https://groups.google.com/forum/#!forum/kubernetes-sig-storage) diff --git a/OWNERS b/OWNERS index f3508c95..b3c654f2 100644 --- a/OWNERS +++ b/OWNERS @@ -1,6 +1,7 @@ # See the OWNERS docs at https://go.k8s.io/owners approvers: - # TODO: in your repo created from this template, you should replace the - # steering-committee with a list of project owners, see the doc linked above. - - steering-committee + - jsafrane + - msau42 + - saad-ali + - xing-yang diff --git a/OWNERS_ALIASES b/OWNERS_ALIASES deleted file mode 100644 index 3a101b99..00000000 --- a/OWNERS_ALIASES +++ /dev/null @@ -1,15 +0,0 @@ -# See the OWNERS docs at https://go.k8s.io/owners#owners_aliases - -aliases: - # TODO: remove this alias, it will go stale in your repo, and in your repo - # you should have your own set of approvers (see OWNERS) - # in the original template repo, we must maintain this list to approve changes - # to the template itself - steering-committee: - - cblecker - - derekwaynecarr - - dims - - lachie83 - - nikhita - - parispittman - - spiffxp diff --git a/README.md b/README.md index ba5444fd..cb313500 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,6 @@ -# Kubernetes Template Project +# Container Object Storage Specification -The Kubernetes Template Project is a template for starting new projects in the GitHub organizations owned by Kubernetes. All Kubernetes projects, at minimum, must have the following files: - -- a `README.md` outlining the project goals, sponsoring sig, and community contact information -- an `OWNERS` with the project leads listed as approvers ([docs on `OWNERS` files][owners]) -- a `CONTRIBUTING.md` outlining how to contribute to the project -- an unmodified copy of `code-of-conduct.md` from this repo, which outlines community behavior and the consequences of breaking the code -- a `LICENSE` which must be Apache 2.0 for code projects, or [Creative Commons 4.0] for documentation repositories, without any custom content -- a `SECURITY_CONTACTS` with the contact points for the Product Security Team - to reach out to for triaging and handling of incoming issues. They must agree to abide by the - [Embargo Policy](https://git.k8s.io/security/private-distributors-list.md#embargo-policy) - and will be removed and replaced if they violate that agreement. +Kubernetes specific Container Object Storage Interface (COSI) components. ## Community, discussion, contribution, and support @@ -18,12 +8,9 @@ Learn how to engage with the Kubernetes community on the [community page](http:/ You can reach the maintainers of this project at: -- [Slack](http://slack.k8s.io/) -- [Mailing List](https://groups.google.com/forum/#!forum/kubernetes-dev) +- [Slack](https://kubernetes.slack.com/messages/sig-storage) +- [Mailing List](https://groups.google.com/forum/#!forum/kubernetes-sig-storage) ### Code of conduct Participation in the Kubernetes community is governed by the [Kubernetes Code of Conduct](code-of-conduct.md). - -[owners]: https://git.k8s.io/community/contributors/guide/owners.md -[Creative Commons 4.0]: https://git.k8s.io/website/LICENSE diff --git a/SECURITY_CONTACTS b/SECURITY_CONTACTS index 4dfb303b..8a7b91d5 100644 --- a/SECURITY_CONTACTS +++ b/SECURITY_CONTACTS @@ -10,5 +10,7 @@ # DO NOT REPORT SECURITY VULNERABILITIES DIRECTLY TO THESE NAMES, FOLLOW THE # INSTRUCTIONS AT https://kubernetes.io/security/ -bob -alice +jsafrane +msau42 +saad-ali +xing-yang From 1fdf2d53cddecb5e847ad810d0097e1e44a7b5f6 Mon Sep 17 00:00:00 2001 From: namrata-ibm Date: Wed, 8 Jul 2020 08:03:24 -0400 Subject: [PATCH 101/242] cloud build: bump timeout in Prow job --- cloudbuild.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index a22c0e7a..8f678924 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -16,7 +16,7 @@ # To promote release images, see https://github.com/kubernetes/k8s.io/tree/master/k8s.gcr.io/images/k8s-staging-sig-storage. # This must be specified in seconds. If omitted, defaults to 600s (10 mins). -timeout: 1200s +timeout: 1800s # This prevents errors if you don't use both _GIT_TAG and _PULL_BASE_REF, # or any new substitutions added in the future. options: From 75ca2dcbf85f899128e197649433153bb52334f3 Mon Sep 17 00:00:00 2001 From: Srini Brahmaroutu Date: Mon, 20 Jul 2020 13:12:15 -0700 Subject: [PATCH 102/242] Making this repo Draft only unitl kep is merged --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index cb313500..b0de48e5 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,6 @@ +# DRAFT ONLY : UNTIL KEP IS MERGED + https://github.com/kubernetes/enhancements/pull/1383 + # Container Object Storage Specification Kubernetes specific Container Object Storage Interface (COSI) components. From e7053d55e79f30a20113d18f3af7dec38c430715 Mon Sep 17 00:00:00 2001 From: Nikhita Raghunath Date: Wed, 22 Jul 2020 10:45:06 +0530 Subject: [PATCH 103/242] Initial commit --- CONTRIBUTING.md | 31 +++++++ LICENSE | 201 +++++++++++++++++++++++++++++++++++++++++++++ OWNERS | 6 ++ OWNERS_ALIASES | 15 ++++ README.md | 29 +++++++ RELEASE.md | 9 ++ SECURITY_CONTACTS | 14 ++++ code-of-conduct.md | 3 + 8 files changed, 308 insertions(+) create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE create mode 100644 OWNERS create mode 100644 OWNERS_ALIASES create mode 100644 README.md create mode 100644 RELEASE.md create mode 100644 SECURITY_CONTACTS create mode 100644 code-of-conduct.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..3cbbabb5 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,31 @@ +# Contributing Guidelines + +Welcome to Kubernetes. We are excited about the prospect of you joining our [community](https://git.k8s.io/community)! The Kubernetes community abides by the CNCF [code of conduct](code-of-conduct.md). Here is an excerpt: + +_As contributors and maintainers of this project, and in the interest of fostering an open and welcoming community, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities._ + +## Getting Started + +We have full documentation on how to get started contributing here: + + + +- [Contributor License Agreement](https://git.k8s.io/community/CLA.md) Kubernetes projects require that you sign a Contributor License Agreement (CLA) before we can accept your pull requests +- [Kubernetes Contributor Guide](https://git.k8s.io/community/contributors/guide) - Main contributor documentation, or you can just jump directly to the [contributing section](https://git.k8s.io/community/contributors/guide#contributing) +- [Contributor Cheat Sheet](https://git.k8s.io/community/contributors/guide/contributor-cheatsheet) - Common resources for existing developers + +## Mentorship + +- [Mentoring Initiatives](https://git.k8s.io/community/mentoring) - We have a diverse set of mentorship programs available that are always looking for volunteers! + + diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..8dada3ed --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + 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. diff --git a/OWNERS b/OWNERS new file mode 100644 index 00000000..f3508c95 --- /dev/null +++ b/OWNERS @@ -0,0 +1,6 @@ +# See the OWNERS docs at https://go.k8s.io/owners + +approvers: + # TODO: in your repo created from this template, you should replace the + # steering-committee with a list of project owners, see the doc linked above. + - steering-committee diff --git a/OWNERS_ALIASES b/OWNERS_ALIASES new file mode 100644 index 00000000..3a101b99 --- /dev/null +++ b/OWNERS_ALIASES @@ -0,0 +1,15 @@ +# See the OWNERS docs at https://go.k8s.io/owners#owners_aliases + +aliases: + # TODO: remove this alias, it will go stale in your repo, and in your repo + # you should have your own set of approvers (see OWNERS) + # in the original template repo, we must maintain this list to approve changes + # to the template itself + steering-committee: + - cblecker + - derekwaynecarr + - dims + - lachie83 + - nikhita + - parispittman + - spiffxp diff --git a/README.md b/README.md new file mode 100644 index 00000000..ba5444fd --- /dev/null +++ b/README.md @@ -0,0 +1,29 @@ +# Kubernetes Template Project + +The Kubernetes Template Project is a template for starting new projects in the GitHub organizations owned by Kubernetes. All Kubernetes projects, at minimum, must have the following files: + +- a `README.md` outlining the project goals, sponsoring sig, and community contact information +- an `OWNERS` with the project leads listed as approvers ([docs on `OWNERS` files][owners]) +- a `CONTRIBUTING.md` outlining how to contribute to the project +- an unmodified copy of `code-of-conduct.md` from this repo, which outlines community behavior and the consequences of breaking the code +- a `LICENSE` which must be Apache 2.0 for code projects, or [Creative Commons 4.0] for documentation repositories, without any custom content +- a `SECURITY_CONTACTS` with the contact points for the Product Security Team + to reach out to for triaging and handling of incoming issues. They must agree to abide by the + [Embargo Policy](https://git.k8s.io/security/private-distributors-list.md#embargo-policy) + and will be removed and replaced if they violate that agreement. + +## Community, discussion, contribution, and support + +Learn how to engage with the Kubernetes community on the [community page](http://kubernetes.io/community/). + +You can reach the maintainers of this project at: + +- [Slack](http://slack.k8s.io/) +- [Mailing List](https://groups.google.com/forum/#!forum/kubernetes-dev) + +### Code of conduct + +Participation in the Kubernetes community is governed by the [Kubernetes Code of Conduct](code-of-conduct.md). + +[owners]: https://git.k8s.io/community/contributors/guide/owners.md +[Creative Commons 4.0]: https://git.k8s.io/website/LICENSE diff --git a/RELEASE.md b/RELEASE.md new file mode 100644 index 00000000..7274b344 --- /dev/null +++ b/RELEASE.md @@ -0,0 +1,9 @@ +# Release Process + +The Kubernetes Template Project is released on an as-needed basis. The process is as follows: + +1. An issue is proposing a new release with a changelog since the last release +1. All [OWNERS](OWNERS) must LGTM this release +1. An OWNER runs `git tag -s $VERSION` and inserts the changelog and pushes the tag with `git push $VERSION` +1. The release issue is closed +1. An announcement email is sent to `kubernetes-dev@googlegroups.com` with the subject `[ANNOUNCE] kubernetes-template-project $VERSION is released` diff --git a/SECURITY_CONTACTS b/SECURITY_CONTACTS new file mode 100644 index 00000000..4dfb303b --- /dev/null +++ b/SECURITY_CONTACTS @@ -0,0 +1,14 @@ +# Defined below are the security contacts for this repo. +# +# They are the contact point for the Product Security Committee to reach out +# to for triaging and handling of incoming issues. +# +# The below names agree to abide by the +# [Embargo Policy](https://git.k8s.io/security/private-distributors-list.md#embargo-policy) +# and will be removed and replaced if they violate that agreement. +# +# DO NOT REPORT SECURITY VULNERABILITIES DIRECTLY TO THESE NAMES, FOLLOW THE +# INSTRUCTIONS AT https://kubernetes.io/security/ + +bob +alice diff --git a/code-of-conduct.md b/code-of-conduct.md new file mode 100644 index 00000000..0d15c00c --- /dev/null +++ b/code-of-conduct.md @@ -0,0 +1,3 @@ +# Kubernetes Community Code of Conduct + +Please refer to our [Kubernetes Community Code of Conduct](https://git.k8s.io/community/code-of-conduct.md) From 2460086c1c91776e70394025aa3a195d47f9efc0 Mon Sep 17 00:00:00 2001 From: Nikhita Raghunath Date: Wed, 22 Jul 2020 10:50:17 +0530 Subject: [PATCH 104/242] Update template files to include repo-specific info --- CONTRIBUTING.md | 9 ++------- OWNERS | 7 ++++--- OWNERS_ALIASES | 15 --------------- README.md | 21 ++++----------------- SECURITY_CONTACTS | 6 ++++-- 5 files changed, 14 insertions(+), 44 deletions(-) delete mode 100644 OWNERS_ALIASES diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3cbbabb5..22b0ac08 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -20,12 +20,7 @@ If your repo has certain guidelines for contribution, put them here ahead of the - [Mentoring Initiatives](https://git.k8s.io/community/mentoring) - We have a diverse set of mentorship programs available that are always looking for volunteers! - +- [Slack](https://kubernetes.slack.com/messages/sig-storage-cosi) +- [Mailing List](https://groups.google.com/forum/#!forum/kubernetes-sig-storage) diff --git a/OWNERS b/OWNERS index f3508c95..b3c654f2 100644 --- a/OWNERS +++ b/OWNERS @@ -1,6 +1,7 @@ # See the OWNERS docs at https://go.k8s.io/owners approvers: - # TODO: in your repo created from this template, you should replace the - # steering-committee with a list of project owners, see the doc linked above. - - steering-committee + - jsafrane + - msau42 + - saad-ali + - xing-yang diff --git a/OWNERS_ALIASES b/OWNERS_ALIASES deleted file mode 100644 index 3a101b99..00000000 --- a/OWNERS_ALIASES +++ /dev/null @@ -1,15 +0,0 @@ -# See the OWNERS docs at https://go.k8s.io/owners#owners_aliases - -aliases: - # TODO: remove this alias, it will go stale in your repo, and in your repo - # you should have your own set of approvers (see OWNERS) - # in the original template repo, we must maintain this list to approve changes - # to the template itself - steering-committee: - - cblecker - - derekwaynecarr - - dims - - lachie83 - - nikhita - - parispittman - - spiffxp diff --git a/README.md b/README.md index ba5444fd..c8b6bfd8 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,6 @@ -# Kubernetes Template Project +# Container Object Storage Controller -The Kubernetes Template Project is a template for starting new projects in the GitHub organizations owned by Kubernetes. All Kubernetes projects, at minimum, must have the following files: - -- a `README.md` outlining the project goals, sponsoring sig, and community contact information -- an `OWNERS` with the project leads listed as approvers ([docs on `OWNERS` files][owners]) -- a `CONTRIBUTING.md` outlining how to contribute to the project -- an unmodified copy of `code-of-conduct.md` from this repo, which outlines community behavior and the consequences of breaking the code -- a `LICENSE` which must be Apache 2.0 for code projects, or [Creative Commons 4.0] for documentation repositories, without any custom content -- a `SECURITY_CONTACTS` with the contact points for the Product Security Team - to reach out to for triaging and handling of incoming issues. They must agree to abide by the - [Embargo Policy](https://git.k8s.io/security/private-distributors-list.md#embargo-policy) - and will be removed and replaced if they violate that agreement. +Container Object Storage Interface (COSI) controller responsible to manage lifecycle of COSI objects. ## Community, discussion, contribution, and support @@ -18,12 +8,9 @@ Learn how to engage with the Kubernetes community on the [community page](http:/ You can reach the maintainers of this project at: -- [Slack](http://slack.k8s.io/) -- [Mailing List](https://groups.google.com/forum/#!forum/kubernetes-dev) +- [Slack](https://kubernetes.slack.com/messages/sig-storage-cosi) +- [Mailing List](https://groups.google.com/forum/#!forum/kubernetes-sig-storage) ### Code of conduct Participation in the Kubernetes community is governed by the [Kubernetes Code of Conduct](code-of-conduct.md). - -[owners]: https://git.k8s.io/community/contributors/guide/owners.md -[Creative Commons 4.0]: https://git.k8s.io/website/LICENSE diff --git a/SECURITY_CONTACTS b/SECURITY_CONTACTS index 4dfb303b..8a7b91d5 100644 --- a/SECURITY_CONTACTS +++ b/SECURITY_CONTACTS @@ -10,5 +10,7 @@ # DO NOT REPORT SECURITY VULNERABILITIES DIRECTLY TO THESE NAMES, FOLLOW THE # INSTRUCTIONS AT https://kubernetes.io/security/ -bob -alice +jsafrane +msau42 +saad-ali +xing-yang From 843bddca1493740fe733d44f749e8ba1e450ad72 Mon Sep 17 00:00:00 2001 From: Michelle Au Date: Wed, 5 Aug 2020 13:29:03 -0700 Subject: [PATCH 105/242] Add steps on promoting release images --- SIDECAR_RELEASE_PROCESS.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/SIDECAR_RELEASE_PROCESS.md b/SIDECAR_RELEASE_PROCESS.md index 6960607e..f6434c82 100644 --- a/SIDECAR_RELEASE_PROCESS.md +++ b/SIDECAR_RELEASE_PROCESS.md @@ -86,6 +86,12 @@ naming convention `-on-`. [external-provisioner example](https://github.com/kubernetes-csi/external-provisioner/releases/new) 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 + the [k8s image + repo](https://github.com/kubernetes/k8s.io/tree/master/k8s.gcr.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 and feature pages with the new released version. 1. After all the sidecars have been released, update From 82d108acdc4dd4cbd6d8d97534000dd5d8ea7e8d Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Wed, 12 Aug 2020 09:42:55 +0200 Subject: [PATCH 106/242] switch to Go 1.15 Go 1.15 was released and is the major version that Kubernetes 1.19.0 is going to use. There are probably bugs in the older 1.13.3 that were fixed, so we should update. --- travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/travis.yml b/travis.yml index bfd7647b..1ab13aef 100644 --- a/travis.yml +++ b/travis.yml @@ -6,7 +6,7 @@ git: depth: false matrix: include: - - go: 1.13.3 + - go: 1.15 before_script: - mkdir -p bin - wget https://github.com/golang/dep/releases/download/v0.5.1/dep-linux-amd64 -O bin/dep From 3b4a2f1d956845ab094e61d8701eab2080226cd3 Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Fri, 14 Aug 2020 14:21:51 +0200 Subject: [PATCH 107/242] prow.sh: fix installing Go for Kubernetes 1.19.0 Kubernetes 1.19.0 uses Go 1.15, but refers to it as 1.15.0. This broke both the check whether we need to install 1.15 (because "go version" reports 1.15, which didn't match 1.15.0) and then downloading the release archive (because the URL also only uses 1.15). --- prow.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/prow.sh b/prow.sh index 9778635f..8ce80cf8 100755 --- a/prow.sh +++ b/prow.sh @@ -513,6 +513,10 @@ go_version_for_kubernetes () ( if ! [ "$go_version" ]; then die "Unable to determine Go version for Kubernetes $version from hack/lib/golang.sh." fi + # Strip the trailing .0. Kubernetes includes it, Go itself doesn't. + # Ignore: See if you can use ${variable//search/replace} instead. + # shellcheck disable=SC2001 + go_version="$(echo "$go_version" | sed -e 's/\.0$//')" echo "$go_version" ) From 0979c091026916e3593022951c08d4f79bdb2bdf Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Fri, 14 Aug 2020 14:23:51 +0200 Subject: [PATCH 108/242] prow.sh: fix E2E suite for Kubernetes >= 1.18 It used to be necessary to override from where the E2E suite came on a case-by-case basis (initially, testing was using a more recent suite against an older Kubernetes). This should never become necessary again and the lack of a specific entry for 1.18 already had the unintended effect that Kubernetes 1.18 was tested with the suite from master, so overall it is better to always use the E2E suite which matches Kubernetes. --- prow.sh | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/prow.sh b/prow.sh index 8ce80cf8..05d397a9 100755 --- a/prow.sh +++ b/prow.sh @@ -218,17 +218,18 @@ configvar CSI_PROW_DRIVER_CANARY "${CSI_PROW_HOSTPATH_CANARY}" "driver image ove # all generated files are present. # # CSI_PROW_E2E_REPO=none disables E2E testing. -# TOOO: remove versioned variables and make e2e version match k8s version -configvar CSI_PROW_E2E_VERSION_1_15 v1.15.0 "E2E version for Kubernetes 1.15.x" -configvar CSI_PROW_E2E_VERSION_1_16 v1.16.0 "E2E version for Kubernetes 1.16.x" -configvar CSI_PROW_E2E_VERSION_1_17 v1.17.0 "E2E version for Kubernetes 1.17.x" -# TODO: add new CSI_PROW_E2E_VERSION entry for future Kubernetes releases -configvar CSI_PROW_E2E_VERSION_LATEST master "E2E version for Kubernetes master" # testing against Kubernetes master is already tracking a moving target, so we might as well use a moving E2E version -configvar CSI_PROW_E2E_REPO_LATEST https://github.com/kubernetes/kubernetes "E2E repo for Kubernetes >= 1.13.x" # currently the same for all versions -configvar CSI_PROW_E2E_IMPORT_PATH_LATEST k8s.io/kubernetes "E2E package for Kubernetes >= 1.13.x" # currently the same for all versions -configvar CSI_PROW_E2E_VERSION "$(get_versioned_variable CSI_PROW_E2E_VERSION "${csi_prow_kubernetes_version_suffix}")" "E2E version" -configvar CSI_PROW_E2E_REPO "$(get_versioned_variable CSI_PROW_E2E_REPO "${csi_prow_kubernetes_version_suffix}")" "E2E repo" -configvar CSI_PROW_E2E_IMPORT_PATH "$(get_versioned_variable CSI_PROW_E2E_IMPORT_PATH "${csi_prow_kubernetes_version_suffix}")" "E2E package" +tag_from_version () { + version="$1" + shift + case "$version" in + latest) echo "master";; + release-*) echo "$version";; + *) echo "v$version";; + esac +} +configvar CSI_PROW_E2E_VERSION "$(tag_from_version "${CSI_PROW_KUBERNETES_VERSION}")" "E2E version" +configvar CSI_PROW_E2E_REPO "https://github.com/kubernetes/kubernetes" "E2E repo" +configvar CSI_PROW_E2E_IMPORT_PATH "k8s.io/kubernetes" "E2E package" # csi-sanity testing from the csi-test repo can be run against the installed # CSI driver. For this to work, deploying the driver must expose the Unix domain From 2c098465dd81ade3fbab1dd251f65d2ec4abc1a5 Mon Sep 17 00:00:00 2001 From: Michelle Au Date: Mon, 24 Aug 2020 16:44:47 -0700 Subject: [PATCH 109/242] Add cleanup instructions to release-notes generation --- SIDECAR_RELEASE_PROCESS.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/SIDECAR_RELEASE_PROCESS.md b/SIDECAR_RELEASE_PROCESS.md index f6434c82..91e837c9 100644 --- a/SIDECAR_RELEASE_PROCESS.md +++ b/SIDECAR_RELEASE_PROCESS.md @@ -54,14 +54,19 @@ naming convention `-on-`. generator](https://github.com/kubernetes/release/tree/master/cmd/release-notes) 1. Generate release notes for the release. Replace arguments with the relevant information. + * Clean up old cached information (also needed if you are generating release + notes for multiple repos) + ```bash + rm -rf /tmp/k8s-repo + ``` * For new minor releases on master: - ``` + ```bash GITHUB_TOKEN= release-notes --discover=mergebase-to-latest --github-org=kubernetes-csi --github-repo=external-provisioner --required-author="" --output out.md ``` * For new patch releases on a release branch: - ``` + ```bash GITHUB_TOKEN= release-notes --discover=patch-to-latest --branch=release-1.1 --github-org=kubernetes-csi --github-repo=external-provisioner --required-author="" --output out.md From 7277b1406daccc4420a911b6bfbb20cd7131081c Mon Sep 17 00:00:00 2001 From: Srini Brahmaroutu Date: Thu, 10 Sep 2020 22:52:57 -0700 Subject: [PATCH 110/242] Adding release tools for CI --- release-tools/.prow.sh | 7 + release-tools/build.make | 194 +++++ release-tools/filter-junit.go | 133 ++++ release-tools/go-get-kubernetes.sh | 104 +++ release-tools/prow.sh | 1183 ++++++++++++++++++++++++++++ release-tools/travis.yml | 21 + release-tools/update-vendor.sh | 23 + release-tools/util.sh | 148 ++++ release-tools/verify-go-version.sh | 51 ++ release-tools/verify-shellcheck.sh | 146 ++++ release-tools/verify-subtree.sh | 41 + release-tools/verify-vendor.sh | 60 ++ 12 files changed, 2111 insertions(+) create mode 100755 release-tools/.prow.sh create mode 100644 release-tools/build.make create mode 100644 release-tools/filter-junit.go create mode 100755 release-tools/go-get-kubernetes.sh create mode 100755 release-tools/prow.sh create mode 100644 release-tools/travis.yml create mode 100755 release-tools/update-vendor.sh create mode 100755 release-tools/util.sh create mode 100755 release-tools/verify-go-version.sh create mode 100755 release-tools/verify-shellcheck.sh create mode 100755 release-tools/verify-subtree.sh create mode 100755 release-tools/verify-vendor.sh diff --git a/release-tools/.prow.sh b/release-tools/.prow.sh new file mode 100755 index 00000000..b18c5358 --- /dev/null +++ b/release-tools/.prow.sh @@ -0,0 +1,7 @@ +#! /bin/bash -e +# +# This is for testing csi-release-tools itself in Prow. All other +# repos use prow.sh for that, but as csi-release-tools isn't a normal +# repo with some Go code in it, it has a custom Prow test script. + +./verify-shellcheck.sh "$(pwd)" diff --git a/release-tools/build.make b/release-tools/build.make new file mode 100644 index 00000000..a717224f --- /dev/null +++ b/release-tools/build.make @@ -0,0 +1,194 @@ +# Copyright 2020 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. + +.PHONY: build-% build container-% container push-% push clean test + +# A space-separated list of all commands in the repository, must be +# set in main Makefile of a repository. +# CMDS= + +# This is the default. It can be overridden in the main Makefile after +# including build.make. +REGISTRY_NAME=quay.io/k8scosi + +# Can be set to -mod=vendor to ensure that the "vendor" directory is used. +GOFLAGS_VENDOR= + +# Revision that gets built into each binary via the main.version +# string. Uses the `git describe` output based on the most recent +# version tag with a short revision suffix or, if nothing has been +# tagged yet, just the revision. +# +# Beware that tags may also be missing in shallow clones as done by +# some CI systems (like TravisCI, which pulls only 50 commits). +REV=$(shell git describe --long --tags --match='v*' --dirty 2>/dev/null || git rev-list -n1 HEAD) + +# A space-separated list of image tags under which the current build is to be pushed. +# Determined dynamically. +IMAGE_TAGS= + +# A "canary" image gets built if the current commit is the head of the remote "master" branch. +# That branch does not exist when building some other branch in TravisCI. +IMAGE_TAGS+=$(shell if [ "$$(git rev-list -n1 HEAD)" = "$$(git rev-list -n1 origin/master 2>/dev/null)" ]; then echo "canary"; fi) + +# A "X.Y.Z-canary" image gets built if the current commit is the head of a "origin/release-X.Y.Z" branch. +# The actual suffix does not matter, only the "release-" prefix is checked. +IMAGE_TAGS+=$(shell git branch -r --points-at=HEAD | grep 'origin/release-' | grep -v -e ' -> ' | sed -e 's;.*/release-\(.*\);\1-canary;') + +# A release image "vX.Y.Z" gets built if there is a tag of that format for the current commit. +# --abbrev=0 suppresses long format, only showing the closest tag. +IMAGE_TAGS+=$(shell tagged="$$(git describe --tags --match='v*' --abbrev=0)"; if [ "$$tagged" ] && [ "$$(git rev-list -n1 HEAD)" = "$$(git rev-list -n1 $$tagged)" ]; then echo $$tagged; fi) + +# Images are named after the command contained in them. +IMAGE_NAME=$(REGISTRY_NAME)/$* + +ifdef V +# Adding "-alsologtostderr" assumes that all test binaries contain glog. This is not guaranteed. +TESTARGS = -v -args -alsologtostderr -v 5 +else +TESTARGS = +endif + +ARCH := $(if $(GOARCH),$(GOARCH),$(shell go env GOARCH)) + +# Specific packages can be excluded from each of the tests below by setting the *_FILTER_CMD variables +# to something like "| grep -v 'github.com/kubernetes-csi/project/pkg/foobar'". See usage below. + +build-%: check-go-version-go + mkdir -p bin + CGO_ENABLED=0 GOOS=linux go build $(GOFLAGS_VENDOR) -a -ldflags '-X main.version=$(REV) -extldflags "-static"' -o ./bin/$* ./cmd/$* + if [ "$$ARCH" = "amd64" ]; then \ + CGO_ENABLED=0 GOOS=windows go build $(GOFLAGS_VENDOR) -a -ldflags '-X main.version=$(REV) -extldflags "-static"' -o ./bin/$*.exe ./cmd/$* ; \ + CGO_ENABLED=0 GOOS=linux GOARCH=ppc64le go build $(GOFLAGS_VENDOR) -a -ldflags '-X main.version=$(REV) -extldflags "-static"' -o ./bin/$*-ppc64le ./cmd/$* ; \ + fi + +container-%: build-% + docker build -t $*:latest -f $(shell if [ -e ./cmd/$*/Dockerfile ]; then echo ./cmd/$*/Dockerfile; else echo Dockerfile; fi) --label revision=$(REV) . + +push-%: container-% + set -ex; \ + push_image () { \ + docker tag $*:latest $(IMAGE_NAME):$$tag; \ + docker push $(IMAGE_NAME):$$tag; \ + }; \ + for tag in $(IMAGE_TAGS); do \ + if [ "$$tag" = "canary" ] || echo "$$tag" | grep -q -e '-canary$$'; then \ + : "creating or overwriting canary image"; \ + push_image; \ + elif docker pull $(IMAGE_NAME):$$tag 2>&1 | tee /dev/stderr | grep -q "manifest for $(IMAGE_NAME):$$tag not found"; then \ + : "creating release image"; \ + push_image; \ + else \ + : "release image $(IMAGE_NAME):$$tag already exists, skipping push"; \ + fi; \ + done + +build: $(CMDS:%=build-%) +container: $(CMDS:%=container-%) +push: $(CMDS:%=push-%) + +clean: + -rm -rf bin + +test: check-go-version-go + +.PHONY: test-go +test: test-go +test-go: + @ echo; echo "### $@:" + go test $(GOFLAGS_VENDOR) `go list $(GOFLAGS_VENDOR) ./... | grep -v -e 'vendor' -e '/test/e2e$$' $(TEST_GO_FILTER_CMD)` $(TESTARGS) + +.PHONY: test-vet +test: test-vet +test-vet: + @ echo; echo "### $@:" + go vet $(GOFLAGS_VENDOR) `go list $(GOFLAGS_VENDOR) ./... | grep -v vendor $(TEST_VET_FILTER_CMD)` + +.PHONY: test-fmt +test: test-fmt +test-fmt: + @ echo; echo "### $@:" + files=$$(find . -name '*.go' | grep -v './vendor' $(TEST_FMT_FILTER_CMD)); \ + if [ $$(gofmt -d $$files | wc -l) -ne 0 ]; then \ + echo "formatting errors:"; \ + gofmt -d $$files; \ + false; \ + fi + +# This test only runs when dep >= 0.5 is installed, which is the case for the CI setup. +# When using 'go mod', we allow the test to be skipped in the Prow CI under some special +# circumstances, because it depends on accessing all remote repos and thus +# running it all the time would defeat the purpose of vendoring: +# - not handling a PR or +# - the fabricated merge commit leaves go.mod, go.sum and vendor dir unchanged +# - release-tools also didn't change (changing rules or Go version might lead to +# a different result and thus must be tested) +# - import statements not changed (because if they change, go.mod might have to be updated) +# +# "git diff" is intelligent enough to annotate changes inside the "import" block in +# the start of the diff hunk: +# +# diff --git a/rpc/common.go b/rpc/common.go +# index bb4a5c4..5fa4271 100644 +# --- a/rpc/common.go +# +++ b/rpc/common.go +# @@ -21,7 +21,6 @@ import ( +# "fmt" +# "time" +# +# - "google.golang.org/grpc" +# "google.golang.org/grpc/codes" +# "google.golang.org/grpc/status" +# +# We rely on that to find such changes. +# +# Vendoring is optional when using go.mod. +.PHONY: test-vendor +test: test-vendor +test-vendor: + @ echo; echo "### $@:" + @ ./release-tools/verify-vendor.sh + +.PHONY: test-subtree +test: test-subtree +test-subtree: + @ echo; echo "### $@:" + ./release-tools/verify-subtree.sh release-tools + +# Components can extend the set of directories which must pass shellcheck. +# The default is to check only the release-tools directory itself. +TEST_SHELLCHECK_DIRS=release-tools +.PHONY: test-shellcheck +test: test-shellcheck +test-shellcheck: + @ echo; echo "### $@:" + @ ret=0; \ + if ! command -v docker; then \ + echo "skipped, no Docker"; \ + exit 0; \ + fi; \ + for dir in $(abspath $(TEST_SHELLCHECK_DIRS)); do \ + echo; \ + echo "$$dir:"; \ + ./release-tools/verify-shellcheck.sh "$$dir" || ret=1; \ + done; \ + exit $$ret + +# Targets in the makefile can depend on check-go-version- +# to trigger a warning if the x.y version of that binary does not match +# what the project uses. Make ensures that this is only checked once per +# invocation. +.PHONY: check-go-version-% +check-go-version-%: + ./release-tools/verify-go-version.sh "$*" diff --git a/release-tools/filter-junit.go b/release-tools/filter-junit.go new file mode 100644 index 00000000..8ba3f6fe --- /dev/null +++ b/release-tools/filter-junit.go @@ -0,0 +1,133 @@ +/* +Copyright 2020 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. +*/ + +/* + * This command filters a JUnit file such that only tests with a name + * matching a regular expression are passed through. By concatenating + * multiple input files it is possible to merge them into a single file. + */ +package main + +import ( + "encoding/xml" + "flag" + "io/ioutil" + "os" + "regexp" +) + +var ( + output = flag.String("o", "-", "junit file to write, - for stdout") + tests = flag.String("t", "", "regular expression matching the test names that are to be included in the output") +) + +/* + * TestSuite represents a JUnit file. Due to how encoding/xml works, we have + * represent all fields that we want to be passed through. It's therefore + * not a complete solution, but good enough for Ginkgo + Spyglass. + */ +type TestSuite struct { + XMLName string `xml:"testsuite"` + TestCases []TestCase `xml:"testcase"` +} + +type TestCase struct { + Name string `xml:"name,attr"` + Time string `xml:"time,attr"` + SystemOut string `xml:"system-out,omitempty"` + Failure string `xml:"failure,omitempty"` + Skipped SkipReason `xml:"skipped,omitempty"` +} + +// SkipReason deals with the special : +// if present, we must re-encode it, even if empty. +type SkipReason string + +func (s *SkipReason) UnmarshalText(text []byte) error { + *s = SkipReason(text) + if *s == "" { + *s = " " + } + return nil +} + +func (s SkipReason) MarshalText() ([]byte, error) { + if s == " " { + return []byte{}, nil + } + return []byte(s), nil +} + +func main() { + var junit TestSuite + var data []byte + + flag.Parse() + + re := regexp.MustCompile(*tests) + + // Read all input files. + for _, input := range flag.Args() { + if input == "-" { + if _, err := os.Stdin.Read(data); err != nil { + panic(err) + } + } else { + var err error + data, err = ioutil.ReadFile(input) + if err != nil { + panic(err) + } + } + if err := xml.Unmarshal(data, &junit); err != nil { + panic(err) + } + } + + // Keep only matching testcases. Testcases skipped in all test runs are only stored once. + filtered := map[string]TestCase{} + for _, testcase := range junit.TestCases { + if !re.MatchString(testcase.Name) { + continue + } + entry, ok := filtered[testcase.Name] + if !ok || // not present yet + entry.Skipped != "" && testcase.Skipped == "" { // replaced skipped test with real test run + filtered[testcase.Name] = testcase + } + } + junit.TestCases = nil + for _, testcase := range filtered { + junit.TestCases = append(junit.TestCases, testcase) + } + + // Re-encode. + data, err := xml.MarshalIndent(junit, "", " ") + if err != nil { + panic(err) + } + + // Write to output. + if *output == "-" { + if _, err := os.Stdout.Write(data); err != nil { + panic(err) + } + } else { + if err := ioutil.WriteFile(*output, data, 0644); err != nil { + panic(err) + } + } +} diff --git a/release-tools/go-get-kubernetes.sh b/release-tools/go-get-kubernetes.sh new file mode 100755 index 00000000..2e739830 --- /dev/null +++ b/release-tools/go-get-kubernetes.sh @@ -0,0 +1,104 @@ +#!/usr/bin/env bash + +# Copyright 2020 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. +# +# This script can be used while converting a repo from "dep" to "go mod" +# by calling it after "go mod init" or to update the Kubernetes packages +# in a repo that has already been converted. Only packages that are +# part of kubernetes/kubernetes and thus part of a Kubernetes release +# are modified. Other k8.io packages (like k8s.io/klog, k8s.io/utils) +# need to be updated separately. + +set -o pipefail + +cmd=$0 + +function help () { + echo "$cmd - update all components from kubernetes/kubernetes to that version" +} + +if [ $# -ne 1 ]; then + help + exit 1 +fi +case "$1" in -h|--help|help) help; exit 0;; esac + +die () { + echo >&2 "$@" + exit 1 +} + +k8s="$1" + +# If the repo imports k8s.io/kubernetes (directly or indirectly), then +# "go mod" will try to find "v0.0.0" versions because +# k8s.io/kubernetes has those in it's go.mod file +# (https://github.com/kubernetes/kubernetes/blob/2bd9643cee5b3b3a5ecbd3af49d09018f0773c77/go.mod#L146-L157). +# (https://github.com/kubernetes/kubernetes/issues/79384). +# +# We need to replicate the replace statements to override those fake +# versions also in our go.mod file (idea and some code from +# https://github.com/kubernetes/kubernetes/issues/79384#issuecomment-521493597). +mods=$( (set -x; curl --silent --show-error --fail "https://raw.githubusercontent.com/kubernetes/kubernetes/v${k8s}/go.mod") | + sed -n 's|.*k8s.io/\(.*\) => ./staging/src/k8s.io/.*|k8s.io/\1|p' + ) || die "failed to determine Kubernetes staging modules" +for mod in $mods; do + # The presence of a potentially incomplete go.mod file affects this command, + # so move elsewhere. + modinfo=$(set -x; cd /; env GO111MODULE=on go mod download -json "$mod@kubernetes-${k8s}") || + die "failed to determine version of $mod: $modinfo" + v=$(echo "$modinfo" | sed -n 's|.*"Version": "\(.*\)".*|\1|p') + (set -x; env GO111MODULE=on go mod edit "-replace=$mod=$mod@$v") || die "'go mod edit' failed" +done + +packages= + +# Beware that we have to work with packages, not modules (i.e. no -m +# flag), because some modules trigger a "no Go code except tests" +# error. Getting their packages works. +if ! packages=$( (set -x; env GO111MODULE=on go list all) | grep ^k8s.io/ | sed -e 's; *;;'); then + cat >&2 <&2 <" go.mod; then + deps="$deps $(echo "$package" | sed -e "s;\$;@kubernetes-$k8s;" -e 's;^k8s.io/kubernetes\(/.*\)@kubernetes-;k8s.io/kubernetes\1@v;')" + fi +done + +# shellcheck disable=SC2086 +(set -x; env GO111MODULE=on go get $deps 2>&1) || die "go get failed" +echo "SUCCESS" diff --git a/release-tools/prow.sh b/release-tools/prow.sh new file mode 100755 index 00000000..ff49f813 --- /dev/null +++ b/release-tools/prow.sh @@ -0,0 +1,1183 @@ +#! /bin/bash +# +# Copyright 2020 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. + + +# This script runs inside a Prow job. It can run unit tests ("make test") +# and E2E testing. This E2E testing covers different scenarios (see +# https://github.com/kubernetes/enhancements/pull/807): +# - running the stable hostpath example against a Kubernetes release +# - running the canary hostpath example against a Kubernetes release +# - building the component in the current repo and running the +# stable hostpath example with that one component replaced against +# a Kubernetes release +# +# The intended usage of this script is that individual repos import +# csi-release-tools, then link their top-level prow.sh to this or +# include it in that file. When including it, several of the variables +# can be overridden in the top-level prow.sh to customize the script +# for the repo. +# +# The expected environment is: +# - $GOPATH/src/ for the repository that is to be tested, +# with PR branch merged (when testing a PR) +# - running on linux-amd64 +# - bazel installed (when testing against Kubernetes master), must be recent +# enough for Kubernetes master +# - kind (https://github.com/kubernetes-sigs/kind) installed +# - optional: Go already installed + +RELEASE_TOOLS_ROOT="$(realpath "$(dirname "${BASH_SOURCE[0]}")")" +REPO_DIR="$(pwd)" + +# Sets the default value for a variable if not set already and logs the value. +# Any variable set this way is usually something that a repo's .prow.sh +# or the job can set. +configvar () { + # Ignore: Word is of the form "A"B"C" (B indicated). Did you mean "ABC" or "A\"B\"C"? + # shellcheck disable=SC2140 + eval : \$\{"$1":="\$2"\} + eval echo "\$3:" "$1=\${$1}" +} + +# Takes the minor version of $CSI_PROW_KUBERNETES_VERSION and overrides it to +# $1 if they are equal minor versions. Ignores versions that begin with +# "release-". +override_k8s_version () { + local current_minor_version + local override_minor_version + + # Ignore: See if you can use ${variable//search/replace} instead. + # shellcheck disable=SC2001 + current_minor_version="$(echo "${CSI_PROW_KUBERNETES_VERSION}" | sed -e 's/\([0-9]*\)\.\([0-9]*\).*/\1\.\2/')" + + # Ignore: See if you can use ${variable//search/replace} instead. + # shellcheck disable=SC2001 + override_minor_version="$(echo "${1}" | sed -e 's/\([0-9]*\)\.\([0-9]*\).*/\1\.\2/')" + if [ "${current_minor_version}" == "${override_minor_version}" ]; then + CSI_PROW_KUBERNETES_VERSION="$1" + echo "Overriding CSI_PROW_KUBERNETES_VERSION with $1: $CSI_PROW_KUBERNETES_VERSION" + fi +} + +# Prints the value of a variable + version suffix, falling back to variable + "LATEST". +get_versioned_variable () { + local var="$1" + local version="$2" + local value + + eval value="\${${var}_${version}}" + if ! [ "$value" ]; then + eval value="\${${var}_LATEST}" + fi + echo "$value" +} + +# If we have a vendor directory, then use it. We must be careful to only +# use this for "make" invocations inside the project's repo itself because +# setting it globally can break other go usages (like "go get " +# which is disabled with GOFLAGS=-mod=vendor). +configvar GOFLAGS_VENDOR "$( [ -d vendor ] && echo '-mod=vendor' )" "Go flags for using the vendor directory" + +# Go versions can be specified seperately for different tasks +# If the pre-installed Go is missing or a different +# version, the required version here will get installed +# from https://golang.org/dl/. +go_from_travis_yml () { + grep "^ *- go:" "${RELEASE_TOOLS_ROOT}/travis.yml" | sed -e 's/.*go: *//' +} +configvar CSI_PROW_GO_VERSION_BUILD "$(go_from_travis_yml)" "Go version for building the component" # depends on component's source code +configvar CSI_PROW_GO_VERSION_E2E "" "override Go version for building the Kubernetes E2E test suite" # normally doesn't need to be set, see install_e2e +configvar CSI_PROW_GO_VERSION_SANITY "${CSI_PROW_GO_VERSION_BUILD}" "Go version for building the csi-sanity test suite" # depends on CSI_PROW_SANITY settings below +configvar CSI_PROW_GO_VERSION_KIND "${CSI_PROW_GO_VERSION_BUILD}" "Go version for building 'kind'" # depends on CSI_PROW_KIND_VERSION below +configvar CSI_PROW_GO_VERSION_GINKGO "${CSI_PROW_GO_VERSION_BUILD}" "Go version for building ginkgo" # depends on CSI_PROW_GINKGO_VERSION below + +# kind version to use. If the pre-installed version is different, +# the desired version is downloaded from https://github.com/kubernetes-sigs/kind/releases/download/ +# (if available), otherwise it is built from source. +configvar CSI_PROW_KIND_VERSION "v0.6.0" "kind" + +# ginkgo test runner version to use. If the pre-installed version is +# different, the desired version is built from source. +configvar CSI_PROW_GINKGO_VERSION v1.7.0 "Ginkgo" + +# Ginkgo runs the E2E test in parallel. The default is based on the number +# of CPUs, but typically this can be set to something higher in the job. +configvar CSI_PROW_GINKO_PARALLEL "-p" "Ginko parallelism parameter(s)" + +# Enables building the code in the repository. On by default, can be +# disabled in jobs which only use pre-built components. +configvar CSI_PROW_BUILD_JOB true "building code in repo enabled" + +# Kubernetes version to test against. This must be a version number +# (like 1.13.3) for which there is a pre-built kind image (see +# https://hub.docker.com/r/kindest/node/tags), "latest" (builds +# Kubernetes from the master branch) or "release-x.yy" (builds +# Kubernetes from a release branch). +# +# This can also be a version that was not released yet at the time +# that the settings below were chose. The script will then +# use the same settings as for "latest" Kubernetes. This works +# as long as there are no breaking changes in Kubernetes, like +# deprecating or changing the implementation of an alpha feature. +configvar CSI_PROW_KUBERNETES_VERSION 1.17.0 "Kubernetes" + +# This is a hack to workaround the issue that each version +# of kind currently only supports specific patch versions of +# Kubernetes. We need to override CSI_PROW_KUBERNETES_VERSION +# passed in by our CI/pull jobs to the versions that +# kind v0.5.0 supports. +# +# If the version is prefixed with "release-", then nothing +# is overridden. +override_k8s_version "1.15.3" + +# CSI_PROW_KUBERNETES_VERSION reduced to first two version numbers and +# with underscore (1_13 instead of 1.13.3) and in uppercase (LATEST +# instead of latest). +# +# This is used to derive the right defaults for the variables below +# when a Prow job just defines the Kubernetes version. +csi_prow_kubernetes_version_suffix="$(echo "${CSI_PROW_KUBERNETES_VERSION}" | tr . _ | tr '[:lower:]' '[:upper:]' | sed -e 's/^RELEASE-//' -e 's/\([0-9]*\)_\([0-9]*\).*/\1_\2/')" + +# Work directory. It has to allow running executables, therefore /tmp +# is avoided. Cleaning up after the script is intentionally left to +# the caller. +configvar CSI_PROW_WORK "$(mkdir -p "$GOPATH/pkg" && mktemp -d "$GOPATH/pkg/csiprow.XXXXXXXXXX")" "work directory" + +# By default, this script tests sidecars with the CSI hostpath driver, +# using the install_csi_driver function. That function depends on +# a deployment script that it searches for in several places: +# +# - The "deploy" directory in the current repository: this is useful +# for the situation that a component becomes incompatible with the +# shared deployment, because then it can (temporarily!) provide its +# own example until the shared one can be updated; it's also how +# csi-driver-host-path itself provides the example. +# +# - CSI_PROW_DRIVER_VERSION of the CSI_PROW_DRIVER_REPO is checked +# out: this allows other repos to reference a version of the example +# that is known to be compatible. +# +# - The /deploy directory can have multiple sub-directories, +# each with different deployments (stable set of images for Kubernetes 1.13, +# stable set of images for Kubernetes 1.14, canary for latest Kubernetes, etc.). +# This is necessary because there may be incompatible changes in the +# "API" of a component (for example, its command line options or RBAC rules) +# or in its support for different Kubernetes versions (CSIDriverInfo as +# CRD in Kubernetes 1.13 vs builtin API in Kubernetes 1.14). +# +# When testing an update for a component in a PR job, the +# CSI_PROW_DEPLOYMENT variable can be set in the +# .prow.sh of each component when there are breaking changes +# that require using a non-default deployment. The default +# is a deployment named "kubernetes-x.yy" (if available), +# otherwise "kubernetes-latest". +# "none" disables the deployment of the hostpath driver. +# +# When no deploy script is found (nothing in `deploy` directory, +# CSI_PROW_DRIVER_REPO=none), nothing gets deployed. +# +# If the deployment script is called with CSI_PROW_TEST_DRIVER= as +# environment variable, then it must write a suitable test driver configuration +# into that file in addition to installing the driver. +configvar CSI_PROW_DRIVER_VERSION "v1.3.0" "CSI driver version" +configvar CSI_PROW_DRIVER_REPO https://github.com/kubernetes-csi/csi-driver-host-path "CSI driver repo" +configvar CSI_PROW_DEPLOYMENT "" "deployment" + +# The install_csi_driver function may work also for other CSI drivers, +# as long as they follow the conventions of the CSI hostpath driver. +# If they don't, then a different install function can be provided in +# a .prow.sh file and this config variable can be overridden. +configvar CSI_PROW_DRIVER_INSTALL "install_csi_driver" "name of the shell function which installs the CSI driver" + +# If CSI_PROW_DRIVER_CANARY is set (typically to "canary", but also +# version tag. Usually empty. CSI_PROW_HOSTPATH_CANARY is +# accepted as alternative name because some test-infra jobs +# still use that name. +configvar CSI_PROW_DRIVER_CANARY "${CSI_PROW_HOSTPATH_CANARY}" "driver image override for canary images" + +# The E2E testing can come from an arbitrary repo. The expectation is that +# the repo supports "go test ./test/e2e -args --storage.testdriver" (https://github.com/kubernetes/kubernetes/pull/72836) +# after setting KUBECONFIG. As a special case, if the repository is Kubernetes, +# then `make WHAT=test/e2e/e2e.test` is called first to ensure that +# all generated files are present. +# +# CSI_PROW_E2E_REPO=none disables E2E testing. +# TOOO: remove versioned variables and make e2e version match k8s version +configvar CSI_PROW_E2E_VERSION_1_15 v1.15.0 "E2E version for Kubernetes 1.15.x" +configvar CSI_PROW_E2E_VERSION_1_16 v1.16.0 "E2E version for Kubernetes 1.16.x" +configvar CSI_PROW_E2E_VERSION_1_17 v1.17.0 "E2E version for Kubernetes 1.17.x" +# TODO: add new CSI_PROW_E2E_VERSION entry for future Kubernetes releases +configvar CSI_PROW_E2E_VERSION_LATEST master "E2E version for Kubernetes master" # testing against Kubernetes master is already tracking a moving target, so we might as well use a moving E2E version +configvar CSI_PROW_E2E_REPO_LATEST https://github.com/kubernetes/kubernetes "E2E repo for Kubernetes >= 1.13.x" # currently the same for all versions +configvar CSI_PROW_E2E_IMPORT_PATH_LATEST k8s.io/kubernetes "E2E package for Kubernetes >= 1.13.x" # currently the same for all versions +configvar CSI_PROW_E2E_VERSION "$(get_versioned_variable CSI_PROW_E2E_VERSION "${csi_prow_kubernetes_version_suffix}")" "E2E version" +configvar CSI_PROW_E2E_REPO "$(get_versioned_variable CSI_PROW_E2E_REPO "${csi_prow_kubernetes_version_suffix}")" "E2E repo" +configvar CSI_PROW_E2E_IMPORT_PATH "$(get_versioned_variable CSI_PROW_E2E_IMPORT_PATH "${csi_prow_kubernetes_version_suffix}")" "E2E package" + +# csi-sanity testing from the csi-test repo can be run against the installed +# CSI driver. For this to work, deploying the driver must expose the Unix domain +# csi.sock as a TCP service for use by the csi-sanity command, which runs outside +# of the cluster. The alternative would have been to (cross-)compile csi-sanity +# and install it inside the cluster, which is not necessarily easier. +configvar CSI_PROW_SANITY_REPO https://github.com/kubernetes-csi/csi-test "csi-test repo" +configvar CSI_PROW_SANITY_VERSION 5421d9f3c37be3b95b241b44a094a3db11bee789 "csi-test version" # latest master +configvar CSI_PROW_SANITY_IMPORT_PATH github.com/kubernetes-csi/csi-test "csi-test package" +configvar CSI_PROW_SANITY_SERVICE "hostpath-service" "Kubernetes TCP service name that exposes csi.sock" +configvar CSI_PROW_SANITY_POD "csi-hostpathplugin-0" "Kubernetes pod with CSI driver" +configvar CSI_PROW_SANITY_CONTAINER "hostpath" "Kubernetes container with CSI driver" + +# The version of dep to use for 'make test-vendor'. Ignored if the project doesn't +# use dep. Only binary releases of dep are supported (https://github.com/golang/dep/releases). +configvar CSI_PROW_DEP_VERSION v0.5.1 "golang dep version to be used for vendor checking" + +# Each job can run one or more of the following tests, identified by +# a single word: +# - unit testing +# - parallel excluding alpha features +# - serial excluding alpha features +# - parallel, only alpha feature +# - serial, only alpha features +# - sanity +# +# Unknown or unsupported entries are ignored. +# +# Sanity testing with csi-sanity only covers the CSI driver itself and +# thus only makes sense in repos which provide their own CSI +# driver. Repos can enable sanity testing by setting +# CSI_PROW_TESTS_SANITY=sanity. +configvar CSI_PROW_TESTS "unit parallel serial parallel-alpha serial-alpha sanity" "tests to run" +tests_enabled () { + local t1 t2 + # We want word-splitting here, so ignore: Quote to prevent word splitting, or split robustly with mapfile or read -a. + # shellcheck disable=SC2206 + local tests=(${CSI_PROW_TESTS}) + for t1 in "$@"; do + for t2 in "${tests[@]}"; do + if [ "$t1" = "$t2" ]; then + return + fi + done + done + return 1 +} +sanity_enabled () { + [ "${CSI_PROW_TESTS_SANITY}" = "sanity" ] && tests_enabled "sanity" +} +tests_need_kind () { + tests_enabled "parallel" "serial" "serial-alpha" "parallel-alpha" || + sanity_enabled +} +tests_need_non_alpha_cluster () { + tests_enabled "parallel" "serial" || + sanity_enabled +} +tests_need_alpha_cluster () { + tests_enabled "parallel-alpha" "serial-alpha" +} + +# Regex for non-alpha, feature-tagged tests that should be run. +# +# Starting with 1.17, snapshots is beta, but the E2E tests still have the +# [Feature:] tag. They need to be explicitly enabled. +configvar CSI_PROW_E2E_FOCUS_1_15 '^' "non-alpha, feature-tagged tests for Kubernetes = 1.15" # no tests to run, match nothing +configvar CSI_PROW_E2E_FOCUS_1_16 '^' "non-alpha, feature-tagged tests for Kubernetes = 1.16" # no tests to run, match nothing +configvar CSI_PROW_E2E_FOCUS_LATEST '\[Feature:VolumeSnapshotDataSource\]' "non-alpha, feature-tagged tests for Kubernetes >= 1.17" +configvar CSI_PROW_E2E_FOCUS "$(get_versioned_variable CSI_PROW_E2E_FOCUS "${csi_prow_kubernetes_version_suffix}")" "non-alpha, feature-tagged tests" + +# Serial vs. parallel is always determined by these regular expressions. +# Individual regular expressions are seperated by spaces for readability +# and expected to not contain spaces. Use dots instead. The complete +# regex for Ginkgo will be created by joining the individual terms. +configvar CSI_PROW_E2E_SERIAL '\[Serial\] \[Disruptive\]' "tags for serial E2E tests" +regex_join () { + echo "$@" | sed -e 's/ */|/g' -e 's/^|*//' -e 's/|*$//' -e 's/^$/this-matches-nothing/g' +} + +# Which tests are alpha depends on the Kubernetes version. We could +# use the same E2E test for all Kubernetes version. This would have +# the advantage that new tests can be applied to older versions +# without having to backport tests. +# +# But the feature tag gets removed from E2E tests when the corresponding +# feature becomes beta, so we would have to track which tests were +# alpha in previous Kubernetes releases. This was considered too +# error prone. Therefore we use E2E tests that match the Kubernetes +# version that is getting tested. +configvar CSI_PROW_E2E_ALPHA_LATEST '\[Feature:' "alpha tests for Kubernetes >= 1.14" # there's no need to update this, adding a new case for CSI_PROW_E2E for a new Kubernetes is enough +configvar CSI_PROW_E2E_ALPHA "$(get_versioned_variable CSI_PROW_E2E_ALPHA "${csi_prow_kubernetes_version_suffix}")" "alpha tests" + +# After the parallel E2E test without alpha features, a test cluster +# with alpha features is brought up and tests that were previously +# disabled are run. The alpha gates in each release have to be listed +# explicitly. If none are set (= variable empty), alpha testing +# is skipped. +# +# Testing against "latest" Kubernetes is problematic because some alpha +# feature which used to work might stop working or change their behavior +# such that the current tests no longer pass. If that happens, +# kubernetes-csi components must be updated, either by disabling +# the failing test for "latest" or by updating the test and not running +# it anymore for older releases. +configvar CSI_PROW_E2E_ALPHA_GATES_1_15 'VolumeSnapshotDataSource=true,ExpandCSIVolumes=true' "alpha feature gates for Kubernetes 1.15" +configvar CSI_PROW_E2E_ALPHA_GATES_1_16 'VolumeSnapshotDataSource=true' "alpha feature gates for Kubernetes 1.16" +# TODO: add new CSI_PROW_ALPHA_GATES_xxx entry for future Kubernetes releases and +# add new gates to CSI_PROW_E2E_ALPHA_GATES_LATEST. +configvar CSI_PROW_E2E_ALPHA_GATES_LATEST '' "alpha feature gates for latest Kubernetes" +configvar CSI_PROW_E2E_ALPHA_GATES "$(get_versioned_variable CSI_PROW_E2E_ALPHA_GATES "${csi_prow_kubernetes_version_suffix}")" "alpha E2E feature gates" + +# Which external-snapshotter tag to use for the snapshotter CRD and snapshot-controller deployment +configvar CSI_SNAPSHOTTER_VERSION 'v2.0.0' "external-snapshotter version tag" + +# Some tests are known to be unusable in a KinD cluster. For example, +# stopping kubelet with "ssh systemctl stop kubelet" simply +# doesn't work. Such tests should be written in a way that they verify +# whether they can run with the current cluster provider, but until +# they are, we filter them out by name. Like the other test selection +# variables, this is again a space separated list of regular expressions. +# +# "different node" test skips can be removed once +# https://github.com/kubernetes/kubernetes/pull/82678 has been backported +# to all the K8s versions we test against +configvar CSI_PROW_E2E_SKIP 'Disruptive|different\s+node' "tests that need to be skipped" + +# This is the directory for additional result files. Usually set by Prow, but +# if not (for example, when invoking manually) it defaults to the work directory. +configvar ARTIFACTS "${CSI_PROW_WORK}/artifacts" "artifacts" +mkdir -p "${ARTIFACTS}" + +run () { + echo "$(date) $(go version | sed -e 's/.*version \(go[^ ]*\).*/\1/') $(if [ "$(pwd)" != "${REPO_DIR}" ]; then pwd; fi)\$" "$@" >&2 + "$@" +} + +info () { + echo >&2 INFO: "$@" +} + +warn () { + echo >&2 WARNING: "$@" +} + +die () { + echo >&2 ERROR: "$@" + exit 1 +} + +# For additional tools. +CSI_PROW_BIN="${CSI_PROW_WORK}/bin" +mkdir -p "${CSI_PROW_BIN}" +PATH="${CSI_PROW_BIN}:$PATH" + +# Ensure that PATH has the desired version of the Go tools, then run command given as argument. +# Empty parameter uses the already installed Go. In Prow, that version is kept up-to-date by +# bumping the container image regularly. +run_with_go () { + local version + version="$1" + shift + + if ! [ "$version" ] || go version 2>/dev/null | grep -q "go$version"; then + run "$@" + else + if ! [ -d "${CSI_PROW_WORK}/go-$version" ]; then + run curl --fail --location "https://dl.google.com/go/go$version.linux-amd64.tar.gz" | tar -C "${CSI_PROW_WORK}" -zxf - || die "installation of Go $version failed" + mv "${CSI_PROW_WORK}/go" "${CSI_PROW_WORK}/go-$version" + fi + PATH="${CSI_PROW_WORK}/go-$version/bin:$PATH" run "$@" + fi +} + +# Ensure that we have the desired version of kind. +install_kind () { + if kind --version 2>/dev/null | grep -q " ${CSI_PROW_KIND_VERSION}$"; then + return + fi + if run curl --fail --location -o "${CSI_PROW_WORK}/bin/kind" "https://github.com/kubernetes-sigs/kind/releases/download/${CSI_PROW_KIND_VERSION}/kind-linux-amd64"; then + chmod u+x "${CSI_PROW_WORK}/bin/kind" + else + git_checkout https://github.com/kubernetes-sigs/kind "${GOPATH}/src/sigs.k8s.io/kind" "${CSI_PROW_KIND_VERSION}" --depth=1 && + (cd "${GOPATH}/src/sigs.k8s.io/kind" && make install INSTALL_DIR="${CSI_PROW_WORK}/bin") + fi +} + +# Ensure that we have the desired version of the ginkgo test runner. +install_ginkgo () { + # CSI_PROW_GINKGO_VERSION contains the tag with v prefix, the command line output does not. + if [ "v$(ginkgo version 2>/dev/null | sed -e 's/.* //')" = "${CSI_PROW_GINKGO_VERSION}" ]; then + return + fi + git_checkout https://github.com/onsi/ginkgo "$GOPATH/src/github.com/onsi/ginkgo" "${CSI_PROW_GINKGO_VERSION}" --depth=1 && + # We have to get dependencies and hence can't call just "go build". + run_with_go "${CSI_PROW_GO_VERSION_GINKGO}" go get github.com/onsi/ginkgo/ginkgo || die "building ginkgo failed" && + mv "$GOPATH/bin/ginkgo" "${CSI_PROW_BIN}" +} + +# Ensure that we have the desired version of dep. +install_dep () { + if dep version 2>/dev/null | grep -q "version:.*${CSI_PROW_DEP_VERSION}$"; then + return + fi + run curl --fail --location -o "${CSI_PROW_WORK}/bin/dep" "https://github.com/golang/dep/releases/download/v0.5.4/dep-linux-amd64" && + chmod u+x "${CSI_PROW_WORK}/bin/dep" +} + +# This checks out a repo ("https://github.com/kubernetes/kubernetes") +# in a certain location ("$GOPATH/src/k8s.io/kubernetes") at +# a certain revision (a hex commit hash, v1.13.1, master). It's okay +# for that directory to exist already. +git_checkout () { + local repo path revision + repo="$1" + shift + path="$1" + shift + revision="$1" + shift + + mkdir -p "$path" + if ! [ -d "$path/.git" ]; then + run git init "$path" + fi + if (cd "$path" && run git fetch "$@" "$repo" "$revision"); then + (cd "$path" && run git checkout FETCH_HEAD) || die "checking out $repo $revision failed" + else + # Might have been because fetching by revision is not + # supported by GitHub (https://github.com/isaacs/github/issues/436). + # Fall back to fetching everything. + (cd "$path" && run git fetch "$repo" '+refs/heads/*:refs/remotes/csiprow/heads/*' '+refs/tags/*:refs/tags/*') || die "fetching $repo failed" + (cd "$path" && run git checkout "$revision") || die "checking out $repo $revision failed" + fi + # This is useful for local testing or when switching between different revisions in the same + # repo. + (cd "$path" && run git clean -fdx) || die "failed to clean $path" +} + +# This clones a repo ("https://github.com/kubernetes/kubernetes") +# in a certain location ("$GOPATH/src/k8s.io/kubernetes") at +# a the head of a specific branch (i.e., release-1.13, master). +# The directory cannot exist. +git_clone_branch () { + local repo path branch parent + repo="$1" + shift + path="$1" + shift + branch="$1" + shift + + parent="$(dirname "$path")" + mkdir -p "$parent" + (cd "$parent" && run git clone --single-branch --branch "$branch" "$repo" "$path") || die "cloning $repo" failed + # This is useful for local testing or when switching between different revisions in the same + # repo. + (cd "$path" && run git clean -fdx) || die "failed to clean $path" +} + +list_gates () ( + set -f; IFS=',' + # Ignore: Double quote to prevent globbing and word splitting. + # shellcheck disable=SC2086 + set -- $1 + while [ "$1" ]; do + # Ignore: See if you can use ${variable//search/replace} instead. + # shellcheck disable=SC2001 + echo "$1" | sed -e 's/ *\([^ =]*\) *= *\([^ ]*\) */ \1: \2/' + shift + done +) + +go_version_for_kubernetes () ( + local path="$1" + local version="$2" + local go_version + + # We use the minimal Go version specified for each K8S release (= minimum_go_version in hack/lib/golang.sh). + # More recent versions might also work, but we don't want to count on that. + go_version="$(grep minimum_go_version= "$path/hack/lib/golang.sh" | sed -e 's/.*=go//')" + if ! [ "$go_version" ]; then + die "Unable to determine Go version for Kubernetes $version from hack/lib/golang.sh." + fi + echo "$go_version" +) + +csi_prow_kind_have_kubernetes=false +# Brings up a Kubernetes cluster and sets KUBECONFIG. +# Accepts additional feature gates in the form gate1=true|false,gate2=... +start_cluster () { + local image gates + gates="$1" + + if kind get clusters | grep -q csi-prow; then + run kind delete cluster --name=csi-prow || die "kind delete failed" + fi + + # Build from source? + if [[ "${CSI_PROW_KUBERNETES_VERSION}" =~ ^release-|^latest$ ]]; then + if ! ${csi_prow_kind_have_kubernetes}; then + local version="${CSI_PROW_KUBERNETES_VERSION}" + if [ "$version" = "latest" ]; then + version=master + fi + git_clone_branch https://github.com/kubernetes/kubernetes "${CSI_PROW_WORK}/src/kubernetes" "$version" || die "checking out Kubernetes $version failed" + + go_version="$(go_version_for_kubernetes "${CSI_PROW_WORK}/src/kubernetes" "$version")" || die "cannot proceed without knowing Go version for Kubernetes" + run_with_go "$go_version" kind build node-image --type bazel --image csiprow/node:latest --kube-root "${CSI_PROW_WORK}/src/kubernetes" || die "'kind build node-image' failed" + csi_prow_kind_have_kubernetes=true + fi + image="csiprow/node:latest" + else + image="kindest/node:v${CSI_PROW_KUBERNETES_VERSION}" + fi + cat >"${CSI_PROW_WORK}/kind-config.yaml" <>"${CSI_PROW_WORK}/kind-config.yaml" </dev/null; wait) + info "For container output see job artifacts." + die "deploying the CSI driver with ${deploy_driver} failed" + fi +} + +# Installs all nessesary snapshotter CRDs +install_snapshot_crds() { + # Wait until volumesnapshot CRDs are in place. + CRD_BASE_DIR="https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/${CSI_SNAPSHOTTER_VERSION}/config/crd" + kubectl apply -f "${CRD_BASE_DIR}/snapshot.storage.k8s.io_volumesnapshotclasses.yaml" --validate=false + kubectl apply -f "${CRD_BASE_DIR}/snapshot.storage.k8s.io_volumesnapshots.yaml" --validate=false + kubectl apply -f "${CRD_BASE_DIR}/snapshot.storage.k8s.io_volumesnapshotcontents.yaml" --validate=false + cnt=0 + until kubectl get volumesnapshotclasses.snapshot.storage.k8s.io \ + && kubectl get volumesnapshots.snapshot.storage.k8s.io \ + && kubectl get volumesnapshotcontents.snapshot.storage.k8s.io; do + if [ $cnt -gt 30 ]; then + echo >&2 "ERROR: snapshot CRDs not ready after over 1 min" + exit 1 + fi + echo "$(date +%H:%M:%S)" "waiting for snapshot CRDs, attempt #$cnt" + cnt=$((cnt + 1)) + sleep 2 + done +} + +# Install snapshot controller and associated RBAC, retrying until the pod is running. +install_snapshot_controller() { + kubectl apply -f "https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/${CSI_SNAPSHOTTER_VERSION}/deploy/kubernetes/snapshot-controller/rbac-snapshot-controller.yaml" + cnt=0 + until kubectl get clusterrolebinding snapshot-controller-role; do + if [ $cnt -gt 30 ]; then + echo "Cluster role bindings:" + kubectl describe clusterrolebinding + echo >&2 "ERROR: snapshot controller RBAC not ready after over 5 min" + exit 1 + fi + echo "$(date +%H:%M:%S)" "waiting for snapshot RBAC setup complete, attempt #$cnt" + cnt=$((cnt + 1)) + sleep 10 + done + + + kubectl apply -f "https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/${CSI_SNAPSHOTTER_VERSION}/deploy/kubernetes/snapshot-controller/setup-snapshot-controller.yaml" + cnt=0 + expected_running_pods=$(curl https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/"${CSI_SNAPSHOTTER_VERSION}"/deploy/kubernetes/snapshot-controller/setup-snapshot-controller.yaml | grep replicas | cut -d ':' -f 2-) + while [ "$(kubectl get pods -l app=snapshot-controller | grep 'Running' -c)" -lt "$expected_running_pods" ]; do + if [ $cnt -gt 30 ]; then + echo "snapshot-controller pod status:" + kubectl describe pods -l app=snapshot-controller + echo >&2 "ERROR: snapshot controller not ready after over 5 min" + exit 1 + fi + echo "$(date +%H:%M:%S)" "waiting for snapshot controller deployment to complete, attempt #$cnt" + cnt=$((cnt + 1)) + sleep 10 + done +} + +# collect logs and cluster status (like the version of all components, Kubernetes version, test version) +collect_cluster_info () { + cat <>"${ARTIFACTS}/$namespace/$pod/$container.log" & + echo "$!" + done + done +} + +# Makes the E2E test suite binary available as "${CSI_PROW_WORK}/e2e.test". +install_e2e () { + if [ -e "${CSI_PROW_WORK}/e2e.test" ]; then + return + fi + + git_checkout "${CSI_PROW_E2E_REPO}" "${GOPATH}/src/${CSI_PROW_E2E_IMPORT_PATH}" "${CSI_PROW_E2E_VERSION}" --depth=1 && + if [ "${CSI_PROW_E2E_IMPORT_PATH}" = "k8s.io/kubernetes" ]; then + go_version="${CSI_PROW_GO_VERSION_E2E:-$(go_version_for_kubernetes "${GOPATH}/src/${CSI_PROW_E2E_IMPORT_PATH}" "${CSI_PROW_E2E_VERSION}")}" && + run_with_go "$go_version" make WHAT=test/e2e/e2e.test "-C${GOPATH}/src/${CSI_PROW_E2E_IMPORT_PATH}" && + ln -s "${GOPATH}/src/${CSI_PROW_E2E_IMPORT_PATH}/_output/bin/e2e.test" "${CSI_PROW_WORK}" + else + run_with_go "${CSI_PROW_GO_VERSION_E2E}" go test -c -o "${CSI_PROW_WORK}/e2e.test" "${CSI_PROW_E2E_IMPORT_PATH}/test/e2e" + fi +} + +# Makes the csi-sanity test suite binary available as +# "${CSI_PROW_WORK}/csi-sanity". +install_sanity () ( + if [ -e "${CSI_PROW_WORK}/csi-sanity" ]; then + return + fi + + git_checkout "${CSI_PROW_SANITY_REPO}" "${GOPATH}/src/${CSI_PROW_SANITY_IMPORT_PATH}" "${CSI_PROW_SANITY_VERSION}" --depth=1 || die "checking out csi-sanity failed" + run_with_go "${CSI_PROW_GO_VERSION_SANITY}" go test -c -o "${CSI_PROW_WORK}/csi-sanity" "${CSI_PROW_SANITY_IMPORT_PATH}/cmd/csi-sanity" || die "building csi-sanity failed" +) + +# Captures pod output while running some other command. +run_with_loggers () ( + loggers=$(start_loggers -f) + trap 'kill $loggers' EXIT + + run "$@" +) + +# Invokes the filter-junit.go tool. +run_filter_junit () { + run_with_go "${CSI_PROW_GO_VERSION_BUILD}" go run "${RELEASE_TOOLS_ROOT}/filter-junit.go" "$@" +} + +# Runs the E2E test suite in a sub-shell. +run_e2e () ( + name="$1" + shift + + install_e2e || die "building e2e.test failed" + install_ginkgo || die "installing ginkgo failed" + + # Rename, merge and filter JUnit files. Necessary in case that we run the E2E suite again + # and to avoid the large number of "skipped" tests that we get from using + # the full Kubernetes E2E testsuite while only running a few tests. + move_junit () { + if ls "${ARTIFACTS}"/junit_[0-9]*.xml 2>/dev/null >/dev/null; then + run_filter_junit -t="External Storage" -o "${ARTIFACTS}/junit_${name}.xml" "${ARTIFACTS}"/junit_[0-9]*.xml && rm -f "${ARTIFACTS}"/junit_[0-9]*.xml + fi + } + trap move_junit EXIT + + cd "${GOPATH}/src/${CSI_PROW_E2E_IMPORT_PATH}" && + run_with_loggers ginkgo -v "$@" "${CSI_PROW_WORK}/e2e.test" -- -report-dir "${ARTIFACTS}" -storage.testdriver="${CSI_PROW_WORK}/test-driver.yaml" +) + +# Run csi-sanity against installed CSI driver. +run_sanity () ( + install_sanity || die "installing csi-sanity failed" + + cat >"${CSI_PROW_WORK}/mkdir_in_pod.sh" <"${CSI_PROW_WORK}/rmdir_in_pod.sh" </\>/g' -e 's/\x1B...//g' +} + +# The "make test" output starts each test with "### :" +# and then ends when the next test starts or with "make: *** +# [] Error 1" when there was a failure. Here we read each +# line of that output, split it up into individual tests and generate +# a make-test.xml file in JUnit format. +make_test_to_junit () { + local ret out testname testoutput + ret=0 + # Plain make-test.xml was not delivered as text/xml by the web + # server and ignored by spyglass. It seems that the name has to + # match junit*.xml. + out="${ARTIFACTS}/junit_make_test.xml" + testname= + echo "" >>"$out" + + while IFS= read -r line; do + echo "$line" # pass through + if echo "$line" | grep -q "^### [^ ]*:$"; then + if [ "$testname" ]; then + # previous test succesful + echo " " >>"$out" + echo " " >>"$out" + fi + # Ignore: See if you can use ${variable//search/replace} instead. + # shellcheck disable=SC2001 + # + # start new test + testname="$(echo "$line" | sed -e 's/^### \([^ ]*\):$/\1/')" + testoutput= + echo " " >>"$out" + echo " " >>"$out" + elif echo "$line" | grep -q '^make: .*Error [0-9]*$'; then + if [ "$testname" ]; then + # Ignore: Consider using { cmd1; cmd2; } >> file instead of individual redirects. + # shellcheck disable=SC2129 + # + # end test with failure + echo " " >>"$out" + # Include the same text as in also in , + # because then it is easier to view in spyglass (shown directly + # instead of having to click through to stdout). + echo " " >>"$out" + echo -n "$testoutput" | ascii_to_xml >>"$out" + echo " " >>"$out" + echo " " >>"$out" + fi + # remember failure for exit code + ret=1 + # not currently inside a test + testname= + else + if [ "$testname" ]; then + # Test output. + echo "$line" | ascii_to_xml >>"$out" + testoutput="$testoutput$line +" + fi + fi + done + # if still in a test, close it now + if [ "$testname" ]; then + echo " " >>"$out" + echo " " >>"$out" + fi + echo "" >>"$out" + + # this makes the error more visible in spyglass + if [ "$ret" -ne 0 ]; then + echo "ERROR: 'make test' failed" + return 1 + fi +} + +# version_gt returns true if arg1 is greater than arg2. +# +# This function expects versions to be one of the following formats: +# X.Y.Z, release-X.Y.Z, vX.Y.Z +# +# where X,Y, and Z are any number. +# +# Partial versions (1.2, release-1.2) work as well. +# The follow substrings are stripped before version comparison: +# - "v" +# - "release-" +# - "kubernetes-" +# +# Usage: +# version_gt release-1.3 v1.2.0 (returns true) +# version_gt v1.1.1 v1.2.0 (returns false) +# version_gt 1.1.1 v1.2.0 (returns false) +# version_gt 1.3.1 v1.2.0 (returns true) +# version_gt 1.1.1 release-1.2.0 (returns false) +# version_gt 1.2.0 1.2.2 (returns false) +function version_gt() { + versions=$(for ver in "$@"; do ver=${ver#release-}; ver=${ver#kubernetes-}; echo "${ver#v}"; done) + greaterVersion=${1#"release-"}; + greaterVersion=${greaterVersion#"kubernetes-"}; + greaterVersion=${greaterVersion#"v"}; + test "$(printf '%s' "$versions" | sort -V | head -n 1)" != "$greaterVersion" +} + +main () { + local images ret + ret=0 + + images= + if ${CSI_PROW_BUILD_JOB}; then + # A successful build is required for testing. + run_with_go "${CSI_PROW_GO_VERSION_BUILD}" make all "GOFLAGS_VENDOR=${GOFLAGS_VENDOR}" || die "'make all' failed" + # We don't want test failures to prevent E2E testing below, because the failure + # might have been minor or unavoidable, for example when experimenting with + # changes in "release-tools" in a PR (that fails the "is release-tools unmodified" + # test). + if tests_enabled "unit"; then + if [ -f Gopkg.toml ] && ! install_dep; then + warn "installing 'dep' failed, cannot test vendoring" + ret=1 + fi + if ! run_with_go "${CSI_PROW_GO_VERSION_BUILD}" make -k test "GOFLAGS_VENDOR=${GOFLAGS_VENDOR}" 2>&1 | make_test_to_junit; then + warn "'make test' failed, proceeding anyway" + ret=1 + fi + fi + # Required for E2E testing. + run_with_go "${CSI_PROW_GO_VERSION_BUILD}" make container "GOFLAGS_VENDOR=${GOFLAGS_VENDOR}" || die "'make container' failed" + fi + + if tests_need_kind; then + install_kind || die "installing kind failed" + + if ${CSI_PROW_BUILD_JOB}; then + cmds="$(grep '^\s*CMDS\s*=' Makefile | sed -e 's/\s*CMDS\s*=//')" + # Get the image that was just built (if any) from the + # top-level Makefile CMDS variable and set the + # deploy.sh env variables for it. We also need to + # side-load those images into the cluster. + for i in $cmds; do + e=$(echo "$i" | tr '[:lower:]' '[:upper:]' | tr - _) + images="$images ${e}_REGISTRY=none ${e}_TAG=csiprow" + + # We must avoid the tag "latest" because that implies + # always pulling the image + # (https://github.com/kubernetes-sigs/kind/issues/328). + docker tag "$i:latest" "$i:csiprow" || die "tagging the locally built container image for $i failed" + done + + if [ -e deploy/kubernetes/rbac.yaml ]; then + # This is one of those components which has its own RBAC rules (like external-provisioner). + # We are testing a locally built image and also want to test with the the current, + # potentially modified RBAC rules. + if [ "$(echo "$cmds" | wc -w)" != 1 ]; then + die "ambiguous deploy/kubernetes/rbac.yaml: need exactly one command, got: $cmds" + fi + e=$(echo "$cmds" | tr '[:lower:]' '[:upper:]' | tr - _) + images="$images ${e}_RBAC=$(pwd)/deploy/kubernetes/rbac.yaml" + fi + fi + + if tests_need_non_alpha_cluster; then + start_cluster || die "starting the non-alpha cluster failed" + + # Install necessary snapshot CRDs and snapshot controller + # For Kubernetes 1.17+, we will install the CRDs and snapshot controller. + if version_gt "${CSI_PROW_KUBERNETES_VERSION}" "1.16.255" || "${CSI_PROW_KUBERNETES_VERSION}" == "latest"; then + info "Version ${CSI_PROW_KUBERNETES_VERSION}, installing CRDs and snapshot controller" + install_snapshot_crds + install_snapshot_controller + else + info "Version ${CSI_PROW_KUBERNETES_VERSION}, skipping CRDs and snapshot controller" + fi + + # Installing the driver might be disabled. + if ${CSI_PROW_DRIVER_INSTALL} "$images"; then + collect_cluster_info + + if sanity_enabled; then + if ! run_sanity; then + ret=1 + fi + fi + + if tests_enabled "parallel"; then + # Ignore: Double quote to prevent globbing and word splitting. + # shellcheck disable=SC2086 + if ! run_e2e parallel ${CSI_PROW_GINKO_PARALLEL} \ + -focus="External.Storage" \ + -skip="$(regex_join "${CSI_PROW_E2E_SERIAL}" "${CSI_PROW_E2E_ALPHA}" "${CSI_PROW_E2E_SKIP}")"; then + warn "E2E parallel failed" + ret=1 + fi + + # Run tests that are feature tagged, but non-alpha + # Ignore: Double quote to prevent globbing and word splitting. + # shellcheck disable=SC2086 + if ! run_e2e parallel-features ${CSI_PROW_GINKO_PARALLEL} \ + -focus="External.Storage.*($(regex_join "${CSI_PROW_E2E_FOCUS}"))" \ + -skip="$(regex_join "${CSI_PROW_E2E_SERIAL}")"; then + warn "E2E parallel features failed" + ret=1 + fi + fi + + if tests_enabled "serial"; then + if ! run_e2e serial \ + -focus="External.Storage.*($(regex_join "${CSI_PROW_E2E_SERIAL}"))" \ + -skip="$(regex_join "${CSI_PROW_E2E_ALPHA}" "${CSI_PROW_E2E_SKIP}")"; then + warn "E2E serial failed" + ret=1 + fi + fi + fi + delete_cluster_inside_prow_job + fi + + if tests_need_alpha_cluster && [ "${CSI_PROW_E2E_ALPHA_GATES}" ]; then + # Need to (re)create the cluster. + start_cluster "${CSI_PROW_E2E_ALPHA_GATES}" || die "starting alpha cluster failed" + + # Install necessary snapshot CRDs and snapshot controller + # For Kubernetes 1.17+, we will install the CRDs and snapshot controller. + if version_gt "${CSI_PROW_KUBERNETES_VERSION}" "1.16.255" || "${CSI_PROW_KUBERNETES_VERSION}" == "latest"; then + info "Version ${CSI_PROW_KUBERNETES_VERSION}, installing CRDs and snapshot controller" + install_snapshot_crds + install_snapshot_controller + else + info "Version ${CSI_PROW_KUBERNETES_VERSION}, skipping CRDs and snapshot controller" + fi + + # Installing the driver might be disabled. + if ${CSI_PROW_DRIVER_INSTALL} "$images"; then + collect_cluster_info + + if tests_enabled "parallel-alpha"; then + # Ignore: Double quote to prevent globbing and word splitting. + # shellcheck disable=SC2086 + if ! run_e2e parallel-alpha ${CSI_PROW_GINKO_PARALLEL} \ + -focus="External.Storage.*($(regex_join "${CSI_PROW_E2E_ALPHA}"))" \ + -skip="$(regex_join "${CSI_PROW_E2E_SERIAL}" "${CSI_PROW_E2E_SKIP}")"; then + warn "E2E parallel alpha failed" + ret=1 + fi + fi + + if tests_enabled "serial-alpha"; then + if ! run_e2e serial-alpha \ + -focus="External.Storage.*(($(regex_join "${CSI_PROW_E2E_SERIAL}")).*($(regex_join "${CSI_PROW_E2E_ALPHA}"))|($(regex_join "${CSI_PROW_E2E_ALPHA}")).*($(regex_join "${CSI_PROW_E2E_SERIAL}")))" \ + -skip="$(regex_join "${CSI_PROW_E2E_SKIP}")"; then + warn "E2E serial alpha failed" + ret=1 + fi + fi + fi + delete_cluster_inside_prow_job + fi + fi + + # Merge all junit files into one. This gets rid of duplicated "skipped" tests. + if ls "${ARTIFACTS}"/junit_*.xml 2>/dev/null >&2; then + run_filter_junit -o "${CSI_PROW_WORK}/junit_final.xml" "${ARTIFACTS}"/junit_*.xml && rm "${ARTIFACTS}"/junit_*.xml && mv "${CSI_PROW_WORK}/junit_final.xml" "${ARTIFACTS}" + fi + + return "$ret" +} diff --git a/release-tools/travis.yml b/release-tools/travis.yml new file mode 100644 index 00000000..bfd7647b --- /dev/null +++ b/release-tools/travis.yml @@ -0,0 +1,21 @@ +language: go +sudo: required +services: + - docker +git: + depth: false +matrix: + include: + - go: 1.13.3 +before_script: +- mkdir -p bin +- wget https://github.com/golang/dep/releases/download/v0.5.1/dep-linux-amd64 -O bin/dep +- chmod u+x bin/dep +- export PATH=$PWD/bin:$PATH +script: +- make -k all test GOFLAGS_VENDOR=$( [ -d vendor ] && echo '-mod=vendor' ) +after_success: + - if [ "${TRAVIS_PULL_REQUEST}" == "false" ]; then + docker login -u "${DOCKER_USERNAME}" -p "${DOCKER_PASSWORD}" quay.io; + make push GOFLAGS_VENDOR=$( [ -d vendor ] && echo '-mod=vendor' ); + fi diff --git a/release-tools/update-vendor.sh b/release-tools/update-vendor.sh new file mode 100755 index 00000000..013a289b --- /dev/null +++ b/release-tools/update-vendor.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash + +# Copyright 2020 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. + +if [ -f Gopkg.toml ]; then + echo "Repo uses 'dep' for vendoring." + (set -x; dep ensure) +elif [ -f go.mod ]; then + release-tools/verify-go-version.sh "go" + (set -x; env GO111MODULE=on go mod tidy && env GO111MODULE=on go mod vendor) +fi diff --git a/release-tools/util.sh b/release-tools/util.sh new file mode 100755 index 00000000..8993774d --- /dev/null +++ b/release-tools/util.sh @@ -0,0 +1,148 @@ +#!/usr/bin/env bash + +# Copyright 2020 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. + +function kube::util::sourced_variable { + # Call this function to tell shellcheck that a variable is supposed to + # be used from other calling context. This helps quiet an "unused + # variable" warning from shellcheck and also document your code. + true +} + +kube::util::sortable_date() { + date "+%Y%m%d-%H%M%S" +} + +# arguments: target, item1, item2, item3, ... +# returns 0 if target is in the given items, 1 otherwise. +kube::util::array_contains() { + local search="$1" + local element + shift + for element; do + if [[ "${element}" == "${search}" ]]; then + return 0 + fi + done + return 1 +} + +# Example: kube::util::trap_add 'echo "in trap DEBUG"' DEBUG +# See: http://stackoverflow.com/questions/3338030/multiple-bash-traps-for-the-same-signal +kube::util::trap_add() { + local trap_add_cmd + trap_add_cmd=$1 + shift + + for trap_add_name in "$@"; do + local existing_cmd + local new_cmd + + # Grab the currently defined trap commands for this trap + existing_cmd=$(trap -p "${trap_add_name}" | awk -F"'" '{print $2}') + + if [[ -z "${existing_cmd}" ]]; then + new_cmd="${trap_add_cmd}" + else + new_cmd="${trap_add_cmd};${existing_cmd}" + fi + + # Assign the test. Disable the shellcheck warning telling that trap + # commands should be single quoted to avoid evaluating them at this + # point instead evaluating them at run time. The logic of adding new + # commands to a single trap requires them to be evaluated right away. + # shellcheck disable=SC2064 + trap "${new_cmd}" "${trap_add_name}" + done +} + +kube::util::download_file() { + local -r url=$1 + local -r destination_file=$2 + + rm "${destination_file}" 2&> /dev/null || true + + for i in $(seq 5) + do + if ! curl -fsSL --retry 3 --keepalive-time 2 "${url}" -o "${destination_file}"; then + echo "Downloading ${url} failed. $((5-i)) retries left." + sleep 1 + else + echo "Downloading ${url} succeed" + return 0 + fi + done + return 1 +} + +# Wait for background jobs to finish. Return with +# an error status if any of the jobs failed. +kube::util::wait-for-jobs() { + local fail=0 + local job + for job in $(jobs -p); do + wait "${job}" || fail=$((fail + 1)) + done + return ${fail} +} + +# kube::util::join +# Concatenates the list elements with the delimiter passed as first parameter +# +# Ex: kube::util::join , a b c +# -> a,b,c +function kube::util::join { + local IFS="$1" + shift + echo "$*" +} + +# kube::util::check-file-in-alphabetical-order +# Check that the file is in alphabetical order +# +function kube::util::check-file-in-alphabetical-order { + local failure_file="$1" + if ! diff -u "${failure_file}" <(LC_ALL=C sort "${failure_file}"); then + { + echo + echo "${failure_file} is not in alphabetical order. Please sort it:" + echo + echo " LC_ALL=C sort -o ${failure_file} ${failure_file}" + echo + } >&2 + false + fi +} + +# Some useful colors. +if [[ -z "${color_start-}" ]]; then + declare -r color_start="\033[" + declare -r color_red="${color_start}0;31m" + declare -r color_yellow="${color_start}0;33m" + declare -r color_green="${color_start}0;32m" + declare -r color_blue="${color_start}1;34m" + declare -r color_cyan="${color_start}1;36m" + declare -r color_norm="${color_start}0m" + + kube::util::sourced_variable "${color_start}" + kube::util::sourced_variable "${color_red}" + kube::util::sourced_variable "${color_yellow}" + kube::util::sourced_variable "${color_green}" + kube::util::sourced_variable "${color_blue}" + kube::util::sourced_variable "${color_cyan}" + kube::util::sourced_variable "${color_norm}" +fi + +# ex: ts=2 sw=2 et filetype=sh diff --git a/release-tools/verify-go-version.sh b/release-tools/verify-go-version.sh new file mode 100755 index 00000000..d24ce1ee --- /dev/null +++ b/release-tools/verify-go-version.sh @@ -0,0 +1,51 @@ +#!/usr/bin/env bash + +# Copyright 2020 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. + +GO="$1" + +if [ ! "$GO" ]; then + echo >&2 "usage: $0 " + exit 1 +fi + +die () { + echo "ERROR: $*" + exit 1 +} + +version=$("$GO" version) || die "determining version of $GO failed" +# shellcheck disable=SC2001 +majorminor=$(echo "$version" | sed -e 's/.*go\([0-9]*\)\.\([0-9]*\).*/\1.\2/') +# shellcheck disable=SC2001 +expected=$(grep "^ *- go:" "release-tools/travis.yml" | sed -e 's/.*go: *\([0-9]*\)\.\([0-9]*\).*/\1.\2/') + +if [ "$majorminor" != "$expected" ]; then + cat >&2 < /dev/null || true +} + +# ensure we're linting the source tree +cd "${ROOT}" + +# find all shell scripts excluding ./_*, ./.git/*, ./vendor*, +# and anything git-ignored +all_shell_scripts=() +while IFS=$'\n' read -r script; + do git check-ignore -q "$script" || all_shell_scripts+=("$script"); +done < <(find . -name "*.sh" \ + -not \( \ + -path ./_\* -o \ + -path ./.git\* -o \ + -path ./vendor\* \ + \)) + +# detect if the host machine has the required shellcheck version installed +# if so, we will use that instead. +HAVE_SHELLCHECK=false +if which shellcheck &>/dev/null; then + detected_version="$(shellcheck --version | grep 'version: .*')" + if [[ "${detected_version}" = "version: ${SHELLCHECK_VERSION}" ]]; then + HAVE_SHELLCHECK=true + fi +fi + +# tell the user which we've selected and possibly set up the container +if ${HAVE_SHELLCHECK}; then + echo "Using host shellcheck ${SHELLCHECK_VERSION} binary." +else + echo "Using shellcheck ${SHELLCHECK_VERSION} docker image." + # remove any previous container, ensure we will attempt to cleanup on exit, + # and create the container + remove_container + kube::util::trap_add 'remove_container' EXIT + if ! output="$(create_container 2>&1)"; then + { + echo "Failed to create shellcheck container with output: " + echo "" + echo "${output}" + } >&2 + exit 1 + fi +fi + +# lint each script, tracking failures +errors=() +for f in "${all_shell_scripts[@]}"; do + set +o errexit + if ${HAVE_SHELLCHECK}; then + failedLint=$(shellcheck --exclude="${SHELLCHECK_DISABLED}" "${f}") + else + failedLint=$(docker exec -t ${SHELLCHECK_CONTAINER} \ + shellcheck --exclude="${SHELLCHECK_DISABLED}" "${f}") + fi + set -o errexit + if [[ -n "${failedLint}" ]]; then + errors+=( "${failedLint}" ) + fi +done + +# Check to be sure all the packages that should pass lint are. +if [ ${#errors[@]} -eq 0 ]; then + echo 'Congratulations! All shell files are passing lint.' +else + { + echo "Errors from shellcheck:" + for err in "${errors[@]}"; do + echo "$err" + done + echo + echo 'Please review the above warnings. You can test via "./hack/verify-shellcheck"' + echo 'If the above warnings do not make sense, you can exempt them from shellcheck' + echo 'checking by adding the "shellcheck disable" directive' + echo '(https://github.com/koalaman/shellcheck/wiki/Directive#disable).' + echo + } >&2 + false +fi diff --git a/release-tools/verify-subtree.sh b/release-tools/verify-subtree.sh new file mode 100755 index 00000000..ab8bb304 --- /dev/null +++ b/release-tools/verify-subtree.sh @@ -0,0 +1,41 @@ +#! /bin/sh -e +# +# Copyright 2020 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. + +# This script verifies that the content of a directory managed +# by "git subtree" has not been modified locally. It does that +# by looking for commits that modify the files with the +# subtree prefix (aka directory) while ignoring merge +# commits. Merge commits are where "git subtree" pulls the +# upstream files into the directory. +# +# Theoretically a developer can subvert this check by modifying files +# in a merge commit, but in practice that shouldn't happen. + +DIR="$1" +if [ ! "$DIR" ]; then + echo "usage: $0 " >&2 + exit 1 +fi + +REV=$(git log -n1 --remove-empty --format=format:%H --no-merges -- "$DIR") +if [ "$REV" ]; then + echo "Directory '$DIR' contains non-upstream changes:" + echo + git log --no-merges -- "$DIR" + exit 1 +else + echo "$DIR is a clean copy of upstream." +fi diff --git a/release-tools/verify-vendor.sh b/release-tools/verify-vendor.sh new file mode 100755 index 00000000..1673242c --- /dev/null +++ b/release-tools/verify-vendor.sh @@ -0,0 +1,60 @@ +#!/usr/bin/env bash + +# Copyright 2020 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. + +if [ -f Gopkg.toml ]; then + echo "Repo uses 'dep' for vendoring." + case "$(dep version 2>/dev/null | grep 'version *:')" in + *v0.[56789]*) + if dep check; then + echo "vendor up-to-date" + else + exit 1 + fi + ;; + *) echo "skipping check, dep >= 0.5 required";; + esac +elif [ -f go.mod ]; then + echo "Repo uses 'go mod'." + # shellcheck disable=SC2235 + if [ "${JOB_NAME}" ] && + ( [ "${JOB_TYPE}" != "presubmit" ] || + [ "$( (git diff "${PULL_BASE_SHA}..HEAD" -- go.mod go.sum vendor release-tools; + git diff "${PULL_BASE_SHA}..HEAD" | grep -e '^@@.*@@ import (' -e '^[+-]import') | + wc -l)" -eq 0 ] ); then + echo "Skipping vendor check because the Prow pre-submit job does not affect dependencies." + elif ! (set -x; env GO111MODULE=on go mod tidy); then + echo "ERROR: vendor check failed." + exit 1 + elif [ "$(git status --porcelain -- go.mod go.sum | wc -l)" -gt 0 ]; then + echo "ERROR: go module files *not* up-to-date, they did get modified by 'GO111MODULE=on go mod tidy':"; + git diff -- go.mod go.sum + exit 1 + elif [ -d vendor ]; then + if ! (set -x; env GO111MODULE=on go mod vendor); then + echo "ERROR: vendor check failed." + exit 1 + elif [ "$(git status --porcelain -- vendor | wc -l)" -gt 0 ]; then + echo "ERROR: vendor directory *not* up-to-date, it did get modified by 'GO111MODULE=on go mod vendor':" + git status -- vendor + git diff -- vendor + exit 1 + else + echo "Go dependencies and vendor directory up-to-date." + fi + else + echo "Go dependencies up-to-date." + fi +fi From f928ea62b21bd5d98f2b3e1bfb039040989416e4 Mon Sep 17 00:00:00 2001 From: Krish Chowdhary Date: Tue, 15 Sep 2020 15:51:46 -0400 Subject: [PATCH 111/242] adds issue templates to COSI controller --- .github/ISSUE_TEMPLATE/bug_report.md | 30 +++++++++++++++++++++++++++ .github/ISSUE_TEMPLATE/enhancement.md | 19 +++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/enhancement.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000..bd884c11 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,30 @@ +--- +name: Bug Report +about: Use this template for reporting bugs or issues. +title: "[DATE] - Title" +--- +# Bug Report + + + +**What happened**: + +**What you expected to happen**: + +**How to reproduce this bug (as minimally and precisely as possible)**: + +**Anything else relevant for this bug report?**: + +**Environment**: + +- Kubernetes version (use `kubectl version`), please list client and server: +- Controller version (provide the release tag or commit hash): +- Cloud provider or hardware configuration: +- OS (e.g: `cat /etc/os-release`): +- Kernel (e.g. `uname -a`): +- Install tools: +- Network plugin and version (if this is a network-related bug): +- Others: diff --git a/.github/ISSUE_TEMPLATE/enhancement.md b/.github/ISSUE_TEMPLATE/enhancement.md new file mode 100644 index 00000000..7ed31b19 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/enhancement.md @@ -0,0 +1,19 @@ +--- +name: Enhancement/Feature Request +about: Use this template to request a new feature or enhancement for the COSI controller +title: "[DATE] - Title" +labels: bug +--- +# Enhancement + +**Is your feature request related to a problem?/Why is this needed** + + +**Describe the solution you'd like in detail** + + +**Describe alternatives you've considered** + + +**Additional context** + From e73c2ce5312662816b180c5b03eb490322051fd7 Mon Sep 17 00:00:00 2001 From: Michelle Au Date: Fri, 25 Sep 2020 17:41:33 -0700 Subject: [PATCH 112/242] Use staging registry for canary tests --- prow.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/prow.sh b/prow.sh index 05d397a9..1812e3a7 100755 --- a/prow.sh +++ b/prow.sh @@ -211,6 +211,10 @@ configvar CSI_PROW_DRIVER_INSTALL "install_csi_driver" "name of the shell functi # still use that name. configvar CSI_PROW_DRIVER_CANARY "${CSI_PROW_HOSTPATH_CANARY}" "driver image override for canary images" +# Image registry to use for canary images. +# Only valid if CSI_PROW_DRIVER_CANARY is set. +configvar CSI_PROW_DRIVER_CANARY_REGISTRY "gcr.io/k8s-staging-sig-storage" "registry for canary images" + # The E2E testing can come from an arbitrary repo. The expectation is that # the repo supports "go test ./test/e2e -args --storage.testdriver" (https://github.com/kubernetes/kubernetes/pull/72836) # after setting KUBECONFIG. As a special case, if the repository is Kubernetes, @@ -693,7 +697,7 @@ install_csi_driver () { fi if [ "${CSI_PROW_DRIVER_CANARY}" != "stable" ]; then - images="$images IMAGE_TAG=${CSI_PROW_DRIVER_CANARY}" + images="$images IMAGE_TAG=${CSI_PROW_DRIVER_CANARY} IMAGE_REGISTRY=${CSI_PROW_DRIVER_CANARY_REGISTRY}" fi # Ignore: Double quote to prevent globbing and word splitting. # It's intentional here for $images. From d1294628784b0b37b9ce30aceab3725cd32c153e Mon Sep 17 00:00:00 2001 From: Michelle Au Date: Fri, 25 Sep 2020 17:49:38 -0700 Subject: [PATCH 113/242] Document new method for adding CI jobs are new K8s versions --- SIDECAR_RELEASE_PROCESS.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/SIDECAR_RELEASE_PROCESS.md b/SIDECAR_RELEASE_PROCESS.md index 91e837c9..4575eb81 100644 --- a/SIDECAR_RELEASE_PROCESS.md +++ b/SIDECAR_RELEASE_PROCESS.md @@ -39,10 +39,11 @@ naming convention `-on-`. 1. Changes can then be updated in all the sidecar repos and hostpath driver repo by following the [update instructions](https://github.com/kubernetes-csi/csi-release-tools/blob/master/README.md#sharing-and-updating). -1. New pull and CI jobs are configured by +1. New pull and CI jobs are configured by adding new K8s versions to the top of [gen-jobs.sh](https://github.com/kubernetes/test-infra/blob/master/config/jobs/kubernetes-csi/gen-jobs.sh). - New pull jobs that have been unverified should be initially made optional. - [Example](https://github.com/kubernetes/test-infra/pull/15055) + New pull jobs that have been unverified should be initially made optional by + setting the new K8s version as + [experimental](https://github.com/kubernetes/test-infra/blob/a1858f46d6014480b130789df58b230a49203a64/config/jobs/kubernetes-csi/gen-jobs.sh#L40). 1. Once new pull and CI jobs have been verified, and the new Kubernetes version is released, we can make the optional jobs required, and also remove the Kubernetes versions that are no longer supported. From 0b09976978630ad73ede12c7a3b32161d2d61cb0 Mon Sep 17 00:00:00 2001 From: Krish Chowdhary Date: Mon, 28 Sep 2020 12:00:12 -0400 Subject: [PATCH 114/242] adds security policy for controller --- .github/SECURITY.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 .github/SECURITY.md diff --git a/.github/SECURITY.md b/.github/SECURITY.md new file mode 100644 index 00000000..3bafc83a --- /dev/null +++ b/.github/SECURITY.md @@ -0,0 +1,14 @@ +# Security Policy + +## Supported Versions + +Information about supported Kubernetes versions can be found on the +[Kubernetes version and version skew support policy] page on the Kubernetes website. + +## Reporting a Vulnerability + +Instructions for reporting a vulnerability can be found on the +[Kubernetes Security and Disclosure Information] page. + +[Kubernetes version and version skew support policy]: https://kubernetes.io/docs/setup/release/version-skew-policy/#supported-versions +[Kubernetes Security and Disclosure Information]: https://kubernetes.io/docs/reference/issues-security/security/#report-a-vulnerability From 1e49ef601c7ff94b32d9fd8f96d41a56e1bba72d Mon Sep 17 00:00:00 2001 From: Krish Chowdhary Date: Mon, 28 Sep 2020 13:57:02 -0400 Subject: [PATCH 115/242] added provisioner line to bug_report --- .github/ISSUE_TEMPLATE/bug_report.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index bd884c11..3bbfb6c0 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -22,6 +22,7 @@ If the matter is security related, please disclose it privately via https://kube - Kubernetes version (use `kubectl version`), please list client and server: - Controller version (provide the release tag or commit hash): +- Provisoner name and version (provide the release tag or commit hash): - Cloud provider or hardware configuration: - OS (e.g: `cat /etc/os-release`): - Kernel (e.g. `uname -a`): From 7100c1209eba08b3444ad7cb84f31e225e0e3889 Mon Sep 17 00:00:00 2001 From: Michelle Au Date: Tue, 6 Oct 2020 11:25:19 -0700 Subject: [PATCH 116/242] Only set staging registry when running canary job --- prow.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/prow.sh b/prow.sh index 1812e3a7..b069a318 100755 --- a/prow.sh +++ b/prow.sh @@ -212,7 +212,7 @@ configvar CSI_PROW_DRIVER_INSTALL "install_csi_driver" "name of the shell functi configvar CSI_PROW_DRIVER_CANARY "${CSI_PROW_HOSTPATH_CANARY}" "driver image override for canary images" # Image registry to use for canary images. -# Only valid if CSI_PROW_DRIVER_CANARY is set. +# Only valid if CSI_PROW_DRIVER_CANARY == "canary". configvar CSI_PROW_DRIVER_CANARY_REGISTRY "gcr.io/k8s-staging-sig-storage" "registry for canary images" # The E2E testing can come from an arbitrary repo. The expectation is that @@ -697,7 +697,11 @@ install_csi_driver () { fi if [ "${CSI_PROW_DRIVER_CANARY}" != "stable" ]; then + if [ "${CSI_PROW_DRIVER_CANARY}" == "canary" ]; then images="$images IMAGE_TAG=${CSI_PROW_DRIVER_CANARY} IMAGE_REGISTRY=${CSI_PROW_DRIVER_CANARY_REGISTRY}" + else + images="$images IMAGE_TAG=${CSI_PROW_DRIVER_CANARY}" + fi fi # Ignore: Double quote to prevent globbing and word splitting. # It's intentional here for $images. From f1a048d32cbd2e4d2e7fbb4d32837064919b928b Mon Sep 17 00:00:00 2001 From: Srini Brahmaroutu Date: Thu, 22 Oct 2020 22:04:00 -0700 Subject: [PATCH 117/242] Add approvers to facilitate project management --- OWNERS | 3 +++ 1 file changed, 3 insertions(+) diff --git a/OWNERS b/OWNERS index b3c654f2..9ea2b344 100644 --- a/OWNERS +++ b/OWNERS @@ -5,3 +5,6 @@ approvers: - msau42 - saad-ali - xing-yang + - wlan0 + - brahmaroutu + - rrati From 465b16f2635bc1d644a11692b0aaba4b7eafd47b Mon Sep 17 00:00:00 2001 From: Srini Brahmaroutu Date: Thu, 22 Oct 2020 15:17:41 -0700 Subject: [PATCH 118/242] We maintain release tools only under Spec repo --- Dockerfile | 6 + release-tools/update-vendor.sh => Makefile | 15 +- release-tools/.prow.sh | 7 - release-tools/CONTRIBUTING.md | 31 - release-tools/LICENSE | 201 ---- release-tools/OWNERS | 11 - release-tools/README.md | 166 --- release-tools/RELEASE.md | 5 - release-tools/SECURITY_CONTACTS | 14 - release-tools/SIDECAR_RELEASE_PROCESS.md | 106 -- release-tools/build.make | 272 ----- release-tools/cloudbuild.sh | 6 - release-tools/cloudbuild.yaml | 46 - release-tools/code-of-conduct.md | 3 - release-tools/filter-junit.go | 133 --- release-tools/go-get-kubernetes.sh | 104 -- release-tools/prow.sh | 1224 -------------------- release-tools/travis.yml | 21 - release-tools/util.sh | 148 --- release-tools/verify-go-version.sh | 51 - release-tools/verify-shellcheck.sh | 146 --- release-tools/verify-subtree.sh | 41 - release-tools/verify-vendor.sh | 60 - 23 files changed, 11 insertions(+), 2806 deletions(-) create mode 100644 Dockerfile rename release-tools/update-vendor.sh => Makefile (64%) mode change 100755 => 100644 delete mode 100755 release-tools/.prow.sh delete mode 100644 release-tools/CONTRIBUTING.md delete mode 100644 release-tools/LICENSE delete mode 100644 release-tools/OWNERS delete mode 100644 release-tools/README.md delete mode 100644 release-tools/RELEASE.md delete mode 100644 release-tools/SECURITY_CONTACTS delete mode 100644 release-tools/SIDECAR_RELEASE_PROCESS.md delete mode 100644 release-tools/build.make delete mode 100755 release-tools/cloudbuild.sh delete mode 100644 release-tools/cloudbuild.yaml delete mode 100644 release-tools/code-of-conduct.md delete mode 100644 release-tools/filter-junit.go delete mode 100755 release-tools/go-get-kubernetes.sh delete mode 100755 release-tools/prow.sh delete mode 100644 release-tools/travis.yml delete mode 100755 release-tools/util.sh delete mode 100755 release-tools/verify-go-version.sh delete mode 100755 release-tools/verify-shellcheck.sh delete mode 100755 release-tools/verify-subtree.sh delete mode 100755 release-tools/verify-vendor.sh diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..c080f91a --- /dev/null +++ b/Dockerfile @@ -0,0 +1,6 @@ +FROM gcr.io/distroless/static:latest +LABEL maintainers="Kubernetes Authors" +LABEL description="COSI Controller" + +COPY ./bin/cosi-controller-manager cosi-controller-manager +ENTRYPOINT ["/cosi-controller-manager"] diff --git a/release-tools/update-vendor.sh b/Makefile old mode 100755 new mode 100644 similarity index 64% rename from release-tools/update-vendor.sh rename to Makefile index 6f4c27ae..00291b44 --- a/release-tools/update-vendor.sh +++ b/Makefile @@ -1,6 +1,4 @@ -#!/usr/bin/env bash - -# Copyright 2019 The Kubernetes Authors. +# Copyright 2020 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. @@ -14,10 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -if [ -f Gopkg.toml ]; then - echo "Repo uses 'dep' for vendoring." - (set -x; dep ensure) -elif [ -f go.mod ]; then - release-tools/verify-go-version.sh "go" - (set -x; env GO111MODULE=on go mod tidy && env GO111MODULE=on go mod vendor) -fi +#CMDS=cosi-controller-manager +all: build + +include release-tools/build.make diff --git a/release-tools/.prow.sh b/release-tools/.prow.sh deleted file mode 100755 index b18c5358..00000000 --- a/release-tools/.prow.sh +++ /dev/null @@ -1,7 +0,0 @@ -#! /bin/bash -e -# -# This is for testing csi-release-tools itself in Prow. All other -# repos use prow.sh for that, but as csi-release-tools isn't a normal -# repo with some Go code in it, it has a custom Prow test script. - -./verify-shellcheck.sh "$(pwd)" diff --git a/release-tools/CONTRIBUTING.md b/release-tools/CONTRIBUTING.md deleted file mode 100644 index de471151..00000000 --- a/release-tools/CONTRIBUTING.md +++ /dev/null @@ -1,31 +0,0 @@ -# Contributing Guidelines - -Welcome to Kubernetes. We are excited about the prospect of you joining our [community](https://github.com/kubernetes/community)! The Kubernetes community abides by the CNCF [code of conduct](code-of-conduct.md). Here is an excerpt: - -_As contributors and maintainers of this project, and in the interest of fostering an open and welcoming community, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities._ - -## Getting Started - -We have full documentation on how to get started contributing here: - - - -- [Contributor License Agreement](https://git.k8s.io/community/CLA.md) Kubernetes projects require that you sign a Contributor License Agreement (CLA) before we can accept your pull requests -- [Kubernetes Contributor Guide](http://git.k8s.io/community/contributors/guide) - Main contributor documentation, or you can just jump directly to the [contributing section](http://git.k8s.io/community/contributors/guide#contributing) -- [Contributor Cheat Sheet](https://git.k8s.io/community/contributors/guide/contributor-cheatsheet.md) - Common resources for existing developers - -## Mentorship - -- [Mentoring Initiatives](https://git.k8s.io/community/mentoring) - We have a diverse set of mentorship programs available that are always looking for volunteers! - - diff --git a/release-tools/LICENSE b/release-tools/LICENSE deleted file mode 100644 index 8dada3ed..00000000 --- a/release-tools/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - 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. diff --git a/release-tools/OWNERS b/release-tools/OWNERS deleted file mode 100644 index 6d2f474e..00000000 --- a/release-tools/OWNERS +++ /dev/null @@ -1,11 +0,0 @@ -# See the OWNERS docs: https://git.k8s.io/community/contributors/guide/owners.md - -approvers: -- saad-ali -- msau42 -- pohly - -reviewers: -- saad-ali -- msau42 -- pohly diff --git a/release-tools/README.md b/release-tools/README.md deleted file mode 100644 index 60eab2a9..00000000 --- a/release-tools/README.md +++ /dev/null @@ -1,166 +0,0 @@ -# [csi-release-tools](https://github.com/kubernetes-csi/csi-release-tools) - -These build and test rules can be shared between different Go projects -without modifications. Customization for the different projects happen -in the top-level Makefile. - -The rules include support for building and pushing Docker images, with -the following features: - - one or more command and image per project - - push canary and/or tagged release images - - automatically derive the image tag(s) from repo tags - - the source code revision is stored in a "revision" image label - - never overwrites an existing release image - -Usage ------ - -The expected repository layout is: - - `cmd/*/*.go` - source code for each command - - `cmd/*/Dockerfile` - docker file for each command or - Dockerfile in the root when only building a single command - - `Makefile` - includes `release-tools/build.make` and sets - configuration variables - - `.travis.yml` - a symlink to `release-tools/.travis.yml` - -To create a release, tag a certain revision with a name that -starts with `v`, for example `v1.0.0`, then `make push` -while that commit is checked out. - -It does not matter on which branch that revision exists, i.e. it is -possible to create releases directly from master. A release branch can -still be created for maintenance releases later if needed. - -Release branches are expected to be named `release-x.y` for releases -`x.y.z`. Building from such a branch creates `x.y-canary` -images. Building from master creates the main `canary` image. - -Sharing and updating --------------------- - -[`git subtree`](https://github.com/git/git/blob/master/contrib/subtree/git-subtree.txt) -is the recommended way of maintaining a copy of the rules inside the -`release-tools` directory of a project. This way, it is possible to make -changes also locally, test them and then push them back to the shared -repository at a later time. - -Cheat sheet: - -- `git subtree add --prefix=release-tools https://github.com/kubernetes-csi/csi-release-tools.git master` - add release tools to a repo which does not have them yet (only once) -- `git subtree pull --prefix=release-tools https://github.com/kubernetes-csi/csi-release-tools.git master` - update local copy to latest upstream (whenever upstream changes) -- edit, `git commit`, `git subtree push --prefix=release-tools git@github.com:/csi-release-tools.git ` - push to a new branch before submitting a PR - -verify-shellcheck.sh --------------------- - -The [verify-shellcheck.sh](./verify-shellcheck.sh) script in this repo -is a stripped down copy of the [corresponding -script](https://github.com/kubernetes/kubernetes/blob/release-1.14/hack/verify-shellcheck.sh) -in the Kubernetes repository. It can be used to check for certain -errors shell scripts, like missing quotation marks. The default -`test-shellcheck` target in [build.make](./build.make) only checks the -scripts in this directory. Components can add more directories to -`TEST_SHELLCHECK_DIRS` to check also other scripts. - -End-to-end testing ------------------- - -A repo that wants to opt into testing via Prow must set up a top-level -`.prow.sh`. Typically that will source `prow.sh` and then transfer -control to it: - -``` bash -#! /bin/bash -e - -. release-tools/prow.sh -main -``` - -All Kubernetes-CSI repos are expected to switch to Prow. For details -on what is enabled in Prow, see -https://github.com/kubernetes/test-infra/tree/master/config/jobs/kubernetes-csi - -Test results for periodic jobs are visible in -https://testgrid.k8s.io/sig-storage-csi-ci - -It is possible to reproduce the Prow testing locally on a suitable machine: -- Linux host -- Docker installed -- code to be tested checkout out in `$GOPATH/src/` -- `cd $GOPATH/src/ && ./.prow.sh` - -Beware that the script intentionally doesn't clean up after itself and -modifies the content of `$GOPATH`, in particular the `kubernetes` and -`kind` repositories there. Better run it in an empty, disposable -`$GOPATH`. - -When it terminates, the following command can be used to get access to -the Kubernetes cluster that was brought up for testing (assuming that -this step succeeded): - - export KUBECONFIG="$(kind get kubeconfig-path --name="csi-prow")" - -It is possible to control the execution via environment variables. See -`prow.sh` for details. Particularly useful is testing against different -Kubernetes releases: - - CSI_PROW_KUBERNETES_VERSION=1.13.3 ./.prow.sh - CSI_PROW_KUBERNETES_VERSION=latest ./.prow.sh - -Dependencies and vendoring --------------------------- - -Most projects will (eventually) use `go mod` to manage -dependencies. `dep` is also still supported by `csi-release-tools`, -but not documented here because it's not recommended anymore. - -The usual instructions for using [go -modules](https://github.com/golang/go/wiki/Modules) apply. Here's a cheat sheet -for some of the relevant commands: -- list available updates: `GO111MODULE=on go list -u -m all` -- update or add a single dependency: `GO111MODULE=on go get ` -- update all dependencies to their next minor or patch release: - `GO111MODULE=on go get ./...` (add `-u=patch` to limit to patch - releases) -- lock onto a specific version: `GO111MODULE=on go get @` -- clean up `go.mod`: `GO111MODULE=on go mod tidy` -- update vendor directory: `GO111MODULE=on go mod vendor` - -`GO111MODULE=on` can be left out when using Go >= 1.13 or when the -source is checked out outside of `$GOPATH`. - -`go mod tidy` must be used to ensure that the listed dependencies are -really still needed. Changing import statements or a tentative `go -get` can result in stale dependencies. - -The `test-vendor` verifies that it was used when run locally or in a -pre-merge CI job. If a `vendor` directory is present, it will also -verify that it's content is up-to-date. - -The `vendor` directory is optional. It is still present in projects -because it avoids downloading sources during CI builds. If this is no -longer deemed necessary, then a project can also remove the directory. - -Conversion of a repository that uses `dep` to `go mod` can be done with: - - GO111MODULE=on go mod init - release-tools/go-get-kubernetes.sh - GO111MODULE=on go mod tidy - GO111MODULE=on go mod vendor - git rm -f Gopkg.toml Gopkg.lock - git add go.mod go.sum vendor - -### Updating Kubernetes dependencies - -When using packages that are part of the Kubernetes source code, the -commands above are not enough because the [lack of semantic -versioning](https://github.com/kubernetes/kubernetes/issues/72638) -prevents `go mod` from finding newer releases. Importing directly from -`kubernetes/kubernetes` also needs `replace` statements to override -the fake `v0.0.0` versions -(https://github.com/kubernetes/kubernetes/issues/79384). The -`go-get-kubernetes.sh` script can be used to update all packages in -lockstep to a different Kubernetes version. Example usage: -``` -$ ./release-tools/go-get-kubernetes.sh 1.16.4 -``` diff --git a/release-tools/RELEASE.md b/release-tools/RELEASE.md deleted file mode 100644 index a0fd815b..00000000 --- a/release-tools/RELEASE.md +++ /dev/null @@ -1,5 +0,0 @@ -# Release Process - -No tagged releases are planned at this point. The intention is to keep -the master branch in a state such that it can be used for all -supported branches in downstream repos which use these files. diff --git a/release-tools/SECURITY_CONTACTS b/release-tools/SECURITY_CONTACTS deleted file mode 100644 index 2af1414e..00000000 --- a/release-tools/SECURITY_CONTACTS +++ /dev/null @@ -1,14 +0,0 @@ -# Defined below are the security contacts for this repo. -# -# They are the contact point for the Product Security Team to reach out -# to for triaging and handling of incoming issues. -# -# The below names agree to abide by the -# [Embargo Policy](https://github.com/kubernetes/sig-release/blob/master/security-release-process-documentation/security-release-process.md#embargo-policy) -# and will be removed and replaced if they violate that agreement. -# -# DO NOT REPORT SECURITY VULNERABILITIES DIRECTLY TO THESE NAMES, FOLLOW THE -# INSTRUCTIONS AT https://kubernetes.io/security/ - -saad-ali -msau42 diff --git a/release-tools/SIDECAR_RELEASE_PROCESS.md b/release-tools/SIDECAR_RELEASE_PROCESS.md deleted file mode 100644 index 4575eb81..00000000 --- a/release-tools/SIDECAR_RELEASE_PROCESS.md +++ /dev/null @@ -1,106 +0,0 @@ -# Sidecar Release Process - -This page describes the process for releasing a kubernetes-csi sidecar. - -## Prerequisites - -The release manager must: - -* Be a member of the kubernetes-csi organization. Open an - [issue](https://github.com/kubernetes/org/issues/new?assignees=&labels=area%2Fgithub-membership&template=membership.md&title=REQUEST%3A+New+membership+for+%3Cyour-GH-handle%3E) in - kubernetes/org to request membership -* Be a top level approver for the repository. To become a top level approver, - the candidate must demonstrate ownership and deep knowledge of the repository - through active maintainence, responding to and fixing issues, reviewing PRs, - test triage. -* Be part of the maintainers or admin group for the repository. admin is a - superset of maintainers, only maintainers level is required for cutting a - release. Membership can be requested by submitting a PR to kubernetes/org. - [Example](https://github.com/kubernetes/org/pull/1467) - -## Updating CI Jobs -Whenever a new Kubernetes minor version is released, our kubernetes-csi CI jobs -must be updated. - -[Our CI jobs](https://k8s-testgrid.appspot.com/sig-storage-csi-ci) have the -naming convention `-on-`. - -1. Jobs should be actively monitored to find and fix failures in sidecars and - infrastructure changes early in the development cycle. Test failures are sent - to kubernetes-sig-storage-test-failures@googlegroups.com. -1. "-on-master" jobs are the closest reflection to the new Kubernetes version. -1. Fixes to our prow.sh CI script can be tested in the [CSI hostpath - repo](https://github.com/kubernetes-csi/csi-driver-host-path) by modifying - [prow.sh](https://github.com/kubernetes-csi/csi-driver-host-path/blob/master/release-tools/prow.sh) - along with any overrides in - [.prow.sh](https://github.com/kubernetes-csi/csi-driver-host-path/blob/master/.prow.sh) - to mirror the failing environment. Once e2e tests are passing (verify-unit tests - will fail), then the prow.sh changes can be submitted to [csi-release-tools](https://github.com/kubernetes-csi/csi-release-tools). -1. Changes can then be updated in all the sidecar repos and hostpath driver repo - by following the [update - instructions](https://github.com/kubernetes-csi/csi-release-tools/blob/master/README.md#sharing-and-updating). -1. New pull and CI jobs are configured by adding new K8s versions to the top of - [gen-jobs.sh](https://github.com/kubernetes/test-infra/blob/master/config/jobs/kubernetes-csi/gen-jobs.sh). - New pull jobs that have been unverified should be initially made optional by - setting the new K8s version as - [experimental](https://github.com/kubernetes/test-infra/blob/a1858f46d6014480b130789df58b230a49203a64/config/jobs/kubernetes-csi/gen-jobs.sh#L40). -1. Once new pull and CI jobs have been verified, and the new Kubernetes version - is released, we can make the optional jobs required, and also remove the - Kubernetes versions that are no longer supported. - -## Release Process -1. Identify all issues and ongoing PRs that should go into the release, and - drive them to resolution. -1. Download v2.8+ [K8s release notes - generator](https://github.com/kubernetes/release/tree/master/cmd/release-notes) -1. Generate release notes for the release. Replace arguments with the relevant - information. - * Clean up old cached information (also needed if you are generating release - notes for multiple repos) - ```bash - rm -rf /tmp/k8s-repo - ``` - * For new minor releases on master: - ```bash - GITHUB_TOKEN= release-notes --discover=mergebase-to-latest - --github-org=kubernetes-csi --github-repo=external-provisioner - --required-author="" --output out.md - ``` - * For new patch releases on a release branch: - ```bash - GITHUB_TOKEN= release-notes --discover=patch-to-latest --branch=release-1.1 - --github-org=kubernetes-csi --github-repo=external-provisioner - --required-author="" --output out.md - ``` -1. Compare the generated output to the new commits for the release to check if - any notable change missed a release note. -1. Reword release notes as needed. Make sure to check notes for breaking - changes and deprecations. -1. If release is a new major/minor version, create a new `CHANGELOG-..md` - file. Otherwise, add the release notes to the top of the existing CHANGELOG - file for that minor version. -1. Submit a PR for the CHANGELOG changes. -1. Submit a PR for README changes, in particular, Compatibility, Feature status, - and any other sections that may need updating. -1. Check that all [canary CI - jobs](https://k8s-testgrid.appspot.com/sig-storage-csi-ci) are passing, - and that test coverage is adequate for the changes that are going into the release. -1. Make sure that no new PRs have merged in the meantime, and no PRs are in - flight and soon to be merged. -1. Create a new release following a previous release as a template. Be sure to select the correct - branch. This requires Github release permissions as required by the prerequisites. - [external-provisioner example](https://github.com/kubernetes-csi/external-provisioner/releases/new) -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 - the [k8s image - repo](https://github.com/kubernetes/k8s.io/tree/master/k8s.gcr.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 - and feature pages with the new released version. -1. After all the sidecars have been released, update - CSI hostpath driver with the new sidecars in the [CSI repo](https://github.com/kubernetes-csi/csi-driver-host-path/tree/master/deploy) - and [k/k - in-tree](https://github.com/kubernetes/kubernetes/tree/master/test/e2e/testing-manifests/storage-csi/hostpath/hostpath) diff --git a/release-tools/build.make b/release-tools/build.make deleted file mode 100644 index c17a1c19..00000000 --- a/release-tools/build.make +++ /dev/null @@ -1,272 +0,0 @@ -# Copyright 2019 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. - -.PHONY: build-% build container-% container push-% push clean test - -# A space-separated list of all commands in the repository, must be -# set in main Makefile of a repository. -# CMDS= - -# This is the default. It can be overridden in the main Makefile after -# including build.make. -REGISTRY_NAME=quay.io/k8scsi - -# Can be set to -mod=vendor to ensure that the "vendor" directory is used. -GOFLAGS_VENDOR= - -# Revision that gets built into each binary via the main.version -# string. Uses the `git describe` output based on the most recent -# version tag with a short revision suffix or, if nothing has been -# tagged yet, just the revision. -# -# Beware that tags may also be missing in shallow clones as done by -# some CI systems (like TravisCI, which pulls only 50 commits). -REV=$(shell git describe --long --tags --match='v*' --dirty 2>/dev/null || git rev-list -n1 HEAD) - -# A space-separated list of image tags under which the current build is to be pushed. -# Determined dynamically. -IMAGE_TAGS= - -# A "canary" image gets built if the current commit is the head of the remote "master" branch. -# That branch does not exist when building some other branch in TravisCI. -IMAGE_TAGS+=$(shell if [ "$$(git rev-list -n1 HEAD)" = "$$(git rev-list -n1 origin/master 2>/dev/null)" ]; then echo "canary"; fi) - -# A "X.Y.Z-canary" image gets built if the current commit is the head of a "origin/release-X.Y.Z" branch. -# The actual suffix does not matter, only the "release-" prefix is checked. -IMAGE_TAGS+=$(shell git branch -r --points-at=HEAD | grep 'origin/release-' | grep -v -e ' -> ' | sed -e 's;.*/release-\(.*\);\1-canary;') - -# A release image "vX.Y.Z" gets built if there is a tag of that format for the current commit. -# --abbrev=0 suppresses long format, only showing the closest tag. -IMAGE_TAGS+=$(shell tagged="$$(git describe --tags --match='v*' --abbrev=0)"; if [ "$$tagged" ] && [ "$$(git rev-list -n1 HEAD)" = "$$(git rev-list -n1 $$tagged)" ]; then echo $$tagged; fi) - -# Images are named after the command contained in them. -IMAGE_NAME=$(REGISTRY_NAME)/$* - -ifdef V -# Adding "-alsologtostderr" assumes that all test binaries contain glog. This is not guaranteed. -TESTARGS = -v -args -alsologtostderr -v 5 -else -TESTARGS = -endif - -# Specific packages can be excluded from each of the tests below by setting the *_FILTER_CMD variables -# to something like "| grep -v 'github.com/kubernetes-csi/project/pkg/foobar'". See usage below. - -# BUILD_PLATFORMS contains a set of triplets, -# separated by semicolon. An empty variable or empty entry (= just a -# semicolon) builds for the default platform of the current Go -# toolchain. -BUILD_PLATFORMS = - -# This builds each command (= the sub-directories of ./cmd) for the target platform(s) -# defined by BUILD_PLATFORMS. -$(CMDS:%=build-%): build-%: check-go-version-go - mkdir -p bin - echo '$(BUILD_PLATFORMS)' | tr ';' '\n' | while read -r os arch suffix; do \ - if ! (set -x; CGO_ENABLED=0 GOOS="$$os" GOARCH="$$arch" go build $(GOFLAGS_VENDOR) -a -ldflags '-X main.version=$(REV) -extldflags "-static"' -o "./bin/$*$$suffix" ./cmd/$*); then \ - echo "Building $* for GOOS=$$os GOARCH=$$arch failed, see error(s) above."; \ - exit 1; \ - fi; \ - done - -$(CMDS:%=container-%): container-%: build-% - docker build -t $*:latest -f $(shell if [ -e ./cmd/$*/Dockerfile ]; then echo ./cmd/$*/Dockerfile; else echo Dockerfile; fi) --label revision=$(REV) . - -$(CMDS:%=push-%): push-%: container-% - set -ex; \ - push_image () { \ - docker tag $*:latest $(IMAGE_NAME):$$tag; \ - docker push $(IMAGE_NAME):$$tag; \ - }; \ - for tag in $(IMAGE_TAGS); do \ - if [ "$$tag" = "canary" ] || echo "$$tag" | grep -q -e '-canary$$'; then \ - : "creating or overwriting canary image"; \ - push_image; \ - elif docker pull $(IMAGE_NAME):$$tag 2>&1 | tee /dev/stderr | grep -q "manifest for $(IMAGE_NAME):$$tag not found"; then \ - : "creating release image"; \ - push_image; \ - else \ - : "release image $(IMAGE_NAME):$$tag already exists, skipping push"; \ - fi; \ - done - -build: $(CMDS:%=build-%) -container: $(CMDS:%=container-%) -push: $(CMDS:%=push-%) - -# Additional parameters are needed when pushing to a local registry, -# see https://github.com/docker/buildx/issues/94. -# However, that then runs into https://github.com/docker/cli/issues/2396. -# -# What works for local testing is: -# make push-multiarch PULL_BASE_REF=master REGISTRY_NAME= BUILD_PLATFORMS="linux amd64; windows amd64 .exe; linux ppc64le -ppc64le; linux s390x -s390x" -DOCKER_BUILDX_CREATE_ARGS ?= - -# This target builds a multiarch image for one command using Moby BuildKit builder toolkit. -# Docker Buildx is included in Docker 19.03. -# -# ./cmd//Dockerfile[.Windows] is used if found, otherwise Dockerfile[.Windows]. -# It is currently optional: if no such file exists, Windows images are not included, -# even when Windows is listed in BUILD_PLATFORMS. That way, projects can test that -# Windows binaries can be built before adding a Dockerfile for it. -# -# BUILD_PLATFORMS determines which individual images are included in the multiarch image. -# PULL_BASE_REF must be set to 'master', 'release-x.y', or a tag name, and determines -# the tag for the resulting multiarch image. -$(CMDS:%=push-multiarch-%): push-multiarch-%: check-pull-base-ref build-% - set -ex; \ - DOCKER_CLI_EXPERIMENTAL=enabled; \ - export DOCKER_CLI_EXPERIMENTAL; \ - docker buildx create $(DOCKER_BUILDX_CREATE_ARGS) --use --name multiarchimage-buildertest; \ - trap "docker buildx rm multiarchimage-buildertest" EXIT; \ - dockerfile_linux=$$(if [ -e ./cmd/$*/Dockerfile ]; then echo ./cmd/$*/Dockerfile; else echo Dockerfile; fi); \ - dockerfile_windows=$$(if [ -e ./cmd/$*/Dockerfile.Windows ]; then echo ./cmd/$*/Dockerfile.Windows; else echo Dockerfile.Windows; fi); \ - if [ '$(BUILD_PLATFORMS)' ]; then build_platforms='$(BUILD_PLATFORMS)'; else build_platforms="linux amd64"; fi; \ - if ! [ -f "$$dockerfile_windows" ]; then \ - build_platforms="$$(echo "$$build_platforms" | sed -e 's/windows *[^ ]* *.exe//g' -e 's/; *;/;/g')"; \ - fi; \ - pushMultiArch () { \ - tag=$$1; \ - echo "$$build_platforms" | tr ';' '\n' | while read -r os arch suffix; do \ - docker buildx build --push \ - --tag $(IMAGE_NAME):$$arch-$$os-$$tag \ - --platform=$$os/$$arch \ - --file $$(eval echo \$${dockerfile_$$os}) \ - --build-arg binary=./bin/$*$$suffix \ - --label revision=$(REV) \ - .; \ - done; \ - images=$$(echo "$$build_platforms" | tr ';' '\n' | while read -r os arch suffix; do echo $(IMAGE_NAME):$$arch-$$os-$$tag; done); \ - docker manifest create --amend $(IMAGE_NAME):$$tag $$images; \ - docker manifest push -p $(IMAGE_NAME):$$tag; \ - }; \ - if [ $(PULL_BASE_REF) = "master" ]; then \ - : "creating or overwriting canary image"; \ - pushMultiArch canary; \ - elif echo $(PULL_BASE_REF) | grep -q -e 'release-*' ; then \ - : "creating or overwriting canary image for release branch"; \ - release_canary_tag=$$(echo $(PULL_BASE_REF) | cut -f2 -d '-')-canary; \ - pushMultiArch $$release_canary_tag; \ - elif docker pull $(IMAGE_NAME):$(PULL_BASE_REF) 2>&1 | tee /dev/stderr | grep -q "manifest for $(IMAGE_NAME):$(PULL_BASE_REF) not found"; then \ - : "creating release image"; \ - pushMultiArch $(PULL_BASE_REF); \ - else \ - : "ERROR: release image $(IMAGE_NAME):$(PULL_BASE_REF) already exists: a new tag is required!"; \ - exit 1; \ - fi - -.PHONY: check-pull-base-ref -check-pull-base-ref: - if ! [ "$(PULL_BASE_REF)" ]; then \ - echo >&2 "ERROR: PULL_BASE_REF must be set to 'master', 'release-x.y', or a tag name."; \ - exit 1; \ - fi - -.PHONY: push-multiarch -push-multiarch: $(CMDS:%=push-multiarch-%) - -clean: - -rm -rf bin - -test: check-go-version-go - -.PHONY: test-go -test: test-go -test-go: - @ echo; echo "### $@:" - go test $(GOFLAGS_VENDOR) `go list $(GOFLAGS_VENDOR) ./... | grep -v -e 'vendor' -e '/test/e2e$$' $(TEST_GO_FILTER_CMD)` $(TESTARGS) - -.PHONY: test-vet -test: test-vet -test-vet: - @ echo; echo "### $@:" - go vet $(GOFLAGS_VENDOR) `go list $(GOFLAGS_VENDOR) ./... | grep -v vendor $(TEST_VET_FILTER_CMD)` - -.PHONY: test-fmt -test: test-fmt -test-fmt: - @ echo; echo "### $@:" - files=$$(find . -name '*.go' | grep -v './vendor' $(TEST_FMT_FILTER_CMD)); \ - if [ $$(gofmt -d $$files | wc -l) -ne 0 ]; then \ - echo "formatting errors:"; \ - gofmt -d $$files; \ - false; \ - fi - -# This test only runs when dep >= 0.5 is installed, which is the case for the CI setup. -# When using 'go mod', we allow the test to be skipped in the Prow CI under some special -# circumstances, because it depends on accessing all remote repos and thus -# running it all the time would defeat the purpose of vendoring: -# - not handling a PR or -# - the fabricated merge commit leaves go.mod, go.sum and vendor dir unchanged -# - release-tools also didn't change (changing rules or Go version might lead to -# a different result and thus must be tested) -# - import statements not changed (because if they change, go.mod might have to be updated) -# -# "git diff" is intelligent enough to annotate changes inside the "import" block in -# the start of the diff hunk: -# -# diff --git a/rpc/common.go b/rpc/common.go -# index bb4a5c4..5fa4271 100644 -# --- a/rpc/common.go -# +++ b/rpc/common.go -# @@ -21,7 +21,6 @@ import ( -# "fmt" -# "time" -# -# - "google.golang.org/grpc" -# "google.golang.org/grpc/codes" -# "google.golang.org/grpc/status" -# -# We rely on that to find such changes. -# -# Vendoring is optional when using go.mod. -.PHONY: test-vendor -test: test-vendor -test-vendor: - @ echo; echo "### $@:" - @ ./release-tools/verify-vendor.sh - -.PHONY: test-subtree -test: test-subtree -test-subtree: - @ echo; echo "### $@:" - ./release-tools/verify-subtree.sh release-tools - -# Components can extend the set of directories which must pass shellcheck. -# The default is to check only the release-tools directory itself. -TEST_SHELLCHECK_DIRS=release-tools -.PHONY: test-shellcheck -test: test-shellcheck -test-shellcheck: - @ echo; echo "### $@:" - @ ret=0; \ - if ! command -v docker; then \ - echo "skipped, no Docker"; \ - exit 0; \ - fi; \ - for dir in $(abspath $(TEST_SHELLCHECK_DIRS)); do \ - echo; \ - echo "$$dir:"; \ - ./release-tools/verify-shellcheck.sh "$$dir" || ret=1; \ - done; \ - exit $$ret - -# Targets in the makefile can depend on check-go-version- -# to trigger a warning if the x.y version of that binary does not match -# what the project uses. Make ensures that this is only checked once per -# invocation. -.PHONY: check-go-version-% -check-go-version-%: - ./release-tools/verify-go-version.sh "$*" diff --git a/release-tools/cloudbuild.sh b/release-tools/cloudbuild.sh deleted file mode 100755 index 3ba11eca..00000000 --- a/release-tools/cloudbuild.sh +++ /dev/null @@ -1,6 +0,0 @@ -#! /bin/bash - -# shellcheck disable=SC1091 -. release-tools/prow.sh - -gcr_cloud_build diff --git a/release-tools/cloudbuild.yaml b/release-tools/cloudbuild.yaml deleted file mode 100644 index 8f678924..00000000 --- a/release-tools/cloudbuild.yaml +++ /dev/null @@ -1,46 +0,0 @@ -# A configuration file for multi-arch image building with the Google cloud build service. -# -# Repos using this file must: -# - import csi-release-tools -# - add a symlink cloudbuild.yaml -> release-tools/cloudbuild.yaml -# - add a .cloudbuild.sh which can be a custom file or a symlink -# to release-tools/cloudbuild.sh -# - accept "binary" as build argument in their Dockerfile(s) (see -# https://github.com/pohly/node-driver-registrar/blob/3018101987b0bb6da2a2657de607174d6e3728f7/Dockerfile#L4-L6) -# because binaries will get built for different architectures and then -# get copied from the built host into the container image -# -# See https://github.com/kubernetes/test-infra/blob/master/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/master/k8s.gcr.io/images/k8s-staging-sig-storage. - -# This must be specified in seconds. If omitted, defaults to 600s (10 mins). -timeout: 1800s -# This prevents errors if you don't use both _GIT_TAG and _PULL_BASE_REF, -# or any new substitutions added in the future. -options: - substitution_option: ALLOW_LOOSE -steps: - # The image must contain bash and curl. Ideally it should also contain - # the desired version of Go (currently defined in release-tools/travis.yml), - # but that just speeds up the build and is not required. - - name: 'gcr.io/k8s-testimages/gcb-docker-gcloud:v20200421-a2bf5f8' - entrypoint: ./.cloudbuild.sh - env: - - GIT_TAG=${_GIT_TAG} - - PULL_BASE_REF=${_PULL_BASE_REF} - - REGISTRY_NAME=gcr.io/${_STAGING_PROJECT} - - HOME=/root -substitutions: - # _GIT_TAG will be filled with a git-based tag for the image, of the form vYYYYMMDD-hash, and - # can be used as a substitution. - _GIT_TAG: '12345' - # _PULL_BASE_REF will contain the ref that was pushed to trigger this build - - # a branch like 'master' or 'release-0.2', or a tag like 'v0.2'. - _PULL_BASE_REF: 'master' - # The default gcr.io staging project for Kubernetes-CSI - # (=> https://console.cloud.google.com/gcr/images/k8s-staging-sig-storage/GLOBAL). - # Might be overridden in the Prow build job for a repo which wants - # images elsewhere. - _STAGING_PROJECT: 'k8s-staging-sig-storage' diff --git a/release-tools/code-of-conduct.md b/release-tools/code-of-conduct.md deleted file mode 100644 index 0d15c00c..00000000 --- a/release-tools/code-of-conduct.md +++ /dev/null @@ -1,3 +0,0 @@ -# Kubernetes Community Code of Conduct - -Please refer to our [Kubernetes Community Code of Conduct](https://git.k8s.io/community/code-of-conduct.md) diff --git a/release-tools/filter-junit.go b/release-tools/filter-junit.go deleted file mode 100644 index cf1cb4ab..00000000 --- a/release-tools/filter-junit.go +++ /dev/null @@ -1,133 +0,0 @@ -/* -Copyright 2019 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. -*/ - -/* -This command filters a JUnit file such that only tests with a name -matching a regular expression are passed through. By concatenating -multiple input files it is possible to merge them into a single file. -*/ -package main - -import ( - "encoding/xml" - "flag" - "io/ioutil" - "os" - "regexp" -) - -var ( - output = flag.String("o", "-", "junit file to write, - for stdout") - tests = flag.String("t", "", "regular expression matching the test names that are to be included in the output") -) - -/* - * TestSuite represents a JUnit file. Due to how encoding/xml works, we have - * represent all fields that we want to be passed through. It's therefore - * not a complete solution, but good enough for Ginkgo + Spyglass. - */ -type TestSuite struct { - XMLName string `xml:"testsuite"` - TestCases []TestCase `xml:"testcase"` -} - -type TestCase struct { - Name string `xml:"name,attr"` - Time string `xml:"time,attr"` - SystemOut string `xml:"system-out,omitempty"` - Failure string `xml:"failure,omitempty"` - Skipped SkipReason `xml:"skipped,omitempty"` -} - -// SkipReason deals with the special : -// if present, we must re-encode it, even if empty. -type SkipReason string - -func (s *SkipReason) UnmarshalText(text []byte) error { - *s = SkipReason(text) - if *s == "" { - *s = " " - } - return nil -} - -func (s SkipReason) MarshalText() ([]byte, error) { - if s == " " { - return []byte{}, nil - } - return []byte(s), nil -} - -func main() { - var junit TestSuite - var data []byte - - flag.Parse() - - re := regexp.MustCompile(*tests) - - // Read all input files. - for _, input := range flag.Args() { - if input == "-" { - if _, err := os.Stdin.Read(data); err != nil { - panic(err) - } - } else { - var err error - data, err = ioutil.ReadFile(input) - if err != nil { - panic(err) - } - } - if err := xml.Unmarshal(data, &junit); err != nil { - panic(err) - } - } - - // Keep only matching testcases. Testcases skipped in all test runs are only stored once. - filtered := map[string]TestCase{} - for _, testcase := range junit.TestCases { - if !re.MatchString(testcase.Name) { - continue - } - entry, ok := filtered[testcase.Name] - if !ok || // not present yet - entry.Skipped != "" && testcase.Skipped == "" { // replaced skipped test with real test run - filtered[testcase.Name] = testcase - } - } - junit.TestCases = nil - for _, testcase := range filtered { - junit.TestCases = append(junit.TestCases, testcase) - } - - // Re-encode. - data, err := xml.MarshalIndent(junit, "", " ") - if err != nil { - panic(err) - } - - // Write to output. - if *output == "-" { - if _, err := os.Stdout.Write(data); err != nil { - panic(err) - } - } else { - if err := ioutil.WriteFile(*output, data, 0644); err != nil { - panic(err) - } - } -} diff --git a/release-tools/go-get-kubernetes.sh b/release-tools/go-get-kubernetes.sh deleted file mode 100755 index 8c4e3024..00000000 --- a/release-tools/go-get-kubernetes.sh +++ /dev/null @@ -1,104 +0,0 @@ -#!/usr/bin/env bash - -# Copyright 2019 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. -# -# This script can be used while converting a repo from "dep" to "go mod" -# by calling it after "go mod init" or to update the Kubernetes packages -# in a repo that has already been converted. Only packages that are -# part of kubernetes/kubernetes and thus part of a Kubernetes release -# are modified. Other k8.io packages (like k8s.io/klog, k8s.io/utils) -# need to be updated separately. - -set -o pipefail - -cmd=$0 - -function help () { - echo "$cmd - update all components from kubernetes/kubernetes to that version" -} - -if [ $# -ne 1 ]; then - help - exit 1 -fi -case "$1" in -h|--help|help) help; exit 0;; esac - -die () { - echo >&2 "$@" - exit 1 -} - -k8s="$1" - -# If the repo imports k8s.io/kubernetes (directly or indirectly), then -# "go mod" will try to find "v0.0.0" versions because -# k8s.io/kubernetes has those in it's go.mod file -# (https://github.com/kubernetes/kubernetes/blob/2bd9643cee5b3b3a5ecbd3af49d09018f0773c77/go.mod#L146-L157). -# (https://github.com/kubernetes/kubernetes/issues/79384). -# -# We need to replicate the replace statements to override those fake -# versions also in our go.mod file (idea and some code from -# https://github.com/kubernetes/kubernetes/issues/79384#issuecomment-521493597). -mods=$( (set -x; curl --silent --show-error --fail "https://raw.githubusercontent.com/kubernetes/kubernetes/v${k8s}/go.mod") | - sed -n 's|.*k8s.io/\(.*\) => ./staging/src/k8s.io/.*|k8s.io/\1|p' - ) || die "failed to determine Kubernetes staging modules" -for mod in $mods; do - # The presence of a potentially incomplete go.mod file affects this command, - # so move elsewhere. - modinfo=$(set -x; cd /; env GO111MODULE=on go mod download -json "$mod@kubernetes-${k8s}") || - die "failed to determine version of $mod: $modinfo" - v=$(echo "$modinfo" | sed -n 's|.*"Version": "\(.*\)".*|\1|p') - (set -x; env GO111MODULE=on go mod edit "-replace=$mod=$mod@$v") || die "'go mod edit' failed" -done - -packages= - -# Beware that we have to work with packages, not modules (i.e. no -m -# flag), because some modules trigger a "no Go code except tests" -# error. Getting their packages works. -if ! packages=$( (set -x; env GO111MODULE=on go list all) | grep ^k8s.io/ | sed -e 's; *;;'); then - cat >&2 <&2 <" go.mod; then - deps="$deps $(echo "$package" | sed -e "s;\$;@kubernetes-$k8s;" -e 's;^k8s.io/kubernetes\(/.*\)@kubernetes-;k8s.io/kubernetes\1@v;')" - fi -done - -# shellcheck disable=SC2086 -(set -x; env GO111MODULE=on go get $deps 2>&1) || die "go get failed" -echo "SUCCESS" diff --git a/release-tools/prow.sh b/release-tools/prow.sh deleted file mode 100755 index b069a318..00000000 --- a/release-tools/prow.sh +++ /dev/null @@ -1,1224 +0,0 @@ -#! /bin/bash -# -# Copyright 2019 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. - - -# This script runs inside a Prow job. It can run unit tests ("make test") -# and E2E testing. This E2E testing covers different scenarios (see -# https://github.com/kubernetes/enhancements/pull/807): -# - running the stable hostpath example against a Kubernetes release -# - running the canary hostpath example against a Kubernetes release -# - building the component in the current repo and running the -# stable hostpath example with that one component replaced against -# a Kubernetes release -# -# The intended usage of this script is that individual repos import -# csi-release-tools, then link their top-level prow.sh to this or -# include it in that file. When including it, several of the variables -# can be overridden in the top-level prow.sh to customize the script -# for the repo. -# -# The expected environment is: -# - $GOPATH/src/ for the repository that is to be tested, -# with PR branch merged (when testing a PR) -# - running on linux-amd64 -# - bazel installed (when testing against Kubernetes master), must be recent -# enough for Kubernetes master -# - kind (https://github.com/kubernetes-sigs/kind) installed -# - optional: Go already installed - -RELEASE_TOOLS_ROOT="$(realpath "$(dirname "${BASH_SOURCE[0]}")")" -REPO_DIR="$(pwd)" - -# Sets the default value for a variable if not set already and logs the value. -# Any variable set this way is usually something that a repo's .prow.sh -# or the job can set. -configvar () { - # Ignore: Word is of the form "A"B"C" (B indicated). Did you mean "ABC" or "A\"B\"C"? - # shellcheck disable=SC2140 - eval : \$\{"$1":="\$2"\} - eval echo "\$3:" "$1=\${$1}" -} - -# Takes the minor version of $CSI_PROW_KUBERNETES_VERSION and overrides it to -# $1 if they are equal minor versions. Ignores versions that begin with -# "release-". -override_k8s_version () { - local current_minor_version - local override_minor_version - - # Ignore: See if you can use ${variable//search/replace} instead. - # shellcheck disable=SC2001 - current_minor_version="$(echo "${CSI_PROW_KUBERNETES_VERSION}" | sed -e 's/\([0-9]*\)\.\([0-9]*\).*/\1\.\2/')" - - # Ignore: See if you can use ${variable//search/replace} instead. - # shellcheck disable=SC2001 - override_minor_version="$(echo "${1}" | sed -e 's/\([0-9]*\)\.\([0-9]*\).*/\1\.\2/')" - if [ "${current_minor_version}" == "${override_minor_version}" ]; then - CSI_PROW_KUBERNETES_VERSION="$1" - echo "Overriding CSI_PROW_KUBERNETES_VERSION with $1: $CSI_PROW_KUBERNETES_VERSION" - fi -} - -# Prints the value of a variable + version suffix, falling back to variable + "LATEST". -get_versioned_variable () { - local var="$1" - local version="$2" - local value - - eval value="\${${var}_${version}}" - if ! [ "$value" ]; then - eval value="\${${var}_LATEST}" - fi - echo "$value" -} - -configvar CSI_PROW_BUILD_PLATFORMS "linux amd64; windows amd64 .exe; linux ppc64le -ppc64le; linux s390x -s390x; linux arm64 -arm64" "Go target platforms (= GOOS + GOARCH) and file suffix of the resulting binaries" - -# If we have a vendor directory, then use it. We must be careful to only -# use this for "make" invocations inside the project's repo itself because -# setting it globally can break other go usages (like "go get " -# which is disabled with GOFLAGS=-mod=vendor). -configvar GOFLAGS_VENDOR "$( [ -d vendor ] && echo '-mod=vendor' )" "Go flags for using the vendor directory" - -# Go versions can be specified seperately for different tasks -# If the pre-installed Go is missing or a different -# version, the required version here will get installed -# from https://golang.org/dl/. -go_from_travis_yml () { - grep "^ *- go:" "${RELEASE_TOOLS_ROOT}/travis.yml" | sed -e 's/.*go: *//' -} -configvar CSI_PROW_GO_VERSION_BUILD "$(go_from_travis_yml)" "Go version for building the component" # depends on component's source code -configvar CSI_PROW_GO_VERSION_E2E "" "override Go version for building the Kubernetes E2E test suite" # normally doesn't need to be set, see install_e2e -configvar CSI_PROW_GO_VERSION_SANITY "${CSI_PROW_GO_VERSION_BUILD}" "Go version for building the csi-sanity test suite" # depends on CSI_PROW_SANITY settings below -configvar CSI_PROW_GO_VERSION_KIND "${CSI_PROW_GO_VERSION_BUILD}" "Go version for building 'kind'" # depends on CSI_PROW_KIND_VERSION below -configvar CSI_PROW_GO_VERSION_GINKGO "${CSI_PROW_GO_VERSION_BUILD}" "Go version for building ginkgo" # depends on CSI_PROW_GINKGO_VERSION below - -# kind version to use. If the pre-installed version is different, -# the desired version is downloaded from https://github.com/kubernetes-sigs/kind/releases/download/ -# (if available), otherwise it is built from source. -configvar CSI_PROW_KIND_VERSION "v0.6.0" "kind" - -# ginkgo test runner version to use. If the pre-installed version is -# different, the desired version is built from source. -configvar CSI_PROW_GINKGO_VERSION v1.7.0 "Ginkgo" - -# Ginkgo runs the E2E test in parallel. The default is based on the number -# of CPUs, but typically this can be set to something higher in the job. -configvar CSI_PROW_GINKO_PARALLEL "-p" "Ginko parallelism parameter(s)" - -# Enables building the code in the repository. On by default, can be -# disabled in jobs which only use pre-built components. -configvar CSI_PROW_BUILD_JOB true "building code in repo enabled" - -# Kubernetes version to test against. This must be a version number -# (like 1.13.3) for which there is a pre-built kind image (see -# https://hub.docker.com/r/kindest/node/tags), "latest" (builds -# Kubernetes from the master branch) or "release-x.yy" (builds -# Kubernetes from a release branch). -# -# This can also be a version that was not released yet at the time -# that the settings below were chose. The script will then -# use the same settings as for "latest" Kubernetes. This works -# as long as there are no breaking changes in Kubernetes, like -# deprecating or changing the implementation of an alpha feature. -configvar CSI_PROW_KUBERNETES_VERSION 1.17.0 "Kubernetes" - -# This is a hack to workaround the issue that each version -# of kind currently only supports specific patch versions of -# Kubernetes. We need to override CSI_PROW_KUBERNETES_VERSION -# passed in by our CI/pull jobs to the versions that -# kind v0.5.0 supports. -# -# If the version is prefixed with "release-", then nothing -# is overridden. -override_k8s_version "1.15.3" - -# CSI_PROW_KUBERNETES_VERSION reduced to first two version numbers and -# with underscore (1_13 instead of 1.13.3) and in uppercase (LATEST -# instead of latest). -# -# This is used to derive the right defaults for the variables below -# when a Prow job just defines the Kubernetes version. -csi_prow_kubernetes_version_suffix="$(echo "${CSI_PROW_KUBERNETES_VERSION}" | tr . _ | tr '[:lower:]' '[:upper:]' | sed -e 's/^RELEASE-//' -e 's/\([0-9]*\)_\([0-9]*\).*/\1_\2/')" - -# Work directory. It has to allow running executables, therefore /tmp -# is avoided. Cleaning up after the script is intentionally left to -# the caller. -configvar CSI_PROW_WORK "$(mkdir -p "$GOPATH/pkg" && mktemp -d "$GOPATH/pkg/csiprow.XXXXXXXXXX")" "work directory" - -# By default, this script tests sidecars with the CSI hostpath driver, -# using the install_csi_driver function. That function depends on -# a deployment script that it searches for in several places: -# -# - The "deploy" directory in the current repository: this is useful -# for the situation that a component becomes incompatible with the -# shared deployment, because then it can (temporarily!) provide its -# own example until the shared one can be updated; it's also how -# csi-driver-host-path itself provides the example. -# -# - CSI_PROW_DRIVER_VERSION of the CSI_PROW_DRIVER_REPO is checked -# out: this allows other repos to reference a version of the example -# that is known to be compatible. -# -# - The /deploy directory can have multiple sub-directories, -# each with different deployments (stable set of images for Kubernetes 1.13, -# stable set of images for Kubernetes 1.14, canary for latest Kubernetes, etc.). -# This is necessary because there may be incompatible changes in the -# "API" of a component (for example, its command line options or RBAC rules) -# or in its support for different Kubernetes versions (CSIDriverInfo as -# CRD in Kubernetes 1.13 vs builtin API in Kubernetes 1.14). -# -# When testing an update for a component in a PR job, the -# CSI_PROW_DEPLOYMENT variable can be set in the -# .prow.sh of each component when there are breaking changes -# that require using a non-default deployment. The default -# is a deployment named "kubernetes-x.yy" (if available), -# otherwise "kubernetes-latest". -# "none" disables the deployment of the hostpath driver. -# -# When no deploy script is found (nothing in `deploy` directory, -# CSI_PROW_DRIVER_REPO=none), nothing gets deployed. -# -# If the deployment script is called with CSI_PROW_TEST_DRIVER= as -# environment variable, then it must write a suitable test driver configuration -# into that file in addition to installing the driver. -configvar CSI_PROW_DRIVER_VERSION "v1.3.0" "CSI driver version" -configvar CSI_PROW_DRIVER_REPO https://github.com/kubernetes-csi/csi-driver-host-path "CSI driver repo" -configvar CSI_PROW_DEPLOYMENT "" "deployment" - -# The install_csi_driver function may work also for other CSI drivers, -# as long as they follow the conventions of the CSI hostpath driver. -# If they don't, then a different install function can be provided in -# a .prow.sh file and this config variable can be overridden. -configvar CSI_PROW_DRIVER_INSTALL "install_csi_driver" "name of the shell function which installs the CSI driver" - -# If CSI_PROW_DRIVER_CANARY is set (typically to "canary", but also -# version tag. Usually empty. CSI_PROW_HOSTPATH_CANARY is -# accepted as alternative name because some test-infra jobs -# still use that name. -configvar CSI_PROW_DRIVER_CANARY "${CSI_PROW_HOSTPATH_CANARY}" "driver image override for canary images" - -# Image registry to use for canary images. -# Only valid if CSI_PROW_DRIVER_CANARY == "canary". -configvar CSI_PROW_DRIVER_CANARY_REGISTRY "gcr.io/k8s-staging-sig-storage" "registry for canary images" - -# The E2E testing can come from an arbitrary repo. The expectation is that -# the repo supports "go test ./test/e2e -args --storage.testdriver" (https://github.com/kubernetes/kubernetes/pull/72836) -# after setting KUBECONFIG. As a special case, if the repository is Kubernetes, -# then `make WHAT=test/e2e/e2e.test` is called first to ensure that -# all generated files are present. -# -# CSI_PROW_E2E_REPO=none disables E2E testing. -tag_from_version () { - version="$1" - shift - case "$version" in - latest) echo "master";; - release-*) echo "$version";; - *) echo "v$version";; - esac -} -configvar CSI_PROW_E2E_VERSION "$(tag_from_version "${CSI_PROW_KUBERNETES_VERSION}")" "E2E version" -configvar CSI_PROW_E2E_REPO "https://github.com/kubernetes/kubernetes" "E2E repo" -configvar CSI_PROW_E2E_IMPORT_PATH "k8s.io/kubernetes" "E2E package" - -# csi-sanity testing from the csi-test repo can be run against the installed -# CSI driver. For this to work, deploying the driver must expose the Unix domain -# csi.sock as a TCP service for use by the csi-sanity command, which runs outside -# of the cluster. The alternative would have been to (cross-)compile csi-sanity -# and install it inside the cluster, which is not necessarily easier. -configvar CSI_PROW_SANITY_REPO https://github.com/kubernetes-csi/csi-test "csi-test repo" -configvar CSI_PROW_SANITY_VERSION 5421d9f3c37be3b95b241b44a094a3db11bee789 "csi-test version" # latest master -configvar CSI_PROW_SANITY_IMPORT_PATH github.com/kubernetes-csi/csi-test "csi-test package" -configvar CSI_PROW_SANITY_SERVICE "hostpath-service" "Kubernetes TCP service name that exposes csi.sock" -configvar CSI_PROW_SANITY_POD "csi-hostpathplugin-0" "Kubernetes pod with CSI driver" -configvar CSI_PROW_SANITY_CONTAINER "hostpath" "Kubernetes container with CSI driver" - -# The version of dep to use for 'make test-vendor'. Ignored if the project doesn't -# use dep. Only binary releases of dep are supported (https://github.com/golang/dep/releases). -configvar CSI_PROW_DEP_VERSION v0.5.1 "golang dep version to be used for vendor checking" - -# Each job can run one or more of the following tests, identified by -# a single word: -# - unit testing -# - parallel excluding alpha features -# - serial excluding alpha features -# - parallel, only alpha feature -# - serial, only alpha features -# - sanity -# -# Unknown or unsupported entries are ignored. -# -# Sanity testing with csi-sanity only covers the CSI driver itself and -# thus only makes sense in repos which provide their own CSI -# driver. Repos can enable sanity testing by setting -# CSI_PROW_TESTS_SANITY=sanity. -configvar CSI_PROW_TESTS "unit parallel serial parallel-alpha serial-alpha sanity" "tests to run" -tests_enabled () { - local t1 t2 - # We want word-splitting here, so ignore: Quote to prevent word splitting, or split robustly with mapfile or read -a. - # shellcheck disable=SC2206 - local tests=(${CSI_PROW_TESTS}) - for t1 in "$@"; do - for t2 in "${tests[@]}"; do - if [ "$t1" = "$t2" ]; then - return - fi - done - done - return 1 -} -sanity_enabled () { - [ "${CSI_PROW_TESTS_SANITY}" = "sanity" ] && tests_enabled "sanity" -} -tests_need_kind () { - tests_enabled "parallel" "serial" "serial-alpha" "parallel-alpha" || - sanity_enabled -} -tests_need_non_alpha_cluster () { - tests_enabled "parallel" "serial" || - sanity_enabled -} -tests_need_alpha_cluster () { - tests_enabled "parallel-alpha" "serial-alpha" -} - -# Regex for non-alpha, feature-tagged tests that should be run. -# -# Starting with 1.17, snapshots is beta, but the E2E tests still have the -# [Feature:] tag. They need to be explicitly enabled. -configvar CSI_PROW_E2E_FOCUS_1_15 '^' "non-alpha, feature-tagged tests for Kubernetes = 1.15" # no tests to run, match nothing -configvar CSI_PROW_E2E_FOCUS_1_16 '^' "non-alpha, feature-tagged tests for Kubernetes = 1.16" # no tests to run, match nothing -configvar CSI_PROW_E2E_FOCUS_LATEST '\[Feature:VolumeSnapshotDataSource\]' "non-alpha, feature-tagged tests for Kubernetes >= 1.17" -configvar CSI_PROW_E2E_FOCUS "$(get_versioned_variable CSI_PROW_E2E_FOCUS "${csi_prow_kubernetes_version_suffix}")" "non-alpha, feature-tagged tests" - -# Serial vs. parallel is always determined by these regular expressions. -# Individual regular expressions are seperated by spaces for readability -# and expected to not contain spaces. Use dots instead. The complete -# regex for Ginkgo will be created by joining the individual terms. -configvar CSI_PROW_E2E_SERIAL '\[Serial\] \[Disruptive\]' "tags for serial E2E tests" -regex_join () { - echo "$@" | sed -e 's/ */|/g' -e 's/^|*//' -e 's/|*$//' -e 's/^$/this-matches-nothing/g' -} - -# Which tests are alpha depends on the Kubernetes version. We could -# use the same E2E test for all Kubernetes version. This would have -# the advantage that new tests can be applied to older versions -# without having to backport tests. -# -# But the feature tag gets removed from E2E tests when the corresponding -# feature becomes beta, so we would have to track which tests were -# alpha in previous Kubernetes releases. This was considered too -# error prone. Therefore we use E2E tests that match the Kubernetes -# version that is getting tested. -configvar CSI_PROW_E2E_ALPHA_LATEST '\[Feature:' "alpha tests for Kubernetes >= 1.14" # there's no need to update this, adding a new case for CSI_PROW_E2E for a new Kubernetes is enough -configvar CSI_PROW_E2E_ALPHA "$(get_versioned_variable CSI_PROW_E2E_ALPHA "${csi_prow_kubernetes_version_suffix}")" "alpha tests" - -# After the parallel E2E test without alpha features, a test cluster -# with alpha features is brought up and tests that were previously -# disabled are run. The alpha gates in each release have to be listed -# explicitly. If none are set (= variable empty), alpha testing -# is skipped. -# -# Testing against "latest" Kubernetes is problematic because some alpha -# feature which used to work might stop working or change their behavior -# such that the current tests no longer pass. If that happens, -# kubernetes-csi components must be updated, either by disabling -# the failing test for "latest" or by updating the test and not running -# it anymore for older releases. -configvar CSI_PROW_E2E_ALPHA_GATES_1_15 'VolumeSnapshotDataSource=true,ExpandCSIVolumes=true' "alpha feature gates for Kubernetes 1.15" -configvar CSI_PROW_E2E_ALPHA_GATES_1_16 'VolumeSnapshotDataSource=true' "alpha feature gates for Kubernetes 1.16" -# TODO: add new CSI_PROW_ALPHA_GATES_xxx entry for future Kubernetes releases and -# add new gates to CSI_PROW_E2E_ALPHA_GATES_LATEST. -configvar CSI_PROW_E2E_ALPHA_GATES_LATEST '' "alpha feature gates for latest Kubernetes" -configvar CSI_PROW_E2E_ALPHA_GATES "$(get_versioned_variable CSI_PROW_E2E_ALPHA_GATES "${csi_prow_kubernetes_version_suffix}")" "alpha E2E feature gates" - -# Which external-snapshotter tag to use for the snapshotter CRD and snapshot-controller deployment -configvar CSI_SNAPSHOTTER_VERSION 'v2.0.1' "external-snapshotter version tag" - -# Some tests are known to be unusable in a KinD cluster. For example, -# stopping kubelet with "ssh systemctl stop kubelet" simply -# doesn't work. Such tests should be written in a way that they verify -# whether they can run with the current cluster provider, but until -# they are, we filter them out by name. Like the other test selection -# variables, this is again a space separated list of regular expressions. -# -# "different node" test skips can be removed once -# https://github.com/kubernetes/kubernetes/pull/82678 has been backported -# to all the K8s versions we test against -configvar CSI_PROW_E2E_SKIP 'Disruptive|different\s+node' "tests that need to be skipped" - -# This is the directory for additional result files. Usually set by Prow, but -# if not (for example, when invoking manually) it defaults to the work directory. -configvar ARTIFACTS "${CSI_PROW_WORK}/artifacts" "artifacts" -mkdir -p "${ARTIFACTS}" - -run () { - echo "$(date) $(go version | sed -e 's/.*version \(go[^ ]*\).*/\1/') $(if [ "$(pwd)" != "${REPO_DIR}" ]; then pwd; fi)\$" "$@" >&2 - "$@" -} - -info () { - echo >&2 INFO: "$@" -} - -warn () { - echo >&2 WARNING: "$@" -} - -die () { - echo >&2 ERROR: "$@" - exit 1 -} - -# For additional tools. -CSI_PROW_BIN="${CSI_PROW_WORK}/bin" -mkdir -p "${CSI_PROW_BIN}" -PATH="${CSI_PROW_BIN}:$PATH" - -# Ensure that PATH has the desired version of the Go tools, then run command given as argument. -# Empty parameter uses the already installed Go. In Prow, that version is kept up-to-date by -# bumping the container image regularly. -run_with_go () { - local version - version="$1" - shift - - if ! [ "$version" ] || go version 2>/dev/null | grep -q "go$version"; then - run "$@" - else - if ! [ -d "${CSI_PROW_WORK}/go-$version" ]; then - run curl --fail --location "https://dl.google.com/go/go$version.linux-amd64.tar.gz" | tar -C "${CSI_PROW_WORK}" -zxf - || die "installation of Go $version failed" - mv "${CSI_PROW_WORK}/go" "${CSI_PROW_WORK}/go-$version" - fi - PATH="${CSI_PROW_WORK}/go-$version/bin:$PATH" run "$@" - fi -} - -# Ensure that we have the desired version of kind. -install_kind () { - if kind --version 2>/dev/null | grep -q " ${CSI_PROW_KIND_VERSION}$"; then - return - fi - if run curl --fail --location -o "${CSI_PROW_WORK}/bin/kind" "https://github.com/kubernetes-sigs/kind/releases/download/${CSI_PROW_KIND_VERSION}/kind-linux-amd64"; then - chmod u+x "${CSI_PROW_WORK}/bin/kind" - else - git_checkout https://github.com/kubernetes-sigs/kind "${GOPATH}/src/sigs.k8s.io/kind" "${CSI_PROW_KIND_VERSION}" --depth=1 && - (cd "${GOPATH}/src/sigs.k8s.io/kind" && make install INSTALL_DIR="${CSI_PROW_WORK}/bin") - fi -} - -# Ensure that we have the desired version of the ginkgo test runner. -install_ginkgo () { - # CSI_PROW_GINKGO_VERSION contains the tag with v prefix, the command line output does not. - if [ "v$(ginkgo version 2>/dev/null | sed -e 's/.* //')" = "${CSI_PROW_GINKGO_VERSION}" ]; then - return - fi - git_checkout https://github.com/onsi/ginkgo "$GOPATH/src/github.com/onsi/ginkgo" "${CSI_PROW_GINKGO_VERSION}" --depth=1 && - # We have to get dependencies and hence can't call just "go build". - run_with_go "${CSI_PROW_GO_VERSION_GINKGO}" go get github.com/onsi/ginkgo/ginkgo || die "building ginkgo failed" && - mv "$GOPATH/bin/ginkgo" "${CSI_PROW_BIN}" -} - -# Ensure that we have the desired version of dep. -install_dep () { - if dep version 2>/dev/null | grep -q "version:.*${CSI_PROW_DEP_VERSION}$"; then - return - fi - run curl --fail --location -o "${CSI_PROW_WORK}/bin/dep" "https://github.com/golang/dep/releases/download/v0.5.4/dep-linux-amd64" && - chmod u+x "${CSI_PROW_WORK}/bin/dep" -} - -# This checks out a repo ("https://github.com/kubernetes/kubernetes") -# in a certain location ("$GOPATH/src/k8s.io/kubernetes") at -# a certain revision (a hex commit hash, v1.13.1, master). It's okay -# for that directory to exist already. -git_checkout () { - local repo path revision - repo="$1" - shift - path="$1" - shift - revision="$1" - shift - - mkdir -p "$path" - if ! [ -d "$path/.git" ]; then - run git init "$path" - fi - if (cd "$path" && run git fetch "$@" "$repo" "$revision"); then - (cd "$path" && run git checkout FETCH_HEAD) || die "checking out $repo $revision failed" - else - # Might have been because fetching by revision is not - # supported by GitHub (https://github.com/isaacs/github/issues/436). - # Fall back to fetching everything. - (cd "$path" && run git fetch "$repo" '+refs/heads/*:refs/remotes/csiprow/heads/*' '+refs/tags/*:refs/tags/*') || die "fetching $repo failed" - (cd "$path" && run git checkout "$revision") || die "checking out $repo $revision failed" - fi - # This is useful for local testing or when switching between different revisions in the same - # repo. - (cd "$path" && run git clean -fdx) || die "failed to clean $path" -} - -# This clones a repo ("https://github.com/kubernetes/kubernetes") -# in a certain location ("$GOPATH/src/k8s.io/kubernetes") at -# a the head of a specific branch (i.e., release-1.13, master). -# The directory cannot exist. -git_clone_branch () { - local repo path branch parent - repo="$1" - shift - path="$1" - shift - branch="$1" - shift - - parent="$(dirname "$path")" - mkdir -p "$parent" - (cd "$parent" && run git clone --single-branch --branch "$branch" "$repo" "$path") || die "cloning $repo" failed - # This is useful for local testing or when switching between different revisions in the same - # repo. - (cd "$path" && run git clean -fdx) || die "failed to clean $path" -} - -list_gates () ( - set -f; IFS=',' - # Ignore: Double quote to prevent globbing and word splitting. - # shellcheck disable=SC2086 - set -- $1 - while [ "$1" ]; do - # Ignore: See if you can use ${variable//search/replace} instead. - # shellcheck disable=SC2001 - echo "$1" | sed -e 's/ *\([^ =]*\) *= *\([^ ]*\) */ \1: \2/' - shift - done -) - -go_version_for_kubernetes () ( - local path="$1" - local version="$2" - local go_version - - # We use the minimal Go version specified for each K8S release (= minimum_go_version in hack/lib/golang.sh). - # More recent versions might also work, but we don't want to count on that. - go_version="$(grep minimum_go_version= "$path/hack/lib/golang.sh" | sed -e 's/.*=go//')" - if ! [ "$go_version" ]; then - die "Unable to determine Go version for Kubernetes $version from hack/lib/golang.sh." - fi - # Strip the trailing .0. Kubernetes includes it, Go itself doesn't. - # Ignore: See if you can use ${variable//search/replace} instead. - # shellcheck disable=SC2001 - go_version="$(echo "$go_version" | sed -e 's/\.0$//')" - echo "$go_version" -) - -csi_prow_kind_have_kubernetes=false -# Brings up a Kubernetes cluster and sets KUBECONFIG. -# Accepts additional feature gates in the form gate1=true|false,gate2=... -start_cluster () { - local image gates - gates="$1" - - if kind get clusters | grep -q csi-prow; then - run kind delete cluster --name=csi-prow || die "kind delete failed" - fi - - # Build from source? - if [[ "${CSI_PROW_KUBERNETES_VERSION}" =~ ^release-|^latest$ ]]; then - if ! ${csi_prow_kind_have_kubernetes}; then - local version="${CSI_PROW_KUBERNETES_VERSION}" - if [ "$version" = "latest" ]; then - version=master - fi - git_clone_branch https://github.com/kubernetes/kubernetes "${CSI_PROW_WORK}/src/kubernetes" "$version" || die "checking out Kubernetes $version failed" - - go_version="$(go_version_for_kubernetes "${CSI_PROW_WORK}/src/kubernetes" "$version")" || die "cannot proceed without knowing Go version for Kubernetes" - run_with_go "$go_version" kind build node-image --type bazel --image csiprow/node:latest --kube-root "${CSI_PROW_WORK}/src/kubernetes" || die "'kind build node-image' failed" - csi_prow_kind_have_kubernetes=true - fi - image="csiprow/node:latest" - else - image="kindest/node:v${CSI_PROW_KUBERNETES_VERSION}" - fi - cat >"${CSI_PROW_WORK}/kind-config.yaml" <>"${CSI_PROW_WORK}/kind-config.yaml" </dev/null; wait) - info "For container output see job artifacts." - die "deploying the CSI driver with ${deploy_driver} failed" - fi -} - -# Installs all nessesary snapshotter CRDs -install_snapshot_crds() { - # Wait until volumesnapshot CRDs are in place. - CRD_BASE_DIR="https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/${CSI_SNAPSHOTTER_VERSION}/config/crd" - kubectl apply -f "${CRD_BASE_DIR}/snapshot.storage.k8s.io_volumesnapshotclasses.yaml" --validate=false - kubectl apply -f "${CRD_BASE_DIR}/snapshot.storage.k8s.io_volumesnapshots.yaml" --validate=false - kubectl apply -f "${CRD_BASE_DIR}/snapshot.storage.k8s.io_volumesnapshotcontents.yaml" --validate=false - cnt=0 - until kubectl get volumesnapshotclasses.snapshot.storage.k8s.io \ - && kubectl get volumesnapshots.snapshot.storage.k8s.io \ - && kubectl get volumesnapshotcontents.snapshot.storage.k8s.io; do - if [ $cnt -gt 30 ]; then - echo >&2 "ERROR: snapshot CRDs not ready after over 1 min" - exit 1 - fi - echo "$(date +%H:%M:%S)" "waiting for snapshot CRDs, attempt #$cnt" - cnt=$((cnt + 1)) - sleep 2 - done -} - -# Install snapshot controller and associated RBAC, retrying until the pod is running. -install_snapshot_controller() { - kubectl apply -f "https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/${CSI_SNAPSHOTTER_VERSION}/deploy/kubernetes/snapshot-controller/rbac-snapshot-controller.yaml" - cnt=0 - until kubectl get clusterrolebinding snapshot-controller-role; do - if [ $cnt -gt 30 ]; then - echo "Cluster role bindings:" - kubectl describe clusterrolebinding - echo >&2 "ERROR: snapshot controller RBAC not ready after over 5 min" - exit 1 - fi - echo "$(date +%H:%M:%S)" "waiting for snapshot RBAC setup complete, attempt #$cnt" - cnt=$((cnt + 1)) - sleep 10 - done - - - kubectl apply -f "https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/${CSI_SNAPSHOTTER_VERSION}/deploy/kubernetes/snapshot-controller/setup-snapshot-controller.yaml" - cnt=0 - expected_running_pods=$(curl https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/"${CSI_SNAPSHOTTER_VERSION}"/deploy/kubernetes/snapshot-controller/setup-snapshot-controller.yaml | grep replicas | cut -d ':' -f 2-) - while [ "$(kubectl get pods -l app=snapshot-controller | grep 'Running' -c)" -lt "$expected_running_pods" ]; do - if [ $cnt -gt 30 ]; then - echo "snapshot-controller pod status:" - kubectl describe pods -l app=snapshot-controller - echo >&2 "ERROR: snapshot controller not ready after over 5 min" - exit 1 - fi - echo "$(date +%H:%M:%S)" "waiting for snapshot controller deployment to complete, attempt #$cnt" - cnt=$((cnt + 1)) - sleep 10 - done -} - -# collect logs and cluster status (like the version of all components, Kubernetes version, test version) -collect_cluster_info () { - cat <>"${ARTIFACTS}/$namespace/$pod/$container.log" & - echo "$!" - done - done -} - -# Makes the E2E test suite binary available as "${CSI_PROW_WORK}/e2e.test". -install_e2e () { - if [ -e "${CSI_PROW_WORK}/e2e.test" ]; then - return - fi - - git_checkout "${CSI_PROW_E2E_REPO}" "${GOPATH}/src/${CSI_PROW_E2E_IMPORT_PATH}" "${CSI_PROW_E2E_VERSION}" --depth=1 && - if [ "${CSI_PROW_E2E_IMPORT_PATH}" = "k8s.io/kubernetes" ]; then - go_version="${CSI_PROW_GO_VERSION_E2E:-$(go_version_for_kubernetes "${GOPATH}/src/${CSI_PROW_E2E_IMPORT_PATH}" "${CSI_PROW_E2E_VERSION}")}" && - run_with_go "$go_version" make WHAT=test/e2e/e2e.test "-C${GOPATH}/src/${CSI_PROW_E2E_IMPORT_PATH}" && - ln -s "${GOPATH}/src/${CSI_PROW_E2E_IMPORT_PATH}/_output/bin/e2e.test" "${CSI_PROW_WORK}" - else - run_with_go "${CSI_PROW_GO_VERSION_E2E}" go test -c -o "${CSI_PROW_WORK}/e2e.test" "${CSI_PROW_E2E_IMPORT_PATH}/test/e2e" - fi -} - -# Makes the csi-sanity test suite binary available as -# "${CSI_PROW_WORK}/csi-sanity". -install_sanity () ( - if [ -e "${CSI_PROW_WORK}/csi-sanity" ]; then - return - fi - - git_checkout "${CSI_PROW_SANITY_REPO}" "${GOPATH}/src/${CSI_PROW_SANITY_IMPORT_PATH}" "${CSI_PROW_SANITY_VERSION}" --depth=1 || die "checking out csi-sanity failed" - run_with_go "${CSI_PROW_GO_VERSION_SANITY}" go test -c -o "${CSI_PROW_WORK}/csi-sanity" "${CSI_PROW_SANITY_IMPORT_PATH}/cmd/csi-sanity" || die "building csi-sanity failed" -) - -# Captures pod output while running some other command. -run_with_loggers () ( - loggers=$(start_loggers -f) - trap 'kill $loggers' EXIT - - run "$@" -) - -# Invokes the filter-junit.go tool. -run_filter_junit () { - run_with_go "${CSI_PROW_GO_VERSION_BUILD}" go run "${RELEASE_TOOLS_ROOT}/filter-junit.go" "$@" -} - -# Runs the E2E test suite in a sub-shell. -run_e2e () ( - name="$1" - shift - - install_e2e || die "building e2e.test failed" - install_ginkgo || die "installing ginkgo failed" - - # Rename, merge and filter JUnit files. Necessary in case that we run the E2E suite again - # and to avoid the large number of "skipped" tests that we get from using - # the full Kubernetes E2E testsuite while only running a few tests. - move_junit () { - if ls "${ARTIFACTS}"/junit_[0-9]*.xml 2>/dev/null >/dev/null; then - run_filter_junit -t="External Storage" -o "${ARTIFACTS}/junit_${name}.xml" "${ARTIFACTS}"/junit_[0-9]*.xml && rm -f "${ARTIFACTS}"/junit_[0-9]*.xml - fi - } - trap move_junit EXIT - - cd "${GOPATH}/src/${CSI_PROW_E2E_IMPORT_PATH}" && - run_with_loggers ginkgo -v "$@" "${CSI_PROW_WORK}/e2e.test" -- -report-dir "${ARTIFACTS}" -storage.testdriver="${CSI_PROW_WORK}/test-driver.yaml" -) - -# Run csi-sanity against installed CSI driver. -run_sanity () ( - install_sanity || die "installing csi-sanity failed" - - cat >"${CSI_PROW_WORK}/mkdir_in_pod.sh" <"${CSI_PROW_WORK}/rmdir_in_pod.sh" </\>/g' -e 's/\x1B...//g' -} - -# The "make test" output starts each test with "### :" -# and then ends when the next test starts or with "make: *** -# [] Error 1" when there was a failure. Here we read each -# line of that output, split it up into individual tests and generate -# a make-test.xml file in JUnit format. -make_test_to_junit () { - local ret out testname testoutput - ret=0 - # Plain make-test.xml was not delivered as text/xml by the web - # server and ignored by spyglass. It seems that the name has to - # match junit*.xml. - out="${ARTIFACTS}/junit_make_test.xml" - testname= - echo "" >>"$out" - - while IFS= read -r line; do - echo "$line" # pass through - if echo "$line" | grep -q "^### [^ ]*:$"; then - if [ "$testname" ]; then - # previous test succesful - echo " " >>"$out" - echo " " >>"$out" - fi - # Ignore: See if you can use ${variable//search/replace} instead. - # shellcheck disable=SC2001 - # - # start new test - testname="$(echo "$line" | sed -e 's/^### \([^ ]*\):$/\1/')" - testoutput= - echo " " >>"$out" - echo " " >>"$out" - elif echo "$line" | grep -q '^make: .*Error [0-9]*$'; then - if [ "$testname" ]; then - # Ignore: Consider using { cmd1; cmd2; } >> file instead of individual redirects. - # shellcheck disable=SC2129 - # - # end test with failure - echo " " >>"$out" - # Include the same text as in also in , - # because then it is easier to view in spyglass (shown directly - # instead of having to click through to stdout). - echo " " >>"$out" - echo -n "$testoutput" | ascii_to_xml >>"$out" - echo " " >>"$out" - echo " " >>"$out" - fi - # remember failure for exit code - ret=1 - # not currently inside a test - testname= - else - if [ "$testname" ]; then - # Test output. - echo "$line" | ascii_to_xml >>"$out" - testoutput="$testoutput$line -" - fi - fi - done - # if still in a test, close it now - if [ "$testname" ]; then - echo " " >>"$out" - echo " " >>"$out" - fi - echo "" >>"$out" - - # this makes the error more visible in spyglass - if [ "$ret" -ne 0 ]; then - echo "ERROR: 'make test' failed" - return 1 - fi -} - -# version_gt returns true if arg1 is greater than arg2. -# -# This function expects versions to be one of the following formats: -# X.Y.Z, release-X.Y.Z, vX.Y.Z -# -# where X,Y, and Z are any number. -# -# Partial versions (1.2, release-1.2) work as well. -# The follow substrings are stripped before version comparison: -# - "v" -# - "release-" -# - "kubernetes-" -# -# Usage: -# version_gt release-1.3 v1.2.0 (returns true) -# version_gt v1.1.1 v1.2.0 (returns false) -# version_gt 1.1.1 v1.2.0 (returns false) -# version_gt 1.3.1 v1.2.0 (returns true) -# version_gt 1.1.1 release-1.2.0 (returns false) -# version_gt 1.2.0 1.2.2 (returns false) -function version_gt() { - versions=$(for ver in "$@"; do ver=${ver#release-}; ver=${ver#kubernetes-}; echo "${ver#v}"; done) - greaterVersion=${1#"release-"}; - greaterVersion=${greaterVersion#"kubernetes-"}; - greaterVersion=${greaterVersion#"v"}; - test "$(printf '%s' "$versions" | sort -V | head -n 1)" != "$greaterVersion" -} - -main () { - local images ret - ret=0 - - images= - if ${CSI_PROW_BUILD_JOB}; then - # A successful build is required for testing. - run_with_go "${CSI_PROW_GO_VERSION_BUILD}" make all "GOFLAGS_VENDOR=${GOFLAGS_VENDOR}" "BUILD_PLATFORMS=${CSI_PROW_BUILD_PLATFORMS}" || die "'make all' failed" - # We don't want test failures to prevent E2E testing below, because the failure - # might have been minor or unavoidable, for example when experimenting with - # changes in "release-tools" in a PR (that fails the "is release-tools unmodified" - # test). - if tests_enabled "unit"; then - if [ -f Gopkg.toml ] && ! install_dep; then - warn "installing 'dep' failed, cannot test vendoring" - ret=1 - fi - if ! run_with_go "${CSI_PROW_GO_VERSION_BUILD}" make -k test "GOFLAGS_VENDOR=${GOFLAGS_VENDOR}" 2>&1 | make_test_to_junit; then - warn "'make test' failed, proceeding anyway" - ret=1 - fi - fi - # Required for E2E testing. - run_with_go "${CSI_PROW_GO_VERSION_BUILD}" make container "GOFLAGS_VENDOR=${GOFLAGS_VENDOR}" || die "'make container' failed" - fi - - if tests_need_kind; then - install_kind || die "installing kind failed" - - if ${CSI_PROW_BUILD_JOB}; then - cmds="$(grep '^\s*CMDS\s*=' Makefile | sed -e 's/\s*CMDS\s*=//')" - # Get the image that was just built (if any) from the - # top-level Makefile CMDS variable and set the - # deploy.sh env variables for it. We also need to - # side-load those images into the cluster. - for i in $cmds; do - e=$(echo "$i" | tr '[:lower:]' '[:upper:]' | tr - _) - images="$images ${e}_REGISTRY=none ${e}_TAG=csiprow" - - # We must avoid the tag "latest" because that implies - # always pulling the image - # (https://github.com/kubernetes-sigs/kind/issues/328). - docker tag "$i:latest" "$i:csiprow" || die "tagging the locally built container image for $i failed" - - # For components with multiple cmds, the RBAC file should be in the following format: - # rbac-$cmd.yaml - # If this file cannot be found, we can default to the standard location: - # deploy/kubernetes/rbac.yaml - rbac_file_path=$(find . -type f -name "rbac-$i.yaml") - if [ "$rbac_file_path" == "" ]; then - rbac_file_path="$(pwd)/deploy/kubernetes/rbac.yaml" - fi - - if [ -e "$rbac_file_path" ]; then - # This is one of those components which has its own RBAC rules (like external-provisioner). - # We are testing a locally built image and also want to test with the the current, - # potentially modified RBAC rules. - e=$(echo "$i" | tr '[:lower:]' '[:upper:]' | tr - _) - images="$images ${e}_RBAC=$rbac_file_path" - fi - done - fi - - if tests_need_non_alpha_cluster; then - start_cluster || die "starting the non-alpha cluster failed" - - # Install necessary snapshot CRDs and snapshot controller - # For Kubernetes 1.17+, we will install the CRDs and snapshot controller. - if version_gt "${CSI_PROW_KUBERNETES_VERSION}" "1.16.255" || "${CSI_PROW_KUBERNETES_VERSION}" == "latest"; then - info "Version ${CSI_PROW_KUBERNETES_VERSION}, installing CRDs and snapshot controller" - install_snapshot_crds - install_snapshot_controller - else - info "Version ${CSI_PROW_KUBERNETES_VERSION}, skipping CRDs and snapshot controller" - fi - - # Installing the driver might be disabled. - if ${CSI_PROW_DRIVER_INSTALL} "$images"; then - collect_cluster_info - - if sanity_enabled; then - if ! run_sanity; then - ret=1 - fi - fi - - if tests_enabled "parallel"; then - # Ignore: Double quote to prevent globbing and word splitting. - # shellcheck disable=SC2086 - if ! run_e2e parallel ${CSI_PROW_GINKO_PARALLEL} \ - -focus="External.Storage" \ - -skip="$(regex_join "${CSI_PROW_E2E_SERIAL}" "${CSI_PROW_E2E_ALPHA}" "${CSI_PROW_E2E_SKIP}")"; then - warn "E2E parallel failed" - ret=1 - fi - - # Run tests that are feature tagged, but non-alpha - # Ignore: Double quote to prevent globbing and word splitting. - # shellcheck disable=SC2086 - if ! run_e2e parallel-features ${CSI_PROW_GINKO_PARALLEL} \ - -focus="External.Storage.*($(regex_join "${CSI_PROW_E2E_FOCUS}"))" \ - -skip="$(regex_join "${CSI_PROW_E2E_SERIAL}")"; then - warn "E2E parallel features failed" - ret=1 - fi - fi - - if tests_enabled "serial"; then - if ! run_e2e serial \ - -focus="External.Storage.*($(regex_join "${CSI_PROW_E2E_SERIAL}"))" \ - -skip="$(regex_join "${CSI_PROW_E2E_ALPHA}" "${CSI_PROW_E2E_SKIP}")"; then - warn "E2E serial failed" - ret=1 - fi - fi - fi - delete_cluster_inside_prow_job - fi - - if tests_need_alpha_cluster && [ "${CSI_PROW_E2E_ALPHA_GATES}" ]; then - # Need to (re)create the cluster. - start_cluster "${CSI_PROW_E2E_ALPHA_GATES}" || die "starting alpha cluster failed" - - # Install necessary snapshot CRDs and snapshot controller - # For Kubernetes 1.17+, we will install the CRDs and snapshot controller. - if version_gt "${CSI_PROW_KUBERNETES_VERSION}" "1.16.255" || "${CSI_PROW_KUBERNETES_VERSION}" == "latest"; then - info "Version ${CSI_PROW_KUBERNETES_VERSION}, installing CRDs and snapshot controller" - install_snapshot_crds - install_snapshot_controller - else - info "Version ${CSI_PROW_KUBERNETES_VERSION}, skipping CRDs and snapshot controller" - fi - - # Installing the driver might be disabled. - if ${CSI_PROW_DRIVER_INSTALL} "$images"; then - collect_cluster_info - - if tests_enabled "parallel-alpha"; then - # Ignore: Double quote to prevent globbing and word splitting. - # shellcheck disable=SC2086 - if ! run_e2e parallel-alpha ${CSI_PROW_GINKO_PARALLEL} \ - -focus="External.Storage.*($(regex_join "${CSI_PROW_E2E_ALPHA}"))" \ - -skip="$(regex_join "${CSI_PROW_E2E_SERIAL}" "${CSI_PROW_E2E_SKIP}")"; then - warn "E2E parallel alpha failed" - ret=1 - fi - fi - - if tests_enabled "serial-alpha"; then - if ! run_e2e serial-alpha \ - -focus="External.Storage.*(($(regex_join "${CSI_PROW_E2E_SERIAL}")).*($(regex_join "${CSI_PROW_E2E_ALPHA}"))|($(regex_join "${CSI_PROW_E2E_ALPHA}")).*($(regex_join "${CSI_PROW_E2E_SERIAL}")))" \ - -skip="$(regex_join "${CSI_PROW_E2E_SKIP}")"; then - warn "E2E serial alpha failed" - ret=1 - fi - fi - fi - delete_cluster_inside_prow_job - fi - fi - - # Merge all junit files into one. This gets rid of duplicated "skipped" tests. - if ls "${ARTIFACTS}"/junit_*.xml 2>/dev/null >&2; then - run_filter_junit -o "${CSI_PROW_WORK}/junit_final.xml" "${ARTIFACTS}"/junit_*.xml && rm "${ARTIFACTS}"/junit_*.xml && mv "${CSI_PROW_WORK}/junit_final.xml" "${ARTIFACTS}" - fi - - return "$ret" -} - -# This function can be called by a repo's top-level cloudbuild.sh: -# it handles environment set up in the GCR cloud build and then -# invokes "make push-multiarch" to do the actual image building. -gcr_cloud_build () { - # Register gcloud as a Docker credential helper. - # Required for "docker buildx build --push". - gcloud auth configure-docker - - if find . -name Dockerfile | grep -v ^./vendor | xargs --no-run-if-empty cat | grep -q ^RUN; then - # Needed for "RUN" steps on non-linux/amd64 platforms. - # See https://github.com/multiarch/qemu-user-static#getting-started - (set -x; docker run --rm --privileged multiarch/qemu-user-static --reset -p yes) - fi - - # Extract tag-n-hash value from GIT_TAG (form vYYYYMMDD-tag-n-hash) for REV value. - REV=v$(echo "$GIT_TAG" | cut -f3- -d 'v') - - run_with_go "${CSI_PROW_GO_VERSION_BUILD}" make push-multiarch REV="${REV}" REGISTRY_NAME="${REGISTRY_NAME}" BUILD_PLATFORMS="${CSI_PROW_BUILD_PLATFORMS}" -} diff --git a/release-tools/travis.yml b/release-tools/travis.yml deleted file mode 100644 index 1ab13aef..00000000 --- a/release-tools/travis.yml +++ /dev/null @@ -1,21 +0,0 @@ -language: go -sudo: required -services: - - docker -git: - depth: false -matrix: - include: - - go: 1.15 -before_script: -- mkdir -p bin -- wget https://github.com/golang/dep/releases/download/v0.5.1/dep-linux-amd64 -O bin/dep -- chmod u+x bin/dep -- export PATH=$PWD/bin:$PATH -script: -- make -k all test GOFLAGS_VENDOR=$( [ -d vendor ] && echo '-mod=vendor' ) -after_success: - - if [ "${TRAVIS_PULL_REQUEST}" == "false" ]; then - docker login -u "${DOCKER_USERNAME}" -p "${DOCKER_PASSWORD}" quay.io; - make push GOFLAGS_VENDOR=$( [ -d vendor ] && echo '-mod=vendor' ); - fi diff --git a/release-tools/util.sh b/release-tools/util.sh deleted file mode 100755 index abeb1b2e..00000000 --- a/release-tools/util.sh +++ /dev/null @@ -1,148 +0,0 @@ -#!/usr/bin/env bash - -# Copyright 2014 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. - -function kube::util::sourced_variable { - # Call this function to tell shellcheck that a variable is supposed to - # be used from other calling context. This helps quiet an "unused - # variable" warning from shellcheck and also document your code. - true -} - -kube::util::sortable_date() { - date "+%Y%m%d-%H%M%S" -} - -# arguments: target, item1, item2, item3, ... -# returns 0 if target is in the given items, 1 otherwise. -kube::util::array_contains() { - local search="$1" - local element - shift - for element; do - if [[ "${element}" == "${search}" ]]; then - return 0 - fi - done - return 1 -} - -# Example: kube::util::trap_add 'echo "in trap DEBUG"' DEBUG -# See: http://stackoverflow.com/questions/3338030/multiple-bash-traps-for-the-same-signal -kube::util::trap_add() { - local trap_add_cmd - trap_add_cmd=$1 - shift - - for trap_add_name in "$@"; do - local existing_cmd - local new_cmd - - # Grab the currently defined trap commands for this trap - existing_cmd=$(trap -p "${trap_add_name}" | awk -F"'" '{print $2}') - - if [[ -z "${existing_cmd}" ]]; then - new_cmd="${trap_add_cmd}" - else - new_cmd="${trap_add_cmd};${existing_cmd}" - fi - - # Assign the test. Disable the shellcheck warning telling that trap - # commands should be single quoted to avoid evaluating them at this - # point instead evaluating them at run time. The logic of adding new - # commands to a single trap requires them to be evaluated right away. - # shellcheck disable=SC2064 - trap "${new_cmd}" "${trap_add_name}" - done -} - -kube::util::download_file() { - local -r url=$1 - local -r destination_file=$2 - - rm "${destination_file}" 2&> /dev/null || true - - for i in $(seq 5) - do - if ! curl -fsSL --retry 3 --keepalive-time 2 "${url}" -o "${destination_file}"; then - echo "Downloading ${url} failed. $((5-i)) retries left." - sleep 1 - else - echo "Downloading ${url} succeed" - return 0 - fi - done - return 1 -} - -# Wait for background jobs to finish. Return with -# an error status if any of the jobs failed. -kube::util::wait-for-jobs() { - local fail=0 - local job - for job in $(jobs -p); do - wait "${job}" || fail=$((fail + 1)) - done - return ${fail} -} - -# kube::util::join -# Concatenates the list elements with the delimiter passed as first parameter -# -# Ex: kube::util::join , a b c -# -> a,b,c -function kube::util::join { - local IFS="$1" - shift - echo "$*" -} - -# kube::util::check-file-in-alphabetical-order -# Check that the file is in alphabetical order -# -function kube::util::check-file-in-alphabetical-order { - local failure_file="$1" - if ! diff -u "${failure_file}" <(LC_ALL=C sort "${failure_file}"); then - { - echo - echo "${failure_file} is not in alphabetical order. Please sort it:" - echo - echo " LC_ALL=C sort -o ${failure_file} ${failure_file}" - echo - } >&2 - false - fi -} - -# Some useful colors. -if [[ -z "${color_start-}" ]]; then - declare -r color_start="\033[" - declare -r color_red="${color_start}0;31m" - declare -r color_yellow="${color_start}0;33m" - declare -r color_green="${color_start}0;32m" - declare -r color_blue="${color_start}1;34m" - declare -r color_cyan="${color_start}1;36m" - declare -r color_norm="${color_start}0m" - - kube::util::sourced_variable "${color_start}" - kube::util::sourced_variable "${color_red}" - kube::util::sourced_variable "${color_yellow}" - kube::util::sourced_variable "${color_green}" - kube::util::sourced_variable "${color_blue}" - kube::util::sourced_variable "${color_cyan}" - kube::util::sourced_variable "${color_norm}" -fi - -# ex: ts=2 sw=2 et filetype=sh diff --git a/release-tools/verify-go-version.sh b/release-tools/verify-go-version.sh deleted file mode 100755 index f242e769..00000000 --- a/release-tools/verify-go-version.sh +++ /dev/null @@ -1,51 +0,0 @@ -#!/usr/bin/env bash - -# Copyright 2019 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. - -GO="$1" - -if [ ! "$GO" ]; then - echo >&2 "usage: $0 " - exit 1 -fi - -die () { - echo "ERROR: $*" - exit 1 -} - -version=$("$GO" version) || die "determining version of $GO failed" -# shellcheck disable=SC2001 -majorminor=$(echo "$version" | sed -e 's/.*go\([0-9]*\)\.\([0-9]*\).*/\1.\2/') -# shellcheck disable=SC2001 -expected=$(grep "^ *- go:" "release-tools/travis.yml" | sed -e 's/.*go: *\([0-9]*\)\.\([0-9]*\).*/\1.\2/') - -if [ "$majorminor" != "$expected" ]; then - cat >&2 < /dev/null || true -} - -# ensure we're linting the source tree -cd "${ROOT}" - -# find all shell scripts excluding ./_*, ./.git/*, ./vendor*, -# and anything git-ignored -all_shell_scripts=() -while IFS=$'\n' read -r script; - do git check-ignore -q "$script" || all_shell_scripts+=("$script"); -done < <(find . -name "*.sh" \ - -not \( \ - -path ./_\* -o \ - -path ./.git\* -o \ - -path ./vendor\* \ - \)) - -# detect if the host machine has the required shellcheck version installed -# if so, we will use that instead. -HAVE_SHELLCHECK=false -if which shellcheck &>/dev/null; then - detected_version="$(shellcheck --version | grep 'version: .*')" - if [[ "${detected_version}" = "version: ${SHELLCHECK_VERSION}" ]]; then - HAVE_SHELLCHECK=true - fi -fi - -# tell the user which we've selected and possibly set up the container -if ${HAVE_SHELLCHECK}; then - echo "Using host shellcheck ${SHELLCHECK_VERSION} binary." -else - echo "Using shellcheck ${SHELLCHECK_VERSION} docker image." - # remove any previous container, ensure we will attempt to cleanup on exit, - # and create the container - remove_container - kube::util::trap_add 'remove_container' EXIT - if ! output="$(create_container 2>&1)"; then - { - echo "Failed to create shellcheck container with output: " - echo "" - echo "${output}" - } >&2 - exit 1 - fi -fi - -# lint each script, tracking failures -errors=() -for f in "${all_shell_scripts[@]}"; do - set +o errexit - if ${HAVE_SHELLCHECK}; then - failedLint=$(shellcheck --exclude="${SHELLCHECK_DISABLED}" "${f}") - else - failedLint=$(docker exec -t ${SHELLCHECK_CONTAINER} \ - shellcheck --exclude="${SHELLCHECK_DISABLED}" "${f}") - fi - set -o errexit - if [[ -n "${failedLint}" ]]; then - errors+=( "${failedLint}" ) - fi -done - -# Check to be sure all the packages that should pass lint are. -if [ ${#errors[@]} -eq 0 ]; then - echo 'Congratulations! All shell files are passing lint.' -else - { - echo "Errors from shellcheck:" - for err in "${errors[@]}"; do - echo "$err" - done - echo - echo 'Please review the above warnings. You can test via "./hack/verify-shellcheck"' - echo 'If the above warnings do not make sense, you can exempt them from shellcheck' - echo 'checking by adding the "shellcheck disable" directive' - echo '(https://github.com/koalaman/shellcheck/wiki/Directive#disable).' - echo - } >&2 - false -fi diff --git a/release-tools/verify-subtree.sh b/release-tools/verify-subtree.sh deleted file mode 100755 index f04a9fa2..00000000 --- a/release-tools/verify-subtree.sh +++ /dev/null @@ -1,41 +0,0 @@ -#! /bin/sh -e -# -# Copyright 2019 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. - -# This script verifies that the content of a directory managed -# by "git subtree" has not been modified locally. It does that -# by looking for commits that modify the files with the -# subtree prefix (aka directory) while ignoring merge -# commits. Merge commits are where "git subtree" pulls the -# upstream files into the directory. -# -# Theoretically a developer can subvert this check by modifying files -# in a merge commit, but in practice that shouldn't happen. - -DIR="$1" -if [ ! "$DIR" ]; then - echo "usage: $0 " >&2 - exit 1 -fi - -REV=$(git log -n1 --remove-empty --format=format:%H --no-merges -- "$DIR") -if [ "$REV" ]; then - echo "Directory '$DIR' contains non-upstream changes:" - echo - git log --no-merges -- "$DIR" - exit 1 -else - echo "$DIR is a clean copy of upstream." -fi diff --git a/release-tools/verify-vendor.sh b/release-tools/verify-vendor.sh deleted file mode 100755 index b413e4b4..00000000 --- a/release-tools/verify-vendor.sh +++ /dev/null @@ -1,60 +0,0 @@ -#!/usr/bin/env bash - -# Copyright 2019 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. - -if [ -f Gopkg.toml ]; then - echo "Repo uses 'dep' for vendoring." - case "$(dep version 2>/dev/null | grep 'version *:')" in - *v0.[56789]*) - if dep check; then - echo "vendor up-to-date" - else - exit 1 - fi - ;; - *) echo "skipping check, dep >= 0.5 required";; - esac -elif [ -f go.mod ]; then - echo "Repo uses 'go mod'." - # shellcheck disable=SC2235 - if [ "${JOB_NAME}" ] && - ( [ "${JOB_TYPE}" != "presubmit" ] || - [ "$( (git diff "${PULL_BASE_SHA}..HEAD" -- go.mod go.sum vendor release-tools; - git diff "${PULL_BASE_SHA}..HEAD" | grep -e '^@@.*@@ import (' -e '^[+-]import') | - wc -l)" -eq 0 ] ); then - echo "Skipping vendor check because the Prow pre-submit job does not affect dependencies." - elif ! (set -x; env GO111MODULE=on go mod tidy); then - echo "ERROR: vendor check failed." - exit 1 - elif [ "$(git status --porcelain -- go.mod go.sum | wc -l)" -gt 0 ]; then - echo "ERROR: go module files *not* up-to-date, they did get modified by 'GO111MODULE=on go mod tidy':"; - git diff -- go.mod go.sum - exit 1 - elif [ -d vendor ]; then - if ! (set -x; env GO111MODULE=on go mod vendor); then - echo "ERROR: vendor check failed." - exit 1 - elif [ "$(git status --porcelain -- vendor | wc -l)" -gt 0 ]; then - echo "ERROR: vendor directory *not* up-to-date, it did get modified by 'GO111MODULE=on go mod vendor':" - git status -- vendor - git diff -- vendor - exit 1 - else - echo "Go dependencies and vendor directory up-to-date." - fi - else - echo "Go dependencies up-to-date." - fi -fi From b963927b5193a76aaba9d60b2b2dbd9537b4225d Mon Sep 17 00:00:00 2001 From: Srini Brahmaroutu Date: Sun, 25 Oct 2020 20:47:27 -0700 Subject: [PATCH 119/242] Basic makefile template to get release tools --- .gitignore | 5 +++++ Makefile | 10 +++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..dda7f45d --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +*.tmp +.DS_Store +.build +*.swp +release-tools diff --git a/Makefile b/Makefile index 00291b44..6df02e59 100644 --- a/Makefile +++ b/Makefile @@ -13,6 +13,14 @@ # limitations under the License. #CMDS=cosi-controller-manager -all: build +all: reltools build +.PHONY: reltools +reltools: release-tools/build.make +release-tools/build.make: + $(eval CURDIR := $(shell pwd)) + $(eval TMP := $(shell mktemp -d)) + $(shell cd ${TMP} && git clone git@github.com:kubernetes-sigs/container-object-storage-interface-spec.git) + $(shell cp -r ${TMP}/container-object-storage-interface-spec/release-tools ${CURDIR}/) + $(shell rm -rf ${TMP}) include release-tools/build.make From d6994679fb78cc90cb855780c3df8ccf373c125d Mon Sep 17 00:00:00 2001 From: Krish Chowdhary Date: Tue, 15 Sep 2020 16:20:52 -0400 Subject: [PATCH 120/242] added issue templates for spec --- .github/ISSUE_TEMPLATE/bug_report.md | 31 +++++++++++++++++++++++++++ .github/ISSUE_TEMPLATE/enhancement.md | 18 ++++++++++++++++ .github/SECURITY.md | 14 ++++++++++++ 3 files changed, 63 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/enhancement.md create mode 100644 .github/SECURITY.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000..8c304dd3 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,31 @@ +--- +name: Bug Report +about: Use this template for reporting bugs or issues. +title: "[DATE] - Title" +labels: bug +--- +# Bug Report + + + +**What happened**: + +**What you expected to happen**: + +**How to reproduce this bug (as minimally and precisely as possible)**: + +**Anything else relevant for this bug report?**: + +**Environment**: + +- Kubernetes version (use `kubectl version`), please list client and server: +- Provisoner name and version (provide the release tag or commit hash): +- Cloud provider or hardware configuration: +- OS (e.g: `cat /etc/os-release`): +- Kernel (e.g. `uname -a`): +- Install tools: +- Network plugin and version (if this is a network-related bug): +- Others: diff --git a/.github/ISSUE_TEMPLATE/enhancement.md b/.github/ISSUE_TEMPLATE/enhancement.md new file mode 100644 index 00000000..2cc57ace --- /dev/null +++ b/.github/ISSUE_TEMPLATE/enhancement.md @@ -0,0 +1,18 @@ +--- +name: Enhancement/Feature Request +about: Use this template to request a new feature or enhancement for the COSI spec +title: "[DATE] - Title" +--- +# Enhancement + +**Is your feature request related to a problem?/Why is this needed** + + +**Describe the solution you'd like in detail** + + +**Describe alternatives you've considered** + + +**Additional context** + diff --git a/.github/SECURITY.md b/.github/SECURITY.md new file mode 100644 index 00000000..3bafc83a --- /dev/null +++ b/.github/SECURITY.md @@ -0,0 +1,14 @@ +# Security Policy + +## Supported Versions + +Information about supported Kubernetes versions can be found on the +[Kubernetes version and version skew support policy] page on the Kubernetes website. + +## Reporting a Vulnerability + +Instructions for reporting a vulnerability can be found on the +[Kubernetes Security and Disclosure Information] page. + +[Kubernetes version and version skew support policy]: https://kubernetes.io/docs/setup/release/version-skew-policy/#supported-versions +[Kubernetes Security and Disclosure Information]: https://kubernetes.io/docs/reference/issues-security/security/#report-a-vulnerability From 534dd4cfaca74bdb84f12e8d0e3ad6ad519053e8 Mon Sep 17 00:00:00 2001 From: Srini Brahmaroutu Date: Sat, 24 Oct 2020 22:08:54 -0700 Subject: [PATCH 121/242] Create proto definitions for cosi --- .gitignore | 10 + Makefile | 176 +++++++ cosi.pb.go | 1424 ++++++++++++++++++++++++++++++++++++++++++++++++++++ cosi.proto | 185 +++++++ go.mod | 9 + go.sum | 70 +++ 6 files changed, 1874 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 cosi.pb.go create mode 100644 cosi.proto create mode 100644 go.mod create mode 100644 go.sum diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..72550517 --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +*.tmp +.DS_Store +.build +*.swp +cosi.proto.tmp +protoc +protoc-gen-go +cosi.a +.protoc +.idea \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..1bb21787 --- /dev/null +++ b/Makefile @@ -0,0 +1,176 @@ +all: build + +######################################################################## +## GOLANG ## +######################################################################## + +# If GOPATH isn't defined then set its default location. +ifeq (,$(strip $(GOPATH))) +GOPATH := $(HOME)/go +else +# If GOPATH is already set then update GOPATH to be its own +# first element. +GOPATH := $(word 1,$(subst :, ,$(GOPATH))) +endif +export GOPATH + + +######################################################################## +## PROTOC ## +######################################################################## + +# Only set PROTOC_VER if it has an empty value. +ifeq (,$(strip $(PROTOC_VER))) +PROTOC_VER := 3.9.1 +endif + +PROTOC_OS := $(shell uname -s) +ifeq (Darwin,$(PROTOC_OS)) +PROTOC_OS := osx +endif + +PROTOC_ARCH := $(shell uname -m) +ifeq (i386,$(PROTOC_ARCH)) +PROTOC_ARCH := x86_32 +endif + +PROTOC := ./protoc +PROTOC_ZIP := protoc-$(PROTOC_VER)-$(PROTOC_OS)-$(PROTOC_ARCH).zip +PROTOC_URL := https://github.com/google/protobuf/releases/download/v$(PROTOC_VER)/$(PROTOC_ZIP) +PROTOC_TMP_DIR := .protoc +PROTOC_TMP_BIN := $(PROTOC_TMP_DIR)/bin/protoc + +$(PROTOC): + -mkdir -p "$(PROTOC_TMP_DIR)" && \ + curl -L $(PROTOC_URL) -o "$(PROTOC_TMP_DIR)/$(PROTOC_ZIP)" && \ + unzip "$(PROTOC_TMP_DIR)/$(PROTOC_ZIP)" -d "$(PROTOC_TMP_DIR)" && \ + chmod 0755 "$(PROTOC_TMP_BIN)" && \ + cp -f "$(PROTOC_TMP_BIN)" "$@" + stat "$@" > /dev/null 2>&1 + + +######################################################################## +## PROTOC-GEN-GO ## +######################################################################## + +# This is the recipe for getting and installing the go plug-in +# for protoc +PROTOC_GEN_GO_PKG := github.com/golang/protobuf/protoc-gen-go +PROTOC_GEN_GO := protoc-gen-go +$(PROTOC_GEN_GO): PROTOBUF_PKG := $(dir $(PROTOC_GEN_GO_PKG)) +$(PROTOC_GEN_GO): PROTOBUF_VERSION := v1.3.2 +$(PROTOC_GEN_GO): + mkdir -p $(dir $(GOPATH)/src/$(PROTOBUF_PKG)) + test -d $(GOPATH)/src/$(PROTOBUF_PKG)/.git || git clone https://$(PROTOBUF_PKG) $(GOPATH)/src/$(PROTOBUF_PKG) + (cd $(GOPATH)/src/$(PROTOBUF_PKG) && \ + (test "$$(git describe --tags | head -1)" = "$(PROTOBUF_VERSION)" || \ + (git fetch && git checkout tags/$(PROTOBUF_VERSION)))) + (cd $(GOPATH)/src/$(PROTOBUF_PKG) && go get -v -d $$(go list -f '{{ .ImportPath }}' ./...)) && \ + go build -o "$@" $(PROTOC_GEN_GO_PKG) + + +######################################################################## +## GEN-PROTO-GO ## +######################################################################## + +# This is the recipe for getting and installing the gen-proto pkg +# This is a dependency of grpc-go and must be installed before +# installing grpc-go. +GENPROTO_GO_SRC := github.com/googleapis/go-genproto +GENPROTO_GO_PKG := google.golang.org/genproto +GENPROTO_BUILD_GO := genproto-build-go +$(GENPROTO_BUILD_GO): GENPROTO_VERSION := 24fa4b261c55da65468f2abfdae2b024eef27dfb +$(GENPROTO_BUILD_GO): + mkdir -p $(dir $(GOPATH)/src/$(GENPROTO_GO_PKG)) + test -d $(GOPATH)/src/$(GENPROTO_GO_PKG)/.git || git clone https://$(GENPROTO_GO_SRC) $(GOPATH)/src/$(GENPROTO_GO_PKG) + (cd $(GOPATH)/src/$(GENPROTO_GO_PKG) && \ + (git fetch && git checkout $(GENPROTO_VERSION))) + (cd $(GOPATH)/src/$(GENPROTO_GO_PKG) && go get -v -d $$(go list -f '{{ .ImportPath }}' ./...)) + + + +######################################################################## +## GRPC-GO ## +######################################################################## + +# This is the recipe for getting and installing the grpc go +GRPC_GO_SRC := github.com/grpc/grpc-go +GRPC_GO_PKG := google.golang.org/grpc +GRPC_BUILD_GO := grpc-build-go +$(GRPC_BUILD_GO): GRPC_VERSION := v1.26.0 +$(GRPC_BUILD_GO): + mkdir -p $(dir $(GOPATH)/src/$(GRPC_GO_PKG)) + test -d $(GOPATH)/src/$(GRPC_GO_PKG)/.git || git clone https://$(GRPC_GO_SRC) $(GOPATH)/src/$(GRPC_GO_PKG) + (cd $(GOPATH)/src/$(GRPC_GO_PKG) && \ + (test "$$(git describe --tags | head -1)" = "$(GRPC_VERSION)" || \ + (git fetch && git checkout tags/$(GRPC_VERSION)))) + (cd $(GOPATH)/src/$(GRPC_GO_PKG) && go get -v -d $$(go list -f '{{ .ImportPath }}' ./...) && \ + go build -o "$@" $(GRPC_GO_PKG)) + + + +######################################################################## +## PATH ## +######################################################################## + +# Update PATH with the current directory. This enables the protoc +# binary to discover the protoc-gen-go binary, built inside this +# directory. +export PATH := $(shell pwd):$(PATH) + + +######################################################################## +## BUILD ## +######################################################################## +COSI_PROTO := ./cosi.proto +COSI_PKG_ROOT := github.com/kubernetes-sigs/container-object-storage-interface-spec +COSI_PKG_SUB := . +COSI_BUILD := $(COSI_PKG_SUB)/.build +COSI_GO := $(COSI_PKG_SUB)/cosi.pb.go +COSI_A := cosi.a +COSI_GO_TMP := $(COSI_BUILD)/$(COSI_PKG_ROOT)/cosi.pb.go + +# This recipe generates the go language bindings to a temp area. +$(COSI_GO_TMP): HERE := $(shell pwd) +$(COSI_GO_TMP): PTYPES_PKG := github.com/golang/protobuf/ptypes +$(COSI_GO_TMP): GO_OUT := plugins=grpc +$(COSI_GO_TMP): GO_OUT := $(GO_OUT),Mgoogle/protobuf/descriptor.proto=github.com/golang/protobuf/protoc-gen-go/descriptor +$(COSI_GO_TMP): GO_OUT := $(GO_OUT),Mgoogle/protobuf/wrappers.proto=$(PTYPES_PKG)/wrappers +$(COSI_GO_TMP): GO_OUT := $(GO_OUT):"$(HERE)/$(COSI_BUILD)" +$(COSI_GO_TMP): INCLUDE := -I$(GOPATH)/src -I$(HERE)/$(PROTOC_TMP_DIR)/include +$(COSI_GO_TMP): $(COSI_PROTO) | $(PROTOC) $(PROTOC_GEN_GO) + @mkdir -p "$(@D)" + (cd "$(GOPATH)/src" && \ + $(HERE)/$(PROTOC) $(INCLUDE) --go_out=$(GO_OUT) "$(COSI_PKG_ROOT)/$( /dev/null 2>&1 || cp -f "$?" "$@" +endif + +# This recipe builds the Go archive from the sources in three steps: +# +# 1. Go get any missing dependencies. +# 2. Cache the packages. +# 3. Build the archive file. +$(COSI_A): $(COSI_GO) $(GENPROTO_BUILD_GO) $(GRPC_BUILD_GO) + go get -v -d ./... + go install ./$(COSI_PKG_SUB) + go build -o "$@" ./$(COSI_PKG_SUB) + +build: $(COSI_A) + +clean: + go clean -i ./... + rm -rf "$(COSI_A)" "$(COSI_GO)" "$(COSI_BUILD)" + +clobber: clean + rm -fr "$(PROTOC)" "$(PROTOC_GEN_GO)" "$(COSI_PKG_SUB)" + +.PHONY: clean clobber $(GRPC_BUILD_GO) $(GENPROTO_BUILD_GO) diff --git a/cosi.pb.go b/cosi.pb.go new file mode 100644 index 00000000..afc32712 --- /dev/null +++ b/cosi.pb.go @@ -0,0 +1,1424 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.23.0 +// protoc v3.9.1 +// source: github.com/kubernetes-sigs/container-object-storage-interface-spec/cosi.proto + +package cosi + +import ( + context "context" + proto "github.com/golang/protobuf/proto" + descriptor "github.com/golang/protobuf/protoc-gen-go/descriptor" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +type ProvisionerCreateBucketRequest_AnonymousBucketAccessMode int32 + +const ( + // Default, disallow uncredentialed access to the backend storage. + ProvisionerCreateBucketRequest_BUCKET_PRIVATE ProvisionerCreateBucketRequest_AnonymousBucketAccessMode = 0 + // Read only, uncredentialed users can call ListBucket and GetObject. + ProvisionerCreateBucketRequest_BUCKET_READ_ONLY ProvisionerCreateBucketRequest_AnonymousBucketAccessMode = 1 + // Write only, uncredentialed users can only call PutObject. + ProvisionerCreateBucketRequest_BUCKET_WRITE_ONLY ProvisionerCreateBucketRequest_AnonymousBucketAccessMode = 2 + // Read/Write, same as ro with the addition of PutObject being allowed. + ProvisionerCreateBucketRequest_BUCKET_READ_WRITE ProvisionerCreateBucketRequest_AnonymousBucketAccessMode = 3 +) + +// Enum value maps for ProvisionerCreateBucketRequest_AnonymousBucketAccessMode. +var ( + ProvisionerCreateBucketRequest_AnonymousBucketAccessMode_name = map[int32]string{ + 0: "BUCKET_PRIVATE", + 1: "BUCKET_READ_ONLY", + 2: "BUCKET_WRITE_ONLY", + 3: "BUCKET_READ_WRITE", + } + ProvisionerCreateBucketRequest_AnonymousBucketAccessMode_value = map[string]int32{ + "BUCKET_PRIVATE": 0, + "BUCKET_READ_ONLY": 1, + "BUCKET_WRITE_ONLY": 2, + "BUCKET_READ_WRITE": 3, + } +) + +func (x ProvisionerCreateBucketRequest_AnonymousBucketAccessMode) Enum() *ProvisionerCreateBucketRequest_AnonymousBucketAccessMode { + p := new(ProvisionerCreateBucketRequest_AnonymousBucketAccessMode) + *p = x + return p +} + +func (x ProvisionerCreateBucketRequest_AnonymousBucketAccessMode) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ProvisionerCreateBucketRequest_AnonymousBucketAccessMode) Descriptor() protoreflect.EnumDescriptor { + return file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_enumTypes[0].Descriptor() +} + +func (ProvisionerCreateBucketRequest_AnonymousBucketAccessMode) Type() protoreflect.EnumType { + return &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_enumTypes[0] +} + +func (x ProvisionerCreateBucketRequest_AnonymousBucketAccessMode) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ProvisionerCreateBucketRequest_AnonymousBucketAccessMode.Descriptor instead. +func (ProvisionerCreateBucketRequest_AnonymousBucketAccessMode) EnumDescriptor() ([]byte, []int) { + return file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{2, 0} +} + +type ProvisionerGetInfoRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *ProvisionerGetInfoRequest) Reset() { + *x = ProvisionerGetInfoRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ProvisionerGetInfoRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ProvisionerGetInfoRequest) ProtoMessage() {} + +func (x *ProvisionerGetInfoRequest) ProtoReflect() protoreflect.Message { + mi := &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ProvisionerGetInfoRequest.ProtoReflect.Descriptor instead. +func (*ProvisionerGetInfoRequest) Descriptor() ([]byte, []int) { + return file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{0} +} + +type ProvisionerGetInfoResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // This field is REQUIRED + // The name MUST follow domain name notation format + // (https://tools.ietf.org/html/rfc1035#section-2.3.1). It SHOULD + // include the plugin's host company name and the plugin name, + // to minimize the possibility of collisions. It MUST be 63 + // characters or less, beginning and ending with an alphanumeric + // character ([a-z0-9A-Z]) with dashes (-), dots (.), and + // alphanumerics between. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *ProvisionerGetInfoResponse) Reset() { + *x = ProvisionerGetInfoResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ProvisionerGetInfoResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ProvisionerGetInfoResponse) ProtoMessage() {} + +func (x *ProvisionerGetInfoResponse) ProtoReflect() protoreflect.Message { + mi := &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ProvisionerGetInfoResponse.ProtoReflect.Descriptor instead. +func (*ProvisionerGetInfoResponse) Descriptor() ([]byte, []int) { + return file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{1} +} + +func (x *ProvisionerGetInfoResponse) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type ProvisionerCreateBucketRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // This field is REQUIRED + // Bucket name. + BucketName string `protobuf:"bytes,1,opt,name=bucket_name,json=bucketName,proto3" json:"bucket_name,omitempty"` + // This field is OPTIONAL + // Protocol specific information required by the call is passed in as key,value pairs. + BucketContext map[string]string `protobuf:"bytes,2,rep,name=bucket_context,json=bucketContext,proto3" json:"bucket_context,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // This field is OPTIONAL + // Allow uncredentialed access to bucket. + AnonymousBucketAccessMode ProvisionerCreateBucketRequest_AnonymousBucketAccessMode `protobuf:"varint,3,opt,name=anonymous_bucket_access_mode,json=anonymousBucketAccessMode,proto3,enum=cosi.v1alpha1.ProvisionerCreateBucketRequest_AnonymousBucketAccessMode" json:"anonymous_bucket_access_mode,omitempty"` +} + +func (x *ProvisionerCreateBucketRequest) Reset() { + *x = ProvisionerCreateBucketRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ProvisionerCreateBucketRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ProvisionerCreateBucketRequest) ProtoMessage() {} + +func (x *ProvisionerCreateBucketRequest) ProtoReflect() protoreflect.Message { + mi := &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ProvisionerCreateBucketRequest.ProtoReflect.Descriptor instead. +func (*ProvisionerCreateBucketRequest) Descriptor() ([]byte, []int) { + return file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{2} +} + +func (x *ProvisionerCreateBucketRequest) GetBucketName() string { + if x != nil { + return x.BucketName + } + return "" +} + +func (x *ProvisionerCreateBucketRequest) GetBucketContext() map[string]string { + if x != nil { + return x.BucketContext + } + return nil +} + +func (x *ProvisionerCreateBucketRequest) GetAnonymousBucketAccessMode() ProvisionerCreateBucketRequest_AnonymousBucketAccessMode { + if x != nil { + return x.AnonymousBucketAccessMode + } + return ProvisionerCreateBucketRequest_BUCKET_PRIVATE +} + +type ProvisionerCreateBucketResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *ProvisionerCreateBucketResponse) Reset() { + *x = ProvisionerCreateBucketResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ProvisionerCreateBucketResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ProvisionerCreateBucketResponse) ProtoMessage() {} + +func (x *ProvisionerCreateBucketResponse) ProtoReflect() protoreflect.Message { + mi := &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ProvisionerCreateBucketResponse.ProtoReflect.Descriptor instead. +func (*ProvisionerCreateBucketResponse) Descriptor() ([]byte, []int) { + return file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{3} +} + +type ProvisionerDeleteBucketRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // This field is REQUIRED + // Bucket name. + BucketName string `protobuf:"bytes,1,opt,name=bucket_name,json=bucketName,proto3" json:"bucket_name,omitempty"` + // This field is OPTIONAL + // Protocol specific information required by the call is passed in as key,value pairs. + BucketContext map[string]string `protobuf:"bytes,2,rep,name=bucket_context,json=bucketContext,proto3" json:"bucket_context,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *ProvisionerDeleteBucketRequest) Reset() { + *x = ProvisionerDeleteBucketRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ProvisionerDeleteBucketRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ProvisionerDeleteBucketRequest) ProtoMessage() {} + +func (x *ProvisionerDeleteBucketRequest) ProtoReflect() protoreflect.Message { + mi := &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ProvisionerDeleteBucketRequest.ProtoReflect.Descriptor instead. +func (*ProvisionerDeleteBucketRequest) Descriptor() ([]byte, []int) { + return file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{4} +} + +func (x *ProvisionerDeleteBucketRequest) GetBucketName() string { + if x != nil { + return x.BucketName + } + return "" +} + +func (x *ProvisionerDeleteBucketRequest) GetBucketContext() map[string]string { + if x != nil { + return x.BucketContext + } + return nil +} + +type ProvisionerDeleteBucketResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *ProvisionerDeleteBucketResponse) Reset() { + *x = ProvisionerDeleteBucketResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ProvisionerDeleteBucketResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ProvisionerDeleteBucketResponse) ProtoMessage() {} + +func (x *ProvisionerDeleteBucketResponse) ProtoReflect() protoreflect.Message { + mi := &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ProvisionerDeleteBucketResponse.ProtoReflect.Descriptor instead. +func (*ProvisionerDeleteBucketResponse) Descriptor() ([]byte, []int) { + return file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{5} +} + +type ProvisionerGrantBucketAccessRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // This field is REQUIRED + // Bucket name. + BucketName string `protobuf:"bytes,1,opt,name=bucket_name,json=bucketName,proto3" json:"bucket_name,omitempty"` + // This field is OPTIONAL + // Protocol specific information required by the call is passed in as key,value pairs. + BucketContext map[string]string `protobuf:"bytes,2,rep,name=bucket_context,json=bucketContext,proto3" json:"bucket_context,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // This field is OPTIONAL + // Principal for which access is requested + Principal string `protobuf:"bytes,3,opt,name=principal,proto3" json:"principal,omitempty"` + // This field is REQUIRED + // Requested Access policy, ex: {"Effect":"Allow","Action":"s3:PutObject","Resource":"arn:aws:s3:::profilepics/*"} + AccessPolicy string `protobuf:"bytes,4,opt,name=access_policy,json=accessPolicy,proto3" json:"access_policy,omitempty"` +} + +func (x *ProvisionerGrantBucketAccessRequest) Reset() { + *x = ProvisionerGrantBucketAccessRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ProvisionerGrantBucketAccessRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ProvisionerGrantBucketAccessRequest) ProtoMessage() {} + +func (x *ProvisionerGrantBucketAccessRequest) ProtoReflect() protoreflect.Message { + mi := &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ProvisionerGrantBucketAccessRequest.ProtoReflect.Descriptor instead. +func (*ProvisionerGrantBucketAccessRequest) Descriptor() ([]byte, []int) { + return file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{6} +} + +func (x *ProvisionerGrantBucketAccessRequest) GetBucketName() string { + if x != nil { + return x.BucketName + } + return "" +} + +func (x *ProvisionerGrantBucketAccessRequest) GetBucketContext() map[string]string { + if x != nil { + return x.BucketContext + } + return nil +} + +func (x *ProvisionerGrantBucketAccessRequest) GetPrincipal() string { + if x != nil { + return x.Principal + } + return "" +} + +func (x *ProvisionerGrantBucketAccessRequest) GetAccessPolicy() string { + if x != nil { + return x.AccessPolicy + } + return "" +} + +type ProvisionerGrantBucketAccessResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // This field is OPTIONAL + // This is the account that is being provided access. This will + // be required later to revoke access. + Principal string `protobuf:"bytes,1,opt,name=principal,proto3" json:"principal,omitempty"` + // This field is OPTIONAL + // Contents of the credential file, ex: aws access key id and secret, etc. + CredentialsFileContents string `protobuf:"bytes,2,opt,name=credentials_file_contents,json=credentialsFileContents,proto3" json:"credentials_file_contents,omitempty"` + // This field is OPTIONAL + // Path where the credential file will be mounted. + CredentialsFilePath string `protobuf:"bytes,3,opt,name=credentials_file_path,json=credentialsFilePath,proto3" json:"credentials_file_path,omitempty"` +} + +func (x *ProvisionerGrantBucketAccessResponse) Reset() { + *x = ProvisionerGrantBucketAccessResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ProvisionerGrantBucketAccessResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ProvisionerGrantBucketAccessResponse) ProtoMessage() {} + +func (x *ProvisionerGrantBucketAccessResponse) ProtoReflect() protoreflect.Message { + mi := &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ProvisionerGrantBucketAccessResponse.ProtoReflect.Descriptor instead. +func (*ProvisionerGrantBucketAccessResponse) Descriptor() ([]byte, []int) { + return file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{7} +} + +func (x *ProvisionerGrantBucketAccessResponse) GetPrincipal() string { + if x != nil { + return x.Principal + } + return "" +} + +func (x *ProvisionerGrantBucketAccessResponse) GetCredentialsFileContents() string { + if x != nil { + return x.CredentialsFileContents + } + return "" +} + +func (x *ProvisionerGrantBucketAccessResponse) GetCredentialsFilePath() string { + if x != nil { + return x.CredentialsFilePath + } + return "" +} + +type ProvisionerRevokeBucketAccessRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // This field is REQUIRED + // Bucket name. + BucketName string `protobuf:"bytes,1,opt,name=bucket_name,json=bucketName,proto3" json:"bucket_name,omitempty"` + // This field is OPTIONAL + // Protocol specific information required by the call is passed in as key,value pairs. + BucketContext map[string]string `protobuf:"bytes,2,rep,name=bucket_context,json=bucketContext,proto3" json:"bucket_context,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // This field is REQUIRED + // This is the account that is being revoked access. + Principal string `protobuf:"bytes,3,opt,name=principal,proto3" json:"principal,omitempty"` +} + +func (x *ProvisionerRevokeBucketAccessRequest) Reset() { + *x = ProvisionerRevokeBucketAccessRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ProvisionerRevokeBucketAccessRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ProvisionerRevokeBucketAccessRequest) ProtoMessage() {} + +func (x *ProvisionerRevokeBucketAccessRequest) ProtoReflect() protoreflect.Message { + mi := &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ProvisionerRevokeBucketAccessRequest.ProtoReflect.Descriptor instead. +func (*ProvisionerRevokeBucketAccessRequest) Descriptor() ([]byte, []int) { + return file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{8} +} + +func (x *ProvisionerRevokeBucketAccessRequest) GetBucketName() string { + if x != nil { + return x.BucketName + } + return "" +} + +func (x *ProvisionerRevokeBucketAccessRequest) GetBucketContext() map[string]string { + if x != nil { + return x.BucketContext + } + return nil +} + +func (x *ProvisionerRevokeBucketAccessRequest) GetPrincipal() string { + if x != nil { + return x.Principal + } + return "" +} + +type ProvisionerRevokeBucketAccessResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *ProvisionerRevokeBucketAccessResponse) Reset() { + *x = ProvisionerRevokeBucketAccessResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ProvisionerRevokeBucketAccessResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ProvisionerRevokeBucketAccessResponse) ProtoMessage() {} + +func (x *ProvisionerRevokeBucketAccessResponse) ProtoReflect() protoreflect.Message { + mi := &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ProvisionerRevokeBucketAccessResponse.ProtoReflect.Descriptor instead. +func (*ProvisionerRevokeBucketAccessResponse) Descriptor() ([]byte, []int) { + return file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{9} +} + +var file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_extTypes = []protoimpl.ExtensionInfo{ + { + ExtendedType: (*descriptor.EnumOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 1060, + Name: "cosi.v1alpha1.alpha_enum", + Tag: "varint,1060,opt,name=alpha_enum", + Filename: "github.com/kubernetes-sigs/container-object-storage-interface-spec/cosi.proto", + }, + { + ExtendedType: (*descriptor.EnumValueOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 1060, + Name: "cosi.v1alpha1.alpha_enum_value", + Tag: "varint,1060,opt,name=alpha_enum_value", + Filename: "github.com/kubernetes-sigs/container-object-storage-interface-spec/cosi.proto", + }, + { + ExtendedType: (*descriptor.FieldOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 1059, + Name: "cosi.v1alpha1.cosi_secret", + Tag: "varint,1059,opt,name=cosi_secret", + Filename: "github.com/kubernetes-sigs/container-object-storage-interface-spec/cosi.proto", + }, + { + ExtendedType: (*descriptor.FieldOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 1060, + Name: "cosi.v1alpha1.alpha_field", + Tag: "varint,1060,opt,name=alpha_field", + Filename: "github.com/kubernetes-sigs/container-object-storage-interface-spec/cosi.proto", + }, + { + ExtendedType: (*descriptor.MessageOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 1060, + Name: "cosi.v1alpha1.alpha_message", + Tag: "varint,1060,opt,name=alpha_message", + Filename: "github.com/kubernetes-sigs/container-object-storage-interface-spec/cosi.proto", + }, + { + ExtendedType: (*descriptor.MethodOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 1060, + Name: "cosi.v1alpha1.alpha_method", + Tag: "varint,1060,opt,name=alpha_method", + Filename: "github.com/kubernetes-sigs/container-object-storage-interface-spec/cosi.proto", + }, + { + ExtendedType: (*descriptor.ServiceOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 1060, + Name: "cosi.v1alpha1.alpha_service", + Tag: "varint,1060,opt,name=alpha_service", + Filename: "github.com/kubernetes-sigs/container-object-storage-interface-spec/cosi.proto", + }, +} + +// Extension fields to descriptor.EnumOptions. +var ( + // Indicates that this enum is OPTIONAL and part of an experimental + // API that may be deprecated and eventually removed between minor + // releases. + // + // optional bool alpha_enum = 1060; + E_AlphaEnum = &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_extTypes[0] +) + +// Extension fields to descriptor.EnumValueOptions. +var ( + // Indicates that this enum value is OPTIONAL and part of an + // experimental API that may be deprecated and eventually removed + // between minor releases. + // + // optional bool alpha_enum_value = 1060; + E_AlphaEnumValue = &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_extTypes[1] +) + +// Extension fields to descriptor.FieldOptions. +var ( + // Indicates that a field MAY contain information that is sensitive + // and MUST be treated as such (e.g. not logged). + // + // optional bool cosi_secret = 1059; + E_CosiSecret = &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_extTypes[2] + // Indicates that this field is OPTIONAL and part of an experimental + // API that may be deprecated and eventually removed between minor + // releases. + // + // optional bool alpha_field = 1060; + E_AlphaField = &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_extTypes[3] +) + +// Extension fields to descriptor.MessageOptions. +var ( + // Indicates that this message is OPTIONAL and part of an experimental + // API that may be deprecated and eventually removed between minor + // releases. + // + // optional bool alpha_message = 1060; + E_AlphaMessage = &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_extTypes[4] +) + +// Extension fields to descriptor.MethodOptions. +var ( + // Indicates that this method is OPTIONAL and part of an experimental + // API that may be deprecated and eventually removed between minor + // releases. + // + // optional bool alpha_method = 1060; + E_AlphaMethod = &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_extTypes[5] +) + +// Extension fields to descriptor.ServiceOptions. +var ( + // Indicates that this service is OPTIONAL and part of an experimental + // API that may be deprecated and eventually removed between minor + // releases. + // + // optional bool alpha_service = 1060; + E_AlphaService = &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_extTypes[6] +) + +var File_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto protoreflect.FileDescriptor + +var file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_rawDesc = []byte{ + 0x0a, 0x4d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x62, + 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x2d, 0x73, 0x69, 0x67, 0x73, 0x2f, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2d, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2d, 0x73, 0x74, + 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2d, + 0x73, 0x70, 0x65, 0x63, 0x2f, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, + 0x0d, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x1a, 0x20, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x22, 0x1b, 0x0a, 0x19, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, + 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x30, 0x0a, + 0x1a, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0xec, 0x03, 0x0a, 0x1e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x67, 0x0a, 0x0e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x63, 0x6f, + 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, + 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x62, + 0x75, 0x63, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x88, 0x01, 0x0a, + 0x1c, 0x61, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x6f, 0x75, 0x73, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x47, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x2e, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x6f, 0x75, 0x73, 0x42, 0x75, 0x63, 0x6b, + 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x19, 0x61, 0x6e, + 0x6f, 0x6e, 0x79, 0x6d, 0x6f, 0x75, 0x73, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x1a, 0x40, 0x0a, 0x12, 0x42, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x73, 0x0a, 0x19, 0x41, 0x6e, 0x6f, + 0x6e, 0x79, 0x6d, 0x6f, 0x75, 0x73, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x55, 0x43, 0x4b, 0x45, 0x54, + 0x5f, 0x50, 0x52, 0x49, 0x56, 0x41, 0x54, 0x45, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x42, 0x55, + 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x01, + 0x12, 0x15, 0x0a, 0x11, 0x42, 0x55, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, + 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x42, 0x55, 0x43, 0x4b, 0x45, + 0x54, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x10, 0x03, 0x22, 0x21, + 0x0a, 0x1f, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0xec, 0x01, 0x0a, 0x1e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, + 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x67, 0x0a, 0x0e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, + 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, + 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x42, 0x75, 0x63, + 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0d, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x1a, 0x40, + 0x0a, 0x12, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x21, 0x0a, 0x1f, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0xb9, 0x02, 0x0a, 0x23, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x62, + 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x6c, 0x0a, 0x0e, + 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x45, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, + 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x62, 0x75, 0x63, + 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, + 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, + 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x1a, 0x40, 0x0a, + 0x12, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0xb4, 0x01, 0x0a, 0x24, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, + 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x69, 0x6e, + 0x63, 0x69, 0x70, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x69, + 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x12, 0x3a, 0x0a, 0x19, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x61, 0x6c, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x63, 0x72, 0x65, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, + 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x13, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x46, 0x69, + 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x22, 0x96, 0x02, 0x0a, 0x24, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, + 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1f, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x6d, 0x0a, 0x0e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x78, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x42, 0x75, + 0x63, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0d, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, + 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x1a, 0x40, 0x0a, + 0x12, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x27, 0x0a, 0x25, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, + 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x89, 0x05, 0x0a, 0x0b, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x12, 0x6b, 0x0a, 0x12, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x28, + 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7a, 0x0a, 0x17, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, + 0x12, 0x2d, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2e, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x7a, 0x0a, 0x17, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x2d, 0x2e, 0x63, + 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, + 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x63, 0x6f, + 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, + 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x87, 0x01, + 0x0a, 0x1c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, + 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x32, + 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, + 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, + 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8a, 0x01, 0x0a, 0x1d, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, + 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x33, 0x2e, 0x63, 0x6f, 0x73, 0x69, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, + 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, + 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x3a, 0x3c, 0x0a, 0x0a, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x65, 0x6e, + 0x75, 0x6d, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x45, 0x6e, + 0x75, 0x6d, 0x3a, 0x4c, 0x0a, 0x10, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x65, 0x6e, 0x75, 0x6d, + 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0e, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x3f, 0x0a, 0x0b, 0x63, 0x6f, 0x73, 0x69, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, + 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, + 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x63, 0x6f, 0x73, 0x69, 0x53, 0x65, 0x63, 0x72, 0x65, + 0x74, 0x3a, 0x3f, 0x0a, 0x0b, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x3a, 0x45, 0x0a, 0x0d, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x42, 0x0a, 0x0c, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, + 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0b, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3a, 0x45, 0x0a, + 0x0d, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1f, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x42, 0x06, 0x5a, 0x04, 0x63, 0x6f, 0x73, 0x69, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_rawDescOnce sync.Once + file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_rawDescData = file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_rawDesc +) + +func file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_rawDescGZIP() []byte { + file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_rawDescOnce.Do(func() { + file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_rawDescData = protoimpl.X.CompressGZIP(file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_rawDescData) + }) + return file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_rawDescData +} + +var file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes = make([]protoimpl.MessageInfo, 14) +var file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_goTypes = []interface{}{ + (ProvisionerCreateBucketRequest_AnonymousBucketAccessMode)(0), // 0: cosi.v1alpha1.ProvisionerCreateBucketRequest.AnonymousBucketAccessMode + (*ProvisionerGetInfoRequest)(nil), // 1: cosi.v1alpha1.ProvisionerGetInfoRequest + (*ProvisionerGetInfoResponse)(nil), // 2: cosi.v1alpha1.ProvisionerGetInfoResponse + (*ProvisionerCreateBucketRequest)(nil), // 3: cosi.v1alpha1.ProvisionerCreateBucketRequest + (*ProvisionerCreateBucketResponse)(nil), // 4: cosi.v1alpha1.ProvisionerCreateBucketResponse + (*ProvisionerDeleteBucketRequest)(nil), // 5: cosi.v1alpha1.ProvisionerDeleteBucketRequest + (*ProvisionerDeleteBucketResponse)(nil), // 6: cosi.v1alpha1.ProvisionerDeleteBucketResponse + (*ProvisionerGrantBucketAccessRequest)(nil), // 7: cosi.v1alpha1.ProvisionerGrantBucketAccessRequest + (*ProvisionerGrantBucketAccessResponse)(nil), // 8: cosi.v1alpha1.ProvisionerGrantBucketAccessResponse + (*ProvisionerRevokeBucketAccessRequest)(nil), // 9: cosi.v1alpha1.ProvisionerRevokeBucketAccessRequest + (*ProvisionerRevokeBucketAccessResponse)(nil), // 10: cosi.v1alpha1.ProvisionerRevokeBucketAccessResponse + nil, // 11: cosi.v1alpha1.ProvisionerCreateBucketRequest.BucketContextEntry + nil, // 12: cosi.v1alpha1.ProvisionerDeleteBucketRequest.BucketContextEntry + nil, // 13: cosi.v1alpha1.ProvisionerGrantBucketAccessRequest.BucketContextEntry + nil, // 14: cosi.v1alpha1.ProvisionerRevokeBucketAccessRequest.BucketContextEntry + (*descriptor.EnumOptions)(nil), // 15: google.protobuf.EnumOptions + (*descriptor.EnumValueOptions)(nil), // 16: google.protobuf.EnumValueOptions + (*descriptor.FieldOptions)(nil), // 17: google.protobuf.FieldOptions + (*descriptor.MessageOptions)(nil), // 18: google.protobuf.MessageOptions + (*descriptor.MethodOptions)(nil), // 19: google.protobuf.MethodOptions + (*descriptor.ServiceOptions)(nil), // 20: google.protobuf.ServiceOptions +} +var file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_depIdxs = []int32{ + 11, // 0: cosi.v1alpha1.ProvisionerCreateBucketRequest.bucket_context:type_name -> cosi.v1alpha1.ProvisionerCreateBucketRequest.BucketContextEntry + 0, // 1: cosi.v1alpha1.ProvisionerCreateBucketRequest.anonymous_bucket_access_mode:type_name -> cosi.v1alpha1.ProvisionerCreateBucketRequest.AnonymousBucketAccessMode + 12, // 2: cosi.v1alpha1.ProvisionerDeleteBucketRequest.bucket_context:type_name -> cosi.v1alpha1.ProvisionerDeleteBucketRequest.BucketContextEntry + 13, // 3: cosi.v1alpha1.ProvisionerGrantBucketAccessRequest.bucket_context:type_name -> cosi.v1alpha1.ProvisionerGrantBucketAccessRequest.BucketContextEntry + 14, // 4: cosi.v1alpha1.ProvisionerRevokeBucketAccessRequest.bucket_context:type_name -> cosi.v1alpha1.ProvisionerRevokeBucketAccessRequest.BucketContextEntry + 15, // 5: cosi.v1alpha1.alpha_enum:extendee -> google.protobuf.EnumOptions + 16, // 6: cosi.v1alpha1.alpha_enum_value:extendee -> google.protobuf.EnumValueOptions + 17, // 7: cosi.v1alpha1.cosi_secret:extendee -> google.protobuf.FieldOptions + 17, // 8: cosi.v1alpha1.alpha_field:extendee -> google.protobuf.FieldOptions + 18, // 9: cosi.v1alpha1.alpha_message:extendee -> google.protobuf.MessageOptions + 19, // 10: cosi.v1alpha1.alpha_method:extendee -> google.protobuf.MethodOptions + 20, // 11: cosi.v1alpha1.alpha_service:extendee -> google.protobuf.ServiceOptions + 1, // 12: cosi.v1alpha1.Provisioner.ProvisionerGetInfo:input_type -> cosi.v1alpha1.ProvisionerGetInfoRequest + 3, // 13: cosi.v1alpha1.Provisioner.ProvisionerCreateBucket:input_type -> cosi.v1alpha1.ProvisionerCreateBucketRequest + 5, // 14: cosi.v1alpha1.Provisioner.ProvisionerDeleteBucket:input_type -> cosi.v1alpha1.ProvisionerDeleteBucketRequest + 7, // 15: cosi.v1alpha1.Provisioner.ProvisionerGrantBucketAccess:input_type -> cosi.v1alpha1.ProvisionerGrantBucketAccessRequest + 9, // 16: cosi.v1alpha1.Provisioner.ProvisionerRevokeBucketAccess:input_type -> cosi.v1alpha1.ProvisionerRevokeBucketAccessRequest + 2, // 17: cosi.v1alpha1.Provisioner.ProvisionerGetInfo:output_type -> cosi.v1alpha1.ProvisionerGetInfoResponse + 4, // 18: cosi.v1alpha1.Provisioner.ProvisionerCreateBucket:output_type -> cosi.v1alpha1.ProvisionerCreateBucketResponse + 6, // 19: cosi.v1alpha1.Provisioner.ProvisionerDeleteBucket:output_type -> cosi.v1alpha1.ProvisionerDeleteBucketResponse + 8, // 20: cosi.v1alpha1.Provisioner.ProvisionerGrantBucketAccess:output_type -> cosi.v1alpha1.ProvisionerGrantBucketAccessResponse + 10, // 21: cosi.v1alpha1.Provisioner.ProvisionerRevokeBucketAccess:output_type -> cosi.v1alpha1.ProvisionerRevokeBucketAccessResponse + 17, // [17:22] is the sub-list for method output_type + 12, // [12:17] is the sub-list for method input_type + 12, // [12:12] is the sub-list for extension type_name + 5, // [5:12] is the sub-list for extension extendee + 0, // [0:5] is the sub-list for field type_name +} + +func init() { + file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_init() +} +func file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_init() { + if File_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ProvisionerGetInfoRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ProvisionerGetInfoResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ProvisionerCreateBucketRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ProvisionerCreateBucketResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ProvisionerDeleteBucketRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ProvisionerDeleteBucketResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ProvisionerGrantBucketAccessRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ProvisionerGrantBucketAccessResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ProvisionerRevokeBucketAccessRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ProvisionerRevokeBucketAccessResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_rawDesc, + NumEnums: 1, + NumMessages: 14, + NumExtensions: 7, + NumServices: 1, + }, + GoTypes: file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_goTypes, + DependencyIndexes: file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_depIdxs, + EnumInfos: file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_enumTypes, + MessageInfos: file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes, + ExtensionInfos: file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_extTypes, + }.Build() + File_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto = out.File + file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_rawDesc = nil + file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_goTypes = nil + file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_depIdxs = nil +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConnInterface + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion6 + +// ProvisionerClient is the client API for Provisioner service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type ProvisionerClient interface { + // This call is meant to retrieve the unique provisioner Identity. + // This identity will have to be set in BucketRequest.Provisioner field in order to invoke this specific provisioner. + ProvisionerGetInfo(ctx context.Context, in *ProvisionerGetInfoRequest, opts ...grpc.CallOption) (*ProvisionerGetInfoResponse, error) + // This call is made to create the bucket in the backend. + // This call is idempotent + // 1. If a bucket that matches both name and parameters already exists, then OK (success) must be returned. + // 2. If a bucket by same name, but different parameters is provided, then the appropriate error code ALREADY_EXISTS must be returned. + ProvisionerCreateBucket(ctx context.Context, in *ProvisionerCreateBucketRequest, opts ...grpc.CallOption) (*ProvisionerCreateBucketResponse, error) + // This call is made to delete the bucket in the backend. + // If the bucket has already been deleted, then no error should be returned. + ProvisionerDeleteBucket(ctx context.Context, in *ProvisionerDeleteBucketRequest, opts ...grpc.CallOption) (*ProvisionerDeleteBucketResponse, error) + // This call grants access to a particular principal. The principal is the account for which this access should be granted. + // If the principal is set, then it should be used as the username of the created credentials. + // If the principal is empty, then a new service account should be created in the backend that satisfies the requested access_policy. + // The principal returned in the response will be used as the unique identifier for deleting this access by calling ProvisionerRevokeBucketAccess. + ProvisionerGrantBucketAccess(ctx context.Context, in *ProvisionerGrantBucketAccessRequest, opts ...grpc.CallOption) (*ProvisionerGrantBucketAccessResponse, error) + // This call revokes all access to a particular bucket from a principal. + ProvisionerRevokeBucketAccess(ctx context.Context, in *ProvisionerRevokeBucketAccessRequest, opts ...grpc.CallOption) (*ProvisionerRevokeBucketAccessResponse, error) +} + +type provisionerClient struct { + cc grpc.ClientConnInterface +} + +func NewProvisionerClient(cc grpc.ClientConnInterface) ProvisionerClient { + return &provisionerClient{cc} +} + +func (c *provisionerClient) ProvisionerGetInfo(ctx context.Context, in *ProvisionerGetInfoRequest, opts ...grpc.CallOption) (*ProvisionerGetInfoResponse, error) { + out := new(ProvisionerGetInfoResponse) + err := c.cc.Invoke(ctx, "/cosi.v1alpha1.Provisioner/ProvisionerGetInfo", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *provisionerClient) ProvisionerCreateBucket(ctx context.Context, in *ProvisionerCreateBucketRequest, opts ...grpc.CallOption) (*ProvisionerCreateBucketResponse, error) { + out := new(ProvisionerCreateBucketResponse) + err := c.cc.Invoke(ctx, "/cosi.v1alpha1.Provisioner/ProvisionerCreateBucket", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *provisionerClient) ProvisionerDeleteBucket(ctx context.Context, in *ProvisionerDeleteBucketRequest, opts ...grpc.CallOption) (*ProvisionerDeleteBucketResponse, error) { + out := new(ProvisionerDeleteBucketResponse) + err := c.cc.Invoke(ctx, "/cosi.v1alpha1.Provisioner/ProvisionerDeleteBucket", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *provisionerClient) ProvisionerGrantBucketAccess(ctx context.Context, in *ProvisionerGrantBucketAccessRequest, opts ...grpc.CallOption) (*ProvisionerGrantBucketAccessResponse, error) { + out := new(ProvisionerGrantBucketAccessResponse) + err := c.cc.Invoke(ctx, "/cosi.v1alpha1.Provisioner/ProvisionerGrantBucketAccess", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *provisionerClient) ProvisionerRevokeBucketAccess(ctx context.Context, in *ProvisionerRevokeBucketAccessRequest, opts ...grpc.CallOption) (*ProvisionerRevokeBucketAccessResponse, error) { + out := new(ProvisionerRevokeBucketAccessResponse) + err := c.cc.Invoke(ctx, "/cosi.v1alpha1.Provisioner/ProvisionerRevokeBucketAccess", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// ProvisionerServer is the server API for Provisioner service. +type ProvisionerServer interface { + // This call is meant to retrieve the unique provisioner Identity. + // This identity will have to be set in BucketRequest.Provisioner field in order to invoke this specific provisioner. + ProvisionerGetInfo(context.Context, *ProvisionerGetInfoRequest) (*ProvisionerGetInfoResponse, error) + // This call is made to create the bucket in the backend. + // This call is idempotent + // 1. If a bucket that matches both name and parameters already exists, then OK (success) must be returned. + // 2. If a bucket by same name, but different parameters is provided, then the appropriate error code ALREADY_EXISTS must be returned. + ProvisionerCreateBucket(context.Context, *ProvisionerCreateBucketRequest) (*ProvisionerCreateBucketResponse, error) + // This call is made to delete the bucket in the backend. + // If the bucket has already been deleted, then no error should be returned. + ProvisionerDeleteBucket(context.Context, *ProvisionerDeleteBucketRequest) (*ProvisionerDeleteBucketResponse, error) + // This call grants access to a particular principal. The principal is the account for which this access should be granted. + // If the principal is set, then it should be used as the username of the created credentials. + // If the principal is empty, then a new service account should be created in the backend that satisfies the requested access_policy. + // The principal returned in the response will be used as the unique identifier for deleting this access by calling ProvisionerRevokeBucketAccess. + ProvisionerGrantBucketAccess(context.Context, *ProvisionerGrantBucketAccessRequest) (*ProvisionerGrantBucketAccessResponse, error) + // This call revokes all access to a particular bucket from a principal. + ProvisionerRevokeBucketAccess(context.Context, *ProvisionerRevokeBucketAccessRequest) (*ProvisionerRevokeBucketAccessResponse, error) +} + +// UnimplementedProvisionerServer can be embedded to have forward compatible implementations. +type UnimplementedProvisionerServer struct { +} + +func (*UnimplementedProvisionerServer) ProvisionerGetInfo(context.Context, *ProvisionerGetInfoRequest) (*ProvisionerGetInfoResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ProvisionerGetInfo not implemented") +} +func (*UnimplementedProvisionerServer) ProvisionerCreateBucket(context.Context, *ProvisionerCreateBucketRequest) (*ProvisionerCreateBucketResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ProvisionerCreateBucket not implemented") +} +func (*UnimplementedProvisionerServer) ProvisionerDeleteBucket(context.Context, *ProvisionerDeleteBucketRequest) (*ProvisionerDeleteBucketResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ProvisionerDeleteBucket not implemented") +} +func (*UnimplementedProvisionerServer) ProvisionerGrantBucketAccess(context.Context, *ProvisionerGrantBucketAccessRequest) (*ProvisionerGrantBucketAccessResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ProvisionerGrantBucketAccess not implemented") +} +func (*UnimplementedProvisionerServer) ProvisionerRevokeBucketAccess(context.Context, *ProvisionerRevokeBucketAccessRequest) (*ProvisionerRevokeBucketAccessResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ProvisionerRevokeBucketAccess not implemented") +} + +func RegisterProvisionerServer(s *grpc.Server, srv ProvisionerServer) { + s.RegisterService(&_Provisioner_serviceDesc, srv) +} + +func _Provisioner_ProvisionerGetInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ProvisionerGetInfoRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ProvisionerServer).ProvisionerGetInfo(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/cosi.v1alpha1.Provisioner/ProvisionerGetInfo", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ProvisionerServer).ProvisionerGetInfo(ctx, req.(*ProvisionerGetInfoRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Provisioner_ProvisionerCreateBucket_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ProvisionerCreateBucketRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ProvisionerServer).ProvisionerCreateBucket(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/cosi.v1alpha1.Provisioner/ProvisionerCreateBucket", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ProvisionerServer).ProvisionerCreateBucket(ctx, req.(*ProvisionerCreateBucketRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Provisioner_ProvisionerDeleteBucket_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ProvisionerDeleteBucketRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ProvisionerServer).ProvisionerDeleteBucket(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/cosi.v1alpha1.Provisioner/ProvisionerDeleteBucket", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ProvisionerServer).ProvisionerDeleteBucket(ctx, req.(*ProvisionerDeleteBucketRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Provisioner_ProvisionerGrantBucketAccess_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ProvisionerGrantBucketAccessRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ProvisionerServer).ProvisionerGrantBucketAccess(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/cosi.v1alpha1.Provisioner/ProvisionerGrantBucketAccess", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ProvisionerServer).ProvisionerGrantBucketAccess(ctx, req.(*ProvisionerGrantBucketAccessRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Provisioner_ProvisionerRevokeBucketAccess_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ProvisionerRevokeBucketAccessRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ProvisionerServer).ProvisionerRevokeBucketAccess(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/cosi.v1alpha1.Provisioner/ProvisionerRevokeBucketAccess", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ProvisionerServer).ProvisionerRevokeBucketAccess(ctx, req.(*ProvisionerRevokeBucketAccessRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _Provisioner_serviceDesc = grpc.ServiceDesc{ + ServiceName: "cosi.v1alpha1.Provisioner", + HandlerType: (*ProvisionerServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "ProvisionerGetInfo", + Handler: _Provisioner_ProvisionerGetInfo_Handler, + }, + { + MethodName: "ProvisionerCreateBucket", + Handler: _Provisioner_ProvisionerCreateBucket_Handler, + }, + { + MethodName: "ProvisionerDeleteBucket", + Handler: _Provisioner_ProvisionerDeleteBucket_Handler, + }, + { + MethodName: "ProvisionerGrantBucketAccess", + Handler: _Provisioner_ProvisionerGrantBucketAccess_Handler, + }, + { + MethodName: "ProvisionerRevokeBucketAccess", + Handler: _Provisioner_ProvisionerRevokeBucketAccess_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "github.com/kubernetes-sigs/container-object-storage-interface-spec/cosi.proto", +} diff --git a/cosi.proto b/cosi.proto new file mode 100644 index 00000000..04d0f19a --- /dev/null +++ b/cosi.proto @@ -0,0 +1,185 @@ +syntax = "proto3"; +package cosi.v1alpha1; + +import "google/protobuf/descriptor.proto"; + +option go_package = "cosi"; + +extend google.protobuf.EnumOptions { + // Indicates that this enum is OPTIONAL and part of an experimental + // API that may be deprecated and eventually removed between minor + // releases. + bool alpha_enum = 1060; +} + +extend google.protobuf.EnumValueOptions { + // Indicates that this enum value is OPTIONAL and part of an + // experimental API that may be deprecated and eventually removed + // between minor releases. + bool alpha_enum_value = 1060; +} + +extend google.protobuf.FieldOptions { + // Indicates that a field MAY contain information that is sensitive + // and MUST be treated as such (e.g. not logged). + bool cosi_secret = 1059; + + // Indicates that this field is OPTIONAL and part of an experimental + // API that may be deprecated and eventually removed between minor + // releases. + bool alpha_field = 1060; +} + +extend google.protobuf.MessageOptions { + // Indicates that this message is OPTIONAL and part of an experimental + // API that may be deprecated and eventually removed between minor + // releases. + bool alpha_message = 1060; +} + +extend google.protobuf.MethodOptions { + // Indicates that this method is OPTIONAL and part of an experimental + // API that may be deprecated and eventually removed between minor + // releases. + bool alpha_method = 1060; +} + +extend google.protobuf.ServiceOptions { + // Indicates that this service is OPTIONAL and part of an experimental + // API that may be deprecated and eventually removed between minor + // releases. + bool alpha_service = 1060; +} + +service Provisioner { + // This call is meant to retrieve the unique provisioner Identity. + // This identity will have to be set in BucketRequest.Provisioner field in order to invoke this specific provisioner. + rpc ProvisionerGetInfo (ProvisionerGetInfoRequest) returns (ProvisionerGetInfoResponse) {} + + // This call is made to create the bucket in the backend. + // This call is idempotent + // 1. If a bucket that matches both name and parameters already exists, then OK (success) must be returned. + // 2. If a bucket by same name, but different parameters is provided, then the appropriate error code ALREADY_EXISTS must be returned. + rpc ProvisionerCreateBucket (ProvisionerCreateBucketRequest) returns (ProvisionerCreateBucketResponse) {} + // This call is made to delete the bucket in the backend. + // If the bucket has already been deleted, then no error should be returned. + rpc ProvisionerDeleteBucket (ProvisionerDeleteBucketRequest) returns (ProvisionerDeleteBucketResponse) {} + + // This call grants access to a particular principal. The principal is the account for which this access should be granted. + // If the principal is set, then it should be used as the username of the created credentials. + // If the principal is empty, then a new service account should be created in the backend that satisfies the requested access_policy. + // The principal returned in the response will be used as the unique identifier for deleting this access by calling ProvisionerRevokeBucketAccess. + rpc ProvisionerGrantBucketAccess (ProvisionerGrantBucketAccessRequest) returns (ProvisionerGrantBucketAccessResponse); + // This call revokes all access to a particular bucket from a principal. + rpc ProvisionerRevokeBucketAccess (ProvisionerRevokeBucketAccessRequest) returns (ProvisionerRevokeBucketAccessResponse); +} + +message ProvisionerGetInfoRequest { + // Intentionally left blank +} + +message ProvisionerGetInfoResponse { + // This field is REQUIRED + // The name MUST follow domain name notation format + // (https://tools.ietf.org/html/rfc1035#section-2.3.1). It SHOULD + // include the plugin's host company name and the plugin name, + // to minimize the possibility of collisions. It MUST be 63 + // characters or less, beginning and ending with an alphanumeric + // character ([a-z0-9A-Z]) with dashes (-), dots (.), and + // alphanumerics between. + string name = 1; +} + +message ProvisionerCreateBucketRequest { + // This field is REQUIRED + // Bucket name. + string bucket_name = 1; + + // This field is OPTIONAL + // Protocol specific information required by the call is passed in as key,value pairs. + map bucket_context = 2; + + enum AnonymousBucketAccessMode { + // Default, disallow uncredentialed access to the backend storage. + BUCKET_PRIVATE = 0; + // Read only, uncredentialed users can call ListBucket and GetObject. + BUCKET_READ_ONLY = 1; + // Write only, uncredentialed users can only call PutObject. + BUCKET_WRITE_ONLY = 2; + // Read/Write, same as ro with the addition of PutObject being allowed. + BUCKET_READ_WRITE = 3; + } + + // This field is OPTIONAL + // Allow uncredentialed access to bucket. + AnonymousBucketAccessMode anonymous_bucket_access_mode = 3; +} + +message ProvisionerCreateBucketResponse { + // Intentionally left blank +} + +message ProvisionerDeleteBucketRequest { + // This field is REQUIRED + // Bucket name. + string bucket_name = 1; + + // This field is OPTIONAL + // Protocol specific information required by the call is passed in as key,value pairs. + map bucket_context = 2; +} + +message ProvisionerDeleteBucketResponse { + // Intentionally left blank +} + +message ProvisionerGrantBucketAccessRequest { + // This field is REQUIRED + // Bucket name. + string bucket_name = 1; + + // This field is OPTIONAL + // Protocol specific information required by the call is passed in as key,value pairs. + map bucket_context = 2; + + // This field is OPTIONAL + // Principal for which access is requested + string principal = 3; + + // This field is REQUIRED + // Requested Access policy, ex: {"Effect":"Allow","Action":"s3:PutObject","Resource":"arn:aws:s3:::profilepics/*"} + string access_policy = 4; +} + +message ProvisionerGrantBucketAccessResponse { + // This field is OPTIONAL + // This is the account that is being provided access. This will + // be required later to revoke access. + string principal = 1; + + // This field is OPTIONAL + // Contents of the credential file, ex: aws access key id and secret, etc. + string credentials_file_contents = 2; + + // This field is OPTIONAL + // Path where the credential file will be mounted. + string credentials_file_path = 3; +} + +message ProvisionerRevokeBucketAccessRequest { + // This field is REQUIRED + // Bucket name. + string bucket_name = 1; + + // This field is OPTIONAL + // Protocol specific information required by the call is passed in as key,value pairs. + map bucket_context = 2; + + // This field is REQUIRED + // This is the account that is being revoked access. + string principal = 3; +} + +message ProvisionerRevokeBucketAccessResponse { + // Intentionally left blank +} diff --git a/go.mod b/go.mod new file mode 100644 index 00000000..fecfce0b --- /dev/null +++ b/go.mod @@ -0,0 +1,9 @@ +module github.com/container-object-storage-interface/spec + +go 1.15 + +require ( + github.com/golang/protobuf v1.4.2 + google.golang.org/grpc v1.30.0 + google.golang.org/protobuf v1.23.0 +) diff --git a/go.sum b/go.sum new file mode 100644 index 00000000..d631fb98 --- /dev/null +++ b/go.sum @@ -0,0 +1,70 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +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-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +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-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2ElGhA4+qG2zF97qiUzTM+rQ0klBOcE= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.30.0 h1:M5a8xTlYTxwMn5ZFkwhRabsygDY5G8TYLyQDBxJNAxE= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +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= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= From f64715b582cadaa73224916b6c7cb590cd572c16 Mon Sep 17 00:00:00 2001 From: Srini Brahmaroutu Date: Fri, 4 Dec 2020 22:40:45 -0800 Subject: [PATCH 122/242] Removing subtree check as release tools no longer a git subtree but copied in --- release-tools/build.make | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/release-tools/build.make b/release-tools/build.make index a717224f..3b1f9a87 100644 --- a/release-tools/build.make +++ b/release-tools/build.make @@ -160,31 +160,6 @@ test-vendor: @ echo; echo "### $@:" @ ./release-tools/verify-vendor.sh -.PHONY: test-subtree -test: test-subtree -test-subtree: - @ echo; echo "### $@:" - ./release-tools/verify-subtree.sh release-tools - -# Components can extend the set of directories which must pass shellcheck. -# The default is to check only the release-tools directory itself. -TEST_SHELLCHECK_DIRS=release-tools -.PHONY: test-shellcheck -test: test-shellcheck -test-shellcheck: - @ echo; echo "### $@:" - @ ret=0; \ - if ! command -v docker; then \ - echo "skipped, no Docker"; \ - exit 0; \ - fi; \ - for dir in $(abspath $(TEST_SHELLCHECK_DIRS)); do \ - echo; \ - echo "$$dir:"; \ - ./release-tools/verify-shellcheck.sh "$$dir" || ret=1; \ - done; \ - exit $$ret - # Targets in the makefile can depend on check-go-version- # to trigger a warning if the x.y version of that binary does not match # what the project uses. Make ensures that this is only checked once per From 98710456fb660cfe643c10875c01a4c5726c7047 Mon Sep 17 00:00:00 2001 From: Rob Rati Date: Mon, 7 Dec 2020 18:15:21 -0500 Subject: [PATCH 123/242] Fix go.mod module name --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index fecfce0b..642ca5cc 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/container-object-storage-interface/spec +module github.com/kubernetes-sigs/container-object-storage-interface-spec go 1.15 From 0078523d5b2b391695c1ff8130712a4e37eb26fc Mon Sep 17 00:00:00 2001 From: Srini Brahmaroutu Date: Wed, 25 Nov 2020 10:47:01 -0800 Subject: [PATCH 124/242] Adding bucketrequest controller --- .gitignore | 2 + .prow.sh | 6 + Makefile | 6 +- cmd/controller-manager/controller-manager.go | 85 +++ go.mod | 15 + go.sum | 750 +++++++++++++++++++ pkg/bucketrequest/bucketrequest.go | 164 ++++ pkg/bucketrequest/bucketrequest_test.go | 215 ++++++ pkg/util/util.go | 374 +++++++++ 9 files changed, 1615 insertions(+), 2 deletions(-) create mode 100755 .prow.sh create mode 100644 cmd/controller-manager/controller-manager.go create mode 100644 go.mod create mode 100644 go.sum create mode 100644 pkg/bucketrequest/bucketrequest.go create mode 100644 pkg/bucketrequest/bucketrequest_test.go create mode 100644 pkg/util/util.go diff --git a/.gitignore b/.gitignore index dda7f45d..c5f97758 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,6 @@ .DS_Store .build *.swp +travis.yml release-tools +bin diff --git a/.prow.sh b/.prow.sh new file mode 100755 index 00000000..682601dd --- /dev/null +++ b/.prow.sh @@ -0,0 +1,6 @@ +#! /bin/bash + +. release-tools/prow.sh + +main + diff --git a/Makefile b/Makefile index 6df02e59..6c19baab 100644 --- a/Makefile +++ b/Makefile @@ -12,15 +12,17 @@ # See the License for the specific language governing permissions and # limitations under the License. -#CMDS=cosi-controller-manager all: reltools build .PHONY: reltools reltools: release-tools/build.make release-tools/build.make: $(eval CURDIR := $(shell pwd)) $(eval TMP := $(shell mktemp -d)) - $(shell cd ${TMP} && git clone git@github.com:kubernetes-sigs/container-object-storage-interface-spec.git) + $(shell cd ${TMP} && git clone https://github.com/kubernetes-sigs/container-object-storage-interface-spec) $(shell cp -r ${TMP}/container-object-storage-interface-spec/release-tools ${CURDIR}/) $(shell rm -rf ${TMP}) + ln -s release-tools/travis.yml travis.yml + +CMDS=controller-manager include release-tools/build.make diff --git a/cmd/controller-manager/controller-manager.go b/cmd/controller-manager/controller-manager.go new file mode 100644 index 00000000..533d898d --- /dev/null +++ b/cmd/controller-manager/controller-manager.go @@ -0,0 +1,85 @@ +package main + +import ( + "context" + "flag" + "os" + "os/signal" + "syscall" + + "github.com/spf13/cobra" + "github.com/spf13/viper" + + bucketcontroller "github.com/kubernetes-sigs/container-object-storage-interface-api/controller" + "github.com/kubernetes-sigs/container-object-storage-interface-controller/pkg/bucketrequest" + + "github.com/golang/glog" +) + +var cmd = &cobra.Command{ + Use: "controller-manager", + Short: "central controller for managing bucket* and bucketAccess* API objects", + SilenceErrors: true, + SilenceUsage: true, + RunE: func(c *cobra.Command, args []string) error { + return run(c.Context(), args) + }, + DisableFlagsInUseLine: true, +} + +var kubeConfig string + +func init() { + viper.AutomaticEnv() + + cmd.PersistentFlags().AddGoFlagSet(flag.CommandLine) + flag.Set("logtostderr", "true") + + strFlag := func(c *cobra.Command, ptr *string, name string, short string, dfault string, desc string) { + c.PersistentFlags(). + StringVarP(ptr, name, short, dfault, desc) + } + strFlag(cmd, &kubeConfig, "kube-config", "", kubeConfig, "path to kubeconfig file") + + hideFlag := func(name string) { + cmd.PersistentFlags().MarkHidden(name) + } + hideFlag("alsologtostderr") + hideFlag("log_backtrace_at") + hideFlag("log_dir") + hideFlag("logtostderr") + hideFlag("master") + hideFlag("stderrthreshold") + hideFlag("vmodule") + + // suppress the incorrect prefix in glog output + flag.CommandLine.Parse([]string{}) + viper.BindPFlags(cmd.PersistentFlags()) + +} + +func main() { + if err := cmd.Execute(); err != nil { + glog.Fatal(err.Error()) + } + + var cancel context.CancelFunc + + _, cancel = context.WithCancel(cmd.Context()) + sigs := make(chan os.Signal, 1) + signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) + + go func() { + <-sigs + cancel() + }() +} + +func run(ctx context.Context, args []string) error { + ctrl, err := bucketcontroller.NewDefaultObjectStorageController("controller-manager", "leader-lock", 40) + if err != nil { + return err + } + ctrl.AddBucketRequestListener(bucketrequest.NewListener()) + return ctrl.Run(ctx) +} diff --git a/go.mod b/go.mod new file mode 100644 index 00000000..19ac6584 --- /dev/null +++ b/go.mod @@ -0,0 +1,15 @@ +module github.com/kubernetes-sigs/container-object-storage-interface-controller + +go 1.15 + +require ( + github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b + github.com/kubernetes-sigs/container-object-storage-interface-api v0.0.0-20201204201926-43539346a903 + github.com/spf13/cobra v1.1.1 + github.com/spf13/viper v1.7.1 + golang.org/x/time v0.0.0-20191024005414-555d28b269f0 + k8s.io/apiextensions-apiserver v0.19.4 + k8s.io/apimachinery v0.19.4 + k8s.io/client-go v0.19.4 + sigs.k8s.io/controller-tools v0.4.1 +) diff --git a/go.sum b/go.sum new file mode 100644 index 00000000..e2f76648 --- /dev/null +++ b/go.sum @@ -0,0 +1,750 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +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.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= +github.com/Azure/go-autorest/autorest v0.9.6/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= +github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= +github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +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/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/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= +github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +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/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +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 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= +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 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= +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/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= +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/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/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/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/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/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/coreos/bbolt v1.3.2/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/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= +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/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/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +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/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/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/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 h1:spTtZBk5DYEvbxMVutUuTyh1Ao2r4iyvLdACqsl/Ljk= +github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +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 h1:kLcOMZeuLAJvL2BPWLMIj5oaZQobrkAqrL+WFZwQses= +github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +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-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-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-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-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-logr/logr v0.2.0 h1:QvGt2nLcHH0WK9orKa+ppBPAxREcH364nPUedEpK0TY= +github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-logr/zapr v0.1.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= +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.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.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= +github.com/go-openapi/errors v0.17.0/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/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.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= +github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w= +github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +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.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.4 h1:3Vw+rh13uq2JFNxgnMTGE1rnoieU9FmyE1gvnyylsYg= +github.com/go-openapi/jsonreference v0.19.4/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= +github.com/go-openapi/loads v0.17.0/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.4/go.mod h1:zZVHonKd8DXyxyw4yfnVjPzBjIQcLt0CCsn0N0ZrQsk= +github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= +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/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.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.12 h1:OO9WrvhDwtiMY/Opr1j1iFZzirI3JW4/bxNFRcntAr4= +github.com/go-openapi/spec v0.19.12/go.mod h1:gwrgJS15eCUgjLpMjBJmbZezCsw88LmgeEip0M63doA= +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.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= +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.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.11 h1:RFTu/dlFySpyVvJDfp/7674JY4SDglYWKztbiIGFpmc= +github.com/go-openapi/swag v0.19.11/go.mod h1:Uc0gKkdR+ojzsEpjh39QChyu92vPgIr72POcgHMAgSY= +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.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gobuffalo/flect v0.2.0 h1:EWCvMGGxOjsgwlWaP+f4+Hh6yrrte7JeFL2S6b+0hdM= +github.com/gobuffalo/flect v0.2.0/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= +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-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 h1:5ZkaAPbicIKTF2I64qf5Fh8Aa83Q/dnOafMYV0OMwjA= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +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= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= +github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +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.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU= +github.com/googleapis/gnostic v0.4.1 h1:DLJCy1n/vrD4HPjOvYcT8aYQXpPIzoRZONaYwyycI+I= +github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= +github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +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/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +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 v1.0.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-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 v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +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.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.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imdario/mergo v0.3.5 h1:JboBksRwiiAJWvIYJVo46AfV+IAIKZpfrSzVKj42R4Q= +github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.9 h1:UauaLniWCFHWd+Jp9oCEkTBj8VO/9DKg3PV3VCNMDIg= +github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/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.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +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 h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +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/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/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +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.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +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 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +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/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kubernetes-sigs/container-object-storage-interface-api v0.0.0-20201204201926-43539346a903 h1:kBd9bCHv429J7Y8Mp2w1Xg3QtDiRAhittzYC/45/G2E= +github.com/kubernetes-sigs/container-object-storage-interface-api v0.0.0-20201204201926-43539346a903/go.mod h1:C7tjzC+nLe7H7+3UM/Z6a7F24yxOO8FSK3ZaVZrKDPQ= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +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 h1:aizVhC/NAAcKWb+5QsU1iNOZb4Yws5UO2I+aIprQITM= +github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +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.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +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/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +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-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +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/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +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/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +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.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.2 h1:8mVmC9kjFFmA8H4pKMUhcblgifdkOIXPvbhN1T36q1M= +github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/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.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +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-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/pkg/errors v0.8.0/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/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.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +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.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/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/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +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.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/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.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +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/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +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/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +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 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +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 v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +github.com/spf13/cobra v1.1.1 h1:KfztREH0tPxJJ+geloSLaAkaPkr4ki2Er5quFV1TDo4= +github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= +github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.1/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.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk= +github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +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/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 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +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/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/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= +go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.etcd.io/etcd v0.5.0-alpha.5.0.20200819165624-17cef6e3e9d5/go.mod h1:skWido08r9w6Lq/w70DO5XYIKMu4QFu1+4VsqLQuJy8= +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.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.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +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/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/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-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-20190510104115-cbcb75029529/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-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/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-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +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-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +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/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.2.0 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +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-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-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-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-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +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-20191004110552-13f9640d40b9/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-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/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-20200707034311-ab3426394381 h1:VXak5I6aEWmAXeQjA+QSZzlgNrpq9mjcfDemuexIKsU= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6 h1:pE8b58s1HRDMi8RDc79m0HISf9D4TzseP40cEA6IGfs= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/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/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-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-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-20190412213103-97732733099d/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-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-20190624142023-c5567b49c5d0/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-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/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-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-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4 h1:5/PjkGUjvEU5Gl6BxmvKRPpqo2uNMv4rcHBMwzk/st8= +golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +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 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/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-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/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-20190328211700-ab21143f2384/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-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +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-20190816200558-6889da9d5479/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-20191012152004-8de300cfc20a/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-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-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200616195046-dc31b401abb5 h1:UaoXseXAWUJUcuJ2E2oczJdLxAJXL0lOmVaBl7kuk+I= +golang.org/x/tools v0.0.0-20200616195046-dc31b401abb5/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +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 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gomodules.xyz/jsonpatch/v2 v2.0.1/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +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.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +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.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/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-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-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +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.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +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= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0 h1:UhZDfRO8JRQru4/+LlLE0BRKGF8L+PICnvYZmx/fEGA= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +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-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +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/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.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +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/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +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/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.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.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20190905181640-827449938966/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= +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.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +k8s.io/api v0.18.2/go.mod h1:SJCWI7OLzhZSvbY7U8zwNl9UA4o1fizoug34OV/2r78= +k8s.io/api v0.18.6/go.mod h1:eeyxr+cwCjMdLAmr2W3RyDI0VvTawSg/3RFFBEnmZGI= +k8s.io/api v0.19.4 h1:I+1I4cgJYuCDgiLNjKx7SLmIbwgj9w7N7Zr5vSIdwpo= +k8s.io/api v0.19.4/go.mod h1:SbtJ2aHCItirzdJ36YslycFNzWADYH3tgOhvBEFtZAk= +k8s.io/apiextensions-apiserver v0.18.2/go.mod h1:q3faSnRGmYimiocj6cHQ1I3WpLqmDgJFlKL37fC4ZvY= +k8s.io/apiextensions-apiserver v0.18.6 h1:vDlk7cyFsDyfwn2rNAO2DbmUbvXy5yT5GE3rrqOzaMo= +k8s.io/apiextensions-apiserver v0.18.6/go.mod h1:lv89S7fUysXjLZO7ke783xOwVTm6lKizADfvUM/SS/M= +k8s.io/apiextensions-apiserver v0.19.4 h1:D9ak9T012tb3vcGFWYmbQuj9SCC8YM4zhA4XZqsAQC4= +k8s.io/apiextensions-apiserver v0.19.4/go.mod h1:B9rpH/nu4JBCtuUp3zTTk8DEjZUupZTBEec7/2zNRYw= +k8s.io/apimachinery v0.18.2/go.mod h1:9SnR/e11v5IbyPCGbvJViimtJ0SwHG4nfZFjU77ftcA= +k8s.io/apimachinery v0.18.6/go.mod h1:OaXp26zu/5J7p0f92ASynJa1pZo06YlV9fG7BoWbCko= +k8s.io/apimachinery v0.19.4 h1:+ZoddM7nbzrDCp0T3SWnyxqf8cbWPT2fkZImoyvHUG0= +k8s.io/apimachinery v0.19.4/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA= +k8s.io/apiserver v0.18.2/go.mod h1:Xbh066NqrZO8cbsoenCwyDJ1OSi8Ag8I2lezeHxzwzw= +k8s.io/apiserver v0.18.6/go.mod h1:Zt2XvTHuaZjBz6EFYzpp+X4hTmgWGy8AthNVnTdm3Wg= +k8s.io/apiserver v0.19.4/go.mod h1:X8WRHCR1UGZDd7HpV0QDc1h/6VbbpAeAGyxSh8yzZXw= +k8s.io/client-go v0.18.2/go.mod h1:Xcm5wVGXX9HAA2JJ2sSBUn3tCJ+4SVlCbl2MNNv+CIU= +k8s.io/client-go v0.18.6/go.mod h1:/fwtGLjYMS1MaM5oi+eXhKwG+1UHidUEXRh6cNsdO0Q= +k8s.io/client-go v0.19.4 h1:85D3mDNoLF+xqpyE9Dh/OtrJDyJrSRKkHmDXIbEzer8= +k8s.io/client-go v0.19.4/go.mod h1:ZrEy7+wj9PjH5VMBCuu/BDlvtUAku0oVFk4MmnW9mWA= +k8s.io/code-generator v0.18.2/go.mod h1:+UHX5rSbxmR8kzS+FAv7um6dtYrZokQvjHpDSYRVkTc= +k8s.io/code-generator v0.18.6/go.mod h1:TgNEVx9hCyPGpdtCWA34olQYLkh3ok9ar7XfSsr8b6c= +k8s.io/code-generator v0.19.4/go.mod h1:moqLn7w0t9cMs4+5CQyxnfA/HV8MF6aAVENF+WZZhgk= +k8s.io/component-base v0.18.2/go.mod h1:kqLlMuhJNHQ9lz8Z7V5bxUUtjFZnrypArGl58gmDfUM= +k8s.io/component-base v0.18.6/go.mod h1:knSVsibPR5K6EW2XOjEHik6sdU5nCvKMrzMt2D4In14= +k8s.io/component-base v0.19.4/go.mod h1:ZzuSLlsWhajIDEkKF73j64Gz/5o0AgON08FgRbEPI70= +k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= +k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= +k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= +k8s.io/klog/v2 v2.2.0 h1:XRvcwJozkgZ1UQJmfMGpvRthQHOvihEhYtDfAaxMz/A= +k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +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-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= +k8s.io/kube-openapi v0.0.0-20200923155610-8b5066479488 h1:mNpvQf4lkIHNOXCoM+Veu/UXwA56Yx1J7hY1Tvcs/oM= +k8s.io/kube-openapi v0.0.0-20200923155610-8b5066479488/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= +k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= +k8s.io/utils v0.0.0-20200603063816-c1c6865ac451/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20200729134348-d5654de09c73 h1:uJmqzgNWG7XyClnU/mLPBWwfKKF1K8Hf8whTseBgJcg= +k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.9/go.mod h1:dzAXnQbTRyDlZPJX2SUPEqvnB+j7AJjtlox7PEwigU0= +sigs.k8s.io/controller-runtime v0.6.3 h1:SBbr+inLPEKhvlJtrvDcwIpm+uhDvp63Bl72xYJtoOE= +sigs.k8s.io/controller-runtime v0.6.3/go.mod h1:WlZNXcM0++oyaQt4B7C2lEE5JYRs8vJUzRP4N4JpdAY= +sigs.k8s.io/controller-tools v0.4.1 h1:VkuV0MxlRPmRu5iTgBZU4UxUX2LiR99n3sdQGRxZF4w= +sigs.k8s.io/controller-tools v0.4.1/go.mod h1:G9rHdZMVlBDocIxGkK3jHLWqcTMNvveypYJwrvYKjWU= +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.1 h1:YXTMot5Qz/X1iBRJhAt+vI+HVttY0WkSqqhKxQ0xVbA= +sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/pkg/bucketrequest/bucketrequest.go b/pkg/bucketrequest/bucketrequest.go new file mode 100644 index 00000000..861f233a --- /dev/null +++ b/pkg/bucketrequest/bucketrequest.go @@ -0,0 +1,164 @@ +package bucketrequest + +import ( + "context" + "fmt" + "strings" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + "github.com/kubernetes-sigs/container-object-storage-interface-api/apis/objectstorage.k8s.io/v1alpha1" + bucketclientset "github.com/kubernetes-sigs/container-object-storage-interface-api/clientset" + bucketcontroller "github.com/kubernetes-sigs/container-object-storage-interface-api/controller" + "github.com/kubernetes-sigs/container-object-storage-interface-controller/pkg/util" + kubeclientset "k8s.io/client-go/kubernetes" + + "github.com/golang/glog" +) + +type bucketRequestListener struct { + kubeClient kubeclientset.Interface + bucketClient bucketclientset.Interface +} + +func NewListener() bucketcontroller.BucketRequestListener { + return &bucketRequestListener{} +} + +func (b *bucketRequestListener) InitializeKubeClient(k kubeclientset.Interface) { + b.kubeClient = k +} + +func (b *bucketRequestListener) InitializeBucketClient(bc bucketclientset.Interface) { + b.bucketClient = bc +} + +// Add creates a bucket in response to a bucketrequest +func (b *bucketRequestListener) Add(ctx context.Context, obj *v1alpha1.BucketRequest) error { + glog.V(1).Infof("add called for bucket %s", obj.Name) + bucketRequest := obj + err := b.provisionBucketRequestOperation(ctx, bucketRequest) + if err != nil { + // Provisioning is 100% finished / not in progress. + switch err { + case util.ErrInvalidBucketClass: + glog.V(5).Infof("Bucket Class specified does not exist. Stop provisioning, removing bucketRequest %s from bucketRequests in progress", bucketRequest.UID) + err = nil + case util.ErrBucketAlreadyExists: + glog.V(5).Infof("Bucket already exist for this bucket request. Stop provisioning, removing bucketRequest %s from bucketRequests in progress", bucketRequest.UID) + err = nil + default: + glog.V(2).Infof("Final error received, removing buckerRequest %s from bucketRequests in progress", bucketRequest.UID) + } + return err + } + + glog.V(5).Infof("BucketRequest processing succeeded, removing bucketRequest %s from bucketRequests in progress", bucketRequest.UID) + return nil +} + +// update processes any updates made to the bucket request +func (b *bucketRequestListener) Update(ctx context.Context, old, new *v1alpha1.BucketRequest) error { + glog.V(1).Infof("update called for bucket %v", old) + return nil +} + +// Delete processes a bucket for which bucket request is deleted +func (b *bucketRequestListener) Delete(ctx context.Context, obj *v1alpha1.BucketRequest) error { + return nil +} + +// provisionBucketRequestOperation attempts to provision a bucket for the given bucketRequest. +// Returns nil error only when the bucket was provisioned, an error it set appropriately if not. +// Returns a normal error when the bucket was not provisioned and provisioning should be retried (requeue the bucketRequest), +// or the special error errBucketAlreadyExists, errInvalidBucketClass, when provisioning was impossible and +// no further attempts to provision should be tried. +func (b *bucketRequestListener) provisionBucketRequestOperation(ctx context.Context, bucketRequest *v1alpha1.BucketRequest) error { + // Most code here is identical to that found in controller.go of kube's controller... + bucketClassName := b.GetBucketClass(bucketRequest) + + // A previous doProvisionBucketRequest may just have finished while we were waiting for + // the locks. Check that bucket (with deterministic name) hasn't been provisioned + // yet. + bucket := b.FindBucket(ctx, bucketRequest) + if bucket != nil { + // bucket has been already provisioned, nothing to do. + glog.Info("Bucket already exists", bucket.Name) + return util.ErrBucketAlreadyExists + } + + bucketClass, err := b.bucketClient.ObjectstorageV1alpha1().BucketClasses().Get(ctx, bucketClassName, metav1.GetOptions{}) + if bucketClass == nil { + // bucketclass does not exist in order to create a bucket + return util.ErrInvalidBucketClass + } + + glog.Infof("creating bucket for bucketrequest %v", bucketRequest.Name) + + // create bucket + bucket = &v1alpha1.Bucket{} + bucket.Name = fmt.Sprintf("%s%s", bucketRequest.Spec.BucketPrefix, util.GetUUID()) + bucket.Spec.Provisioner = bucketClass.Provisioner + bucket.Spec.RetentionPolicy = bucketClass.RetentionPolicy + bucket.Spec.AnonymousAccessMode = bucketClass.AnonymousAccessMode + bucket.Spec.BucketClassName = bucketClass.Name + bucket.Spec.BucketRequest = &v1alpha1.BucketRequestReference{ + Name: bucketRequest.Name, + Namespace: bucketRequest.Namespace, + UID: bucketRequest.ObjectMeta.UID} + bucket.Spec.AllowedNamespaces = util.CopyStrings(bucketClass.AllowedNamespaces) + bucket.Spec.Parameters = util.CopySS(bucketClass.Parameters) + + // TODO have a switch statement to populate appropriate protocol based on BR.Protocol + bucket.Spec.Protocol.RequestedProtocol = bucketRequest.Spec.Protocol + + bucket, err = b.bucketClient.ObjectstorageV1alpha1().Buckets().Create(context.Background(), bucket, metav1.CreateOptions{}) + if err != nil { + glog.V(5).Infof("Error occurred when creating bucket %v", err) + return err + } + + glog.Infof("Finished creating bucket %v", bucket.Name) + return nil +} + +// GetBucketClass returns BucketClassName. If no bucket class was in the request it returns empty +// TODO this methods can be more sophisticate to address bucketClass overrides using annotations just like SC. +func (b *bucketRequestListener) GetBucketClass(bucketRequest *v1alpha1.BucketRequest) string { + + if bucketRequest.Spec.BucketClassName != "" { + return bucketRequest.Spec.BucketClassName + } + + return "" +} + +func (b *bucketRequestListener) FindBucket(ctx context.Context, br *v1alpha1.BucketRequest) *v1alpha1.Bucket { + bucketList, err := b.bucketClient.ObjectstorageV1alpha1().Buckets().List(ctx, metav1.ListOptions{}) + if err != nil { + return nil + } + if len(bucketList.Items) > 0 { + for _, bucket := range bucketList.Items { + if strings.HasPrefix(bucket.Name, br.Spec.BucketPrefix) && + bucket.Spec.BucketClassName == br.Spec.BucketClassName && + bucket.Spec.BucketRequest.Name == br.Name && + bucket.Spec.BucketRequest.Namespace == br.Namespace && + bucket.Spec.BucketRequest.UID == br.ObjectMeta.UID { + return &bucket + } + } + } + return nil +} + +// cloneTheBucket clones a bucket to a different namespace when a BR is for brownfield. +func (b *bucketRequestListener) cloneTheBucket(bucketRequest *v1alpha1.BucketRequest) error { + glog.V(1).Infof("clone called for bucket %s", bucketRequest.Spec.BucketInstanceName) + return util.ErrNotImplemented +} + +// logOperation format and prints logs +func logOperation(operation, format string, a ...interface{}) string { + return fmt.Sprintf(fmt.Sprintf("%s: %s", operation, format), a...) +} diff --git a/pkg/bucketrequest/bucketrequest_test.go b/pkg/bucketrequest/bucketrequest_test.go new file mode 100644 index 00000000..cef7e37c --- /dev/null +++ b/pkg/bucketrequest/bucketrequest_test.go @@ -0,0 +1,215 @@ +package bucketrequest + +import ( + "context" + "testing" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + bucketclientset "github.com/kubernetes-sigs/container-object-storage-interface-api/clientset/fake" + "k8s.io/client-go/kubernetes/fake" + + types "github.com/kubernetes-sigs/container-object-storage-interface-api/apis/objectstorage.k8s.io/v1alpha1" + "github.com/kubernetes-sigs/container-object-storage-interface-controller/pkg/util" +) + +var classGoldParameters = map[string]string{ + "param1": "value1", + "param2": "value2", +} + +var goldClass = types.BucketClass{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "objectstorage.k8s.io/v1alpha1", + Kind: "BucketClass", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "classgold", + }, + AllowedNamespaces: []string{"default", "cosins"}, + Parameters: classGoldParameters, + Protocol: "s3", + IsDefaultBucketClass: false, +} + +var bucketRequest1 = types.BucketRequest{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "objectstorage.k8s.io/v1alpha1", + Kind: "BucketRequest", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "bucketrequest1", + Namespace: "default", + }, + Spec: types.BucketRequestSpec{ + BucketPrefix: "cosi", + Protocol: types.RequestedProtocol{ + Name: "s3", + Version: "", + }, + BucketClassName: "classgold", + }, +} + +var bucketRequest2 = types.BucketRequest{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "objectstorage.k8s.io/v1alpha1", + Kind: "BucketRequest", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "bucketrequest2", + Namespace: "default", + }, + Spec: types.BucketRequestSpec{ + BucketPrefix: "cosi", + Protocol: types.RequestedProtocol{ + Name: "s3", + Version: "", + }, + BucketClassName: "classgold", + }, +} + +// Test basic add functionality +func TestAdd(t *testing.T) { + runCreateBucket(t, "add") +} + +// Test add with multipleBRs +func TestAddWithMultipleBR(t *testing.T) { + runCreateBucketWithMultipleBR(t, "addWithMultipleBR") +} + +// Test add idempotency +func TestAddIdempotency(t *testing.T) { + runCreateBucketIdempotency(t, "addWithMultipleBR") +} + +func runCreateBucket(t *testing.T, name string) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + client := bucketclientset.NewSimpleClientset() + kubeClient := fake.NewSimpleClientset() + + listener := NewListener() + listener.InitializeKubeClient(kubeClient) + listener.InitializeBucketClient(client) + + bucketclass, err := util.CreateBucketClass(ctx, client, &goldClass) + if err != nil { + t.Fatalf("Error occurred when creating bucketclass: %v", err) + } + + bucketrequest, err := util.CreateBucketRequest(ctx, client, &bucketRequest1) + if err != nil { + t.Fatalf("Error occurred when creating bucketrequest: %v", err) + } + + listener.Add(ctx, bucketrequest) + + bucketList := util.GetBuckets(ctx, client, 1) + defer util.DeleteObjects(ctx, client, *bucketrequest, *bucketclass, bucketList.Items) + + if len(bucketList.Items) != 1 { + t.Fatalf("Expecting a single bucket created but found %v", len(bucketList.Items)) + } + bucket := bucketList.Items[0] + + if util.ValidateBucket(bucket, *bucketrequest, *bucketclass) { + return + } else { + t.Fatalf("Failed to compare the resulting bucket with the BucketRequest %v and BucketClass %v", bucketrequest, bucketclass) + } +} + +func runCreateBucketWithMultipleBR(t *testing.T, name string) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + client := bucketclientset.NewSimpleClientset() + kubeClient := fake.NewSimpleClientset() + + listener := NewListener() + listener.InitializeKubeClient(kubeClient) + listener.InitializeBucketClient(client) + + bucketclass, err := util.CreateBucketClass(ctx, client, &goldClass) + if err != nil { + t.Fatalf("Error occurred when creating bucketclass: %v", err) + } + + bucketrequest, err := util.CreateBucketRequest(ctx, client, &bucketRequest1) + if err != nil { + t.Fatalf("Error occurred when creating bucketrequest: %v", err) + } + + bucketrequest2, err := util.CreateBucketRequest(ctx, client, &bucketRequest2) + if err != nil { + t.Fatalf("Error occurred when creating bucketrequest: %v", err) + } + + listener.Add(ctx, bucketrequest) + listener.Add(ctx, bucketrequest2) + + bucketList := util.GetBuckets(ctx, client, 2) + defer util.DeleteObjects(ctx, client, *bucketrequest, *bucketrequest2, *bucketclass, bucketList.Items) + if len(bucketList.Items) != 2 { + t.Fatalf("Expecting two buckets created but found %v", len(bucketList.Items)) + } + bucket := bucketList.Items[0] + bucket2 := bucketList.Items[1] + + if (util.ValidateBucket(bucket, *bucketrequest, *bucketclass) && util.ValidateBucket(bucket2, *bucketrequest2, *bucketclass)) || + (util.ValidateBucket(bucket2, *bucketrequest, *bucketclass) && util.ValidateBucket(bucket, *bucketrequest2, *bucketclass)) { + return + } else { + t.Fatalf("Failed to compare the resulting bucket with the BucketRequest %v and BucketClass %v", bucketrequest, bucketclass) + } +} + +func runCreateBucketIdempotency(t *testing.T, name string) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + client := bucketclientset.NewSimpleClientset() + kubeClient := fake.NewSimpleClientset() + + listener := NewListener() + listener.InitializeKubeClient(kubeClient) + listener.InitializeBucketClient(client) + + bucketclass, err := util.CreateBucketClass(ctx, client, &goldClass) + if err != nil { + t.Fatalf("Error occurred when creating bucketclass: %v", err) + } + + bucketrequest, err := util.CreateBucketRequest(ctx, client, &bucketRequest1) + if err != nil { + t.Fatalf("Error occurred when creating bucketrequest: %v", err) + } + + listener.Add(ctx, bucketrequest) + + bucketList := util.GetBuckets(ctx, client, 1) + defer util.DeleteObjects(ctx, client, *bucketrequest, *bucketclass, bucketList.Items) + + if len(bucketList.Items) != 1 { + t.Errorf("Expecting a single bucket created but found %v", len(bucketList.Items)) + } + bucket := bucketList.Items[0] + + if util.ValidateBucket(bucket, *bucketrequest, *bucketclass) { + return + } else { + t.Fatalf("Failed to compare the resulting bucket with the BucketRequest %v and BucketClass %v", bucketrequest, bucketclass) + // call the add directly the second time + } + + listener.Add(ctx, bucketrequest) + + bucketList = util.GetBuckets(ctx, client, 1) + if len(bucketList.Items) != 1 { + t.Fatalf("Expecting a single bucket created but found %v", len(bucketList.Items)) + } +} diff --git a/pkg/util/util.go b/pkg/util/util.go new file mode 100644 index 00000000..ba7e2c30 --- /dev/null +++ b/pkg/util/util.go @@ -0,0 +1,374 @@ +package util + +import ( + "context" + "errors" + "fmt" + "golang.org/x/time/rate" + "os" + "reflect" + "strings" + "time" + + apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" + apiextensions "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1" + apierrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/uuid" + kubeclientset "k8s.io/client-go/kubernetes" + "k8s.io/client-go/rest" + "k8s.io/client-go/tools/clientcmd" + "k8s.io/client-go/util/workqueue" + + types "github.com/kubernetes-sigs/container-object-storage-interface-api/apis/objectstorage.k8s.io/v1alpha1" + bucketclientset "github.com/kubernetes-sigs/container-object-storage-interface-api/clientset" + "github.com/kubernetes-sigs/container-object-storage-interface-api/controller" + + "sigs.k8s.io/controller-tools/pkg/crd" + crdmarkers "sigs.k8s.io/controller-tools/pkg/crd/markers" + "sigs.k8s.io/controller-tools/pkg/genall" + "sigs.k8s.io/controller-tools/pkg/loader" + "sigs.k8s.io/controller-tools/pkg/markers" + + "github.com/golang/glog" +) + +var ( + // Error codes that the central controller will return + ErrBucketAlreadyExists = errors.New("A bucket already existing that matches the bucket request") + ErrInvalidBucketClass = errors.New("Cannot find Bucket Class with the name specified in the bucket request") + ErrBCUnavailable = errors.New("BucketClass is not available") + ErrNotImplemented = errors.New("Operation Not Implemented") +) + +func CopySS(m map[string]string) map[string]string { + if m == nil { + return nil + } + copy := make(map[string]string, len(m)) + for k, v := range m { + copy[k] = v + } + return copy +} + +func CopyStrings(s []string) []string { + if s == nil { + return nil + } + c := make([]string, len(s)) + copy(c, s) + return c +} + +func GetUUID() string { + return string(uuid.NewUUID()) +} + +// SetupTest is utility function to create clients and controller +// This is used by bucket request and bucket access request unit tests +func SetupTest(ctx context.Context) (bucketclientset.Interface, kubeclientset.Interface, *controller.ObjectStorageController) { + + // Initialize the clients + config, err := func() (*rest.Config, error) { + kubeConfig := os.Getenv("KUBECONFIG") + if kubeConfig != "" { + return clientcmd.BuildConfigFromFlags("", kubeConfig) + } + return rest.InClusterConfig() + }() + if err != nil { + glog.Fatalf("Failed to create clients: %v", err) + } + + kubeClient, err := kubeclientset.NewForConfig(config) + if err != nil { + glog.Fatalf("Failed to create Kubernetes client: %v", err) + } + client, err := bucketclientset.NewForConfig(config) + if err != nil { + glog.Fatalf("Failed to create ObjectStorage client: %v", err) + } + + crdClientset, err := apiextensions.NewForConfig(config) + if err != nil { + glog.Fatalf("Failed to create CRD client: %v", err) + } + + err = RegisterCRDs(ctx, crdClientset.CustomResourceDefinitions()) + if err != nil { + glog.Fatalf("Failed to register CRDs: %v", err) + } + + rateLimit := workqueue.NewMaxOfRateLimiter( + workqueue.NewItemExponentialFailureRateLimiter(100*time.Millisecond, 600*time.Second), + &workqueue.BucketRateLimiter{Limiter: rate.NewLimiter(rate.Limit(10), 100)}, + ) + ctrl, err := controller.NewObjectStorageControllerWithClientset("controller-manager", "leader-lock", 40, rateLimit, kubeClient, client) + if err != nil { + glog.Fatalf("Failed to create ObjectStorage Controller: %v", err) + } + + go ctrl.Run(ctx) + return client, kubeClient, ctrl +} + +// GetBuckets will wait and fetch expected number of buckets created by the test +// This is used by bucket request unit tests +func GetBuckets(ctx context.Context, client bucketclientset.Interface, numExpected int) *types.BucketList { + bucketList, err := client.ObjectstorageV1alpha1().Buckets().List(ctx, metav1.ListOptions{}) + if len(bucketList.Items) > 0 { + return bucketList + } + numtimes := 0 + for numtimes < 10 { + bucketList, err = client.ObjectstorageV1alpha1().Buckets().List(ctx, metav1.ListOptions{}) + if len(bucketList.Items) >= numExpected { + return bucketList + } else { + glog.Errorf("Failed to fetch the bucket created %v", err) + } + numtimes++ + <-time.After(time.Duration(numtimes) * time.Second) + } + return &types.BucketList{} +} + +// Validates the content of the bucket against bucket request and backet class +// This is used by bucket request unit tests +func ValidateBucket(bucket types.Bucket, bucketrequest types.BucketRequest, bucketclass types.BucketClass) bool { + if strings.HasPrefix(bucket.Name, bucketrequest.Spec.BucketPrefix) && + bucket.Spec.BucketClassName == bucketrequest.Spec.BucketClassName && + bucket.Spec.BucketRequest.Name == bucketrequest.Name && + bucket.Spec.BucketRequest.Namespace == bucketrequest.Namespace && + bucket.Spec.BucketRequest.UID == bucketrequest.ObjectMeta.UID && + bucket.Spec.BucketClassName == bucketclass.Name && + reflect.DeepEqual(bucket.Spec.Parameters, bucketclass.Parameters) && + bucket.Spec.Provisioner == bucketclass.Provisioner && + bucket.Spec.RetentionPolicy == bucketclass.RetentionPolicy && + bucket.Spec.AnonymousAccessMode == bucketclass.AnonymousAccessMode { + return true + } + return false +} + +// Validates the content of the bucket against bucket request and backet class +// This is used by bucket access request unit tests +func GetBucketAccesses(ctx context.Context, client bucketclientset.Interface, numExpected int) *types.BucketAccessList { + bucketaccessList, _ := client.ObjectstorageV1alpha1().BucketAccesses().List(ctx, metav1.ListOptions{}) + if len(bucketaccessList.Items) > 0 { + return bucketaccessList + } + numtimes := 0 + for numtimes < 10 { + bucketaccessList, _ = client.ObjectstorageV1alpha1().BucketAccesses().List(ctx, metav1.ListOptions{}) + if len(bucketaccessList.Items) >= numExpected { + return bucketaccessList + } + numtimes++ + <-time.After(time.Duration(numtimes) * time.Second) + } + return &types.BucketAccessList{} +} + +// Validates the content of the bucket access against bucket access request and backet access class +// This is used by bucket access request unit tests +func ValidateBucketAccess(bucketaccess types.BucketAccess, bucketaccessrequest types.BucketAccessRequest, bucketaccessclass types.BucketAccessClass) bool { + if bucketaccess.Spec.BucketInstanceName != "" && + bucketaccess.Spec.BucketAccessRequest == bucketaccessrequest.Name && + bucketaccess.Spec.ServiceAccount == bucketaccessrequest.Spec.ServiceAccountName && + bucketaccess.Spec.PolicyActionsConfigMapData != "" && + bucketaccess.Spec.Provisioner == bucketaccessclass.Provisioner { + return true + } + return false +} + +// Deletes any bucket api object or an array of bucket or bucket access objects. +// This is used by bucket request and bucket access request unit tests +func DeleteObjects(ctx context.Context, client bucketclientset.Interface, objs ...interface{}) { + for _, obj := range objs { + switch t := obj.(type) { + case types.Bucket: + client.ObjectstorageV1alpha1().Buckets().Delete(ctx, obj.(types.Bucket).Name, metav1.DeleteOptions{}) + case types.BucketRequest: + client.ObjectstorageV1alpha1().BucketRequests(obj.(types.BucketRequest).Namespace).Delete(ctx, obj.(types.BucketRequest).Name, metav1.DeleteOptions{}) + case types.BucketClass: + client.ObjectstorageV1alpha1().BucketClasses().Delete(ctx, obj.(types.BucketClass).Name, metav1.DeleteOptions{}) + case []types.Bucket: + for _, a := range obj.([]types.Bucket) { + DeleteObjects(ctx, client, a) + } + case types.BucketAccess: + client.ObjectstorageV1alpha1().BucketAccesses().Delete(ctx, obj.(types.BucketAccess).Name, metav1.DeleteOptions{}) + case types.BucketAccessRequest: + client.ObjectstorageV1alpha1().BucketAccessRequests(obj.(types.BucketAccessRequest).Namespace).Delete(ctx, obj.(types.BucketAccessRequest).Name, metav1.DeleteOptions{}) + case types.BucketAccessClass: + client.ObjectstorageV1alpha1().BucketAccessClasses().Delete(ctx, obj.(types.BucketAccessClass).Name, metav1.DeleteOptions{}) + case []types.BucketAccess: + for _, a := range obj.([]types.BucketAccess) { + DeleteObjects(ctx, client, a) + } + default: + glog.Errorf("Unknown Obj of type %v", t) + } + } +} + +// CreateBucketRequest creates a bucket request object or return an existing bucket request object +// This is used by bucket request unit tests +func CreateBucketRequest(ctx context.Context, client bucketclientset.Interface, br *types.BucketRequest) (*types.BucketRequest, error) { + br, err := client.ObjectstorageV1alpha1().BucketRequests(br.Namespace).Create(ctx, br, metav1.CreateOptions{}) + if (err != nil) && apierrors.IsAlreadyExists(err) { + br, err = client.ObjectstorageV1alpha1().BucketRequests(br.Namespace).Get(ctx, br.Name, metav1.GetOptions{}) + } + return br, err +} + +// CreateBucketAccessRequest creates a bucket access request object or return an existing bucket access request object +// This is used by bucket access request unit tests +func CreateBucketAccessRequest(ctx context.Context, client bucketclientset.Interface, bar *types.BucketAccessRequest) (*types.BucketAccessRequest, error) { + bar, err := client.ObjectstorageV1alpha1().BucketAccessRequests(bar.Namespace).Create(ctx, bar, metav1.CreateOptions{}) + if (err != nil) && apierrors.IsAlreadyExists(err) { + bar, err = client.ObjectstorageV1alpha1().BucketAccessRequests(bar.Namespace).Get(ctx, bar.Name, metav1.GetOptions{}) + } + return bar, err +} + +// CreateBucketClass creates a bucket class object or return an existing bucket class object +// This is used by bucket request unit tests +func CreateBucketClass(ctx context.Context, client bucketclientset.Interface, bc *types.BucketClass) (*types.BucketClass, error) { + bc, err := client.ObjectstorageV1alpha1().BucketClasses().Create(ctx, bc, metav1.CreateOptions{}) + if (err != nil) && apierrors.IsAlreadyExists(err) { + bc, err = client.ObjectstorageV1alpha1().BucketClasses().Get(ctx, bc.Name, metav1.GetOptions{}) + } + return bc, err +} + +// CreateBucketAccessClass creates a bucket access class object or return an existing bucket access class object +// This is used by bucket request unit tests +func CreateBucketAccessClass(ctx context.Context, client bucketclientset.Interface, bac *types.BucketAccessClass) (*types.BucketAccessClass, error) { + bac, err := client.ObjectstorageV1alpha1().BucketAccessClasses().Create(ctx, bac, metav1.CreateOptions{}) + if (err != nil) && apierrors.IsAlreadyExists(err) { + bac, err = client.ObjectstorageV1alpha1().BucketAccessClasses().Get(ctx, bac.Name, metav1.GetOptions{}) + } + return bac, err +} + +// CreateBucket creates a bucket object or return an existing bucket object +// This is used by bucket request unit tests +func CreateBucket(ctx context.Context, client bucketclientset.Interface, b *types.Bucket) (*types.Bucket, error) { + b, err := client.ObjectstorageV1alpha1().Buckets().Create(ctx, b, metav1.CreateOptions{}) + if (err != nil) && apierrors.IsAlreadyExists(err) { + b, err = client.ObjectstorageV1alpha1().Buckets().Get(ctx, b.Name, metav1.GetOptions{}) + } + return b, err +} + +// CreateBucketAccess creates a bucket access object or return an existing bucket access object +// This is used by bucket access request unit tests +func CreateBucketAccess(ctx context.Context, client bucketclientset.Interface, ba *types.BucketAccess) (*types.BucketAccess, error) { + ba, err := client.ObjectstorageV1alpha1().BucketAccesses().Create(ctx, ba, metav1.CreateOptions{}) + if (err != nil) && apierrors.IsAlreadyExists(err) { + ba, err = client.ObjectstorageV1alpha1().BucketAccesses().Get(ctx, ba.Name, metav1.GetOptions{}) + } + return ba, err +} + +// getCRDClient returns CRD interface for managing CRD objects programmatically +// Used by unit tests and functional tests +func getCRDClient() (apiextensions.CustomResourceDefinitionInterface, error) { + config, err := func() (*rest.Config, error) { + kubeConfig := os.Getenv("KUBECONFIG") + + if kubeConfig != "" { + return clientcmd.BuildConfigFromFlags("", kubeConfig) + } + return rest.InClusterConfig() + }() + + crdClientset, err := apiextensions.NewForConfig(config) + if err != nil { + glog.Fatalf("could not initialize crd client: %v", err) + return nil, err + } + return crdClientset.CustomResourceDefinitions(), err +} + +// RegisterCRDs registers the CRD so that unit tests can use the CRD to perform bucket API testing +func RegisterCRDs(ctx context.Context, client apiextensions.CustomResourceDefinitionInterface) error { + var err error + if client == nil { + client, err = getCRDClient() + } + if err != nil { + return err + } + + roots, err := loader.LoadRoots("github.com/kubernetes-sigs/container-object-storage-interface-api/apis/objectstorage.k8s.io/v1alpha1") + if err != nil { + return err + } + + defn := markers.Must(markers.MakeDefinition("crd", markers.DescribesPackage, crd.Generator{})) + optionsRegistry := &markers.Registry{} + if err := optionsRegistry.Register(defn); err != nil { + return err + } + + if err := genall.RegisterOptionsMarkers(optionsRegistry); err != nil { + return err + } + + if err := crdmarkers.Register(optionsRegistry); err != nil { + return err + } + + parser := &crd.Parser{ + Collector: &markers.Collector{ + Registry: optionsRegistry, + }, + Checker: &loader.TypeChecker{}, + } + crd.AddKnownTypes(parser) + for _, root := range roots { + parser.NeedPackage(root) + } + + metav1Pkg := crd.FindMetav1(roots) + if metav1Pkg == nil { + // no objects in the roots, since nothing imported metav1 + return fmt.Errorf("no objects found in all roots") + } + + // TODO: allow selecting a specific object + kubeKinds := crd.FindKubeKinds(parser, metav1Pkg) + if len(kubeKinds) == 0 { + // no objects in the roots + return fmt.Errorf("no kube kind-objects found in all roots") + } + + //crdClient := utils.GetCRDClient() + crdClient := client + + for groupKind := range kubeKinds { + parser.NeedCRDFor(groupKind, func() *int { + i := 256 + return &i + }()) + crdRaw := parser.CustomResourceDefinitions[groupKind] + glog.Infof("creating CRD: %v", groupKind) + if crdRaw.ObjectMeta.Annotations == nil { + crdRaw.ObjectMeta.Annotations = map[string]string{} + } + if _, ok := crdRaw.ObjectMeta.Annotations[apiextensionsv1.KubeAPIApprovedAnnotation]; !ok { + crdRaw.ObjectMeta.Annotations[apiextensionsv1.KubeAPIApprovedAnnotation] = "https://github.com/kubernetes/kubernetes/pull/78458" + } + if _, err := crdClient.Create(ctx, &crdRaw, metav1.CreateOptions{}); err != nil { + if !apierrors.IsAlreadyExists(err) { + return err + } + } + } + return nil +} From ddc3f1e4f3f8f491947a3fe4e45d61fca4bde55f Mon Sep 17 00:00:00 2001 From: Manjunath A Kumatagi Date: Wed, 9 Dec 2020 21:34:08 +0530 Subject: [PATCH 125/242] Fix kubeconfig flag --- cmd/controller-manager/controller-manager.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/controller-manager/controller-manager.go b/cmd/controller-manager/controller-manager.go index 533d898d..5ac029c4 100644 --- a/cmd/controller-manager/controller-manager.go +++ b/cmd/controller-manager/controller-manager.go @@ -39,7 +39,7 @@ func init() { c.PersistentFlags(). StringVarP(ptr, name, short, dfault, desc) } - strFlag(cmd, &kubeConfig, "kube-config", "", kubeConfig, "path to kubeconfig file") + strFlag(cmd, &kubeConfig, "kubeconfig", "", kubeConfig, "path to kubeconfig file") hideFlag := func(name string) { cmd.PersistentFlags().MarkHidden(name) From edb08e6ca5f9a419d3aed4f4121d5867f5e06343 Mon Sep 17 00:00:00 2001 From: Rob Rati Date: Wed, 9 Dec 2020 18:43:41 -0500 Subject: [PATCH 126/242] Added fake client --- fake/cosi.pb.go | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 fake/cosi.pb.go diff --git a/fake/cosi.pb.go b/fake/cosi.pb.go new file mode 100644 index 00000000..b0487a9d --- /dev/null +++ b/fake/cosi.pb.go @@ -0,0 +1,46 @@ +package fake + +import ( + "context" + + cosi "github.com/kubernetes-sigs/container-object-storage-interface-spec" + + "google.golang.org/grpc" +) + +// this ensures that the mock implements the client interface +var _ cosi.ProvisionerClient = (*MockProvisionerClient)(nil) + +// MockProvisionerClient is a type that implements all the methods for RolePolicyAttachmentClient interface +type MockProvisionerClient struct { + GetInfo func(ctx context.Context, in *cosi.ProvisionerGetInfoRequest, opts ...grpc.CallOption) (*cosi.ProvisionerGetInfoResponse, error) + CreateBucket func(ctx context.Context, in *cosi.ProvisionerCreateBucketRequest, opts ...grpc.CallOption) (*cosi.ProvisionerCreateBucketResponse, error) + DeleteBucket func(ctx context.Context, in *cosi.ProvisionerDeleteBucketRequest, opts ...grpc.CallOption) (*cosi.ProvisionerDeleteBucketResponse, error) + GrantBucketAccess func(ctx context.Context, in *cosi.ProvisionerGrantBucketAccessRequest, opts ...grpc.CallOption) (*cosi.ProvisionerGrantBucketAccessResponse, error) + RevokeBucketAccess func(ctx context.Context, in *cosi.ProvisionerRevokeBucketAccessRequest, opts ...grpc.CallOption) (*cosi.ProvisionerRevokeBucketAccessResponse, error) +} + +// ProvisionerCreateBucket mocks GetBucketPolicyRequest method +func (m *MockProvisionerClient) ProvisionerCreateBucket(ctx context.Context, in *cosi.ProvisionerCreateBucketRequest, opts ...grpc.CallOption) (*cosi.ProvisionerCreateBucketResponse, error) { + return m.CreateBucket(ctx, in, opts...) +} + +// ProvisionerDeleteBucket mocks PutBucketPolicyRequest method +func (m *MockProvisionerClient) ProvisionerDeleteBucket(ctx context.Context, in *cosi.ProvisionerDeleteBucketRequest, opts ...grpc.CallOption) (*cosi.ProvisionerDeleteBucketResponse, error) { + return m.DeleteBucket(ctx, in, opts...) +} + +// ProvisionerGrantBucketAccess mocks DeleteBucketPolicyRequest method +func (m *MockProvisionerClient) ProvisionerGrantBucketAccess(ctx context.Context, in *cosi.ProvisionerGrantBucketAccessRequest, opts ...grpc.CallOption) (*cosi.ProvisionerGrantBucketAccessResponse, error) { + return m.GrantBucketAccess(ctx, in, opts...) +} + +// ProvisionerRevokeBucketAccess mocks DeleteBucketPolicyRequest method +func (m *MockProvisionerClient) ProvisionerRevokeBucketAccess(ctx context.Context, in *cosi.ProvisionerRevokeBucketAccessRequest, opts ...grpc.CallOption) (*cosi.ProvisionerRevokeBucketAccessResponse, error) { + return m.RevokeBucketAccess(ctx, in, opts...) +} + +// ProvisionerRevokeBucketAccess mocks DeleteBucketPolicyRequest method +func (m *MockProvisionerClient) ProvisionerGetInfo(ctx context.Context, in *cosi.ProvisionerGetInfoRequest, opts ...grpc.CallOption) (*cosi.ProvisionerGetInfoResponse, error) { + return m.GetInfo(ctx, in, opts...) +} From 2a29305571b5bee7d98ce07bcc708b3a452b14ac Mon Sep 17 00:00:00 2001 From: Tejas Parikh Date: Thu, 10 Dec 2020 11:29:23 -0500 Subject: [PATCH 127/242] Added Kustomize for controller, sidecar & CRDs Signed-off-by: Tejas Parikh --- deploy/base/deployment.yaml | 24 +++++++++++ deploy/base/ns.yaml | 5 +++ deploy/base/rbac.yaml | 55 +++++++++++++++++++++++++ deploy/base/sa.yaml | 6 +++ kustomization.yaml | 81 +++++++++++++++++++++++++++++++++++++ 5 files changed, 171 insertions(+) create mode 100644 deploy/base/deployment.yaml create mode 100644 deploy/base/ns.yaml create mode 100644 deploy/base/rbac.yaml create mode 100644 deploy/base/sa.yaml create mode 100644 kustomization.yaml diff --git a/deploy/base/deployment.yaml b/deploy/base/deployment.yaml new file mode 100644 index 00000000..c33295be --- /dev/null +++ b/deploy/base/deployment.yaml @@ -0,0 +1,24 @@ +--- +kind: Deployment +apiVersion: apps/v1 +metadata: + name: objectstorage-controller + namespace: objectstorage-system +spec: + replicas: 1 + strategy: + rollingUpdate: + maxUnavailable: 0 + maxSurge: 1 + selector: + matchLabels: + app: objectstorage-controller + template: + metadata: + labels: + app: objectstorage-controller + spec: + serviceAccountName: objectstorage-controller-sa + containers: + - name: objectstorage-controller + image: quay.io/containerobjectstorage/objectstorage-controller:latest diff --git a/deploy/base/ns.yaml b/deploy/base/ns.yaml new file mode 100644 index 00000000..c31ae9c4 --- /dev/null +++ b/deploy/base/ns.yaml @@ -0,0 +1,5 @@ +--- +apiVersion: v1 +kind: Namespace +metadata: + name: objectstorage-system diff --git a/deploy/base/rbac.yaml b/deploy/base/rbac.yaml new file mode 100644 index 00000000..1051b694 --- /dev/null +++ b/deploy/base/rbac.yaml @@ -0,0 +1,55 @@ +--- +kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: objectstorage-controller-role +rules: +- apiGroups: ["objectstorage.k8s.io"] + resources: ["bucketrequests", "bucketaccessrequests"] + verbs: ["get", "list", "watch"] +- apiGroups: ["objectstorage.k8s.io"] + resources: ["buckets", "bucketaccess"] + verbs: ["get", "list", "watch", "update", "create", "delete"] +- apiGroups: ["objectstorage.k8s.io"] + resources: ["bucketclass","bucketaccessclass"] + verbs: ["get", "list"] +- apiGroups: [""] + resources: ["events"] + verbs: ["list", "watch", "create", "update", "patch"] +--- +kind: ClusterRoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: system:objectstorage-controller +subjects: + - kind: ServiceAccount + name: objectstorage-controller-sa + namespace: objectstorage-system +roleRef: + kind: ClusterRole + name: objectstorage-controller-role + apiGroup: rbac.authorization.k8s.io +--- +kind: Role +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: objectstorage-controller + namespace: objectstorage-system +rules: +- apiGroups: ["coordination.k8s.io"] + resources: ["leases"] + verbs: ["get", "watch", "list", "delete", "update", "create"] +--- +kind: RoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: objectstorage-controller + namespace: objectstorage-system +subjects: + - kind: ServiceAccount + name: objectstorage-controller-sa + namespace: objectstorage-system +roleRef: + kind: Role + name: objectstorage-controller + apiGroup: rbac.authorization.k8s.io diff --git a/deploy/base/sa.yaml b/deploy/base/sa.yaml new file mode 100644 index 00000000..802dbb8c --- /dev/null +++ b/deploy/base/sa.yaml @@ -0,0 +1,6 @@ +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: objectstorage-controller-sa + namespace: objectstorage-system diff --git a/kustomization.yaml b/kustomization.yaml new file mode 100644 index 00000000..0d2ba6d9 --- /dev/null +++ b/kustomization.yaml @@ -0,0 +1,81 @@ +--- +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +images: +# Controller +- name: objectstorage-controller + newName: quay.io/containerobjectstorage/objectstorage-controller + newTag: latest +# Sidecar +- name: object-storage-sidecar + newName: quay.io/containerobjectstorage/object-storage-sidecar + newTag: latest +# Sample Driver +- name: sample-driver + newName: quay.io/containerobjectstorage/sample-driver + newTag: latest + +resources: +# CRDs +- https://raw.githubusercontent.com/kubernetes-sigs/container-object-storage-interface-api/master/crds/objectstorage.k8s.io_bucketaccessclasses.yaml +- https://raw.githubusercontent.com/kubernetes-sigs/container-object-storage-interface-api/master/crds/objectstorage.k8s.io_bucketaccesses.yaml +- https://raw.githubusercontent.com/kubernetes-sigs/container-object-storage-interface-api/master/crds/objectstorage.k8s.io_bucketaccessrequests.yaml +- https://raw.githubusercontent.com/kubernetes-sigs/container-object-storage-interface-api/master/crds/objectstorage.k8s.io_bucketclasses.yaml +- https://raw.githubusercontent.com/kubernetes-sigs/container-object-storage-interface-api/master/crds/objectstorage.k8s.io_bucketrequests.yaml +- https://raw.githubusercontent.com/kubernetes-sigs/container-object-storage-interface-api/master/crds/objectstorage.k8s.io_buckets.yaml +# Controller +- deploy/base/ns.yaml +- deploy/base/sa.yaml +- deploy/base/rbac.yaml +- deploy/base/deployment.yaml +# Sidecar +- https://raw.githubusercontent.com/container-object-storage-interface/cosi-provisioner-sidecar/master/examples/object-storage-sidecar.yaml + +patches: +# CRDs +- target: + kind: CustomResourceDefinition + patch: |- + - op: add + path: /metadata/annotations + value: + controller-gen.kubebuilder.io/version: (devel) + api-approved.kubernetes.io: https://github.com/kubernetes-sigs/container-object-storage-interface-api/pull/2 +# Controller +- target: + kind: Deployment + name: objectstorage-controller + patch: |- + - op: replace + path: /spec/template/spec/containers/0/imagePullPolicy + value: IfNotPresent +# Sidecar +- target: + kind: Deployment + name: object-storage-provisioner + patch: |- + - op: replace + path: /spec/template/spec/containers/0/imagePullPolicy + value: IfNotPresent + - op: replace + path: /spec/template/spec/containers/1/imagePullPolicy + value: IfNotPresent + - op: replace + path: /metadata + value: + name: object-storage-provisioner + labels: + app: object-storage-provisioner + namespace: objectstorage-provisioner-ns +- target: + kind: Secret + name: object-storage-provisioner + patch: |- + - op: replace + path: /metadata + value: + name: object-storage-provisioner + labels: + app: object-storage-provisioner + namespace: objectstorage-provisioner-ns From 84ffaba85d0dce129cf524fb7b9307fec566158b Mon Sep 17 00:00:00 2001 From: Srini Brahmaroutu Date: Fri, 4 Dec 2020 08:57:14 -0800 Subject: [PATCH 128/242] Adding BucketAccess Add Functionality, Fix cmd controller and pass context to command Fixes https://github.com/kubernetes-sigs/container-object-storage-interface-controller/issues/10 Fixes https://github.com/kubernetes-sigs/container-object-storage-interface-controller/issues/8 --- cmd/controller-manager/controller-manager.go | 14 +- go.mod | 3 +- go.sum | 11 +- .../bucketaccessrequest.go | 162 +++++++++ .../bucketaccessrequest_test.go | 332 ++++++++++++++++++ pkg/bucketrequest/bucketrequest.go | 41 ++- pkg/bucketrequest/bucketrequest_test.go | 51 ++- pkg/util/util.go | 40 ++- 8 files changed, 605 insertions(+), 49 deletions(-) create mode 100644 pkg/bucketaccessrequest/bucketaccessrequest.go create mode 100644 pkg/bucketaccessrequest/bucketaccessrequest_test.go diff --git a/cmd/controller-manager/controller-manager.go b/cmd/controller-manager/controller-manager.go index 533d898d..750e833b 100644 --- a/cmd/controller-manager/controller-manager.go +++ b/cmd/controller-manager/controller-manager.go @@ -11,6 +11,7 @@ import ( "github.com/spf13/viper" bucketcontroller "github.com/kubernetes-sigs/container-object-storage-interface-api/controller" + "github.com/kubernetes-sigs/container-object-storage-interface-controller/pkg/bucketaccessrequest" "github.com/kubernetes-sigs/container-object-storage-interface-controller/pkg/bucketrequest" "github.com/golang/glog" @@ -59,13 +60,9 @@ func init() { } func main() { - if err := cmd.Execute(); err != nil { - glog.Fatal(err.Error()) - } - - var cancel context.CancelFunc + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() // Just in case - _, cancel = context.WithCancel(cmd.Context()) sigs := make(chan os.Signal, 1) signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) @@ -73,6 +70,10 @@ func main() { <-sigs cancel() }() + + if err := cmd.ExecuteContext(ctx); err != nil { + glog.Fatal(err.Error()) + } } func run(ctx context.Context, args []string) error { @@ -81,5 +82,6 @@ func run(ctx context.Context, args []string) error { return err } ctrl.AddBucketRequestListener(bucketrequest.NewListener()) + ctrl.AddBucketAccessRequestListener(bucketaccessrequest.NewListener()) return ctrl.Run(ctx) } diff --git a/go.mod b/go.mod index 19ac6584..f1959337 100644 --- a/go.mod +++ b/go.mod @@ -4,10 +4,11 @@ go 1.15 require ( github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b - github.com/kubernetes-sigs/container-object-storage-interface-api v0.0.0-20201204201926-43539346a903 + github.com/kubernetes-sigs/container-object-storage-interface-api v0.0.0-20201210173615-0c3244fa34b9 github.com/spf13/cobra v1.1.1 github.com/spf13/viper v1.7.1 golang.org/x/time v0.0.0-20191024005414-555d28b269f0 + k8s.io/api v0.19.4 k8s.io/apiextensions-apiserver v0.19.4 k8s.io/apimachinery v0.19.4 k8s.io/client-go v0.19.4 diff --git a/go.sum b/go.sum index e2f76648..6d6c49cb 100644 --- a/go.sum +++ b/go.sum @@ -257,6 +257,7 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO 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 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.5 h1:JboBksRwiiAJWvIYJVo46AfV+IAIKZpfrSzVKj42R4Q= @@ -289,8 +290,8 @@ 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/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kubernetes-sigs/container-object-storage-interface-api v0.0.0-20201204201926-43539346a903 h1:kBd9bCHv429J7Y8Mp2w1Xg3QtDiRAhittzYC/45/G2E= -github.com/kubernetes-sigs/container-object-storage-interface-api v0.0.0-20201204201926-43539346a903/go.mod h1:C7tjzC+nLe7H7+3UM/Z6a7F24yxOO8FSK3ZaVZrKDPQ= +github.com/kubernetes-sigs/container-object-storage-interface-api v0.0.0-20201210173615-0c3244fa34b9 h1:1Zmlu1GKd1iIv9fdc1mkaTuUtoNqet4NLYLE/8p9ylw= +github.com/kubernetes-sigs/container-object-storage-interface-api v0.0.0-20201210173615-0c3244fa34b9/go.mod h1:C7tjzC+nLe7H7+3UM/Z6a7F24yxOO8FSK3ZaVZrKDPQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= @@ -336,6 +337,7 @@ github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn 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.11.0 h1:JAKSXpt1YjtLA7YpPiqO9ss6sNXEsPfSGdwN0UHqzrw= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.2 h1:8mVmC9kjFFmA8H4pKMUhcblgifdkOIXPvbhN1T36q1M= @@ -343,6 +345,7 @@ github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9k github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.8.1 h1:C5Dqfs/LeauYDX0jJXIe2SWmwCbGzx9yF8C8xy3Lh34= github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= @@ -486,7 +489,6 @@ golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCc 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.2.0 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -661,6 +663,7 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogR gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 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 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= @@ -693,7 +696,6 @@ k8s.io/api v0.18.6/go.mod h1:eeyxr+cwCjMdLAmr2W3RyDI0VvTawSg/3RFFBEnmZGI= k8s.io/api v0.19.4 h1:I+1I4cgJYuCDgiLNjKx7SLmIbwgj9w7N7Zr5vSIdwpo= k8s.io/api v0.19.4/go.mod h1:SbtJ2aHCItirzdJ36YslycFNzWADYH3tgOhvBEFtZAk= k8s.io/apiextensions-apiserver v0.18.2/go.mod h1:q3faSnRGmYimiocj6cHQ1I3WpLqmDgJFlKL37fC4ZvY= -k8s.io/apiextensions-apiserver v0.18.6 h1:vDlk7cyFsDyfwn2rNAO2DbmUbvXy5yT5GE3rrqOzaMo= k8s.io/apiextensions-apiserver v0.18.6/go.mod h1:lv89S7fUysXjLZO7ke783xOwVTm6lKizADfvUM/SS/M= k8s.io/apiextensions-apiserver v0.19.4 h1:D9ak9T012tb3vcGFWYmbQuj9SCC8YM4zhA4XZqsAQC4= k8s.io/apiextensions-apiserver v0.19.4/go.mod h1:B9rpH/nu4JBCtuUp3zTTk8DEjZUupZTBEec7/2zNRYw= @@ -727,6 +729,7 @@ k8s.io/klog/v2 v2.2.0 h1:XRvcwJozkgZ1UQJmfMGpvRthQHOvihEhYtDfAaxMz/A= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= 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-20200805222855-6aeccd4b50c6 h1:+WnxoVtG8TMiudHBSEtrVL1egv36TkkJm+bA8AxicmQ= k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= k8s.io/kube-openapi v0.0.0-20200923155610-8b5066479488 h1:mNpvQf4lkIHNOXCoM+Veu/UXwA56Yx1J7hY1Tvcs/oM= k8s.io/kube-openapi v0.0.0-20200923155610-8b5066479488/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= diff --git a/pkg/bucketaccessrequest/bucketaccessrequest.go b/pkg/bucketaccessrequest/bucketaccessrequest.go new file mode 100644 index 00000000..48cebc99 --- /dev/null +++ b/pkg/bucketaccessrequest/bucketaccessrequest.go @@ -0,0 +1,162 @@ +package bucketaccessrequest + +import ( + "context" + + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + "github.com/kubernetes-sigs/container-object-storage-interface-api/apis/objectstorage.k8s.io/v1alpha1" + bucketclientset "github.com/kubernetes-sigs/container-object-storage-interface-api/clientset" + bucketcontroller "github.com/kubernetes-sigs/container-object-storage-interface-api/controller" + "github.com/kubernetes-sigs/container-object-storage-interface-controller/pkg/util" + kubeclientset "k8s.io/client-go/kubernetes" + "k8s.io/client-go/util/retry" + + "github.com/golang/glog" +) + +type bucketAccessRequestListener struct { + kubeClient kubeclientset.Interface + bucketClient bucketclientset.Interface +} + +func NewListener() bucketcontroller.BucketAccessRequestListener { + return &bucketAccessRequestListener{} +} + +func (b *bucketAccessRequestListener) InitializeKubeClient(k kubeclientset.Interface) { + b.kubeClient = k +} + +func (b *bucketAccessRequestListener) InitializeBucketClient(bc bucketclientset.Interface) { + b.bucketClient = bc +} + +func (b *bucketAccessRequestListener) Add(ctx context.Context, obj *v1alpha1.BucketAccessRequest) error { + glog.V(1).Infof("Add called for BucketAccessRequest %s", obj.Name) + bucketAccessRequest := obj + + err := b.provisionBucketAccess(ctx, bucketAccessRequest) + if err != nil { + // Provisioning is 100% finished / not in progress. + switch err { + case util.ErrInvalidBucketAccessClass: + glog.V(1).Infof("BucketAccessClass specified does not exist while processing BucketAccessRequest %v.", bucketAccessRequest.Name) + err = nil + case util.ErrBucketAccessAlreadyExists: + glog.V(1).Infof("BucketAccess already exist for this BucketAccessRequest %v.", bucketAccessRequest.Name) + err = nil + default: + glog.V(1).Infof("Error occurred processing BucketAccessRequest %v: %v", bucketAccessRequest.Name, err) + } + return err + } + + glog.V(1).Infof("BucketAccessRequest %v is successfully processed.", bucketAccessRequest.Name) + return nil +} + +func (b *bucketAccessRequestListener) Update(ctx context.Context, old, new *v1alpha1.BucketAccessRequest) error { + glog.V(1).Infof("Update called for BucketAccessRequest %v", old.Name) + return nil +} + +func (b *bucketAccessRequestListener) Delete(ctx context.Context, obj *v1alpha1.BucketAccessRequest) error { + glog.V(1).Infof("Delete called for BucketAccessRequest %v", obj.Name) + return nil +} + +// provisionBucketAccess attempts to provision a BucketAccess for the given bucketAccessRequest. +// Returns nil error only when the bucketaccess was provisioned. An error is return if we cannot create bucket access. +// A normal error is returned when bucket acess was not provisioned and provisioning should be retried (requeue the bucketAccessRequest), +// or a special error errBucketAccessAlreadyExists, errInvalidBucketAccessClass is returned when provisioning was impossible and +// no further attempts to provision should be tried. +func (b *bucketAccessRequestListener) provisionBucketAccess(ctx context.Context, bucketAccessRequest *v1alpha1.BucketAccessRequest) error { + bucketAccessClassName := bucketAccessRequest.Spec.BucketAccessClassName + + bucketaccess := b.FindBucketAccess(ctx, bucketAccessRequest) + if bucketaccess != nil { + // bucketaccess has provisioned, nothing to do. + return util.ErrBucketAccessAlreadyExists + } + + bucketAccessClass, err := b.bucketClient.ObjectstorageV1alpha1().BucketAccessClasses().Get(ctx, bucketAccessClassName, metav1.GetOptions{}) + if bucketAccessClass == nil { + // bucket access class is invalid or not specified, cannot continue with provisioning. + return util.ErrInvalidBucketAccessClass + } + + bucketRequest, err := b.bucketClient.ObjectstorageV1alpha1().BucketRequests(bucketAccessRequest.Namespace).Get(ctx, bucketAccessRequest.Spec.BucketRequestName, metav1.GetOptions{}) + if bucketRequest == nil { + // bucket request does not exist, we have to reject this provision. + return util.ErrInvalidBucketRequest + } + if err != nil { + return err + } + + if bucketRequest.Spec.BucketInstanceName == "" { + return util.ErrWaitForBucketProvisioning + } + + sa, err := b.kubeClient.CoreV1().ServiceAccounts(bucketAccessRequest.Namespace).Get(ctx, bucketAccessRequest.Spec.ServiceAccountName, metav1.GetOptions{}) + if err != nil { + return err + } + + bucketaccess = &v1alpha1.BucketAccess{} + bucketaccess.Name = util.GetUUID() + + bucketaccess.Spec.BucketInstanceName = bucketRequest.Spec.BucketInstanceName + bucketaccess.Spec.BucketAccessRequest = &v1.ObjectReference{ + Name: bucketAccessRequest.Name, + Namespace: bucketAccessRequest.Namespace, + UID: bucketAccessRequest.ObjectMeta.UID} + bucketaccess.Spec.ServiceAccount = &v1.ObjectReference{ + Name: sa.Name, + Namespace: sa.Namespace, + UID: sa.ObjectMeta.UID} + // bucketaccess.Spec.MintedSecretName - set by the driver + bucketaccess.Spec.PolicyActionsConfigMapData, err = util.ReadConfigData(b.kubeClient, bucketAccessClass.PolicyActionsConfigMap) + if err != nil { + return err + } + // bucketaccess.Spec.Principal - set by the driver + bucketaccess.Spec.Provisioner = bucketAccessClass.Provisioner + bucketaccess.Spec.Parameters = util.CopySS(bucketAccessClass.Parameters) + + bucketaccess, err = b.bucketClient.ObjectstorageV1alpha1().BucketAccesses().Create(context.Background(), bucketaccess, metav1.CreateOptions{}) + if err != nil { + return err + } + + err = retry.RetryOnConflict(retry.DefaultRetry, func() error { + bucketAccessRequest.Spec.BucketAccessName = bucketaccess.Name + _, err := b.bucketClient.ObjectstorageV1alpha1().BucketAccessRequests(bucketAccessRequest.Namespace).Update(ctx, bucketAccessRequest, metav1.UpdateOptions{}) + if err != nil { + return err + } + return nil + }) + if err != nil { + return err + } + glog.Infof("Finished creating BucketAccess %v", bucketaccess.Name) + return nil +} + +func (b *bucketAccessRequestListener) FindBucketAccess(ctx context.Context, bar *v1alpha1.BucketAccessRequest) *v1alpha1.BucketAccess { + bucketAccessList, err := b.bucketClient.ObjectstorageV1alpha1().BucketAccesses().List(ctx, metav1.ListOptions{}) + if err != nil || len(bucketAccessList.Items) <= 0 { + return nil + } + for _, bucketaccess := range bucketAccessList.Items { + if bucketaccess.Spec.BucketAccessRequest.Name == bar.Name && + bucketaccess.Spec.BucketAccessRequest.Namespace == bar.Namespace && + bucketaccess.Spec.BucketAccessRequest.UID == bar.UID { + return &bucketaccess + } + } + return nil +} diff --git a/pkg/bucketaccessrequest/bucketaccessrequest_test.go b/pkg/bucketaccessrequest/bucketaccessrequest_test.go new file mode 100644 index 00000000..73834949 --- /dev/null +++ b/pkg/bucketaccessrequest/bucketaccessrequest_test.go @@ -0,0 +1,332 @@ +package bucketaccessrequest + +import ( + "context" + "testing" + + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + bucketclientset "github.com/kubernetes-sigs/container-object-storage-interface-api/clientset/fake" + "k8s.io/client-go/kubernetes/fake" + + types "github.com/kubernetes-sigs/container-object-storage-interface-api/apis/objectstorage.k8s.io/v1alpha1" + "github.com/kubernetes-sigs/container-object-storage-interface-controller/pkg/util" +) + +var sa1 = v1.ServiceAccount{ + ObjectMeta: metav1.ObjectMeta{ + Name: "sa1", + Namespace: "default", + }, +} + +var sa2 = v1.ServiceAccount{ + ObjectMeta: metav1.ObjectMeta{ + Name: "sa2", + Namespace: "default", + }, +} + +var cosiConfigMap = v1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: "testconfigmap", + Namespace: "default", + Labels: map[string]string{ + "cosi-configmap": "test-cred1", + }, + }, + Data: map[string]string{ + "profile": "profile1", + "certfile": "cert1", + }, +} + +var classGoldAccessParameters = map[string]string{ + "param1": "value1", + "param2": "value2", +} + +var goldAccessClass = types.BucketAccessClass{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "objectstorage.k8s.io/v1alpha1", + Kind: "BucketAccessClass", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "classaccessgold", + }, + Provisioner: "provisioner1", + PolicyActionsConfigMap: &v1.ObjectReference{Name: "testconfigmap", Namespace: "default"}, + Parameters: classGoldAccessParameters, +} + +var bucketRequest1 = types.BucketRequest{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "objectstorage.k8s.io/v1alpha1", + Kind: "BucketRequest", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "bucketrequest1", + Namespace: "default", + }, + Spec: types.BucketRequestSpec{ + BucketPrefix: "cosi", + Protocol: types.RequestedProtocol{ + Name: "s3", + Version: "", + }, + BucketClassName: "classgold", + BucketInstanceName: "cosi1234567890", + }, +} + +var bucketAccessRequest1 = types.BucketAccessRequest{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "objectstorage.k8s.io/v1alpha1", + Kind: "BucketAccessRequest", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "bucketaccessrequest1", + Namespace: "default", + }, + Spec: types.BucketAccessRequestSpec{ + ServiceAccountName: "sa1", + BucketRequestName: "bucketrequest1", + BucketAccessClassName: "classaccessgold", + }, +} + +var bucketAccessRequest2 = types.BucketAccessRequest{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "objectstorage.k8s.io/v1alpha1", + Kind: "BucketAccessRequest", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "bucketaccessrequest2", + Namespace: "default", + }, + Spec: types.BucketAccessRequestSpec{ + ServiceAccountName: "sa2", + BucketRequestName: "bucketrequest1", + BucketAccessClassName: "classaccessgold", + }, +} + +// Test basic add functionality +func TestAddBAR(t *testing.T) { + runCreateBucketAccess(t, "add") +} + +// Test add with multipleBRs +func TestAddWithMultipleBAR(t *testing.T) { + runCreateBucketWithMultipleBA(t, "addWithMultipleBR") +} + +// Test add idempotency +func TestAddBARIdempotency(t *testing.T) { + runCreateBucketIdempotency(t, "addWithMultipleBR") +} + +func runCreateBucketAccess(t *testing.T, name string) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + client := bucketclientset.NewSimpleClientset() + kubeClient := fake.NewSimpleClientset() + + listener := NewListener() + listener.InitializeKubeClient(kubeClient) + listener.InitializeBucketClient(client) + + _, err := kubeClient.CoreV1().ServiceAccounts(sa1.Namespace).Create(ctx, &sa1, metav1.CreateOptions{}) + if err != nil { + t.Fatalf("Error occurred when creating ServiceAccount: %v", err) + } + defer kubeClient.CoreV1().ServiceAccounts(sa1.Namespace).Delete(ctx, sa1.Name, metav1.DeleteOptions{}) + + _, err = kubeClient.CoreV1().ConfigMaps(cosiConfigMap.Namespace).Create(ctx, &cosiConfigMap, metav1.CreateOptions{}) + if err != nil { + t.Fatalf("Error occurred when creating ConfigMap: %v", err) + } + defer kubeClient.CoreV1().ConfigMaps(cosiConfigMap.Namespace).Delete(ctx, cosiConfigMap.Name, metav1.DeleteOptions{}) + + bucketaccessclass, err := util.CreateBucketAccessClass(ctx, client, &goldAccessClass) + if err != nil { + t.Fatalf("Error occurred when creating BucketAccessClass: %v", err) + } + + bucketrequest, err := util.CreateBucketRequest(ctx, client, &bucketRequest1) + if err != nil { + t.Fatalf("Error occurred when creating BucketRequest: %v", err) + } + + bucketaccessrequest, err := util.CreateBucketAccessRequest(ctx, client, &bucketAccessRequest1) + if err != nil { + t.Fatalf("Error occurred when creating BucketAccessRequest: %v", err) + } + + listener.Add(ctx, bucketaccessrequest) + + bucketAccessList := util.GetBucketAccesses(ctx, client, 1) + defer util.DeleteObjects(ctx, client, *bucketrequest, *bucketaccessrequest, *bucketaccessclass, bucketAccessList.Items) + + if len(bucketAccessList.Items) != 1 { + t.Fatalf("Expecting a single BucketAccess created but found %v", len(bucketAccessList.Items)) + } + bucketaccess := bucketAccessList.Items[0] + + bucketaccessrequest, err = client.ObjectstorageV1alpha1().BucketAccessRequests(bucketaccessrequest.Namespace).Get(ctx, bucketaccessrequest.Name, metav1.GetOptions{}) + if err != nil { + t.Fatalf("Error occurred when updating BucketAccessRequest: %v", err) + } + + if util.ValidateBucketAccess(bucketaccess, *bucketaccessrequest, *bucketaccessclass) { + return + } else { + t.Fatalf("Failed to compare the resulting BucketAccess with the BucketAccessRequest %v and BucketAccessClass %v", bucketaccessrequest, bucketaccessclass) + } +} + +func runCreateBucketWithMultipleBA(t *testing.T, name string) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + client := bucketclientset.NewSimpleClientset() + kubeClient := fake.NewSimpleClientset() + + listener := NewListener() + listener.InitializeKubeClient(kubeClient) + listener.InitializeBucketClient(client) + + _, err := kubeClient.CoreV1().ServiceAccounts(sa1.Namespace).Create(ctx, &sa1, metav1.CreateOptions{}) + if err != nil { + t.Fatalf("Error occurred when creating ServiceAccount: %v", err) + } + defer kubeClient.CoreV1().ServiceAccounts(sa1.Namespace).Delete(ctx, sa1.Name, metav1.DeleteOptions{}) + + _, err = kubeClient.CoreV1().ServiceAccounts(sa2.Namespace).Create(ctx, &sa2, metav1.CreateOptions{}) + if err != nil { + t.Fatalf("Error occurred when creating ServiceAccount: %v", err) + } + defer kubeClient.CoreV1().ServiceAccounts(sa2.Namespace).Delete(ctx, sa2.Name, metav1.DeleteOptions{}) + + _, err = kubeClient.CoreV1().ConfigMaps(cosiConfigMap.Namespace).Create(ctx, &cosiConfigMap, metav1.CreateOptions{}) + if err != nil { + t.Fatalf("Error occurred when creating ConfigMap: %v", err) + } + defer kubeClient.CoreV1().ConfigMaps(cosiConfigMap.Namespace).Delete(ctx, cosiConfigMap.Name, metav1.DeleteOptions{}) + + bucketaccessclass, err := util.CreateBucketAccessClass(ctx, client, &goldAccessClass) + if err != nil { + t.Fatalf("Error occurred when creating BucketAccessClass: %v", err) + } + + bucketrequest, err := util.CreateBucketRequest(ctx, client, &bucketRequest1) + if err != nil { + t.Fatalf("Error occurred when creating BucketRequest: %v", err) + } + + bucketaccessrequest, err := util.CreateBucketAccessRequest(ctx, client, &bucketAccessRequest1) + if err != nil { + t.Fatalf("Error occurred when creating BucketAccessRequest: %v", err) + } + + bucketaccessrequest2, err := util.CreateBucketAccessRequest(ctx, client, &bucketAccessRequest2) + if err != nil { + t.Fatalf("Error occurred when creating BucketAccessRequest: %v", err) + } + + listener.Add(ctx, bucketaccessrequest) + listener.Add(ctx, bucketaccessrequest2) + + bucketAccessList := util.GetBucketAccesses(ctx, client, 2) + defer util.DeleteObjects(ctx, client, *bucketrequest, *bucketaccessrequest, *bucketaccessrequest2, *bucketaccessclass, bucketAccessList.Items) + + if len(bucketAccessList.Items) != 2 { + t.Fatalf("Expecting a single BucketAccess created but found %v", len(bucketAccessList.Items)) + } + bucketaccess := bucketAccessList.Items[0] + bucketaccess2 := bucketAccessList.Items[1] + + bucketaccessrequest, err = client.ObjectstorageV1alpha1().BucketAccessRequests(bucketaccessrequest.Namespace).Get(ctx, bucketaccessrequest.Name, metav1.GetOptions{}) + if err != nil { + t.Fatalf("Error occurred when updating BucketAccessRequest: %v", err) + } + bucketaccessrequest2, err = client.ObjectstorageV1alpha1().BucketAccessRequests(bucketaccessrequest2.Namespace).Get(ctx, bucketaccessrequest2.Name, metav1.GetOptions{}) + if err != nil { + t.Fatalf("Error occurred when updating BucketAccessRequest: %v", err) + } + + if (util.ValidateBucketAccess(bucketaccess, *bucketaccessrequest, *bucketaccessclass) && util.ValidateBucketAccess(bucketaccess2, *bucketaccessrequest2, *bucketaccessclass)) || + (util.ValidateBucketAccess(bucketaccess2, *bucketaccessrequest, *bucketaccessclass) && util.ValidateBucketAccess(bucketaccess, *bucketaccessrequest2, *bucketaccessclass)) { + return + } else { + t.Fatalf("Failed to compare the resulting BucketAccess with the BucketAccessRequest %v and BucketAccessClass %v", bucketaccessrequest, bucketaccessclass) + } + +} + +func runCreateBucketIdempotency(t *testing.T, name string) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + client := bucketclientset.NewSimpleClientset() + kubeClient := fake.NewSimpleClientset() + + listener := NewListener() + listener.InitializeKubeClient(kubeClient) + listener.InitializeBucketClient(client) + + _, err := kubeClient.CoreV1().ServiceAccounts(sa1.Namespace).Create(ctx, &sa1, metav1.CreateOptions{}) + if err != nil { + t.Fatalf("Error occurred when creating ServiceAccount: %v", err) + } + defer kubeClient.CoreV1().ServiceAccounts(sa1.Namespace).Delete(ctx, sa1.Name, metav1.DeleteOptions{}) + + _, err = kubeClient.CoreV1().ConfigMaps(cosiConfigMap.Namespace).Create(ctx, &cosiConfigMap, metav1.CreateOptions{}) + if err != nil { + t.Fatalf("Error occurred when creating ConfigMap: %v", err) + } + defer kubeClient.CoreV1().ConfigMaps(cosiConfigMap.Namespace).Delete(ctx, cosiConfigMap.Name, metav1.DeleteOptions{}) + + bucketaccessclass, err := util.CreateBucketAccessClass(ctx, client, &goldAccessClass) + if err != nil { + t.Fatalf("Error occurred when creating BucketAccessClass: %v", err) + } + + bucketrequest, err := util.CreateBucketRequest(ctx, client, &bucketRequest1) + if err != nil { + t.Fatalf("Error occurred when creating BucketRequest: %v", err) + } + + bucketaccessrequest, err := util.CreateBucketAccessRequest(ctx, client, &bucketAccessRequest1) + if err != nil { + t.Fatalf("Error occurred when creating BucketAccessRequest: %v", err) + } + + listener.Add(ctx, bucketaccessrequest) + + bucketAccessList := util.GetBucketAccesses(ctx, client, 1) + defer util.DeleteObjects(ctx, client, *bucketrequest, *bucketaccessrequest, *bucketaccessclass, bucketAccessList.Items) + + if len(bucketAccessList.Items) != 1 { + t.Fatalf("Expecting a single BucketAccess created but found %v", len(bucketAccessList.Items)) + } + bucketaccess := bucketAccessList.Items[0] + + bucketaccessrequest, err = client.ObjectstorageV1alpha1().BucketAccessRequests(bucketaccessrequest.Namespace).Get(ctx, bucketaccessrequest.Name, metav1.GetOptions{}) + if err != nil { + t.Fatalf("Error occurred when updating BucketAccessRequest: %v", err) + } + + if !util.ValidateBucketAccess(bucketaccess, *bucketaccessrequest, *bucketaccessclass) { + t.Fatalf("Failed to compare the resulting BucketAccess with the BucketAccessRequest %v and BucketAccessClass %v", bucketaccessrequest, bucketaccessclass) + } + + // call the add directly the second time + listener.Add(ctx, bucketaccessrequest) + bucketAccessList = util.GetBucketAccesses(ctx, client, 1) + if len(bucketAccessList.Items) != 1 { + t.Fatalf("Expecting a single BucketAccess created but found %v", len(bucketAccessList.Items)) + } +} diff --git a/pkg/bucketrequest/bucketrequest.go b/pkg/bucketrequest/bucketrequest.go index 861f233a..ab126302 100644 --- a/pkg/bucketrequest/bucketrequest.go +++ b/pkg/bucketrequest/bucketrequest.go @@ -5,6 +5,7 @@ import ( "fmt" "strings" + v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "github.com/kubernetes-sigs/container-object-storage-interface-api/apis/objectstorage.k8s.io/v1alpha1" @@ -12,6 +13,7 @@ import ( bucketcontroller "github.com/kubernetes-sigs/container-object-storage-interface-api/controller" "github.com/kubernetes-sigs/container-object-storage-interface-controller/pkg/util" kubeclientset "k8s.io/client-go/kubernetes" + "k8s.io/client-go/util/retry" "github.com/golang/glog" ) @@ -35,36 +37,37 @@ func (b *bucketRequestListener) InitializeBucketClient(bc bucketclientset.Interf // Add creates a bucket in response to a bucketrequest func (b *bucketRequestListener) Add(ctx context.Context, obj *v1alpha1.BucketRequest) error { - glog.V(1).Infof("add called for bucket %s", obj.Name) + glog.V(1).Infof("Add called for BucketRequest %s", obj.Name) bucketRequest := obj err := b.provisionBucketRequestOperation(ctx, bucketRequest) if err != nil { // Provisioning is 100% finished / not in progress. switch err { case util.ErrInvalidBucketClass: - glog.V(5).Infof("Bucket Class specified does not exist. Stop provisioning, removing bucketRequest %s from bucketRequests in progress", bucketRequest.UID) + glog.V(1).Infof("BucketClass specified does not exist while processing BucketRequest %v.", bucketRequest.Name) err = nil case util.ErrBucketAlreadyExists: - glog.V(5).Infof("Bucket already exist for this bucket request. Stop provisioning, removing bucketRequest %s from bucketRequests in progress", bucketRequest.UID) + glog.V(1).Infof("Bucket already exist for this bucket request %v.", bucketRequest.Name) err = nil default: - glog.V(2).Infof("Final error received, removing buckerRequest %s from bucketRequests in progress", bucketRequest.UID) + glog.V(1).Infof("Error occurred processing BucketRequest %v: %v", bucketRequest.Name, err) } return err } - glog.V(5).Infof("BucketRequest processing succeeded, removing bucketRequest %s from bucketRequests in progress", bucketRequest.UID) + glog.V(1).Infof("BucketRequest %v is successfully processed.", bucketRequest.Name) return nil } // update processes any updates made to the bucket request func (b *bucketRequestListener) Update(ctx context.Context, old, new *v1alpha1.BucketRequest) error { - glog.V(1).Infof("update called for bucket %v", old) + glog.V(1).Infof("Update called for BucketRequest %v", old.Name) return nil } // Delete processes a bucket for which bucket request is deleted func (b *bucketRequestListener) Delete(ctx context.Context, obj *v1alpha1.BucketRequest) error { + glog.V(1).Infof("Delete called for BucketRequest %v", obj.Name) return nil } @@ -93,7 +96,7 @@ func (b *bucketRequestListener) provisionBucketRequestOperation(ctx context.Cont return util.ErrInvalidBucketClass } - glog.Infof("creating bucket for bucketrequest %v", bucketRequest.Name) + glog.Infof("Creating Bucket for BucketRequest %v", bucketRequest.Name) // create bucket bucket = &v1alpha1.Bucket{} @@ -102,7 +105,7 @@ func (b *bucketRequestListener) provisionBucketRequestOperation(ctx context.Cont bucket.Spec.RetentionPolicy = bucketClass.RetentionPolicy bucket.Spec.AnonymousAccessMode = bucketClass.AnonymousAccessMode bucket.Spec.BucketClassName = bucketClass.Name - bucket.Spec.BucketRequest = &v1alpha1.BucketRequestReference{ + bucket.Spec.BucketRequest = &v1.ObjectReference{ Name: bucketRequest.Name, Namespace: bucketRequest.Namespace, UID: bucketRequest.ObjectMeta.UID} @@ -114,11 +117,22 @@ func (b *bucketRequestListener) provisionBucketRequestOperation(ctx context.Cont bucket, err = b.bucketClient.ObjectstorageV1alpha1().Buckets().Create(context.Background(), bucket, metav1.CreateOptions{}) if err != nil { - glog.V(5).Infof("Error occurred when creating bucket %v", err) + glog.V(5).Infof("Error occurred when creating Bucket %v", err) return err } - glog.Infof("Finished creating bucket %v", bucket.Name) + err = retry.RetryOnConflict(retry.DefaultRetry, func() error { + bucketRequest.Spec.BucketInstanceName = bucket.Name + _, err := b.bucketClient.ObjectstorageV1alpha1().BucketRequests(bucketRequest.Namespace).Update(ctx, bucketRequest, metav1.UpdateOptions{}) + if err != nil { + return err + } + return nil + }) + if err != nil { + return err + } + glog.Infof("Finished creating Bucket %v", bucket.Name) return nil } @@ -154,11 +168,6 @@ func (b *bucketRequestListener) FindBucket(ctx context.Context, br *v1alpha1.Buc // cloneTheBucket clones a bucket to a different namespace when a BR is for brownfield. func (b *bucketRequestListener) cloneTheBucket(bucketRequest *v1alpha1.BucketRequest) error { - glog.V(1).Infof("clone called for bucket %s", bucketRequest.Spec.BucketInstanceName) + glog.V(1).Infof("Clone called for Bucket %s", bucketRequest.Spec.BucketInstanceName) return util.ErrNotImplemented } - -// logOperation format and prints logs -func logOperation(operation, format string, a ...interface{}) string { - return fmt.Sprintf(fmt.Sprintf("%s: %s", operation, format), a...) -} diff --git a/pkg/bucketrequest/bucketrequest_test.go b/pkg/bucketrequest/bucketrequest_test.go index cef7e37c..87057e55 100644 --- a/pkg/bucketrequest/bucketrequest_test.go +++ b/pkg/bucketrequest/bucketrequest_test.go @@ -71,7 +71,7 @@ var bucketRequest2 = types.BucketRequest{ } // Test basic add functionality -func TestAdd(t *testing.T) { +func TestAddBR(t *testing.T) { runCreateBucket(t, "add") } @@ -81,7 +81,7 @@ func TestAddWithMultipleBR(t *testing.T) { } // Test add idempotency -func TestAddIdempotency(t *testing.T) { +func TestAddBRIdempotency(t *testing.T) { runCreateBucketIdempotency(t, "addWithMultipleBR") } @@ -98,12 +98,12 @@ func runCreateBucket(t *testing.T, name string) { bucketclass, err := util.CreateBucketClass(ctx, client, &goldClass) if err != nil { - t.Fatalf("Error occurred when creating bucketclass: %v", err) + t.Fatalf("Error occurred when creating BucketClass: %v", err) } bucketrequest, err := util.CreateBucketRequest(ctx, client, &bucketRequest1) if err != nil { - t.Fatalf("Error occurred when creating bucketrequest: %v", err) + t.Fatalf("Error occurred when creating BucketRequest: %v", err) } listener.Add(ctx, bucketrequest) @@ -112,14 +112,19 @@ func runCreateBucket(t *testing.T, name string) { defer util.DeleteObjects(ctx, client, *bucketrequest, *bucketclass, bucketList.Items) if len(bucketList.Items) != 1 { - t.Fatalf("Expecting a single bucket created but found %v", len(bucketList.Items)) + t.Fatalf("Expecting a single Bucket created but found %v", len(bucketList.Items)) } bucket := bucketList.Items[0] + bucketrequest, err = client.ObjectstorageV1alpha1().BucketRequests(bucketrequest.Namespace).Get(ctx, bucketrequest.Name, metav1.GetOptions{}) + if err != nil { + t.Fatalf("Error occurred when reading BucketRequest: %v", err) + } + if util.ValidateBucket(bucket, *bucketrequest, *bucketclass) { return } else { - t.Fatalf("Failed to compare the resulting bucket with the BucketRequest %v and BucketClass %v", bucketrequest, bucketclass) + t.Fatalf("Failed to compare the resulting Bucket with the BucketRequest %v and BucketClass %v", bucketrequest, bucketclass) } } @@ -136,17 +141,17 @@ func runCreateBucketWithMultipleBR(t *testing.T, name string) { bucketclass, err := util.CreateBucketClass(ctx, client, &goldClass) if err != nil { - t.Fatalf("Error occurred when creating bucketclass: %v", err) + t.Fatalf("Error occurred when creating BucketClass: %v", err) } bucketrequest, err := util.CreateBucketRequest(ctx, client, &bucketRequest1) if err != nil { - t.Fatalf("Error occurred when creating bucketrequest: %v", err) + t.Fatalf("Error occurred when creating BucketRequest: %v", err) } bucketrequest2, err := util.CreateBucketRequest(ctx, client, &bucketRequest2) if err != nil { - t.Fatalf("Error occurred when creating bucketrequest: %v", err) + t.Fatalf("Error occurred when creating BucketRequest: %v", err) } listener.Add(ctx, bucketrequest) @@ -155,16 +160,25 @@ func runCreateBucketWithMultipleBR(t *testing.T, name string) { bucketList := util.GetBuckets(ctx, client, 2) defer util.DeleteObjects(ctx, client, *bucketrequest, *bucketrequest2, *bucketclass, bucketList.Items) if len(bucketList.Items) != 2 { - t.Fatalf("Expecting two buckets created but found %v", len(bucketList.Items)) + t.Fatalf("Expecting two Buckets created but found %v", len(bucketList.Items)) } bucket := bucketList.Items[0] bucket2 := bucketList.Items[1] + bucketrequest, err = client.ObjectstorageV1alpha1().BucketRequests(bucketrequest.Namespace).Get(ctx, bucketrequest.Name, metav1.GetOptions{}) + if err != nil { + t.Fatalf("Error occurred when reading BucketRequest: %v", err) + } + bucketrequest2, err = client.ObjectstorageV1alpha1().BucketRequests(bucketrequest2.Namespace).Get(ctx, bucketrequest2.Name, metav1.GetOptions{}) + if err != nil { + t.Fatalf("Error occurred when reading BucketRequest: %v", err) + } + if (util.ValidateBucket(bucket, *bucketrequest, *bucketclass) && util.ValidateBucket(bucket2, *bucketrequest2, *bucketclass)) || (util.ValidateBucket(bucket2, *bucketrequest, *bucketclass) && util.ValidateBucket(bucket, *bucketrequest2, *bucketclass)) { return } else { - t.Fatalf("Failed to compare the resulting bucket with the BucketRequest %v and BucketClass %v", bucketrequest, bucketclass) + t.Fatalf("Failed to compare the resulting Bucket with the BucketRequest %v and BucketClass %v", bucketrequest, bucketclass) } } @@ -181,12 +195,12 @@ func runCreateBucketIdempotency(t *testing.T, name string) { bucketclass, err := util.CreateBucketClass(ctx, client, &goldClass) if err != nil { - t.Fatalf("Error occurred when creating bucketclass: %v", err) + t.Fatalf("Error occurred when creating BucketClass: %v", err) } bucketrequest, err := util.CreateBucketRequest(ctx, client, &bucketRequest1) if err != nil { - t.Fatalf("Error occurred when creating bucketrequest: %v", err) + t.Fatalf("Error occurred when creating BucketRequest: %v", err) } listener.Add(ctx, bucketrequest) @@ -195,14 +209,19 @@ func runCreateBucketIdempotency(t *testing.T, name string) { defer util.DeleteObjects(ctx, client, *bucketrequest, *bucketclass, bucketList.Items) if len(bucketList.Items) != 1 { - t.Errorf("Expecting a single bucket created but found %v", len(bucketList.Items)) + t.Errorf("Expecting a single Bucket created but found %v", len(bucketList.Items)) } bucket := bucketList.Items[0] + bucketrequest, err = client.ObjectstorageV1alpha1().BucketRequests(bucketrequest.Namespace).Get(ctx, bucketrequest.Name, metav1.GetOptions{}) + if err != nil { + t.Fatalf("Error occurred when reading BucketRequest: %v", err) + } + if util.ValidateBucket(bucket, *bucketrequest, *bucketclass) { return } else { - t.Fatalf("Failed to compare the resulting bucket with the BucketRequest %v and BucketClass %v", bucketrequest, bucketclass) + t.Fatalf("Failed to compare the resulting Bucket with the BucketRequest %v and BucketClass %v", bucketrequest, bucketclass) // call the add directly the second time } @@ -210,6 +229,6 @@ func runCreateBucketIdempotency(t *testing.T, name string) { bucketList = util.GetBuckets(ctx, client, 1) if len(bucketList.Items) != 1 { - t.Fatalf("Expecting a single bucket created but found %v", len(bucketList.Items)) + t.Fatalf("Expecting a single Bucket created but found %v", len(bucketList.Items)) } } diff --git a/pkg/util/util.go b/pkg/util/util.go index ba7e2c30..14a8cede 100644 --- a/pkg/util/util.go +++ b/pkg/util/util.go @@ -2,6 +2,7 @@ package util import ( "context" + "encoding/json" "errors" "fmt" "golang.org/x/time/rate" @@ -10,6 +11,7 @@ import ( "strings" "time" + v1 "k8s.io/api/core/v1" apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" apiextensions "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" @@ -35,10 +37,15 @@ import ( var ( // Error codes that the central controller will return - ErrBucketAlreadyExists = errors.New("A bucket already existing that matches the bucket request") - ErrInvalidBucketClass = errors.New("Cannot find Bucket Class with the name specified in the bucket request") - ErrBCUnavailable = errors.New("BucketClass is not available") - ErrNotImplemented = errors.New("Operation Not Implemented") + ErrBucketAlreadyExists = errors.New("A bucket already existing that matches the bucket request") + ErrInvalidBucketClass = errors.New("Cannot find bucket class with the name specified in the bucket request") + ErrBucketAccessAlreadyExists = errors.New("A bucket access already existing that matches the bucket access request") + ErrInvalidBucketAccessClass = errors.New("Cannot find bucket access class with the name specified in the bucket access request") + ErrInvalidBucketRequest = errors.New("Invalid bucket request specified in the bucket access request") + ErrWaitForBucketProvisioning = errors.New("Bucket instance specified in the bucket request is not available to provision bucket access") + ErrBCUnavailable = errors.New("BucketClass is not available") + ErrNotImplemented = errors.New("Operation Not Implemented") + ErrNilConfigMap = errors.New("ConfigMap cannot be nil") ) func CopySS(m map[string]string) map[string]string { @@ -65,6 +72,25 @@ func GetUUID() string { return string(uuid.NewUUID()) } +func ReadConfigData(kubeClient kubeclientset.Interface, configMapRef *v1.ObjectReference) (string, error) { + if configMapRef == nil { + return "", ErrNilConfigMap + } + configMap, err := kubeClient.CoreV1().ConfigMaps(configMapRef.Namespace).Get(context.TODO(), configMapRef.Name, metav1.GetOptions{}) + if err != nil { + return "", err + } + payload := make(map[string]string) + for name, data := range configMap.Data { + payload[name] = data + } + cData, err := json.Marshal(payload) + if err != nil { + return "", err + } + return string(cData), nil +} + // SetupTest is utility function to create clients and controller // This is used by bucket request and bucket access request unit tests func SetupTest(ctx context.Context) (bucketclientset.Interface, kubeclientset.Interface, *controller.ObjectStorageController) { @@ -138,6 +164,7 @@ func GetBuckets(ctx context.Context, client bucketclientset.Interface, numExpect // This is used by bucket request unit tests func ValidateBucket(bucket types.Bucket, bucketrequest types.BucketRequest, bucketclass types.BucketClass) bool { if strings.HasPrefix(bucket.Name, bucketrequest.Spec.BucketPrefix) && + bucketrequest.Spec.BucketInstanceName == bucket.Name && bucket.Spec.BucketClassName == bucketrequest.Spec.BucketClassName && bucket.Spec.BucketRequest.Name == bucketrequest.Name && bucket.Spec.BucketRequest.Namespace == bucketrequest.Namespace && @@ -175,8 +202,9 @@ func GetBucketAccesses(ctx context.Context, client bucketclientset.Interface, nu // This is used by bucket access request unit tests func ValidateBucketAccess(bucketaccess types.BucketAccess, bucketaccessrequest types.BucketAccessRequest, bucketaccessclass types.BucketAccessClass) bool { if bucketaccess.Spec.BucketInstanceName != "" && - bucketaccess.Spec.BucketAccessRequest == bucketaccessrequest.Name && - bucketaccess.Spec.ServiceAccount == bucketaccessrequest.Spec.ServiceAccountName && + bucketaccessrequest.Spec.BucketAccessName == bucketaccess.Name && + bucketaccess.Spec.BucketAccessRequest.UID == bucketaccessrequest.UID && + bucketaccess.Spec.ServiceAccount.Name == bucketaccessrequest.Spec.ServiceAccountName && bucketaccess.Spec.PolicyActionsConfigMapData != "" && bucketaccess.Spec.Provisioner == bucketaccessclass.Provisioner { return true From 2958448df64ac440427c6377fa4c7a04264d7292 Mon Sep 17 00:00:00 2001 From: Somers B Matthews Date: Mon, 14 Dec 2020 11:06:40 -0600 Subject: [PATCH 129/242] updated README.md and added spec.md fixed spacing typo in README.md added repo/images table to README.md added images to README.md changed name of adapter image in README.md changed urls in README.md attempt to fix newline after table in README.md added newline in README.md added headers to README.md removed html break in README.md removed table from README.md reformated repos and images added hyphen in README.md removed punctuation in README.md --- README.md | 33 +++++++++++++++++++++++++++++---- spec.md | 18 ++++++++++++++++++ 2 files changed, 47 insertions(+), 4 deletions(-) create mode 100644 spec.md diff --git a/README.md b/README.md index b0de48e5..624d4687 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,25 @@ -# DRAFT ONLY : UNTIL KEP IS MERGED - https://github.com/kubernetes/enhancements/pull/1383 +COSI repos and images: + +[Spec](https://github.com/kubernetes-sigs/container-object-storage-interface-spec) \ +[API](https://github.com/kubernetes-sigs/container-object-storage-interface-api) \ +[Controller](https://github.com/kubernetes-sigs/container-object-storage-interface-controller)
+  - [images: cosi-controller](https://quay.io/repository/containerobjectstorage/objectstorage-controller?tab=tags) \ + [Provisioner Sidecar](https://github.com/kubernetes-sigs/container-object-storage-interface-provisioner-sidecar)
+   - images: cosi-provisioner \ + [CSI Adapter](https://github.com/kubernetes-sigs/container-object-storage-interface-csi-adapter)
+   - images: cosi-node-adapter + +COSI deprecated repos: + + + +[Spec](https://github.com/container-object-storage-interface/spec) \ +[API](https://github.com/container-object-storage-interface/api) \ +[Manager (i.e. Controller)](https://github.com/container-object-storage-interface/cosi-controller-manager) \ +[Provisioner Sidecar](https://github.com/container-object-storage-interface/cosi-provisioner-sidecar) \ +[Ephemeral CSI Driver](https://github.com/container-object-storage-interface/ephemeral-csi-driver) + + # Container Object Storage Specification @@ -7,12 +27,17 @@ Kubernetes specific Container Object Storage Interface (COSI) components. ## Community, discussion, contribution, and support +If you are new to a SIG Storage project, check out this [contributing guide](https://github.com/kubernetes/community/blob/master/sig-storage/CONTRIBUTING.md) +and the [community page](https://github.com/kubernetes/community/tree/master/sig-storage). + +If you are new to the SIG Storage COSI project, check out the [spec](https://github.com/kubernetes-sigs/container-object-storage-interface-spec/blob/master/spec.md), [KEP](https://github.com/kubernetes/enhancements/tree/master/keps/sig-storage/1979-object-storage-support), and [project board](https://github.com/orgs/kubernetes-sigs/projects/). + Learn how to engage with the Kubernetes community on the [community page](http://kubernetes.io/community/). You can reach the maintainers of this project at: -- [Slack](https://kubernetes.slack.com/messages/sig-storage) -- [Mailing List](https://groups.google.com/forum/#!forum/kubernetes-sig-storage) +- [Slack](https://kubernetes.slack.com/messages/sig-storage-cosi) +- [Mailing List](https://groups.google.com/g/container-object-storage-interface-wg?pli=1) ### Code of conduct diff --git a/spec.md b/spec.md new file mode 100644 index 00000000..5adef41b --- /dev/null +++ b/spec.md @@ -0,0 +1,18 @@ +#Container Object Storage Interface (COSI) + + + +Authors: + +TODO put authors' names and emails here. + +##Notational Conventions + +The keywords "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" are to be interpreted as described in [RFC 2119](http://tools.ietf.org/html/rfc2119) (Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, March 1997). + +The key words "unspecified", "undefined", and "implementation-defined" are to be interpreted as described in the [rationale for the C99 standard](http://www.open-std.org/jtc1/sc22/wg14/www/C99RationaleV5.10.pdf#page=18). + +An implementation is not compliant if it fails to satisfy one or more of the MUST, REQUIRED, or SHALL requirements for the protocols it implements. +An implementation is compliant if it satisfies all the MUST, REQUIRED, and SHALL requirements for the protocols it implements. + + From 7f1fc71dbf7287163e3f99a602ea3c1d64cf17b7 Mon Sep 17 00:00:00 2001 From: Nicolas Trangez Date: Thu, 17 Dec 2020 17:30:23 +0000 Subject: [PATCH 130/242] Move `kustomization.yaml` into its layer, `deploy/base` --- kustomization.yaml => deploy/base/kustomization.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) rename kustomization.yaml => deploy/base/kustomization.yaml (96%) diff --git a/kustomization.yaml b/deploy/base/kustomization.yaml similarity index 96% rename from kustomization.yaml rename to deploy/base/kustomization.yaml index 0d2ba6d9..ac342fa5 100644 --- a/kustomization.yaml +++ b/deploy/base/kustomization.yaml @@ -25,10 +25,10 @@ resources: - https://raw.githubusercontent.com/kubernetes-sigs/container-object-storage-interface-api/master/crds/objectstorage.k8s.io_bucketrequests.yaml - https://raw.githubusercontent.com/kubernetes-sigs/container-object-storage-interface-api/master/crds/objectstorage.k8s.io_buckets.yaml # Controller -- deploy/base/ns.yaml -- deploy/base/sa.yaml -- deploy/base/rbac.yaml -- deploy/base/deployment.yaml +- ns.yaml +- sa.yaml +- rbac.yaml +- deployment.yaml # Sidecar - https://raw.githubusercontent.com/container-object-storage-interface/cosi-provisioner-sidecar/master/examples/object-storage-sidecar.yaml From 2a599bb8b5a75cc9ae0cfa7c603cfaa937d0579d Mon Sep 17 00:00:00 2001 From: Nicolas Trangez Date: Thu, 17 Dec 2020 17:32:48 +0000 Subject: [PATCH 131/242] deploy: don't override images The images names/tags are properly encoded in the base manifests, no need to override them through a Kustomization. --- deploy/base/kustomization.yaml | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/deploy/base/kustomization.yaml b/deploy/base/kustomization.yaml index ac342fa5..1125dca9 100644 --- a/deploy/base/kustomization.yaml +++ b/deploy/base/kustomization.yaml @@ -2,20 +2,6 @@ apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization -images: -# Controller -- name: objectstorage-controller - newName: quay.io/containerobjectstorage/objectstorage-controller - newTag: latest -# Sidecar -- name: object-storage-sidecar - newName: quay.io/containerobjectstorage/object-storage-sidecar - newTag: latest -# Sample Driver -- name: sample-driver - newName: quay.io/containerobjectstorage/sample-driver - newTag: latest - resources: # CRDs - https://raw.githubusercontent.com/kubernetes-sigs/container-object-storage-interface-api/master/crds/objectstorage.k8s.io_bucketaccessclasses.yaml From 912611a0f7c50e072e83b3fe8c6806b86cf3c95c Mon Sep 17 00:00:00 2001 From: Nicolas Trangez Date: Thu, 17 Dec 2020 17:37:09 +0000 Subject: [PATCH 132/242] deploy: don't use `IfNotPresent` `imagePullPolicy` for `latest` images --- deploy/base/kustomization.yaml | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/deploy/base/kustomization.yaml b/deploy/base/kustomization.yaml index 1125dca9..296f7eca 100644 --- a/deploy/base/kustomization.yaml +++ b/deploy/base/kustomization.yaml @@ -28,25 +28,11 @@ patches: value: controller-gen.kubebuilder.io/version: (devel) api-approved.kubernetes.io: https://github.com/kubernetes-sigs/container-object-storage-interface-api/pull/2 -# Controller -- target: - kind: Deployment - name: objectstorage-controller - patch: |- - - op: replace - path: /spec/template/spec/containers/0/imagePullPolicy - value: IfNotPresent # Sidecar - target: kind: Deployment name: object-storage-provisioner patch: |- - - op: replace - path: /spec/template/spec/containers/0/imagePullPolicy - value: IfNotPresent - - op: replace - path: /spec/template/spec/containers/1/imagePullPolicy - value: IfNotPresent - op: replace path: /metadata value: From b5e4dc3c0e9d63b6a3e1da467d2a06974caf8781 Mon Sep 17 00:00:00 2001 From: Nicolas Trangez Date: Thu, 17 Dec 2020 17:50:19 +0000 Subject: [PATCH 133/242] deploy: create `fullstack` Kustomize layer This deploys the controller (base layer) as well as the provisioner. End result remains the same. --- deploy/base/kustomization.yaml | 25 --------------------- deploy/fullstack/kustomization.yaml | 35 +++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 25 deletions(-) create mode 100644 deploy/fullstack/kustomization.yaml diff --git a/deploy/base/kustomization.yaml b/deploy/base/kustomization.yaml index 296f7eca..37a1da29 100644 --- a/deploy/base/kustomization.yaml +++ b/deploy/base/kustomization.yaml @@ -15,8 +15,6 @@ resources: - sa.yaml - rbac.yaml - deployment.yaml -# Sidecar -- https://raw.githubusercontent.com/container-object-storage-interface/cosi-provisioner-sidecar/master/examples/object-storage-sidecar.yaml patches: # CRDs @@ -28,26 +26,3 @@ patches: value: controller-gen.kubebuilder.io/version: (devel) api-approved.kubernetes.io: https://github.com/kubernetes-sigs/container-object-storage-interface-api/pull/2 -# Sidecar -- target: - kind: Deployment - name: object-storage-provisioner - patch: |- - - op: replace - path: /metadata - value: - name: object-storage-provisioner - labels: - app: object-storage-provisioner - namespace: objectstorage-provisioner-ns -- target: - kind: Secret - name: object-storage-provisioner - patch: |- - - op: replace - path: /metadata - value: - name: object-storage-provisioner - labels: - app: object-storage-provisioner - namespace: objectstorage-provisioner-ns diff --git a/deploy/fullstack/kustomization.yaml b/deploy/fullstack/kustomization.yaml new file mode 100644 index 00000000..8804e9db --- /dev/null +++ b/deploy/fullstack/kustomization.yaml @@ -0,0 +1,35 @@ +--- +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +bases: +- ../base/ + +resources: +# Sidecar +- https://raw.githubusercontent.com/container-object-storage-interface/cosi-provisioner-sidecar/master/examples/object-storage-sidecar.yaml + +patches: +# Sidecar +- target: + kind: Deployment + name: object-storage-provisioner + patch: |- + - op: replace + path: /metadata + value: + name: object-storage-provisioner + labels: + app: object-storage-provisioner + namespace: objectstorage-provisioner-ns +- target: + kind: Secret + name: object-storage-provisioner + patch: |- + - op: replace + path: /metadata + value: + name: object-storage-provisioner + labels: + app: object-storage-provisioner + namespace: objectstorage-provisioner-ns From e8242ea5f0c951470213cf5ef77ee7f565b14571 Mon Sep 17 00:00:00 2001 From: Nicolas Trangez Date: Thu, 17 Dec 2020 17:58:06 +0000 Subject: [PATCH 134/242] deploy: add some common labels to all objects Closes: https://github.com/kubernetes-sigs/container-object-storage-interface-controller/issues/23 See: https://kubernetes.io/docs/concepts/overview/working-with-objects/common-labels/#labels --- deploy/base/deployment.yaml | 14 ++++++++++++-- deploy/base/rbac.yaml | 20 ++++++++++++++++++++ deploy/base/sa.yaml | 5 +++++ 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/deploy/base/deployment.yaml b/deploy/base/deployment.yaml index c33295be..aac96e50 100644 --- a/deploy/base/deployment.yaml +++ b/deploy/base/deployment.yaml @@ -4,6 +4,11 @@ apiVersion: apps/v1 metadata: name: objectstorage-controller namespace: objectstorage-system + labels: + app.kubernetes.io/part-of: container-object-storage-interface + app.kubernetes.io/component: controller + app.kubernetes.io/version: main + app.kubernetes.io/name: container-object-storage-interface-controller spec: replicas: 1 strategy: @@ -12,11 +17,16 @@ spec: maxSurge: 1 selector: matchLabels: - app: objectstorage-controller + app.kubernetes.io/part-of: container-object-storage-interface + app.kubernetes.io/component: controller + app.kubernetes.io/name: container-object-storage-interface-controller template: metadata: labels: - app: objectstorage-controller + app.kubernetes.io/part-of: container-object-storage-interface + app.kubernetes.io/component: controller + app.kubernetes.io/version: main + app.kubernetes.io/name: container-object-storage-interface-controller spec: serviceAccountName: objectstorage-controller-sa containers: diff --git a/deploy/base/rbac.yaml b/deploy/base/rbac.yaml index 1051b694..bed8acac 100644 --- a/deploy/base/rbac.yaml +++ b/deploy/base/rbac.yaml @@ -3,6 +3,11 @@ kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: objectstorage-controller-role + labels: + app.kubernetes.io/part-of: container-object-storage-interface + app.kubernetes.io/component: controller + app.kubernetes.io/version: main + app.kubernetes.io/name: container-object-storage-interface-controller rules: - apiGroups: ["objectstorage.k8s.io"] resources: ["bucketrequests", "bucketaccessrequests"] @@ -21,6 +26,11 @@ kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: system:objectstorage-controller + labels: + app.kubernetes.io/part-of: container-object-storage-interface + app.kubernetes.io/component: controller + app.kubernetes.io/version: main + app.kubernetes.io/name: container-object-storage-interface-controller subjects: - kind: ServiceAccount name: objectstorage-controller-sa @@ -35,6 +45,11 @@ apiVersion: rbac.authorization.k8s.io/v1 metadata: name: objectstorage-controller namespace: objectstorage-system + labels: + app.kubernetes.io/part-of: container-object-storage-interface + app.kubernetes.io/component: controller + app.kubernetes.io/version: main + app.kubernetes.io/name: container-object-storage-interface-controller rules: - apiGroups: ["coordination.k8s.io"] resources: ["leases"] @@ -45,6 +60,11 @@ apiVersion: rbac.authorization.k8s.io/v1 metadata: name: objectstorage-controller namespace: objectstorage-system + labels: + app.kubernetes.io/part-of: container-object-storage-interface + app.kubernetes.io/component: controller + app.kubernetes.io/version: main + app.kubernetes.io/name: container-object-storage-interface-controller subjects: - kind: ServiceAccount name: objectstorage-controller-sa diff --git a/deploy/base/sa.yaml b/deploy/base/sa.yaml index 802dbb8c..8146d502 100644 --- a/deploy/base/sa.yaml +++ b/deploy/base/sa.yaml @@ -4,3 +4,8 @@ kind: ServiceAccount metadata: name: objectstorage-controller-sa namespace: objectstorage-system + labels: + app.kubernetes.io/part-of: container-object-storage-interface + app.kubernetes.io/component: controller + app.kubernetes.io/version: main + app.kubernetes.io/name: container-object-storage-interface-controller From 6d19b4912d7f9d0be35f241c706d8ec72c1369c9 Mon Sep 17 00:00:00 2001 From: Nicolas Trangez Date: Thu, 17 Dec 2020 18:30:29 +0000 Subject: [PATCH 135/242] deploy: restore namespace handling in `fullstack` overlay This patch removes hard-coded namespaces from the `base` layer, then creates the `objectstorage-system` and `objectstorage-provisioner-ns` Namespaces in the `fullstack` overlay, and uses them accordingly. Closes: https://github.com/kubernetes-sigs/container-object-storage-interface-controller/issues/22 --- deploy/base/deployment.yaml | 1 - deploy/base/kustomization.yaml | 1 - deploy/base/rbac.yaml | 4 --- deploy/base/sa.yaml | 1 - .../fullstack/controller/kustomization.yaml | 12 +++++++ deploy/{base => fullstack/controller}/ns.yaml | 0 deploy/fullstack/kustomization.yaml | 32 ++----------------- .../fullstack/provisioner/kustomization.yaml | 11 +++++++ deploy/fullstack/provisioner/ns.yaml | 5 +++ 9 files changed, 30 insertions(+), 37 deletions(-) create mode 100644 deploy/fullstack/controller/kustomization.yaml rename deploy/{base => fullstack/controller}/ns.yaml (100%) create mode 100644 deploy/fullstack/provisioner/kustomization.yaml create mode 100644 deploy/fullstack/provisioner/ns.yaml diff --git a/deploy/base/deployment.yaml b/deploy/base/deployment.yaml index aac96e50..30c09225 100644 --- a/deploy/base/deployment.yaml +++ b/deploy/base/deployment.yaml @@ -3,7 +3,6 @@ kind: Deployment apiVersion: apps/v1 metadata: name: objectstorage-controller - namespace: objectstorage-system labels: app.kubernetes.io/part-of: container-object-storage-interface app.kubernetes.io/component: controller diff --git a/deploy/base/kustomization.yaml b/deploy/base/kustomization.yaml index 37a1da29..1d7e8e55 100644 --- a/deploy/base/kustomization.yaml +++ b/deploy/base/kustomization.yaml @@ -11,7 +11,6 @@ resources: - https://raw.githubusercontent.com/kubernetes-sigs/container-object-storage-interface-api/master/crds/objectstorage.k8s.io_bucketrequests.yaml - https://raw.githubusercontent.com/kubernetes-sigs/container-object-storage-interface-api/master/crds/objectstorage.k8s.io_buckets.yaml # Controller -- ns.yaml - sa.yaml - rbac.yaml - deployment.yaml diff --git a/deploy/base/rbac.yaml b/deploy/base/rbac.yaml index bed8acac..fc60d1bd 100644 --- a/deploy/base/rbac.yaml +++ b/deploy/base/rbac.yaml @@ -34,7 +34,6 @@ metadata: subjects: - kind: ServiceAccount name: objectstorage-controller-sa - namespace: objectstorage-system roleRef: kind: ClusterRole name: objectstorage-controller-role @@ -44,7 +43,6 @@ kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: name: objectstorage-controller - namespace: objectstorage-system labels: app.kubernetes.io/part-of: container-object-storage-interface app.kubernetes.io/component: controller @@ -59,7 +57,6 @@ kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: objectstorage-controller - namespace: objectstorage-system labels: app.kubernetes.io/part-of: container-object-storage-interface app.kubernetes.io/component: controller @@ -68,7 +65,6 @@ metadata: subjects: - kind: ServiceAccount name: objectstorage-controller-sa - namespace: objectstorage-system roleRef: kind: Role name: objectstorage-controller diff --git a/deploy/base/sa.yaml b/deploy/base/sa.yaml index 8146d502..f6cf10db 100644 --- a/deploy/base/sa.yaml +++ b/deploy/base/sa.yaml @@ -3,7 +3,6 @@ apiVersion: v1 kind: ServiceAccount metadata: name: objectstorage-controller-sa - namespace: objectstorage-system labels: app.kubernetes.io/part-of: container-object-storage-interface app.kubernetes.io/component: controller diff --git a/deploy/fullstack/controller/kustomization.yaml b/deploy/fullstack/controller/kustomization.yaml new file mode 100644 index 00000000..9a103319 --- /dev/null +++ b/deploy/fullstack/controller/kustomization.yaml @@ -0,0 +1,12 @@ +--- +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +namespace: objectstorage-system + +bases: +- ../../base/ + +resources: +# Namespace +- ns.yaml diff --git a/deploy/base/ns.yaml b/deploy/fullstack/controller/ns.yaml similarity index 100% rename from deploy/base/ns.yaml rename to deploy/fullstack/controller/ns.yaml diff --git a/deploy/fullstack/kustomization.yaml b/deploy/fullstack/kustomization.yaml index 8804e9db..787fc8da 100644 --- a/deploy/fullstack/kustomization.yaml +++ b/deploy/fullstack/kustomization.yaml @@ -3,33 +3,5 @@ apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization bases: -- ../base/ - -resources: -# Sidecar -- https://raw.githubusercontent.com/container-object-storage-interface/cosi-provisioner-sidecar/master/examples/object-storage-sidecar.yaml - -patches: -# Sidecar -- target: - kind: Deployment - name: object-storage-provisioner - patch: |- - - op: replace - path: /metadata - value: - name: object-storage-provisioner - labels: - app: object-storage-provisioner - namespace: objectstorage-provisioner-ns -- target: - kind: Secret - name: object-storage-provisioner - patch: |- - - op: replace - path: /metadata - value: - name: object-storage-provisioner - labels: - app: object-storage-provisioner - namespace: objectstorage-provisioner-ns +- ./controller +- ./provisioner diff --git a/deploy/fullstack/provisioner/kustomization.yaml b/deploy/fullstack/provisioner/kustomization.yaml new file mode 100644 index 00000000..81f1f2eb --- /dev/null +++ b/deploy/fullstack/provisioner/kustomization.yaml @@ -0,0 +1,11 @@ +--- +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +namespace: objectstorage-provisioner-ns + +resources: +# Namespace +- ns.yaml +# Sidecar +- https://raw.githubusercontent.com/container-object-storage-interface/cosi-provisioner-sidecar/master/examples/object-storage-sidecar.yaml diff --git a/deploy/fullstack/provisioner/ns.yaml b/deploy/fullstack/provisioner/ns.yaml new file mode 100644 index 00000000..04eb2ff2 --- /dev/null +++ b/deploy/fullstack/provisioner/ns.yaml @@ -0,0 +1,5 @@ +--- +apiVersion: v1 +kind: Namespace +metadata: + name: objectstorage-provisioner-ns From 7c519fe167fc38a6750298a25602a955d9235b70 Mon Sep 17 00:00:00 2001 From: Nicolas Trangez Date: Thu, 17 Dec 2020 23:42:24 +0000 Subject: [PATCH 136/242] deploy: use `crds` Kustomization from the API repo Instead of listing all CRD manifests and patching in the required `api-approved` label in a Kustomization within this repository, use the new Kustomization layer from the API repository as a base. This simplifies the deployment machinery in this project. See: https://github.com/kubernetes-sigs/container-object-storage-interface-api/pull/13 --- deploy/base/kustomization.yaml | 22 ++++------------------ 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/deploy/base/kustomization.yaml b/deploy/base/kustomization.yaml index 1d7e8e55..100cd953 100644 --- a/deploy/base/kustomization.yaml +++ b/deploy/base/kustomization.yaml @@ -2,26 +2,12 @@ apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization -resources: +bases: # CRDs -- https://raw.githubusercontent.com/kubernetes-sigs/container-object-storage-interface-api/master/crds/objectstorage.k8s.io_bucketaccessclasses.yaml -- https://raw.githubusercontent.com/kubernetes-sigs/container-object-storage-interface-api/master/crds/objectstorage.k8s.io_bucketaccesses.yaml -- https://raw.githubusercontent.com/kubernetes-sigs/container-object-storage-interface-api/master/crds/objectstorage.k8s.io_bucketaccessrequests.yaml -- https://raw.githubusercontent.com/kubernetes-sigs/container-object-storage-interface-api/master/crds/objectstorage.k8s.io_bucketclasses.yaml -- https://raw.githubusercontent.com/kubernetes-sigs/container-object-storage-interface-api/master/crds/objectstorage.k8s.io_bucketrequests.yaml -- https://raw.githubusercontent.com/kubernetes-sigs/container-object-storage-interface-api/master/crds/objectstorage.k8s.io_buckets.yaml +- github.com/kubernetes-sigs/container-object-storage-interface-api/crds + +resources: # Controller - sa.yaml - rbac.yaml - deployment.yaml - -patches: -# CRDs -- target: - kind: CustomResourceDefinition - patch: |- - - op: add - path: /metadata/annotations - value: - controller-gen.kubebuilder.io/version: (devel) - api-approved.kubernetes.io: https://github.com/kubernetes-sigs/container-object-storage-interface-api/pull/2 From ee426364bd754a79f03be14333d38cd87305daec Mon Sep 17 00:00:00 2001 From: Srini Brahmaroutu Date: Tue, 5 Jan 2021 11:12:52 -0800 Subject: [PATCH 137/242] Fix the build files so that prow job can run successfully --- Dockerfile | 4 ++-- deploy/base/rbac.yaml | 8 +++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index c080f91a..3d388720 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,5 +2,5 @@ FROM gcr.io/distroless/static:latest LABEL maintainers="Kubernetes Authors" LABEL description="COSI Controller" -COPY ./bin/cosi-controller-manager cosi-controller-manager -ENTRYPOINT ["/cosi-controller-manager"] +COPY ./bin/controller-manager controller-manager +ENTRYPOINT ["/controller-manager"] diff --git a/deploy/base/rbac.yaml b/deploy/base/rbac.yaml index fc60d1bd..7ebebfe4 100644 --- a/deploy/base/rbac.yaml +++ b/deploy/base/rbac.yaml @@ -3,6 +3,7 @@ kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: objectstorage-controller-role + namespace: default labels: app.kubernetes.io/part-of: container-object-storage-interface app.kubernetes.io/component: controller @@ -25,7 +26,8 @@ rules: kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: - name: system:objectstorage-controller + name: objectstorage-controller + namespace: default labels: app.kubernetes.io/part-of: container-object-storage-interface app.kubernetes.io/component: controller @@ -34,6 +36,7 @@ metadata: subjects: - kind: ServiceAccount name: objectstorage-controller-sa + namespace: default roleRef: kind: ClusterRole name: objectstorage-controller-role @@ -43,6 +46,7 @@ kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: name: objectstorage-controller + namespace: default labels: app.kubernetes.io/part-of: container-object-storage-interface app.kubernetes.io/component: controller @@ -57,6 +61,7 @@ kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: objectstorage-controller + namespace: default labels: app.kubernetes.io/part-of: container-object-storage-interface app.kubernetes.io/component: controller @@ -65,6 +70,7 @@ metadata: subjects: - kind: ServiceAccount name: objectstorage-controller-sa + namespace: default roleRef: kind: Role name: objectstorage-controller From e4385e40d00437f1399c72edf7f522f14c071df9 Mon Sep 17 00:00:00 2001 From: Srini Brahmaroutu Date: Sat, 21 Nov 2020 20:59:56 -0800 Subject: [PATCH 138/242] Adding cosi specific changes to prow.sh --- release-tools/prow.sh | 663 ++++++++++++------------------------------ 1 file changed, 185 insertions(+), 478 deletions(-) diff --git a/release-tools/prow.sh b/release-tools/prow.sh index ff49f813..bc14bf87 100755 --- a/release-tools/prow.sh +++ b/release-tools/prow.sh @@ -16,16 +16,10 @@ # This script runs inside a Prow job. It can run unit tests ("make test") -# and E2E testing. This E2E testing covers different scenarios (see -# https://github.com/kubernetes/enhancements/pull/807): -# - running the stable hostpath example against a Kubernetes release -# - running the canary hostpath example against a Kubernetes release -# - building the component in the current repo and running the -# stable hostpath example with that one component replaced against -# a Kubernetes release -# +# and E2E testing. This E2E testing covers different scenarios. +# # The intended usage of this script is that individual repos import -# csi-release-tools, then link their top-level prow.sh to this or +# release-tools, then link their top-level prow.sh to this or # include it in that file. When including it, several of the variables # can be overridden in the top-level prow.sh to customize the script # for the repo. @@ -52,7 +46,7 @@ configvar () { eval echo "\$3:" "$1=\${$1}" } -# Takes the minor version of $CSI_PROW_KUBERNETES_VERSION and overrides it to +# Takes the minor version of $COSI_PROW_KUBERNETES_VERSION and overrides it to # $1 if they are equal minor versions. Ignores versions that begin with # "release-". override_k8s_version () { @@ -61,14 +55,14 @@ override_k8s_version () { # Ignore: See if you can use ${variable//search/replace} instead. # shellcheck disable=SC2001 - current_minor_version="$(echo "${CSI_PROW_KUBERNETES_VERSION}" | sed -e 's/\([0-9]*\)\.\([0-9]*\).*/\1\.\2/')" + current_minor_version="$(echo "${COSI_PROW_KUBERNETES_VERSION}" | sed -e 's/\([0-9]*\)\.\([0-9]*\).*/\1\.\2/')" # Ignore: See if you can use ${variable//search/replace} instead. # shellcheck disable=SC2001 override_minor_version="$(echo "${1}" | sed -e 's/\([0-9]*\)\.\([0-9]*\).*/\1\.\2/')" if [ "${current_minor_version}" == "${override_minor_version}" ]; then - CSI_PROW_KUBERNETES_VERSION="$1" - echo "Overriding CSI_PROW_KUBERNETES_VERSION with $1: $CSI_PROW_KUBERNETES_VERSION" + COSI_PROW_KUBERNETES_VERSION="$1" + echo "Overriding COSI_PROW_KUBERNETES_VERSION with $1: $COSI_PROW_KUBERNETES_VERSION" fi } @@ -98,28 +92,29 @@ configvar GOFLAGS_VENDOR "$( [ -d vendor ] && echo '-mod=vendor' )" "Go flags fo go_from_travis_yml () { grep "^ *- go:" "${RELEASE_TOOLS_ROOT}/travis.yml" | sed -e 's/.*go: *//' } -configvar CSI_PROW_GO_VERSION_BUILD "$(go_from_travis_yml)" "Go version for building the component" # depends on component's source code -configvar CSI_PROW_GO_VERSION_E2E "" "override Go version for building the Kubernetes E2E test suite" # normally doesn't need to be set, see install_e2e -configvar CSI_PROW_GO_VERSION_SANITY "${CSI_PROW_GO_VERSION_BUILD}" "Go version for building the csi-sanity test suite" # depends on CSI_PROW_SANITY settings below -configvar CSI_PROW_GO_VERSION_KIND "${CSI_PROW_GO_VERSION_BUILD}" "Go version for building 'kind'" # depends on CSI_PROW_KIND_VERSION below -configvar CSI_PROW_GO_VERSION_GINKGO "${CSI_PROW_GO_VERSION_BUILD}" "Go version for building ginkgo" # depends on CSI_PROW_GINKGO_VERSION below + +configvar COSI_K8S_GO_VERSION "1.15.5" "This will override the k8s version, sometime k8s version is incorrect to fetch from go downloads" +configvar COSI_PROW_GO_VERSION_BUILD "$(go_from_travis_yml)" "Go version for building the component" # depends on component's source code +configvar COSI_PROW_GO_VERSION_E2E "${COSI_K8S_GO_VERSION}" "override Go version for building the Kubernetes E2E test suite" # normally doesn't need to be set, see install_e2e +configvar COSI_PROW_GO_VERSION_KIND "${COSI_PROW_GO_VERSION_BUILD}" "Go version for building 'kind'" # depends on COSI_PROW_KIND_VERSION below +configvar COSI_PROW_GO_VERSION_GINKGO "${COSI_PROW_GO_VERSION_BUILD}" "Go version for building ginkgo" # depends on COSI_PROW_GINKGO_VERSION below # kind version to use. If the pre-installed version is different, # the desired version is downloaded from https://github.com/kubernetes-sigs/kind/releases/download/ # (if available), otherwise it is built from source. -configvar CSI_PROW_KIND_VERSION "v0.6.0" "kind" +configvar COSI_PROW_KIND_VERSION "v0.6.0" "kind" # ginkgo test runner version to use. If the pre-installed version is # different, the desired version is built from source. -configvar CSI_PROW_GINKGO_VERSION v1.7.0 "Ginkgo" +configvar COSI_PROW_GINKGO_VERSION v1.7.0 "Ginkgo" # Ginkgo runs the E2E test in parallel. The default is based on the number # of CPUs, but typically this can be set to something higher in the job. -configvar CSI_PROW_GINKO_PARALLEL "-p" "Ginko parallelism parameter(s)" +configvar COSI_PROW_GINKO_PARALLEL "-p" "Ginko parallelism parameter(s)" # Enables building the code in the repository. On by default, can be # disabled in jobs which only use pre-built components. -configvar CSI_PROW_BUILD_JOB true "building code in repo enabled" +configvar COSI_PROW_BUILD_JOB true "building code in repo enabled" # Kubernetes version to test against. This must be a version number # (like 1.13.3) for which there is a pre-built kind image (see @@ -132,82 +127,30 @@ configvar CSI_PROW_BUILD_JOB true "building code in repo enabled" # use the same settings as for "latest" Kubernetes. This works # as long as there are no breaking changes in Kubernetes, like # deprecating or changing the implementation of an alpha feature. -configvar CSI_PROW_KUBERNETES_VERSION 1.17.0 "Kubernetes" +configvar COSI_PROW_KUBERNETES_VERSION 1.17.0 "Kubernetes" # This is a hack to workaround the issue that each version # of kind currently only supports specific patch versions of -# Kubernetes. We need to override CSI_PROW_KUBERNETES_VERSION +# Kubernetes. We need to override COSI_PROW_KUBERNETES_VERSION # passed in by our CI/pull jobs to the versions that # kind v0.5.0 supports. # # If the version is prefixed with "release-", then nothing # is overridden. -override_k8s_version "1.15.3" +override_k8s_version "1.19.3" -# CSI_PROW_KUBERNETES_VERSION reduced to first two version numbers and +# COSI_PROW_KUBERNETES_VERSION reduced to first two version numbers and # with underscore (1_13 instead of 1.13.3) and in uppercase (LATEST # instead of latest). # # This is used to derive the right defaults for the variables below # when a Prow job just defines the Kubernetes version. -csi_prow_kubernetes_version_suffix="$(echo "${CSI_PROW_KUBERNETES_VERSION}" | tr . _ | tr '[:lower:]' '[:upper:]' | sed -e 's/^RELEASE-//' -e 's/\([0-9]*\)_\([0-9]*\).*/\1_\2/')" +cosi_prow_kubernetes_version_suffix="$(echo "${COSI_PROW_KUBERNETES_VERSION}" | tr . _ | tr '[:lower:]' '[:upper:]' | sed -e 's/^RELEASE-//' -e 's/\([0-9]*\)_\([0-9]*\).*/\1_\2/')" # Work directory. It has to allow running executables, therefore /tmp # is avoided. Cleaning up after the script is intentionally left to # the caller. -configvar CSI_PROW_WORK "$(mkdir -p "$GOPATH/pkg" && mktemp -d "$GOPATH/pkg/csiprow.XXXXXXXXXX")" "work directory" - -# By default, this script tests sidecars with the CSI hostpath driver, -# using the install_csi_driver function. That function depends on -# a deployment script that it searches for in several places: -# -# - The "deploy" directory in the current repository: this is useful -# for the situation that a component becomes incompatible with the -# shared deployment, because then it can (temporarily!) provide its -# own example until the shared one can be updated; it's also how -# csi-driver-host-path itself provides the example. -# -# - CSI_PROW_DRIVER_VERSION of the CSI_PROW_DRIVER_REPO is checked -# out: this allows other repos to reference a version of the example -# that is known to be compatible. -# -# - The /deploy directory can have multiple sub-directories, -# each with different deployments (stable set of images for Kubernetes 1.13, -# stable set of images for Kubernetes 1.14, canary for latest Kubernetes, etc.). -# This is necessary because there may be incompatible changes in the -# "API" of a component (for example, its command line options or RBAC rules) -# or in its support for different Kubernetes versions (CSIDriverInfo as -# CRD in Kubernetes 1.13 vs builtin API in Kubernetes 1.14). -# -# When testing an update for a component in a PR job, the -# CSI_PROW_DEPLOYMENT variable can be set in the -# .prow.sh of each component when there are breaking changes -# that require using a non-default deployment. The default -# is a deployment named "kubernetes-x.yy" (if available), -# otherwise "kubernetes-latest". -# "none" disables the deployment of the hostpath driver. -# -# When no deploy script is found (nothing in `deploy` directory, -# CSI_PROW_DRIVER_REPO=none), nothing gets deployed. -# -# If the deployment script is called with CSI_PROW_TEST_DRIVER= as -# environment variable, then it must write a suitable test driver configuration -# into that file in addition to installing the driver. -configvar CSI_PROW_DRIVER_VERSION "v1.3.0" "CSI driver version" -configvar CSI_PROW_DRIVER_REPO https://github.com/kubernetes-csi/csi-driver-host-path "CSI driver repo" -configvar CSI_PROW_DEPLOYMENT "" "deployment" - -# The install_csi_driver function may work also for other CSI drivers, -# as long as they follow the conventions of the CSI hostpath driver. -# If they don't, then a different install function can be provided in -# a .prow.sh file and this config variable can be overridden. -configvar CSI_PROW_DRIVER_INSTALL "install_csi_driver" "name of the shell function which installs the CSI driver" - -# If CSI_PROW_DRIVER_CANARY is set (typically to "canary", but also -# version tag. Usually empty. CSI_PROW_HOSTPATH_CANARY is -# accepted as alternative name because some test-infra jobs -# still use that name. -configvar CSI_PROW_DRIVER_CANARY "${CSI_PROW_HOSTPATH_CANARY}" "driver image override for canary images" +configvar COSI_PROW_WORK "$(mkdir -p "$GOPATH/pkg" && mktemp -d "$GOPATH/pkg/cosiprow.XXXXXXXXXX")" "work directory" # The E2E testing can come from an arbitrary repo. The expectation is that # the repo supports "go test ./test/e2e -args --storage.testdriver" (https://github.com/kubernetes/kubernetes/pull/72836) @@ -215,36 +158,29 @@ configvar CSI_PROW_DRIVER_CANARY "${CSI_PROW_HOSTPATH_CANARY}" "driver image ove # then `make WHAT=test/e2e/e2e.test` is called first to ensure that # all generated files are present. # -# CSI_PROW_E2E_REPO=none disables E2E testing. +# COSI_PROW_E2E_REPO=none disables E2E testing. # TOOO: remove versioned variables and make e2e version match k8s version -configvar CSI_PROW_E2E_VERSION_1_15 v1.15.0 "E2E version for Kubernetes 1.15.x" -configvar CSI_PROW_E2E_VERSION_1_16 v1.16.0 "E2E version for Kubernetes 1.16.x" -configvar CSI_PROW_E2E_VERSION_1_17 v1.17.0 "E2E version for Kubernetes 1.17.x" -# TODO: add new CSI_PROW_E2E_VERSION entry for future Kubernetes releases -configvar CSI_PROW_E2E_VERSION_LATEST master "E2E version for Kubernetes master" # testing against Kubernetes master is already tracking a moving target, so we might as well use a moving E2E version -configvar CSI_PROW_E2E_REPO_LATEST https://github.com/kubernetes/kubernetes "E2E repo for Kubernetes >= 1.13.x" # currently the same for all versions -configvar CSI_PROW_E2E_IMPORT_PATH_LATEST k8s.io/kubernetes "E2E package for Kubernetes >= 1.13.x" # currently the same for all versions -configvar CSI_PROW_E2E_VERSION "$(get_versioned_variable CSI_PROW_E2E_VERSION "${csi_prow_kubernetes_version_suffix}")" "E2E version" -configvar CSI_PROW_E2E_REPO "$(get_versioned_variable CSI_PROW_E2E_REPO "${csi_prow_kubernetes_version_suffix}")" "E2E repo" -configvar CSI_PROW_E2E_IMPORT_PATH "$(get_versioned_variable CSI_PROW_E2E_IMPORT_PATH "${csi_prow_kubernetes_version_suffix}")" "E2E package" - -# csi-sanity testing from the csi-test repo can be run against the installed -# CSI driver. For this to work, deploying the driver must expose the Unix domain -# csi.sock as a TCP service for use by the csi-sanity command, which runs outside -# of the cluster. The alternative would have been to (cross-)compile csi-sanity -# and install it inside the cluster, which is not necessarily easier. -configvar CSI_PROW_SANITY_REPO https://github.com/kubernetes-csi/csi-test "csi-test repo" -configvar CSI_PROW_SANITY_VERSION 5421d9f3c37be3b95b241b44a094a3db11bee789 "csi-test version" # latest master -configvar CSI_PROW_SANITY_IMPORT_PATH github.com/kubernetes-csi/csi-test "csi-test package" -configvar CSI_PROW_SANITY_SERVICE "hostpath-service" "Kubernetes TCP service name that exposes csi.sock" -configvar CSI_PROW_SANITY_POD "csi-hostpathplugin-0" "Kubernetes pod with CSI driver" -configvar CSI_PROW_SANITY_CONTAINER "hostpath" "Kubernetes container with CSI driver" +configvar COSI_PROW_E2E_VERSION_LATEST master "E2E version for Kubernetes master" # testing against Kubernetes master is already tracking a moving target, so we might as well use a moving E2E version +configvar COSI_PROW_E2E_REPO_LATEST https://github.com/kubernetes/kubernetes "E2E repo for Kubernetes >= 1.13.x" # currently the same for all versions +configvar COSI_PROW_E2E_IMPORT_PATH_LATEST k8s.io/kubernetes "E2E package for Kubernetes >= 1.13.x" # currently the same for all versions +configvar COSI_PROW_E2E_VERSION "$(get_versioned_variable COSI_PROW_E2E_VERSION "${cosi_prow_kubernetes_version_suffix}")" "E2E version" +configvar COSI_PROW_E2E_REPO "$(get_versioned_variable COSI_PROW_E2E_REPO "${cosi_prow_kubernetes_version_suffix}")" "E2E repo" +configvar COSI_PROW_E2E_IMPORT_PATH "$(get_versioned_variable COSI_PROW_E2E_IMPORT_PATH "${cosi_prow_kubernetes_version_suffix}")" "E2E package" # The version of dep to use for 'make test-vendor'. Ignored if the project doesn't # use dep. Only binary releases of dep are supported (https://github.com/golang/dep/releases). -configvar CSI_PROW_DEP_VERSION v0.5.1 "golang dep version to be used for vendor checking" +configvar COSI_PROW_DEP_VERSION v0.5.1 "golang dep version to be used for vendor checking" -# Each job can run one or more of the following tests, identified by +// Version of the Spec used +configvar COSI_SPEC_VERSION master "version of the cosi spec will influence the crd object loaded for testing" + +// Version of the API used +configvar COSI_API_VERSION master "version of the cosi api will influence the api objects loaded for testing" + +// Version of the Controller used +configvar COSI_CONTROLLER_VERSION master "version of the cosi controller used for testing" + +# TODO Each job can run one or more of the following tests, identified by # a single word: # - unit testing # - parallel excluding alpha features @@ -255,16 +191,12 @@ configvar CSI_PROW_DEP_VERSION v0.5.1 "golang dep version to be used for vendor # # Unknown or unsupported entries are ignored. # -# Sanity testing with csi-sanity only covers the CSI driver itself and -# thus only makes sense in repos which provide their own CSI -# driver. Repos can enable sanity testing by setting -# CSI_PROW_TESTS_SANITY=sanity. -configvar CSI_PROW_TESTS "unit parallel serial parallel-alpha serial-alpha sanity" "tests to run" +configvar COSI_PROW_TESTS "unit parallel serial parallel-alpha serial-alpha sanity" "tests to run" tests_enabled () { local t1 t2 # We want word-splitting here, so ignore: Quote to prevent word splitting, or split robustly with mapfile or read -a. # shellcheck disable=SC2206 - local tests=(${CSI_PROW_TESTS}) + local tests=(${COSI_PROW_TESTS}) for t1 in "$@"; do for t2 in "${tests[@]}"; do if [ "$t1" = "$t2" ]; then @@ -274,9 +206,7 @@ tests_enabled () { done return 1 } -sanity_enabled () { - [ "${CSI_PROW_TESTS_SANITY}" = "sanity" ] && tests_enabled "sanity" -} + tests_need_kind () { tests_enabled "parallel" "serial" "serial-alpha" "parallel-alpha" || sanity_enabled @@ -289,74 +219,22 @@ tests_need_alpha_cluster () { tests_enabled "parallel-alpha" "serial-alpha" } -# Regex for non-alpha, feature-tagged tests that should be run. -# -# Starting with 1.17, snapshots is beta, but the E2E tests still have the -# [Feature:] tag. They need to be explicitly enabled. -configvar CSI_PROW_E2E_FOCUS_1_15 '^' "non-alpha, feature-tagged tests for Kubernetes = 1.15" # no tests to run, match nothing -configvar CSI_PROW_E2E_FOCUS_1_16 '^' "non-alpha, feature-tagged tests for Kubernetes = 1.16" # no tests to run, match nothing -configvar CSI_PROW_E2E_FOCUS_LATEST '\[Feature:VolumeSnapshotDataSource\]' "non-alpha, feature-tagged tests for Kubernetes >= 1.17" -configvar CSI_PROW_E2E_FOCUS "$(get_versioned_variable CSI_PROW_E2E_FOCUS "${csi_prow_kubernetes_version_suffix}")" "non-alpha, feature-tagged tests" - # Serial vs. parallel is always determined by these regular expressions. # Individual regular expressions are seperated by spaces for readability # and expected to not contain spaces. Use dots instead. The complete # regex for Ginkgo will be created by joining the individual terms. -configvar CSI_PROW_E2E_SERIAL '\[Serial\] \[Disruptive\]' "tags for serial E2E tests" +configvar COSI_PROW_E2E_SERIAL '\[Serial\] \[Disruptive\]' "tags for serial E2E tests" regex_join () { echo "$@" | sed -e 's/ */|/g' -e 's/^|*//' -e 's/|*$//' -e 's/^$/this-matches-nothing/g' } -# Which tests are alpha depends on the Kubernetes version. We could -# use the same E2E test for all Kubernetes version. This would have -# the advantage that new tests can be applied to older versions -# without having to backport tests. -# -# But the feature tag gets removed from E2E tests when the corresponding -# feature becomes beta, so we would have to track which tests were -# alpha in previous Kubernetes releases. This was considered too -# error prone. Therefore we use E2E tests that match the Kubernetes -# version that is getting tested. -configvar CSI_PROW_E2E_ALPHA_LATEST '\[Feature:' "alpha tests for Kubernetes >= 1.14" # there's no need to update this, adding a new case for CSI_PROW_E2E for a new Kubernetes is enough -configvar CSI_PROW_E2E_ALPHA "$(get_versioned_variable CSI_PROW_E2E_ALPHA "${csi_prow_kubernetes_version_suffix}")" "alpha tests" - -# After the parallel E2E test without alpha features, a test cluster -# with alpha features is brought up and tests that were previously -# disabled are run. The alpha gates in each release have to be listed -# explicitly. If none are set (= variable empty), alpha testing -# is skipped. -# -# Testing against "latest" Kubernetes is problematic because some alpha -# feature which used to work might stop working or change their behavior -# such that the current tests no longer pass. If that happens, -# kubernetes-csi components must be updated, either by disabling -# the failing test for "latest" or by updating the test and not running -# it anymore for older releases. -configvar CSI_PROW_E2E_ALPHA_GATES_1_15 'VolumeSnapshotDataSource=true,ExpandCSIVolumes=true' "alpha feature gates for Kubernetes 1.15" -configvar CSI_PROW_E2E_ALPHA_GATES_1_16 'VolumeSnapshotDataSource=true' "alpha feature gates for Kubernetes 1.16" -# TODO: add new CSI_PROW_ALPHA_GATES_xxx entry for future Kubernetes releases and -# add new gates to CSI_PROW_E2E_ALPHA_GATES_LATEST. -configvar CSI_PROW_E2E_ALPHA_GATES_LATEST '' "alpha feature gates for latest Kubernetes" -configvar CSI_PROW_E2E_ALPHA_GATES "$(get_versioned_variable CSI_PROW_E2E_ALPHA_GATES "${csi_prow_kubernetes_version_suffix}")" "alpha E2E feature gates" - -# Which external-snapshotter tag to use for the snapshotter CRD and snapshot-controller deployment -configvar CSI_SNAPSHOTTER_VERSION 'v2.0.0' "external-snapshotter version tag" - -# Some tests are known to be unusable in a KinD cluster. For example, -# stopping kubelet with "ssh systemctl stop kubelet" simply -# doesn't work. Such tests should be written in a way that they verify -# whether they can run with the current cluster provider, but until -# they are, we filter them out by name. Like the other test selection -# variables, this is again a space separated list of regular expressions. -# -# "different node" test skips can be removed once -# https://github.com/kubernetes/kubernetes/pull/82678 has been backported -# to all the K8s versions we test against -configvar CSI_PROW_E2E_SKIP 'Disruptive|different\s+node' "tests that need to be skipped" +configvar COSI_PROW_E2E_SKIP 'Disruptive|different\s+node' "tests that need to be skipped" + +configvar COSI_PROW_E2E_ALPHA "$(get_versioned_variable COSI_PROW_E2E_ALPHA "${cosi_prow_kubernetes_version_suffix}")" "alpha tests" # This is the directory for additional result files. Usually set by Prow, but # if not (for example, when invoking manually) it defaults to the work directory. -configvar ARTIFACTS "${CSI_PROW_WORK}/artifacts" "artifacts" +configvar ARTIFACTS "${COSI_PROW_WORK}/artifacts" "artifacts" mkdir -p "${ARTIFACTS}" run () { @@ -378,9 +256,9 @@ die () { } # For additional tools. -CSI_PROW_BIN="${CSI_PROW_WORK}/bin" -mkdir -p "${CSI_PROW_BIN}" -PATH="${CSI_PROW_BIN}:$PATH" +COSI_PROW_BIN="${COSI_PROW_WORK}/bin" +mkdir -p "${COSI_PROW_BIN}" +PATH="${COSI_PROW_BIN}:$PATH" # Ensure that PATH has the desired version of the Go tools, then run command given as argument. # Empty parameter uses the already installed Go. In Prow, that version is kept up-to-date by @@ -393,46 +271,46 @@ run_with_go () { if ! [ "$version" ] || go version 2>/dev/null | grep -q "go$version"; then run "$@" else - if ! [ -d "${CSI_PROW_WORK}/go-$version" ]; then - run curl --fail --location "https://dl.google.com/go/go$version.linux-amd64.tar.gz" | tar -C "${CSI_PROW_WORK}" -zxf - || die "installation of Go $version failed" - mv "${CSI_PROW_WORK}/go" "${CSI_PROW_WORK}/go-$version" + if ! [ -d "${COSI_PROW_WORK}/go-$version" ]; then + run curl --fail --location "https://dl.google.com/go/go$version.linux-amd64.tar.gz" | tar -C "${COSI_PROW_WORK}" -zxf - || die "installation of Go $version failed" + mv "${COSI_PROW_WORK}/go" "${COSI_PROW_WORK}/go-$version" fi - PATH="${CSI_PROW_WORK}/go-$version/bin:$PATH" run "$@" + PATH="${COSI_PROW_WORK}/go-$version/bin:$PATH" run "$@" fi } # Ensure that we have the desired version of kind. install_kind () { - if kind --version 2>/dev/null | grep -q " ${CSI_PROW_KIND_VERSION}$"; then + if kind --version 2>/dev/null | grep -q " ${COSI_PROW_KIND_VERSION}$"; then return fi - if run curl --fail --location -o "${CSI_PROW_WORK}/bin/kind" "https://github.com/kubernetes-sigs/kind/releases/download/${CSI_PROW_KIND_VERSION}/kind-linux-amd64"; then - chmod u+x "${CSI_PROW_WORK}/bin/kind" + if run curl --fail --location -o "${COSI_PROW_WORK}/bin/kind" "https://github.com/kubernetes-sigs/kind/releases/download/${COSI_PROW_KIND_VERSION}/kind-linux-amd64"; then + chmod u+x "${COSI_PROW_WORK}/bin/kind" else - git_checkout https://github.com/kubernetes-sigs/kind "${GOPATH}/src/sigs.k8s.io/kind" "${CSI_PROW_KIND_VERSION}" --depth=1 && - (cd "${GOPATH}/src/sigs.k8s.io/kind" && make install INSTALL_DIR="${CSI_PROW_WORK}/bin") + git_checkout https://github.com/kubernetes-sigs/kind "${GOPATH}/src/sigs.k8s.io/kind" "${COSI_PROW_KIND_VERSION}" --depth=1 && + (cd "${GOPATH}/src/sigs.k8s.io/kind" && make install INSTALL_DIR="${COSI_PROW_WORK}/bin") fi } # Ensure that we have the desired version of the ginkgo test runner. install_ginkgo () { - # CSI_PROW_GINKGO_VERSION contains the tag with v prefix, the command line output does not. - if [ "v$(ginkgo version 2>/dev/null | sed -e 's/.* //')" = "${CSI_PROW_GINKGO_VERSION}" ]; then + # COSI_PROW_GINKGO_VERSION contains the tag with v prefix, the command line output does not. + if [ "v$(ginkgo version 2>/dev/null | sed -e 's/.* //')" = "${COSI_PROW_GINKGO_VERSION}" ]; then return fi - git_checkout https://github.com/onsi/ginkgo "$GOPATH/src/github.com/onsi/ginkgo" "${CSI_PROW_GINKGO_VERSION}" --depth=1 && + git_checkout https://github.com/onsi/ginkgo "$GOPATH/src/github.com/onsi/ginkgo" "${COSI_PROW_GINKGO_VERSION}" --depth=1 && # We have to get dependencies and hence can't call just "go build". - run_with_go "${CSI_PROW_GO_VERSION_GINKGO}" go get github.com/onsi/ginkgo/ginkgo || die "building ginkgo failed" && - mv "$GOPATH/bin/ginkgo" "${CSI_PROW_BIN}" + run_with_go "${COSI_PROW_GO_VERSION_GINKGO}" go get github.com/onsi/ginkgo/ginkgo || die "building ginkgo failed" && + mv "$GOPATH/bin/ginkgo" "${COSI_PROW_BIN}" } # Ensure that we have the desired version of dep. install_dep () { - if dep version 2>/dev/null | grep -q "version:.*${CSI_PROW_DEP_VERSION}$"; then + if dep version 2>/dev/null | grep -q "version:.*${COSI_PROW_DEP_VERSION}$"; then return fi - run curl --fail --location -o "${CSI_PROW_WORK}/bin/dep" "https://github.com/golang/dep/releases/download/v0.5.4/dep-linux-amd64" && - chmod u+x "${CSI_PROW_WORK}/bin/dep" + run curl --fail --location -o "${COSI_PROW_WORK}/bin/dep" "https://github.com/golang/dep/releases/download/v0.5.4/dep-linux-amd64" && + chmod u+x "${COSI_PROW_WORK}/bin/dep" } # This checks out a repo ("https://github.com/kubernetes/kubernetes") @@ -458,7 +336,7 @@ git_checkout () { # Might have been because fetching by revision is not # supported by GitHub (https://github.com/isaacs/github/issues/436). # Fall back to fetching everything. - (cd "$path" && run git fetch "$repo" '+refs/heads/*:refs/remotes/csiprow/heads/*' '+refs/tags/*:refs/tags/*') || die "fetching $repo failed" + (cd "$path" && run git fetch "$repo" '+refs/heads/*:refs/remotes/cosiprow/heads/*' '+refs/tags/*:refs/tags/*') || die "fetching $repo failed" (cd "$path" && run git checkout "$revision") || die "checking out $repo $revision failed" fi # This is useful for local testing or when switching between different revisions in the same @@ -487,19 +365,6 @@ git_clone_branch () { (cd "$path" && run git clean -fdx) || die "failed to clean $path" } -list_gates () ( - set -f; IFS=',' - # Ignore: Double quote to prevent globbing and word splitting. - # shellcheck disable=SC2086 - set -- $1 - while [ "$1" ]; do - # Ignore: See if you can use ${variable//search/replace} instead. - # shellcheck disable=SC2001 - echo "$1" | sed -e 's/ *\([^ =]*\) *= *\([^ ]*\) */ \1: \2/' - shift - done -) - go_version_for_kubernetes () ( local path="$1" local version="$2" @@ -514,35 +379,36 @@ go_version_for_kubernetes () ( echo "$go_version" ) -csi_prow_kind_have_kubernetes=false +cosi_prow_kind_have_kubernetes=false # Brings up a Kubernetes cluster and sets KUBECONFIG. # Accepts additional feature gates in the form gate1=true|false,gate2=... start_cluster () { local image gates gates="$1" - if kind get clusters | grep -q csi-prow; then - run kind delete cluster --name=csi-prow || die "kind delete failed" + if kind get clusters | grep -q cosi-prow; then + run kind delete cluster --name=cosi-prow || die "kind delete failed" fi + echo "build k/k source" # Build from source? - if [[ "${CSI_PROW_KUBERNETES_VERSION}" =~ ^release-|^latest$ ]]; then - if ! ${csi_prow_kind_have_kubernetes}; then - local version="${CSI_PROW_KUBERNETES_VERSION}" + if [[ "${COSI_PROW_KUBERNETES_VERSION}" =~ ^release-|^latest$ ]]; then + if ! ${cosi_prow_kind_have_kubernetes}; then + local version="${COSI_PROW_KUBERNETES_VERSION}" if [ "$version" = "latest" ]; then version=master fi - git_clone_branch https://github.com/kubernetes/kubernetes "${CSI_PROW_WORK}/src/kubernetes" "$version" || die "checking out Kubernetes $version failed" + git_clone_branch https://github.com/kubernetes/kubernetes "${COSI_PROW_WORK}/src/kubernetes" "$version" || die "checking out Kubernetes $version failed" - go_version="$(go_version_for_kubernetes "${CSI_PROW_WORK}/src/kubernetes" "$version")" || die "cannot proceed without knowing Go version for Kubernetes" - run_with_go "$go_version" kind build node-image --type bazel --image csiprow/node:latest --kube-root "${CSI_PROW_WORK}/src/kubernetes" || die "'kind build node-image' failed" - csi_prow_kind_have_kubernetes=true + go_version="$(go_version_for_kubernetes "${COSI_PROW_WORK}/src/kubernetes" "$version")" || die "cannot proceed without knowing Go version for Kubernetes" + run_with_go "$go_version" kind build node-image --type bazel --image cosiprow/node:latest --kube-root "${COSI_PROW_WORK}/src/kubernetes" || die "'kind build node-image' failed" + cosi_prow_kind_have_kubernetes=true fi - image="csiprow/node:latest" + image="cosiprow/node:latest" else - image="kindest/node:v${CSI_PROW_KUBERNETES_VERSION}" + image="kindest/node:v${COSI_PROW_KUBERNETES_VERSION}" fi - cat >"${CSI_PROW_WORK}/kind-config.yaml" <"${COSI_PROW_WORK}/kind-config.yaml" <>"${CSI_PROW_WORK}/kind-config.yaml" <>"${COSI_PROW_WORK}/kind-config.yaml" </dev/null; wait) - info "For container output see job artifacts." - die "deploying the CSI driver with ${deploy_driver} failed" - fi +kubectl_apply () { + // TODO once this CRD is part of core replace it with 'kubectl apply -f $1 --validate=false' + curl $1 | sed '/annotations/ a \ \ "api-approved.kubernetes.io": "https://github.com/kubernetes-sigs/container-object-storage-interface-api/pull/2"' | kubectl apply -f - --validate=false } -# Installs all nessesary snapshotter CRDs -install_snapshot_crds() { - # Wait until volumesnapshot CRDs are in place. - CRD_BASE_DIR="https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/${CSI_SNAPSHOTTER_VERSION}/config/crd" - kubectl apply -f "${CRD_BASE_DIR}/snapshot.storage.k8s.io_volumesnapshotclasses.yaml" --validate=false - kubectl apply -f "${CRD_BASE_DIR}/snapshot.storage.k8s.io_volumesnapshots.yaml" --validate=false - kubectl apply -f "${CRD_BASE_DIR}/snapshot.storage.k8s.io_volumesnapshotcontents.yaml" --validate=false +# Installs all nessesary CRDs +install_crds() { + # Wait until cosi CRDs are in place. + CRD_BASE_DIR="https://raw.githubusercontent.com/kubernetes-sigs/container-object-storage-interface-api/${COSI_SPEC_VERSION}/crds" + kubectl_apply "${CRD_BASE_DIR}/objectstorage.k8s.io_bucketclasses.yaml" + kubectl_apply "${CRD_BASE_DIR}/objectstorage.k8s.io_bucketrequests.yaml" + kubectl_apply "${CRD_BASE_DIR}/objectstorage.k8s.io_buckets.yaml" + kubectl_apply "${CRD_BASE_DIR}/objectstorage.k8s.io_bucketaccessclasses.yaml" + kubectl_apply "${CRD_BASE_DIR}/objectstorage.k8s.io_bucketaccessrequests.yaml" + kubectl_apply "${CRD_BASE_DIR}/objectstorage.k8s.io_bucketaccesses.yaml" cnt=0 - until kubectl get volumesnapshotclasses.snapshot.storage.k8s.io \ - && kubectl get volumesnapshots.snapshot.storage.k8s.io \ - && kubectl get volumesnapshotcontents.snapshot.storage.k8s.io; do + until kubectl get bucketaccessclasses.objectstorage.k8s.io \ + && kubectl get bucketaccessrequests.objectstorage.k8s.io \ + && kubectl get bucketaccesses.objectstorage.k8s.io \ + && kubectl get bucketclasses.objectstorage.k8s.io \ + && kubectl get bucketrequests.objectstorage.k8s.io \ + && kubectl get buckets.objectstorage.k8s.io; do if [ $cnt -gt 30 ]; then - echo >&2 "ERROR: snapshot CRDs not ready after over 1 min" + echo >&2 "ERROR: cosi CRDs not ready after over 1 min" exit 1 fi - echo "$(date +%H:%M:%S)" "waiting for snapshot CRDs, attempt #$cnt" + echo "$(date +%H:%M:%S)" "waiting for cosi CRDs, attempt #$cnt" cnt=$((cnt + 1)) sleep 2 done } -# Install snapshot controller and associated RBAC, retrying until the pod is running. -install_snapshot_controller() { - kubectl apply -f "https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/${CSI_SNAPSHOTTER_VERSION}/deploy/kubernetes/snapshot-controller/rbac-snapshot-controller.yaml" +# Install controller and associated RBAC, retrying until the pod is running. +install_controller() { + kubectl apply -f "https://raw.githubusercontent.com/kubernetes-sigs/container-object-storage-interface-controller/${COSI_CONTROLLER_VERSION}/deploy/base/sa.yaml" + kubectl apply -f "https://raw.githubusercontent.com/kubernetes-sigs/container-object-storage-interface-controller/${COSI_CONTROLLER_VERSION}/deploy/base/rbac.yaml" cnt=0 - until kubectl get clusterrolebinding snapshot-controller-role; do + until kubectl get clusterrolebinding objectstorage-controller; do if [ $cnt -gt 30 ]; then echo "Cluster role bindings:" kubectl describe clusterrolebinding - echo >&2 "ERROR: snapshot controller RBAC not ready after over 5 min" + echo >&2 "ERROR: controller RBAC not ready after over 5 min" exit 1 - fi - echo "$(date +%H:%M:%S)" "waiting for snapshot RBAC setup complete, attempt #$cnt" - cnt=$((cnt + 1)) - sleep 10 + fi + echo "$(date +%H:%M:%S)" "waiting for cosi RBAC setup complete, attempt #$cnt" + cnt=$((cnt + 1)) + sleep 10 done - kubectl apply -f "https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/${CSI_SNAPSHOTTER_VERSION}/deploy/kubernetes/snapshot-controller/setup-snapshot-controller.yaml" + kubectl apply -f "https://raw.githubusercontent.com/kubernetes-sigs/container-object-storage-interface-controller/${COSI_CONTROLLER_VERSION}/deploy/base/deployment.yaml" cnt=0 - expected_running_pods=$(curl https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/"${CSI_SNAPSHOTTER_VERSION}"/deploy/kubernetes/snapshot-controller/setup-snapshot-controller.yaml | grep replicas | cut -d ':' -f 2-) - while [ "$(kubectl get pods -l app=snapshot-controller | grep 'Running' -c)" -lt "$expected_running_pods" ]; do + kubectl get pods + kubectl get pods -l app=objectstorage-controller + expected_running_pods=$(curl "https://raw.githubusercontent.com/kubernetes-sigs/container-object-storage-interface-controller/${COSI_CONTROLLER_VERSION}/deploy/base/deployment.yaml" | grep replicas | cut -d ':' -f 2-) + while [ "$(kubectl get pods -l app.kubernetes.io/name=container-object-storage-interface-controller | grep 'Running' -c)" -lt "$expected_running_pods" ]; do if [ $cnt -gt 30 ]; then - echo "snapshot-controller pod status:" - kubectl describe pods -l app=snapshot-controller - echo >&2 "ERROR: snapshot controller not ready after over 5 min" + echo "objectstorage-controller pod status:" + kubectl describe pods -l app.kubernetes.io/name=container-object-storage-interface-controller + echo >&2 "ERROR: cosi controller not ready after over 5 min" exit 1 fi - echo "$(date +%H:%M:%S)" "waiting for snapshot controller deployment to complete, attempt #$cnt" + echo "$(date +%H:%M:%S)" "waiting for cosi controller deployment to complete, attempt #$cnt" cnt=$((cnt + 1)) sleep 10 done @@ -764,16 +606,6 @@ $(kubectl version) Driver installation in default namespace: $(kubectl get all) -Images in cluster: -REPOSITORY TAG REVISION -$( -# Here we iterate over all images that are in use and print some information about them. -# The "revision" label is where our build process puts the version number and revision, -# which is always unique, in contrast to the tag (think "canary"...). -docker exec csi-prow-control-plane docker image ls --format='{{.Repository}} {{.Tag}} {{.ID}}' | grep -e csi -e hostpath | while read -r repo tag id; do - echo "$repo" "$tag" "$(docker exec csi-prow-control-plane docker image inspect --format='{{ index .Config.Labels "revision"}}' "$id")" -done -) ========================================================= EOF @@ -795,33 +627,22 @@ start_loggers () { done } -# Makes the E2E test suite binary available as "${CSI_PROW_WORK}/e2e.test". +# Makes the E2E test suite binary available as "${COSI_PROW_WORK}/e2e.test". install_e2e () { - if [ -e "${CSI_PROW_WORK}/e2e.test" ]; then + if [ -e "${COSI_PROW_WORK}/e2e.test" ]; then return fi - git_checkout "${CSI_PROW_E2E_REPO}" "${GOPATH}/src/${CSI_PROW_E2E_IMPORT_PATH}" "${CSI_PROW_E2E_VERSION}" --depth=1 && - if [ "${CSI_PROW_E2E_IMPORT_PATH}" = "k8s.io/kubernetes" ]; then - go_version="${CSI_PROW_GO_VERSION_E2E:-$(go_version_for_kubernetes "${GOPATH}/src/${CSI_PROW_E2E_IMPORT_PATH}" "${CSI_PROW_E2E_VERSION}")}" && - run_with_go "$go_version" make WHAT=test/e2e/e2e.test "-C${GOPATH}/src/${CSI_PROW_E2E_IMPORT_PATH}" && - ln -s "${GOPATH}/src/${CSI_PROW_E2E_IMPORT_PATH}/_output/bin/e2e.test" "${CSI_PROW_WORK}" + git_checkout "${COSI_PROW_E2E_REPO}" "${GOPATH}/src/${COSI_PROW_E2E_IMPORT_PATH}" "${COSI_PROW_E2E_VERSION}" --depth=1 && + if [ "${COSI_PROW_E2E_IMPORT_PATH}" = "k8s.io/kubernetes" ]; then + go_version="${COSI_PROW_GO_VERSION_E2E:-$(go_version_for_kubernetes "${GOPATH}/src/${COSI_PROW_E2E_IMPORT_PATH}" "${COSI_PROW_E2E_VERSION}")}" && + run_with_go "$go_version" make WHAT=test/e2e/e2e.test "-C${GOPATH}/src/${COSI_PROW_E2E_IMPORT_PATH}" && + ln -s "${GOPATH}/src/${COSI_PROW_E2E_IMPORT_PATH}/_output/bin/e2e.test" "${COSI_PROW_WORK}" else - run_with_go "${CSI_PROW_GO_VERSION_E2E}" go test -c -o "${CSI_PROW_WORK}/e2e.test" "${CSI_PROW_E2E_IMPORT_PATH}/test/e2e" + run_with_go "${COSI_PROW_GO_VERSION_E2E}" go test -c -o "${COSI_PROW_WORK}/e2e.test" "${COSI_PROW_E2E_IMPORT_PATH}/test/e2e" fi } -# Makes the csi-sanity test suite binary available as -# "${CSI_PROW_WORK}/csi-sanity". -install_sanity () ( - if [ -e "${CSI_PROW_WORK}/csi-sanity" ]; then - return - fi - - git_checkout "${CSI_PROW_SANITY_REPO}" "${GOPATH}/src/${CSI_PROW_SANITY_IMPORT_PATH}" "${CSI_PROW_SANITY_VERSION}" --depth=1 || die "checking out csi-sanity failed" - run_with_go "${CSI_PROW_GO_VERSION_SANITY}" go test -c -o "${CSI_PROW_WORK}/csi-sanity" "${CSI_PROW_SANITY_IMPORT_PATH}/cmd/csi-sanity" || die "building csi-sanity failed" -) - # Captures pod output while running some other command. run_with_loggers () ( loggers=$(start_loggers -f) @@ -832,7 +653,7 @@ run_with_loggers () ( # Invokes the filter-junit.go tool. run_filter_junit () { - run_with_go "${CSI_PROW_GO_VERSION_BUILD}" go run "${RELEASE_TOOLS_ROOT}/filter-junit.go" "$@" + run_with_go "${COSI_PROW_GO_VERSION_BUILD}" go run "${RELEASE_TOOLS_ROOT}/filter-junit.go" "$@" } # Runs the E2E test suite in a sub-shell. @@ -853,61 +674,9 @@ run_e2e () ( } trap move_junit EXIT - cd "${GOPATH}/src/${CSI_PROW_E2E_IMPORT_PATH}" && - run_with_loggers ginkgo -v "$@" "${CSI_PROW_WORK}/e2e.test" -- -report-dir "${ARTIFACTS}" -storage.testdriver="${CSI_PROW_WORK}/test-driver.yaml" -) - -# Run csi-sanity against installed CSI driver. -run_sanity () ( - install_sanity || die "installing csi-sanity failed" - - cat >"${CSI_PROW_WORK}/mkdir_in_pod.sh" <"${CSI_PROW_WORK}/rmdir_in_pod.sh" <&1 | make_test_to_junit; then + if ! run_with_go "${COSI_PROW_GO_VERSION_BUILD}" make -k test "GOFLAGS_VENDOR=${GOFLAGS_VENDOR}" 2>&1 | make_test_to_junit; then warn "'make test' failed, proceeding anyway" ret=1 fi fi # Required for E2E testing. - run_with_go "${CSI_PROW_GO_VERSION_BUILD}" make container "GOFLAGS_VENDOR=${GOFLAGS_VENDOR}" || die "'make container' failed" + run_with_go "${COSI_PROW_GO_VERSION_BUILD}" make container "GOFLAGS_VENDOR=${GOFLAGS_VENDOR}" || die "'make container' failed" fi if tests_need_kind; then install_kind || die "installing kind failed" - if ${CSI_PROW_BUILD_JOB}; then + if ${COSI_PROW_BUILD_JOB}; then cmds="$(grep '^\s*CMDS\s*=' Makefile | sed -e 's/\s*CMDS\s*=//')" # Get the image that was just built (if any) from the # top-level Makefile CMDS variable and set the @@ -1056,12 +825,12 @@ main () { # side-load those images into the cluster. for i in $cmds; do e=$(echo "$i" | tr '[:lower:]' '[:upper:]' | tr - _) - images="$images ${e}_REGISTRY=none ${e}_TAG=csiprow" + images="$images ${e}_REGISTRY=quay.io/containerobjectstorage ${e}_TAG=cosiprow" # We must avoid the tag "latest" because that implies # always pulling the image # (https://github.com/kubernetes-sigs/kind/issues/328). - docker tag "$i:latest" "$i:csiprow" || die "tagging the locally built container image for $i failed" + docker tag "$i:latest" "$i:cosiprow" || die "tagging the locally built container image for $i failed" done if [ -e deploy/kubernetes/rbac.yaml ]; then @@ -1079,104 +848,42 @@ main () { if tests_need_non_alpha_cluster; then start_cluster || die "starting the non-alpha cluster failed" - # Install necessary snapshot CRDs and snapshot controller - # For Kubernetes 1.17+, we will install the CRDs and snapshot controller. - if version_gt "${CSI_PROW_KUBERNETES_VERSION}" "1.16.255" || "${CSI_PROW_KUBERNETES_VERSION}" == "latest"; then - info "Version ${CSI_PROW_KUBERNETES_VERSION}, installing CRDs and snapshot controller" - install_snapshot_crds - install_snapshot_controller + # Install necessary CRDs and controllers + # For Kubernetes 1.19+, we will install the CRDs and controller. + if version_gt "${COSI_PROW_KUBERNETES_VERSION}" "1.16.255" || "${COSI_PROW_KUBERNETES_VERSION}" == "latest"; then + info "Version ${COSI_PROW_KUBERNETES_VERSION}, installing CRDs and cosi controller" + install_crds + install_controller else - info "Version ${CSI_PROW_KUBERNETES_VERSION}, skipping CRDs and snapshot controller" + info "Version ${COSI_PROW_KUBERNETES_VERSION}, skipping CRDs and cosi controller" fi - # Installing the driver might be disabled. - if ${CSI_PROW_DRIVER_INSTALL} "$images"; then - collect_cluster_info - - if sanity_enabled; then - if ! run_sanity; then - ret=1 - fi - fi - - if tests_enabled "parallel"; then - # Ignore: Double quote to prevent globbing and word splitting. - # shellcheck disable=SC2086 - if ! run_e2e parallel ${CSI_PROW_GINKO_PARALLEL} \ - -focus="External.Storage" \ - -skip="$(regex_join "${CSI_PROW_E2E_SERIAL}" "${CSI_PROW_E2E_ALPHA}" "${CSI_PROW_E2E_SKIP}")"; then - warn "E2E parallel failed" - ret=1 - fi - - # Run tests that are feature tagged, but non-alpha - # Ignore: Double quote to prevent globbing and word splitting. - # shellcheck disable=SC2086 - if ! run_e2e parallel-features ${CSI_PROW_GINKO_PARALLEL} \ - -focus="External.Storage.*($(regex_join "${CSI_PROW_E2E_FOCUS}"))" \ - -skip="$(regex_join "${CSI_PROW_E2E_SERIAL}")"; then - warn "E2E parallel features failed" - ret=1 - fi - fi + collect_cluster_info - if tests_enabled "serial"; then - if ! run_e2e serial \ - -focus="External.Storage.*($(regex_join "${CSI_PROW_E2E_SERIAL}"))" \ - -skip="$(regex_join "${CSI_PROW_E2E_ALPHA}" "${CSI_PROW_E2E_SKIP}")"; then - warn "E2E serial failed" - ret=1 - fi + if tests_enabled "parallel"; then + if ! run_e2e parallel ${COSI_PROW_GINKO_PARALLEL} \ + -focus="ObjectStorage" \ + -skip="$(regex_join "${COSI_PROW_E2E_SERIAL}" "${COSI_PROW_E2E_ALPHA}" "${COSI_PROW_E2E_SKIP}")"; then + warn "E2E parallel failed" + ret=1 fi fi - delete_cluster_inside_prow_job - fi - - if tests_need_alpha_cluster && [ "${CSI_PROW_E2E_ALPHA_GATES}" ]; then - # Need to (re)create the cluster. - start_cluster "${CSI_PROW_E2E_ALPHA_GATES}" || die "starting alpha cluster failed" - - # Install necessary snapshot CRDs and snapshot controller - # For Kubernetes 1.17+, we will install the CRDs and snapshot controller. - if version_gt "${CSI_PROW_KUBERNETES_VERSION}" "1.16.255" || "${CSI_PROW_KUBERNETES_VERSION}" == "latest"; then - info "Version ${CSI_PROW_KUBERNETES_VERSION}, installing CRDs and snapshot controller" - install_snapshot_crds - install_snapshot_controller - else - info "Version ${CSI_PROW_KUBERNETES_VERSION}, skipping CRDs and snapshot controller" - fi - - # Installing the driver might be disabled. - if ${CSI_PROW_DRIVER_INSTALL} "$images"; then - collect_cluster_info - - if tests_enabled "parallel-alpha"; then - # Ignore: Double quote to prevent globbing and word splitting. - # shellcheck disable=SC2086 - if ! run_e2e parallel-alpha ${CSI_PROW_GINKO_PARALLEL} \ - -focus="External.Storage.*($(regex_join "${CSI_PROW_E2E_ALPHA}"))" \ - -skip="$(regex_join "${CSI_PROW_E2E_SERIAL}" "${CSI_PROW_E2E_SKIP}")"; then - warn "E2E parallel alpha failed" - ret=1 - fi - fi - if tests_enabled "serial-alpha"; then - if ! run_e2e serial-alpha \ - -focus="External.Storage.*(($(regex_join "${CSI_PROW_E2E_SERIAL}")).*($(regex_join "${CSI_PROW_E2E_ALPHA}"))|($(regex_join "${CSI_PROW_E2E_ALPHA}")).*($(regex_join "${CSI_PROW_E2E_SERIAL}")))" \ - -skip="$(regex_join "${CSI_PROW_E2E_SKIP}")"; then - warn "E2E serial alpha failed" - ret=1 - fi + if tests_enabled "serial"; then + if ! run_e2e serial \ + -focus="ObjectStorage.*" \ + -skip="$(regex_join "${COSI_PROW_E2E_ALPHA}" "${COSI_PROW_E2E_SKIP}")"; then + warn "E2E serial failed" + ret=1 fi fi - delete_cluster_inside_prow_job + fi + delete_cluster_inside_prow_job fi - # Merge all junit files into one. This gets rid of duplicated "skipped" tests. if ls "${ARTIFACTS}"/junit_*.xml 2>/dev/null >&2; then - run_filter_junit -o "${CSI_PROW_WORK}/junit_final.xml" "${ARTIFACTS}"/junit_*.xml && rm "${ARTIFACTS}"/junit_*.xml && mv "${CSI_PROW_WORK}/junit_final.xml" "${ARTIFACTS}" + run_filter_junit -o "${COSI_PROW_WORK}/junit_final.xml" "${ARTIFACTS}"/junit_*.xml && rm "${ARTIFACTS}"/junit_*.xml && mv "${COSI_PROW_WORK}/junit_final.xml" "${ARTIFACTS}" fi return "$ret" From 8e846a7e95b3e05d25e8a22b8467ad56ba885c5b Mon Sep 17 00:00:00 2001 From: Tejas Parikh Date: Tue, 12 Jan 2021 15:49:28 -0500 Subject: [PATCH 139/242] Refactor Kustomize templates This PR removes the fullstack kustomize template and simplifies the base deploy of controller. Kustomize will now only deploy controller resources. --- deploy/base/kustomization.yaml | 13 ------------- deploy/fullstack/controller/kustomization.yaml | 12 ------------ deploy/fullstack/controller/ns.yaml | 5 ----- deploy/fullstack/kustomization.yaml | 7 ------- deploy/fullstack/provisioner/kustomization.yaml | 11 ----------- deploy/fullstack/provisioner/ns.yaml | 5 ----- kustomization.yaml | 14 ++++++++++++++ {deploy/base => resources}/deployment.yaml | 1 + {deploy/base => resources}/rbac.yaml | 0 {deploy/base => resources}/sa.yaml | 0 10 files changed, 15 insertions(+), 53 deletions(-) delete mode 100644 deploy/base/kustomization.yaml delete mode 100644 deploy/fullstack/controller/kustomization.yaml delete mode 100644 deploy/fullstack/controller/ns.yaml delete mode 100644 deploy/fullstack/kustomization.yaml delete mode 100644 deploy/fullstack/provisioner/kustomization.yaml delete mode 100644 deploy/fullstack/provisioner/ns.yaml create mode 100644 kustomization.yaml rename {deploy/base => resources}/deployment.yaml (96%) rename {deploy/base => resources}/rbac.yaml (100%) rename {deploy/base => resources}/sa.yaml (100%) diff --git a/deploy/base/kustomization.yaml b/deploy/base/kustomization.yaml deleted file mode 100644 index 100cd953..00000000 --- a/deploy/base/kustomization.yaml +++ /dev/null @@ -1,13 +0,0 @@ ---- -apiVersion: kustomize.config.k8s.io/v1beta1 -kind: Kustomization - -bases: -# CRDs -- github.com/kubernetes-sigs/container-object-storage-interface-api/crds - -resources: -# Controller -- sa.yaml -- rbac.yaml -- deployment.yaml diff --git a/deploy/fullstack/controller/kustomization.yaml b/deploy/fullstack/controller/kustomization.yaml deleted file mode 100644 index 9a103319..00000000 --- a/deploy/fullstack/controller/kustomization.yaml +++ /dev/null @@ -1,12 +0,0 @@ ---- -apiVersion: kustomize.config.k8s.io/v1beta1 -kind: Kustomization - -namespace: objectstorage-system - -bases: -- ../../base/ - -resources: -# Namespace -- ns.yaml diff --git a/deploy/fullstack/controller/ns.yaml b/deploy/fullstack/controller/ns.yaml deleted file mode 100644 index c31ae9c4..00000000 --- a/deploy/fullstack/controller/ns.yaml +++ /dev/null @@ -1,5 +0,0 @@ ---- -apiVersion: v1 -kind: Namespace -metadata: - name: objectstorage-system diff --git a/deploy/fullstack/kustomization.yaml b/deploy/fullstack/kustomization.yaml deleted file mode 100644 index 787fc8da..00000000 --- a/deploy/fullstack/kustomization.yaml +++ /dev/null @@ -1,7 +0,0 @@ ---- -apiVersion: kustomize.config.k8s.io/v1beta1 -kind: Kustomization - -bases: -- ./controller -- ./provisioner diff --git a/deploy/fullstack/provisioner/kustomization.yaml b/deploy/fullstack/provisioner/kustomization.yaml deleted file mode 100644 index 81f1f2eb..00000000 --- a/deploy/fullstack/provisioner/kustomization.yaml +++ /dev/null @@ -1,11 +0,0 @@ ---- -apiVersion: kustomize.config.k8s.io/v1beta1 -kind: Kustomization - -namespace: objectstorage-provisioner-ns - -resources: -# Namespace -- ns.yaml -# Sidecar -- https://raw.githubusercontent.com/container-object-storage-interface/cosi-provisioner-sidecar/master/examples/object-storage-sidecar.yaml diff --git a/deploy/fullstack/provisioner/ns.yaml b/deploy/fullstack/provisioner/ns.yaml deleted file mode 100644 index 04eb2ff2..00000000 --- a/deploy/fullstack/provisioner/ns.yaml +++ /dev/null @@ -1,5 +0,0 @@ ---- -apiVersion: v1 -kind: Namespace -metadata: - name: objectstorage-provisioner-ns diff --git a/kustomization.yaml b/kustomization.yaml new file mode 100644 index 00000000..1cb50a7a --- /dev/null +++ b/kustomization.yaml @@ -0,0 +1,14 @@ +--- +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +commonLabels: + app.kubernetes.io/part-of: container-object-storage-interface + app.kubernetes.io/component: controller + app.kubernetes.io/version: main + app.kubernetes.io/name: container-object-storage-interface-controller + +resources: +- resources/sa.yaml +- resources/rbac.yaml +- resources/deployment.yaml diff --git a/deploy/base/deployment.yaml b/resources/deployment.yaml similarity index 96% rename from deploy/base/deployment.yaml rename to resources/deployment.yaml index 30c09225..ac8fc2a7 100644 --- a/deploy/base/deployment.yaml +++ b/resources/deployment.yaml @@ -18,6 +18,7 @@ spec: matchLabels: app.kubernetes.io/part-of: container-object-storage-interface app.kubernetes.io/component: controller + app.kubernetes.io/version: main app.kubernetes.io/name: container-object-storage-interface-controller template: metadata: diff --git a/deploy/base/rbac.yaml b/resources/rbac.yaml similarity index 100% rename from deploy/base/rbac.yaml rename to resources/rbac.yaml diff --git a/deploy/base/sa.yaml b/resources/sa.yaml similarity index 100% rename from deploy/base/sa.yaml rename to resources/sa.yaml From 020bacd627b3afb102cdc059df008bc8c3823c84 Mon Sep 17 00:00:00 2001 From: wlan0 Date: Tue, 12 Jan 2021 15:51:32 -0800 Subject: [PATCH 140/242] fix race condition while creating buckets --- go.mod | 20 +++++++++ go.sum | 58 +++++++++++++++++++++++++ pkg/bucketrequest/bucketrequest.go | 34 +++++++++------ pkg/bucketrequest/bucketrequest_test.go | 2 + 4 files changed, 100 insertions(+), 14 deletions(-) diff --git a/go.mod b/go.mod index f1959337..d4d0ac5f 100644 --- a/go.mod +++ b/go.mod @@ -4,13 +4,33 @@ go 1.15 require ( github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b + github.com/golang/protobuf v1.4.3 // indirect + github.com/google/go-cmp v0.5.2 // indirect + github.com/google/uuid v1.1.2 // indirect + github.com/gopherjs/gopherjs v0.0.0-20190328170749-bb2674552d8f // indirect + github.com/kr/text v0.2.0 // indirect github.com/kubernetes-sigs/container-object-storage-interface-api v0.0.0-20201210173615-0c3244fa34b9 + github.com/mailru/easyjson v0.7.6 // indirect + github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/smartystreets/assertions v1.1.1 // indirect github.com/spf13/cobra v1.1.1 github.com/spf13/viper v1.7.1 + github.com/stretchr/testify v1.6.1 // indirect + golang.org/x/crypto v0.0.0-20201124201722-c8d3bf9c5392 // indirect + golang.org/x/net v0.0.0-20201216054612-986b41b23924 // indirect + golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d // indirect + golang.org/x/text v0.3.4 // indirect golang.org/x/time v0.0.0-20191024005414-555d28b269f0 + golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e // indirect + gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b // indirect + gopkg.in/ini.v1 v1.57.0 // indirect + gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 // indirect k8s.io/api v0.19.4 k8s.io/apiextensions-apiserver v0.19.4 k8s.io/apimachinery v0.19.4 k8s.io/client-go v0.19.4 + k8s.io/klog/v2 v2.4.0 // indirect + k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd // indirect sigs.k8s.io/controller-tools v0.4.1 ) diff --git a/go.sum b/go.sum index 6d6c49cb..df32efaa 100644 --- a/go.sum +++ b/go.sum @@ -77,6 +77,7 @@ github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfc 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/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -197,6 +198,8 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -204,6 +207,8 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -215,6 +220,8 @@ github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm4 github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= @@ -225,6 +232,8 @@ github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3i github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gopherjs/gopherjs v0.0.0-20190328170749-bb2674552d8f h1:4Gslotqbs16iAg+1KR/XdabIfq8TlAWHdwS5QJFksLc= +github.com/gopherjs/gopherjs v0.0.0-20190328170749-bb2674552d8f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= 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= @@ -267,6 +276,8 @@ github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJ github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= 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= @@ -290,6 +301,8 @@ 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/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kubernetes-sigs/container-object-storage-interface-api v0.0.0-20201210173615-0c3244fa34b9 h1:1Zmlu1GKd1iIv9fdc1mkaTuUtoNqet4NLYLE/8p9ylw= github.com/kubernetes-sigs/container-object-storage-interface-api v0.0.0-20201210173615-0c3244fa34b9/go.mod h1:C7tjzC+nLe7H7+3UM/Z6a7F24yxOO8FSK3ZaVZrKDPQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= @@ -302,6 +315,8 @@ github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.0 h1:aizVhC/NAAcKWb+5QsU1iNOZb4Yws5UO2I+aIprQITM= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= +github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= @@ -331,6 +346,8 @@ github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8m 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/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= @@ -360,6 +377,8 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= @@ -393,6 +412,8 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/assertions v1.1.1 h1:T/YLemO5Yp7KPzS+lVtu+WsHn8yoSwTfItdAd1r3cck= +github.com/smartystreets/assertions v1.1.1/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= @@ -426,6 +447,8 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= @@ -438,6 +461,7 @@ github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 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= @@ -468,6 +492,8 @@ golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201124201722-c8d3bf9c5392 h1:xYJJ3S178yv++9zXV/hnr29plCAGO9vAFG9dorqaFQc= +golang.org/x/crypto v0.0.0-20201124201722-c8d3bf9c5392/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/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-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -521,17 +547,23 @@ golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200707034311-ab3426394381 h1:VXak5I6aEWmAXeQjA+QSZzlgNrpq9mjcfDemuexIKsU= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201216054612-986b41b23924 h1:QsnDpLLOKwHBBDa8nDws4DYNc/ryVW2vCpxCs09d4PY= +golang.org/x/net v0.0.0-20201216054612-986b41b23924/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6 h1:pE8b58s1HRDMi8RDc79m0HISf9D4TzseP40cEA6IGfs= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-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= @@ -557,6 +589,7 @@ golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/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-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-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -568,12 +601,20 @@ golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4 h1:5/PjkGUjvEU5Gl6BxmvKRPpqo2uNMv4rcHBMwzk/st8= golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/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 h1:nxC68pudNYkKU6jWhgrqdreuFiOQWj1Fs7T3VrH4Pjw= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 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= @@ -610,10 +651,14 @@ golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200616195046-dc31b401abb5 h1:UaoXseXAWUJUcuJ2E2oczJdLxAJXL0lOmVaBl7kuk+I= golang.org/x/tools v0.0.0-20200616195046-dc31b401abb5/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e h1:Z2uDrs8MyXUWJbwGc4V+nGjV4Ygo+oubBbWSVQw21/I= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +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= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= @@ -661,6 +706,8 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b h1:QRR6H1YWRnHb4Y/HeNFCTJLFVxaq6wH4YuVdsUOr75U= +gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 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 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= @@ -669,6 +716,8 @@ 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.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.57.0 h1:9unxIsFcTt4I55uWluz+UmL95q4kdJ0buvQ1ZIqVQww= +gopkg.in/ini.v1 v1.57.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= 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/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= @@ -684,6 +733,9 @@ gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20190905181640-827449938966/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-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/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= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -727,12 +779,16 @@ 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 h1:XRvcwJozkgZ1UQJmfMGpvRthQHOvihEhYtDfAaxMz/A= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/klog/v2 v2.4.0 h1:7+X0fUguPyrKEC4WjH8iGDg3laWgMo5tMnRTIGTTxGQ= +k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= 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-20200805222855-6aeccd4b50c6 h1:+WnxoVtG8TMiudHBSEtrVL1egv36TkkJm+bA8AxicmQ= k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= k8s.io/kube-openapi v0.0.0-20200923155610-8b5066479488 h1:mNpvQf4lkIHNOXCoM+Veu/UXwA56Yx1J7hY1Tvcs/oM= k8s.io/kube-openapi v0.0.0-20200923155610-8b5066479488/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= +k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd h1:sOHNzJIkytDF6qadMNKhhDRpc6ODik8lVC6nOur7B2c= +k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20200603063816-c1c6865ac451/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20200729134348-d5654de09c73 h1:uJmqzgNWG7XyClnU/mLPBWwfKKF1K8Hf8whTseBgJcg= @@ -748,6 +804,8 @@ sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= sigs.k8s.io/structured-merge-diff/v4 v4.0.1 h1:YXTMot5Qz/X1iBRJhAt+vI+HVttY0WkSqqhKxQ0xVbA= sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.0.2 h1:YHQV7Dajm86OuqnIR6zAelnDWBRjo+YhYV9PmGrh1s8= +sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/pkg/bucketrequest/bucketrequest.go b/pkg/bucketrequest/bucketrequest.go index ab126302..f14898ec 100644 --- a/pkg/bucketrequest/bucketrequest.go +++ b/pkg/bucketrequest/bucketrequest.go @@ -2,18 +2,18 @@ package bucketrequest import ( "context" - "fmt" "strings" v1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/util/retry" "github.com/kubernetes-sigs/container-object-storage-interface-api/apis/objectstorage.k8s.io/v1alpha1" bucketclientset "github.com/kubernetes-sigs/container-object-storage-interface-api/clientset" bucketcontroller "github.com/kubernetes-sigs/container-object-storage-interface-api/controller" "github.com/kubernetes-sigs/container-object-storage-interface-controller/pkg/util" kubeclientset "k8s.io/client-go/kubernetes" - "k8s.io/client-go/util/retry" "github.com/golang/glog" ) @@ -80,27 +80,33 @@ func (b *bucketRequestListener) provisionBucketRequestOperation(ctx context.Cont // Most code here is identical to that found in controller.go of kube's controller... bucketClassName := b.GetBucketClass(bucketRequest) - // A previous doProvisionBucketRequest may just have finished while we were waiting for - // the locks. Check that bucket (with deterministic name) hasn't been provisioned - // yet. - bucket := b.FindBucket(ctx, bucketRequest) - if bucket != nil { - // bucket has been already provisioned, nothing to do. - glog.Info("Bucket already exists", bucket.Name) - return util.ErrBucketAlreadyExists - } - bucketClass, err := b.bucketClient.ObjectstorageV1alpha1().BucketClasses().Get(ctx, bucketClassName, metav1.GetOptions{}) if bucketClass == nil { // bucketclass does not exist in order to create a bucket return util.ErrInvalidBucketClass } - glog.Infof("Creating Bucket for BucketRequest %v", bucketRequest.Name) + name := bucketRequest.Spec.BucketPrefix + if name != "" { + name = name + "-" + } + name = name + string(bucketRequest.GetUID()) + + bucket, err := b.bucketClient.ObjectstorageV1alpha1().Buckets().Get(context.Background(), name, metav1.GetOptions{}) + if err != nil { + // anything other than 404 + if !errors.IsNotFound(err) { + glog.Errorf("error fetching bucket: %v", err) + return err + } + } else { // if bucket found + return nil + } // create bucket bucket = &v1alpha1.Bucket{} - bucket.Name = fmt.Sprintf("%s%s", bucketRequest.Spec.BucketPrefix, util.GetUUID()) + + bucket.Name = name bucket.Spec.Provisioner = bucketClass.Provisioner bucket.Spec.RetentionPolicy = bucketClass.RetentionPolicy bucket.Spec.AnonymousAccessMode = bucketClass.AnonymousAccessMode diff --git a/pkg/bucketrequest/bucketrequest_test.go b/pkg/bucketrequest/bucketrequest_test.go index 87057e55..0914aba8 100644 --- a/pkg/bucketrequest/bucketrequest_test.go +++ b/pkg/bucketrequest/bucketrequest_test.go @@ -40,6 +40,7 @@ var bucketRequest1 = types.BucketRequest{ ObjectMeta: metav1.ObjectMeta{ Name: "bucketrequest1", Namespace: "default", + UID: "12345-67890", }, Spec: types.BucketRequestSpec{ BucketPrefix: "cosi", @@ -59,6 +60,7 @@ var bucketRequest2 = types.BucketRequest{ ObjectMeta: metav1.ObjectMeta{ Name: "bucketrequest2", Namespace: "default", + UID: "abcde-fghijk", }, Spec: types.BucketRequestSpec{ BucketPrefix: "cosi", From 11dd1df2bdf22f82da0ee39048adba03763aed01 Mon Sep 17 00:00:00 2001 From: wlan0 Date: Tue, 12 Jan 2021 21:24:07 -0800 Subject: [PATCH 141/242] fix rbac rules and check for errors getting bucketclass --- .../bucketaccessrequest.go | 73 ++++++++++++------- .../bucketaccessrequest_test.go | 3 + pkg/bucketrequest/bucketrequest.go | 13 ++-- pkg/util/util.go | 19 ++--- resources/deployment.yaml | 2 + resources/rbac.yaml | 10 ++- 6 files changed, 77 insertions(+), 43 deletions(-) diff --git a/pkg/bucketaccessrequest/bucketaccessrequest.go b/pkg/bucketaccessrequest/bucketaccessrequest.go index 48cebc99..36ba7852 100644 --- a/pkg/bucketaccessrequest/bucketaccessrequest.go +++ b/pkg/bucketaccessrequest/bucketaccessrequest.go @@ -4,14 +4,15 @@ import ( "context" v1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + kubeclientset "k8s.io/client-go/kubernetes" + "k8s.io/client-go/util/retry" "github.com/kubernetes-sigs/container-object-storage-interface-api/apis/objectstorage.k8s.io/v1alpha1" bucketclientset "github.com/kubernetes-sigs/container-object-storage-interface-api/clientset" bucketcontroller "github.com/kubernetes-sigs/container-object-storage-interface-api/controller" "github.com/kubernetes-sigs/container-object-storage-interface-controller/pkg/util" - kubeclientset "k8s.io/client-go/kubernetes" - "k8s.io/client-go/util/retry" "github.com/golang/glog" ) @@ -41,9 +42,6 @@ func (b *bucketAccessRequestListener) Add(ctx context.Context, obj *v1alpha1.Buc if err != nil { // Provisioning is 100% finished / not in progress. switch err { - case util.ErrInvalidBucketAccessClass: - glog.V(1).Infof("BucketAccessClass specified does not exist while processing BucketAccessRequest %v.", bucketAccessRequest.Name) - err = nil case util.ErrBucketAccessAlreadyExists: glog.V(1).Infof("BucketAccess already exist for this BucketAccessRequest %v.", bucketAccessRequest.Name) err = nil @@ -73,26 +71,40 @@ func (b *bucketAccessRequestListener) Delete(ctx context.Context, obj *v1alpha1. // or a special error errBucketAccessAlreadyExists, errInvalidBucketAccessClass is returned when provisioning was impossible and // no further attempts to provision should be tried. func (b *bucketAccessRequestListener) provisionBucketAccess(ctx context.Context, bucketAccessRequest *v1alpha1.BucketAccessRequest) error { - bucketAccessClassName := bucketAccessRequest.Spec.BucketAccessClassName - - bucketaccess := b.FindBucketAccess(ctx, bucketAccessRequest) - if bucketaccess != nil { - // bucketaccess has provisioned, nothing to do. - return util.ErrBucketAccessAlreadyExists + baClient := b.bucketClient.ObjectstorageV1alpha1().BucketAccesses() + bacClient := b.bucketClient.ObjectstorageV1alpha1().BucketAccessClasses() + brClient := b.bucketClient.ObjectstorageV1alpha1().BucketRequests + barClient := b.bucketClient.ObjectstorageV1alpha1().BucketAccessRequests + coreClient := b.kubeClient.CoreV1() + + name := string(bucketAccessRequest.GetUID()) + _, err := baClient.Get(ctx, name, metav1.GetOptions{}) + if err != nil { + // anything other than 404 + if !errors.IsNotFound(err) { + glog.Errorf("error fetching bucketaccess: %v", err) + return err + } + } else { // if bucket found + return nil } - bucketAccessClass, err := b.bucketClient.ObjectstorageV1alpha1().BucketAccessClasses().Get(ctx, bucketAccessClassName, metav1.GetOptions{}) - if bucketAccessClass == nil { + bucketAccessClassName := bucketAccessRequest.Spec.BucketAccessClassName + bucketAccessClass, err := bacClient.Get(ctx, bucketAccessClassName, metav1.GetOptions{}) + if err != nil { // bucket access class is invalid or not specified, cannot continue with provisioning. + glog.Errorf("error fetching bucketaccessclass [%v]: %v", bucketAccessClassName, err) return util.ErrInvalidBucketAccessClass } - bucketRequest, err := b.bucketClient.ObjectstorageV1alpha1().BucketRequests(bucketAccessRequest.Namespace).Get(ctx, bucketAccessRequest.Spec.BucketRequestName, metav1.GetOptions{}) - if bucketRequest == nil { - // bucket request does not exist, we have to reject this provision. - return util.ErrInvalidBucketRequest + brName := bucketAccessRequest.Spec.BucketRequestName + // TODO: catch this in a admission controller + if brName == "" { + return util.ErrInvalidBucketAccessRequest } + bucketRequest, err := brClient(bucketAccessRequest.Namespace).Get(ctx, brName, metav1.GetOptions{}) if err != nil { + glog.Errorf("error fetching bucket request [%v]: %v", brName, err) return err } @@ -100,23 +112,29 @@ func (b *bucketAccessRequestListener) provisionBucketAccess(ctx context.Context, return util.ErrWaitForBucketProvisioning } - sa, err := b.kubeClient.CoreV1().ServiceAccounts(bucketAccessRequest.Namespace).Get(ctx, bucketAccessRequest.Spec.ServiceAccountName, metav1.GetOptions{}) - if err != nil { - return err + saName := bucketAccessRequest.Spec.ServiceAccountName + sa := &v1.ServiceAccount{} + if saName != "" { + sa, err = coreClient.ServiceAccounts(bucketAccessRequest.Namespace).Get(ctx, saName, metav1.GetOptions{}) + if err != nil { + return err + } } - bucketaccess = &v1alpha1.BucketAccess{} - bucketaccess.Name = util.GetUUID() + bucketaccess := &v1alpha1.BucketAccess{} + bucketaccess.Name = name bucketaccess.Spec.BucketInstanceName = bucketRequest.Spec.BucketInstanceName bucketaccess.Spec.BucketAccessRequest = &v1.ObjectReference{ Name: bucketAccessRequest.Name, Namespace: bucketAccessRequest.Namespace, - UID: bucketAccessRequest.ObjectMeta.UID} + UID: bucketAccessRequest.ObjectMeta.UID, + } bucketaccess.Spec.ServiceAccount = &v1.ObjectReference{ Name: sa.Name, Namespace: sa.Namespace, - UID: sa.ObjectMeta.UID} + UID: sa.ObjectMeta.UID, + } // bucketaccess.Spec.MintedSecretName - set by the driver bucketaccess.Spec.PolicyActionsConfigMapData, err = util.ReadConfigData(b.kubeClient, bucketAccessClass.PolicyActionsConfigMap) if err != nil { @@ -126,14 +144,17 @@ func (b *bucketAccessRequestListener) provisionBucketAccess(ctx context.Context, bucketaccess.Spec.Provisioner = bucketAccessClass.Provisioner bucketaccess.Spec.Parameters = util.CopySS(bucketAccessClass.Parameters) - bucketaccess, err = b.bucketClient.ObjectstorageV1alpha1().BucketAccesses().Create(context.Background(), bucketaccess, metav1.CreateOptions{}) + bucketaccess, err = baClient.Create(context.Background(), bucketaccess, metav1.CreateOptions{}) if err != nil { + if errors.IsAlreadyExists(err) { + return nil + } return err } err = retry.RetryOnConflict(retry.DefaultRetry, func() error { bucketAccessRequest.Spec.BucketAccessName = bucketaccess.Name - _, err := b.bucketClient.ObjectstorageV1alpha1().BucketAccessRequests(bucketAccessRequest.Namespace).Update(ctx, bucketAccessRequest, metav1.UpdateOptions{}) + _, err := barClient(bucketAccessRequest.Namespace).Update(ctx, bucketAccessRequest, metav1.UpdateOptions{}) if err != nil { return err } diff --git a/pkg/bucketaccessrequest/bucketaccessrequest_test.go b/pkg/bucketaccessrequest/bucketaccessrequest_test.go index 73834949..d9b77f12 100644 --- a/pkg/bucketaccessrequest/bucketaccessrequest_test.go +++ b/pkg/bucketaccessrequest/bucketaccessrequest_test.go @@ -68,6 +68,7 @@ var bucketRequest1 = types.BucketRequest{ ObjectMeta: metav1.ObjectMeta{ Name: "bucketrequest1", Namespace: "default", + UID: "br-12345", }, Spec: types.BucketRequestSpec{ BucketPrefix: "cosi", @@ -88,6 +89,7 @@ var bucketAccessRequest1 = types.BucketAccessRequest{ ObjectMeta: metav1.ObjectMeta{ Name: "bucketaccessrequest1", Namespace: "default", + UID: "bar-12345", }, Spec: types.BucketAccessRequestSpec{ ServiceAccountName: "sa1", @@ -104,6 +106,7 @@ var bucketAccessRequest2 = types.BucketAccessRequest{ ObjectMeta: metav1.ObjectMeta{ Name: "bucketaccessrequest2", Namespace: "default", + UID: "bar-67890", }, Spec: types.BucketAccessRequestSpec{ ServiceAccountName: "sa2", diff --git a/pkg/bucketrequest/bucketrequest.go b/pkg/bucketrequest/bucketrequest.go index f14898ec..12268455 100644 --- a/pkg/bucketrequest/bucketrequest.go +++ b/pkg/bucketrequest/bucketrequest.go @@ -37,7 +37,7 @@ func (b *bucketRequestListener) InitializeBucketClient(bc bucketclientset.Interf // Add creates a bucket in response to a bucketrequest func (b *bucketRequestListener) Add(ctx context.Context, obj *v1alpha1.BucketRequest) error { - glog.V(1).Infof("Add called for BucketRequest %s", obj.Name) + glog.V(3).Infof("Add called for BucketRequest %s", obj.Name) bucketRequest := obj err := b.provisionBucketRequestOperation(ctx, bucketRequest) if err != nil { @@ -61,13 +61,13 @@ func (b *bucketRequestListener) Add(ctx context.Context, obj *v1alpha1.BucketReq // update processes any updates made to the bucket request func (b *bucketRequestListener) Update(ctx context.Context, old, new *v1alpha1.BucketRequest) error { - glog.V(1).Infof("Update called for BucketRequest %v", old.Name) + glog.V(3).Infof("Update called for BucketRequest %v", old.Name) return nil } // Delete processes a bucket for which bucket request is deleted func (b *bucketRequestListener) Delete(ctx context.Context, obj *v1alpha1.BucketRequest) error { - glog.V(1).Infof("Delete called for BucketRequest %v", obj.Name) + glog.V(3).Infof("Delete called for BucketRequest %v", obj.Name) return nil } @@ -81,8 +81,8 @@ func (b *bucketRequestListener) provisionBucketRequestOperation(ctx context.Cont bucketClassName := b.GetBucketClass(bucketRequest) bucketClass, err := b.bucketClient.ObjectstorageV1alpha1().BucketClasses().Get(ctx, bucketClassName, metav1.GetOptions{}) - if bucketClass == nil { - // bucketclass does not exist in order to create a bucket + if err != nil { + glog.Errorf("error getting bucketclass: [%v] %v", bucketClassName, err) return util.ErrInvalidBucketClass } @@ -123,6 +123,9 @@ func (b *bucketRequestListener) provisionBucketRequestOperation(ctx context.Cont bucket, err = b.bucketClient.ObjectstorageV1alpha1().Buckets().Create(context.Background(), bucket, metav1.CreateOptions{}) if err != nil { + if errors.IsAlreadyExists(err) { + return nil + } glog.V(5).Infof("Error occurred when creating Bucket %v", err) return err } diff --git a/pkg/util/util.go b/pkg/util/util.go index 14a8cede..28edfeac 100644 --- a/pkg/util/util.go +++ b/pkg/util/util.go @@ -37,15 +37,16 @@ import ( var ( // Error codes that the central controller will return - ErrBucketAlreadyExists = errors.New("A bucket already existing that matches the bucket request") - ErrInvalidBucketClass = errors.New("Cannot find bucket class with the name specified in the bucket request") - ErrBucketAccessAlreadyExists = errors.New("A bucket access already existing that matches the bucket access request") - ErrInvalidBucketAccessClass = errors.New("Cannot find bucket access class with the name specified in the bucket access request") - ErrInvalidBucketRequest = errors.New("Invalid bucket request specified in the bucket access request") - ErrWaitForBucketProvisioning = errors.New("Bucket instance specified in the bucket request is not available to provision bucket access") - ErrBCUnavailable = errors.New("BucketClass is not available") - ErrNotImplemented = errors.New("Operation Not Implemented") - ErrNilConfigMap = errors.New("ConfigMap cannot be nil") + ErrBucketAlreadyExists = errors.New("A bucket already existing that matches the bucket request") + ErrInvalidBucketClass = errors.New("Cannot find bucket class with the name specified in the bucket request") + ErrBucketAccessAlreadyExists = errors.New("A bucket access already existing that matches the bucket access request") + ErrInvalidBucketAccessClass = errors.New("Cannot find bucket access class with the name specified in the bucket access request") + ErrInvalidBucketRequest = errors.New("Invalid bucket request specified in the bucket access request") + ErrInvalidBucketAccessRequest = errors.New("Invalid bucket access request specified") + ErrWaitForBucketProvisioning = errors.New("Bucket instance specified in the bucket request is not available to provision bucket access") + ErrBCUnavailable = errors.New("BucketClass is not available") + ErrNotImplemented = errors.New("Operation Not Implemented") + ErrNilConfigMap = errors.New("ConfigMap cannot be nil") ) func CopySS(m map[string]string) map[string]string { diff --git a/resources/deployment.yaml b/resources/deployment.yaml index ac8fc2a7..c48e7487 100644 --- a/resources/deployment.yaml +++ b/resources/deployment.yaml @@ -32,3 +32,5 @@ spec: containers: - name: objectstorage-controller image: quay.io/containerobjectstorage/objectstorage-controller:latest + args: + - "--v=5" diff --git a/resources/rbac.yaml b/resources/rbac.yaml index 7ebebfe4..9b554c3c 100644 --- a/resources/rbac.yaml +++ b/resources/rbac.yaml @@ -12,16 +12,20 @@ metadata: rules: - apiGroups: ["objectstorage.k8s.io"] resources: ["bucketrequests", "bucketaccessrequests"] - verbs: ["get", "list", "watch"] + verbs: ["get", "list", "watch", "update"] - apiGroups: ["objectstorage.k8s.io"] - resources: ["buckets", "bucketaccess"] + resources: ["buckets", "bucketaccesses"] verbs: ["get", "list", "watch", "update", "create", "delete"] - apiGroups: ["objectstorage.k8s.io"] - resources: ["bucketclass","bucketaccessclass"] + resources: ["bucketclasses","bucketaccessclasses"] verbs: ["get", "list"] - apiGroups: [""] resources: ["events"] verbs: ["list", "watch", "create", "update", "patch"] +- apiGroups: [""] + resources: ["configmaps", "serviceaccounts"] + verbs: ["list", "get"] + --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 From aa1ed3d8068023ec5031c344d387f31547b52833 Mon Sep 17 00:00:00 2001 From: Srini Brahmaroutu Date: Tue, 19 Jan 2021 18:21:19 -0800 Subject: [PATCH 142/242] Fixing build for the api changes to Protocol --- go.mod | 2 +- go.sum | 4 ++-- .../bucketaccessrequest_test.go | 6 +----- pkg/bucketrequest/bucketrequest.go | 4 +--- pkg/bucketrequest/bucketrequest_test.go | 14 +++----------- 5 files changed, 8 insertions(+), 22 deletions(-) diff --git a/go.mod b/go.mod index d4d0ac5f..b5bacae4 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/google/uuid v1.1.2 // indirect github.com/gopherjs/gopherjs v0.0.0-20190328170749-bb2674552d8f // indirect github.com/kr/text v0.2.0 // indirect - github.com/kubernetes-sigs/container-object-storage-interface-api v0.0.0-20201210173615-0c3244fa34b9 + github.com/kubernetes-sigs/container-object-storage-interface-api v0.0.0-20210120011359-1e91ae41e243 github.com/mailru/easyjson v0.7.6 // indirect github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect diff --git a/go.sum b/go.sum index df32efaa..a5f29fe3 100644 --- a/go.sum +++ b/go.sum @@ -303,8 +303,8 @@ github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kubernetes-sigs/container-object-storage-interface-api v0.0.0-20201210173615-0c3244fa34b9 h1:1Zmlu1GKd1iIv9fdc1mkaTuUtoNqet4NLYLE/8p9ylw= -github.com/kubernetes-sigs/container-object-storage-interface-api v0.0.0-20201210173615-0c3244fa34b9/go.mod h1:C7tjzC+nLe7H7+3UM/Z6a7F24yxOO8FSK3ZaVZrKDPQ= +github.com/kubernetes-sigs/container-object-storage-interface-api v0.0.0-20210120011359-1e91ae41e243 h1:iOEsQYg/QXxzYP10JaLtoQWdlGG3OS/a3sOYsrDXwdE= +github.com/kubernetes-sigs/container-object-storage-interface-api v0.0.0-20210120011359-1e91ae41e243/go.mod h1:C7tjzC+nLe7H7+3UM/Z6a7F24yxOO8FSK3ZaVZrKDPQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= diff --git a/pkg/bucketaccessrequest/bucketaccessrequest_test.go b/pkg/bucketaccessrequest/bucketaccessrequest_test.go index d9b77f12..3cbf2ee6 100644 --- a/pkg/bucketaccessrequest/bucketaccessrequest_test.go +++ b/pkg/bucketaccessrequest/bucketaccessrequest_test.go @@ -71,11 +71,7 @@ var bucketRequest1 = types.BucketRequest{ UID: "br-12345", }, Spec: types.BucketRequestSpec{ - BucketPrefix: "cosi", - Protocol: types.RequestedProtocol{ - Name: "s3", - Version: "", - }, + BucketPrefix: "cosi", BucketClassName: "classgold", BucketInstanceName: "cosi1234567890", }, diff --git a/pkg/bucketrequest/bucketrequest.go b/pkg/bucketrequest/bucketrequest.go index 12268455..b5e2099d 100644 --- a/pkg/bucketrequest/bucketrequest.go +++ b/pkg/bucketrequest/bucketrequest.go @@ -116,11 +116,9 @@ func (b *bucketRequestListener) provisionBucketRequestOperation(ctx context.Cont Namespace: bucketRequest.Namespace, UID: bucketRequest.ObjectMeta.UID} bucket.Spec.AllowedNamespaces = util.CopyStrings(bucketClass.AllowedNamespaces) + bucket.Spec.Protocol = *bucketClass.Protocol.DeepCopy() bucket.Spec.Parameters = util.CopySS(bucketClass.Parameters) - // TODO have a switch statement to populate appropriate protocol based on BR.Protocol - bucket.Spec.Protocol.RequestedProtocol = bucketRequest.Spec.Protocol - bucket, err = b.bucketClient.ObjectstorageV1alpha1().Buckets().Create(context.Background(), bucket, metav1.CreateOptions{}) if err != nil { if errors.IsAlreadyExists(err) { diff --git a/pkg/bucketrequest/bucketrequest_test.go b/pkg/bucketrequest/bucketrequest_test.go index 0914aba8..8134e63a 100644 --- a/pkg/bucketrequest/bucketrequest_test.go +++ b/pkg/bucketrequest/bucketrequest_test.go @@ -28,7 +28,7 @@ var goldClass = types.BucketClass{ }, AllowedNamespaces: []string{"default", "cosins"}, Parameters: classGoldParameters, - Protocol: "s3", + Protocol: types.Protocol{Name: "s3"}, IsDefaultBucketClass: false, } @@ -43,11 +43,7 @@ var bucketRequest1 = types.BucketRequest{ UID: "12345-67890", }, Spec: types.BucketRequestSpec{ - BucketPrefix: "cosi", - Protocol: types.RequestedProtocol{ - Name: "s3", - Version: "", - }, + BucketPrefix: "cosi", BucketClassName: "classgold", }, } @@ -63,11 +59,7 @@ var bucketRequest2 = types.BucketRequest{ UID: "abcde-fghijk", }, Spec: types.BucketRequestSpec{ - BucketPrefix: "cosi", - Protocol: types.RequestedProtocol{ - Name: "s3", - Version: "", - }, + BucketPrefix: "cosi", BucketClassName: "classgold", }, } From 4def7c80327e5a0b42c6b7a976f174404a2e05db Mon Sep 17 00:00:00 2001 From: Srini Brahmaroutu Date: Mon, 11 Jan 2021 22:59:30 -0800 Subject: [PATCH 143/242] Adding COSI spec documentation --- .gitignore | 3 +- cosicomponents.png | Bin 0 -> 184799 bytes spec.md | 582 ++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 579 insertions(+), 6 deletions(-) create mode 100644 cosicomponents.png diff --git a/.gitignore b/.gitignore index 72550517..6bf2a963 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,5 @@ protoc protoc-gen-go cosi.a .protoc -.idea \ No newline at end of file +.idea +.project diff --git a/cosicomponents.png b/cosicomponents.png new file mode 100644 index 0000000000000000000000000000000000000000..6c852a333e4c8e9bf03e15868566bacc21b87fe7 GIT binary patch literal 184799 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

IH7~hS%?NH1-(JgqHG)8F0 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 n_k`wAx@M?s<}&;8l;Oq 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 literal 0 HcmV?d00001 diff --git a/spec.md b/spec.md index 5adef41b..1684a5f6 100644 --- a/spec.md +++ b/spec.md @@ -1,12 +1,13 @@ -#Container Object Storage Interface (COSI) - - +# Container Object Storage Interface (COSI) Authors: -TODO put authors' names and emails here. +* Sidharth Mani << @wlan0 +* Jeff Vance << @jeffvance +* Srini Brahmaroutu << @brahmaroutu + -##Notational Conventions +## Notational Conventions The keywords "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" are to be interpreted as described in [RFC 2119](http://tools.ietf.org/html/rfc2119) (Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, March 1997). @@ -15,4 +16,575 @@ The key words "unspecified", "undefined", and "implementation-defined" are to be An implementation is not compliant if it fails to satisfy one or more of the MUST, REQUIRED, or SHALL requirements for the protocols it implements. An implementation is compliant if it satisfies all the MUST, REQUIRED, and SHALL requirements for the protocols it implements. +## Terminology + +| Term | Definition | +|-------------------|--------------------------------------------------| +| Bucket | A flat organization that contains immutable objects. | +| Brownfield Bucket | An existing back-end bucket. | +| Greenfield Bucket | A new back-end bucket created by COSI. | +|COSI System | Container Orchestration system/ Container Object Storage Implementation, communicates with Plugins using COSI service RPCs. | +| SP | Object Storage Provider, the vendor of a COSI plugin implementation. | +| CO | Container Orchestrator, like Kubernetes. | +| RPC/gRPC | [Remote Procedure Call](https://en.wikipedia.org/wiki/Remote_procedure_call). | +| Node | A host where the user workload will be running, uniquely identifiable from the perspective of a Plugin by a node ID. | +| COSI Driver(aka Plugin) | Aka “plugin implementation”, a gRPC endpoint that implements the COSI Services. | +| Sidecar (aka Provisioner Sidecar) | A COSI process that interfaces with the Plugin. | +|COSI Node Adapter (aka CSI Driver) | A process that accepts gRPC calls from the Kubelet notifying it when the workload has been started and when it is terminating. | +| Provisioner | A generic term meant to describe the combination of a sidecar and COSI driver. "Provisioning" a bucket can mean creating a new bucket or granting access to an existing bucket. | +| Workload | The atomic unit of "work" scheduled by a COSI System. This MAY be a container or a collection of containers. | + +## Objective + +To define a standard “Container Object Storage Interface” (COSI) that enables a storage vendor (SP) to develop an RPC-based plugin once and have it work across multiple Kubernetes clusters and on other COs. + +### Goals in MVP + +The Container Object Storage Interface (COSI) will: + +* Enable SP authors to write one COSI compliant RPC Plugin that “just works” across all COs that implement COSI. +* Define API (RPCs) that enable: + * Dynamic provisioning and de-provisioning of a bucket. + * Ability to define bucket access control mechanisms + * Consumption of both existing and new buckets created on SP. + * Define plugin protocol recommendations. + * Describe a process by which an admin configures a Plugin. + * COSI deployments and templates. + +### Non-Goals in MVP + +The Container Object Storage Interface (COSI) spec explicitly will not define, provide, or dictate: + +* Specific mechanisms by which a Provisioner Sidecar manages the lifecycle of a Plugin, including: + * How to deploy, install, upgrade, uninstall, monitor, or respawn (in case of unexpected termination) Plugins. +* A first class message structure/field to represent "grades of object storage" (aka "bucket class"). +* Protocol-level authentication and authorization. +* Packaging of a Plugin. + +## Solution Overview + +This specification defines an interface along with the minimum operational and packaging recommendations for a storage provider (SP) to implement a COSI compatible plugin. +The interface declares the RPCs that a plugin MUST expose: this is the **primary focus** of the COSI specification. +Any operational and packaging recommendations offer additional guidance to promote cross-COSI system compatibility. + +### Architecture + +The primary focus of this specification is on the RPC **protocol** between a COSI System and a Plugin. +It SHOULD be possible to ship cross-COSI system compatible Plugins for a variety of deployment architectures. +A COSI system SHOULD be equipped to handle both centralized and headless plugins. +Interaction of these components is illustrated in the figure below. + +``` + COSI System "Master" Host ++-------------------------------------------+ +| | +| +------------+ +------------+ | +| | COSI | gRPC | Controller | | +| | System +-----------> Plugin | | +| +------------+ +------------+ | +| | ++-------------------------------------------+ + +``` +Figure 1: Plugin deployment, all of the COSI system Node hosts run Plugins. + + +![Cosi Components](cosicomponents.png) + +Figure 2: Kubernetes implementation - Interaction of COSI components + +### Bucket Lifecycle + +``` + CreateBucket +-------------+ DeleteBucket + +------------->| CREATED +--------------+ + | +---+----^---+ | + | Grant | | Revoke v + +++ Bucket | | Bucket +++ + |X| Access | | Access | | + +-+ +---v----+---+ +-+ + | BOUND | + +---+----^---+ + +``` +Figure 3: The lifecycle of a dynamically provisioned bucket, from +creation to deletion. +``` + +The above diagrams illustrate a general expectation with respect to how a COSI system MAY manage the lifecycle of a bucket via the API presented in this specification. +Plugins SHOULD expose all RPCs for an interface: Controller plugins SHOULD implement all RPCs for the service. +Unsupported RPCs SHOULD return an appropriate error code that indicates such (e.g. `UNIMPLEMENTED`). + +## Container Object Storage Interface + +This section describes the interface between COSI systems and Plugins. + +### RPC Interface + +A CO interacts with an Plugin through RPCs. +Each SP MUST provide: + +* **Plugin**: A gRPC endpoint serving COSI RPCs that MUST be run on the Node. + +```protobuf +syntax = "proto3"; +package cosi.v1alpha1; + +import "google/protobuf/descriptor.proto"; + +option go_package = "cosi"; + +extend google.protobuf.EnumOptions { + // Indicates that this enum is OPTIONAL and part of an experimental + // API that may be deprecated and eventually removed between minor + // releases. + bool alpha_enum = 1060; +} + +extend google.protobuf.EnumValueOptions { + // Indicates that this enum value is OPTIONAL and part of an + // experimental API that may be deprecated and eventually removed + // between minor releases. + bool alpha_enum_value = 1060; +} + +extend google.protobuf.FieldOptions { + // Indicates that a field MAY contain information that is sensitive + // and MUST be treated as such (e.g. not logged). + bool cosi_secret = 1059; + + // Indicates that this field is OPTIONAL and part of an experimental + // API that may be deprecated and eventually removed between minor + // releases. + bool alpha_field = 1060; +} + +extend google.protobuf.MessageOptions { + // Indicates that this message is OPTIONAL and part of an experimental + // API that may be deprecated and eventually removed between minor + // releases. + bool alpha_message = 1060; +} + +extend google.protobuf.MethodOptions { + // Indicates that this method is OPTIONAL and part of an experimental + // API that may be deprecated and eventually removed between minor + // releases. + bool alpha_method = 1060; +} + +extend google.protobuf.ServiceOptions { + // Indicates that this service is OPTIONAL and part of an experimental + // API that may be deprecated and eventually removed between minor + // releases. + bool alpha_service = 1060; +} + +service Provisioner { + // This call is meant to retrieve the unique provisioner Identity. + // This identity will have to be set in BucketRequest.Provisioner field in order to invoke this specific provisioner. + rpc ProvisionerGetInfo (ProvisionerGetInfoRequest) returns (ProvisionerGetInfoResponse) {} + + // This call is made to create the bucket in the backend. + // This call is idempotent + // 1. If a bucket that matches both name and parameters already exists, then OK (success) must be returned. + // 2. If a bucket by same name, but different parameters is provided, then the appropriate error code ALREADY_EXISTS must be returned. + rpc ProvisionerCreateBucket (ProvisionerCreateBucketRequest) returns (ProvisionerCreateBucketResponse) {} + // This call is made to delete the bucket in the backend. + // If the bucket has already been deleted, then no error should be returned. + rpc ProvisionerDeleteBucket (ProvisionerDeleteBucketRequest) returns (ProvisionerDeleteBucketResponse) {} + + // This call grants access to a particular principal. The principal is the account for which this access should be granted. + // If the principal is set, then it should be used as the username of the created credentials. + // If the principal is empty, then a new service account should be created in the backend that satisfies the requested access_policy. + // The principal returned in the response will be used as the unique identifier for deleting this access by calling ProvisionerRevokeBucketAccess. + rpc ProvisionerGrantBucketAccess (ProvisionerGrantBucketAccessRequest) returns (ProvisionerGrantBucketAccessResponse); + // This call revokes all access to a particular bucket from a principal. + rpc ProvisionerRevokeBucketAccess (ProvisionerRevokeBucketAccessRequest) returns (ProvisionerRevokeBucketAccessResponse); +} + +message ProvisionerGetInfoRequest { + // Intentionally left blank +} + +message ProvisionerGetInfoResponse { + // This field is REQUIRED + // The name MUST follow domain name notation format + // (https://tools.ietf.org/html/rfc1035#section-2.3.1). It SHOULD + // include the plugin's host company name and the plugin name, + // to minimize the possibility of collisions. It MUST be 63 + // characters or less, beginning and ending with an alphanumeric + // character ([a-z0-9A-Z]) with dashes (-), dots (.), and + // alphanumerics between. + string name = 1; +} + +message ProvisionerCreateBucketRequest { + // This field is REQUIRED + // Bucket name. + string bucket_name = 1; + + // This field is OPTIONAL + // Protocol specific information required by the call is passed in as key,value pairs. + map bucket_context = 2; + + enum AnonymousBucketAccessMode { + // Default, disallow uncredentialed access to the backend storage. + BUCKET_PRIVATE = 0; + // Read only, uncredentialed users can call ListBucket and GetObject. + BUCKET_READ_ONLY = 1; + // Write only, uncredentialed users can only call PutObject. + BUCKET_WRITE_ONLY = 2; + // Read/Write, same as ro with the addition of PutObject being allowed. + BUCKET_READ_WRITE = 3; + } + + // This field is OPTIONAL + // Allow uncredentialed access to bucket. + AnonymousBucketAccessMode anonymous_bucket_access_mode = 3; +} + +message ProvisionerCreateBucketResponse { + // Intentionally left blank +} + +message ProvisionerDeleteBucketRequest { + // This field is REQUIRED + // Bucket name. + string bucket_name = 1; + + // This field is OPTIONAL + // Protocol specific information required by the call is passed in as key,value pairs. + map bucket_context = 2; +} + +message ProvisionerDeleteBucketResponse { + // Intentionally left blank +} + +message ProvisionerGrantBucketAccessRequest { + // This field is REQUIRED + // Bucket name. + string bucket_name = 1; + + // This field is OPTIONAL + // Protocol specific information required by the call is passed in as key,value pairs. + map bucket_context = 2; + + // This field is OPTIONAL + // Principal for which access is requested + string principal = 3; + + // This field is REQUIRED + // Requested Access policy, ex: {"Effect":"Allow","Action":"s3:PutObject","Resource":"arn:aws:s3:::profilepics/*"} + string access_policy = 4; +} + +message ProvisionerGrantBucketAccessResponse { + // This field is OPTIONAL + // This is the account that is being provided access. This will + // be required later to revoke access. + string principal = 1; + + // This field is OPTIONAL + // Contents of the credential file, ex: aws access key id and secret, etc. + string credentials_file_contents = 2; + + // This field is OPTIONAL + // Path where the credential file will be mounted. + string credentials_file_path = 3; +} + +message ProvisionerRevokeBucketAccessRequest { + // This field is REQUIRED + // Bucket name. + string bucket_name = 1; + + // This field is OPTIONAL + // Protocol specific information required by the call is passed in as key,value pairs. + map bucket_context = 2; + + // This field is REQUIRED + // This is the account that is being revoked access. + string principal = 3; +} + +message ProvisionerRevokeBucketAccessResponse { + // Intentionally left blank +} + +``` + +#### Concurrency + +In general the Cluster Orchestrator (CO) is responsible for ensuring that there is no more than one call “in-flight” per Bucket at a given time. +Multiple calls to CreateBucket may result in error 'ALREADY_EXISTS' if the call succeeded early. Similarly DeleteBucket, GrantBucketAccess, RevokeBucketAccess will behave the same. + + +#### Field Requirements + +The requirements documented herein apply equally and without exception, unless otherwise noted, for the fields of all protobuf message types defined by this specification. +Violation of these requirements MAY result in RPC message data that is not compatible with all COSI systems, Plugin, and/or COSI middleware implementations. + +##### Size Limits + +COSI defines general size limits for fields of various types (see table below). +The general size limit for a particular field MAY be overridden by specifying a different size limit in said field's description. +Unless otherwise specified, fields SHALL NOT exceed the limits documented here. +These limits apply for messages generated by both COSI systems and plugins. + +| Size | Field Type | +|------------|---------------------| +| 128 bytes | string | +| 4 KiB | map | + +##### `REQUIRED` vs. `OPTIONAL` + +* A field noted as `REQUIRED` MUST be specified, subject to any per-RPC caveats; caveats SHOULD be rare. +* A `repeated` or `map` field listed as `REQUIRED` MUST contain at least 1 element. +* A field noted as `OPTIONAL` MAY be specified and the specification SHALL clearly define expected behavior for the default, zero-value of such fields. + +Scalar fields, even REQUIRED ones, will be defaulted if not specified and any field set to the default value will not be serialized over the wire as per [proto3](https://developers.google.com/protocol-buffers/docs/proto3#default). + +#### Timeouts + +Any of the RPCs defined in this spec MAY timeout and MAY be retried. +The COSI system MAY choose the maximum time it is willing to wait for a call, how long it waits between retries, and how many time it retries (these values are not negotiated between plugin and COSI system). + +Idempotency requirements ensure that a retried call with the same fields continues where it left off when retried. +The only way to cancel a call is to issue a "negation" call if one exists. +For example, issue a `DeleteBucket` call to cancel a pending `CreateBucket` operation, etc. + +### Error Scheme + +All COSI API calls defined in this spec MUST return a [standard gRPC status](https://github.com/grpc/grpc/blob/master/src/proto/grpc/status/status.proto). +Most gRPC libraries provide helper methods to set and read the status fields. + +The status `code` MUST contain a [canonical error code](https://github.com/grpc/grpc-go/blob/master/codes/codes.go). COSI systems MUST handle all valid error codes. Each RPC defines a set of gRPC error codes that MUST be returned by the plugin when specified conditions are encountered. In addition to those, if the conditions defined below are encountered, the plugin MUST return the associated gRPC error code. + +| Condition | gRPC Code | Description | Recovery Behavior | +|-----------|-----------|-------------|-------------------| +| Missing required field | 3 MISSING_ARGUMENT | Indicates that a required field is missing from the request. More human-readable information MAY be provided in the `status.message` field. | Caller MUST fix the request by adding the missing required field before retrying. | +| Invalid or unsupported field in the request | 3 INVALID_ARGUMENT | Indicates that the one or more fields in this field is either not allowed by the Plugin or has an invalid value. More human-readable information MAY be provided in the gRPC `status.message` field. | Caller MUST fix the field before retrying. | +| Permission denied | 7 PERMISSION_DENIED | The Plugin is able to derive or otherwise infer an identity from the secrets present within an RPC, but that identity does not have permission to invoke the RPC. | System administrator SHOULD ensure that requisite permissions are granted, after which point the caller MAY retry the attempted RPC. | +| Operation pending for bucket | 10 ABORTED | Indicates that there is already an operation pending for the specified bucket. In general the Cluster Orchestrator (CO) is responsible for ensuring that there is no more than one call "in-flight" per bucket at a given time. However, in some circumstances, the COSI system MAY lose state (for example when the COSI system crashes and restarts), and MAY issue multiple calls simultaneously for the same bucket. The Plugin, SHOULD handle this as gracefully as possible, and MAY return this error code to reject secondary calls. | Caller SHOULD ensure that there are no other calls pending for the specified volume, and then retry with exponential back off. | +| Call not implemented | 12 UNIMPLEMENTED | The invoked RPC is not implemented by the Plugin or disabled in the Plugin's current mode of operation. | Caller MUST NOT retry. Caller MAY call `GetPluginInfo` to discover Plugin info. | +| Not authenticated | 16 UNAUTHENTICATED | The invoked RPC does not carry secrets that are valid for authentication. | Caller SHALL either fix the secrets provided in the RPC, or otherwise regalvanize said secrets such that they will pass authentication by the Plugin for the attempted RPC, after which point the caller MAY retry the attempted RPC. | + +The status `message` MUST contain a human readable description of error, if the status `code` is not `OK`. +This string MAY be surfaced by COSI system to end users. + +The status `details` MUST be empty. In the future, this spec MAY require `details` to return a machine-parsable protobuf message if the status `code` is not `OK` to enable COSI system's to implement smarter error handling and fault resolution. + +### Provisioner Service RPC + +Provisioner service RPCs allow a COSI system to query a plugin for information, create and delete bucket as well as grant and revoke access to the bucket to various principals running the workload. +The general flow of the success case MAY be as follows (protos illustrated in YAML for brevity): + +1. COSI system queries metadata via Identity RPC. + +``` + # COSI system --(ProvisionerGetInfo)--> Plugin + request: + response: + name: org.foo.whizbang.super-plugin + version: blue-green + manifest: + baz: qaz +``` +``` +message ProvisionerGetInfoRequest { + // Intentionally left blank +} + +message ProvisionerGetInfoResponse { + string name = 1; + string version = 2; + map manifest = 3; +} +``` + +#### `ProvisionerCreateBucket` + +A Controller Plugin MUST implement this RPC call. +This RPC will be called by the COSI system to provision a new bucket on behalf of a COSI user. + +This operation MUST be idempotent. +If a volume corresponding to the specified bucket `name` already exists, is accessible from `accessibility_requirements, and is compatible with the specified attributes of the bucket in the `ProvisionerCreateBucket`, the Plugin MUST reply `0 OK` with the corresponding `ProvisionerCreateBucketResponse`. + +``` +message ProvisionerCreateBucketRequest { + // Idempotency - This name is generated by the COSI system to achieve + // idempotency. + // This field is REQUIRED. + string bucket_name = 1; + + // This field is OPTIONAL + // Protocol specific information required by the call is passed in as key,value pairs. + map bucket_context = 2; + + enum AnonymousBucketAccessMode { + BUCKET_PRIVATE = 0; + BUCKET_READ_ONLY = 1; + BUCKET_WRITE_ONLY = 2; + BUCKET_READ_WRITE = 3; + } + + // This field is OPTIONAL + // Allow uncredentialed access to bucket. + AnonymousBucketAccessMode anonymous_bucket_access_mode = 3; +} + +message ProvisionerCreateBucketResponse { + // Intentionally left blank +} + +``` +##### CreateBucket Errors + +If the plugin is unable to complete the CreateBucket call successfully, it MUST return a non-ok gRPC code in the gRPC status. +If the conditions defined below are encountered, the plugin MUST return the specified gRPC error code. +The COSI system MUST implement the specified error recovery behavior when it encounters the gRPC error code. + +| Condition | gRPC Code | Description | Recovery Behavior | +|-----------|-----------|-------------|-------------------| +| Bucket Name invalid | 3 INVALID_ARGUMENT | Besides the general cases, this code MUST also be used to indicate when plugin cannot create a bucket due to parameter check on the backend. More human-readable information SHOULD be provided in the gRPC `status.message` field for the problem. | Caller should retry call with corrected parameter values.| +| Bucket already exists but is incompatible | 6 ALREADY_EXISTS | Indicates that a bucket corresponding to the specified bucket `name` already exists but is incompatible with the specified attributes. | Caller MUST fix the arguments or use a different `name` before retrying. | +| Unsupported value | 11 OUT_OF_RANGE | Indicates that the value requested cannot be used to provision the bucket. | Caller MUST fix the attributes before retrying. | + + +### Secrets Requirements (where applicable) + +Secrets MAY be required by plugin to complete a RPC request. +A secret is a string to string map where the key identifies the name of the secret (e.g. "username" or "password"), and the value contains the secret data (e.g. "bob" or "abc123"). +Each key MUST consist of alphanumeric characters, '-', '_' or '.'. +Each value MUST contain a valid string. +An SP MAY choose to accept binary (non-string) data by using a binary-to-text encoding scheme, like base64. +An SP SHALL advertise the requirements for required secret keys and values in documentation. +COSI system SHALL permit passing through the required secrets. +A COSI system MAY pass the same secrets to all RPCs, therefore the keys for all unique secrets that an SP expects MUST be unique across all COSI operations. +This information is sensitive and MUST be treated as such (not logged, etc.) by the COSI system. + + +## Protocol + +### Connectivity + +* A COSI system SHALL communicate with a Plugin using gRPC to access the `Provisioner` service. + * proto3 SHOULD be used with gRPC, as per the [official recommendations](http://www.grpc.io/docs/guides/#protocol-buffer-versions). + * All Plugins SHALL implement the REQUIRED Identity service RPCs. +* The COSI system SHALL provide the listen-address for the Plugin by way of the `COSI_ENDPOINT` environment variable. + Plugin components SHALL create, bind, and listen for RPCs on the specified listen address. + * Only UNIX Domain Sockets MAY be used as endpoints. + This will likely change in a future version of this specification to support non-UNIX platforms. +* All supported RPC services MUST be available at the listen address of the Plugin. + +### Security + +* The COSI system operator and Provisioner Sidecar SHOULD take steps to ensure that any and all communication between the COSI system and Plugin Service are secured according to best practices. +* Communication between a COSI system and a Plugin SHALL be transported over UNIX Domain Sockets. + * gRPC is compatible with UNIX Domain Sockets; it is the responsibility of the COSI system operator and Provisioner Sidecar to properly secure access to the Domain Socket using OS filesystem ACLs and/or other OS-specific security context tooling. + * SP’s supplying stand-alone Plugin controller appliances, or other remote components that are incompatible with UNIX Domain Sockets MUST provide a software component that proxies communication between a UNIX Domain Socket and the remote component(s). + Proxy components transporting communication over IP networks SHALL be responsible for securing communications over such networks. +* Both the COSI system and Plugin SHOULD avoid accidental leakage of sensitive information (such as redacting such information from log files). + +### Debugging + +* Debugging and tracing are supported by external, COSI-independent additions and extensions to gRPC APIs, such as [OpenTracing](https://github.com/grpc-ecosystem/grpc-opentracing). + +## Configuration and Operation + +### General Configuration + +* The `COSI_ENDPOINT` environment variable SHALL be supplied to the Plugin by the Provisioner Sidecar. +* An operator SHALL configure the COSI system to connect to the Plugin via the listen address identified by `COSI_ENDPOINT` variable. +* With exception to sensitive data, Plugin configuration SHOULD be specified by environment variables, whenever possible, instead of by command line flags or bind-mounted/injected files. + + +#### Plugin Bootstrap Example + +* Sidecar -> Plugin: `COSI_ENDPOINT=unix:///path/to/unix/domain/socket.sock`. +* Operator -> COSI system: use plugin at endpoint `unix:///path/to/unix/domain/socket.sock`. +* COSI system: monitor `/path/to/unix/domain/socket.sock`. +* Plugin: read `COSI_ENDPOINT`, create UNIX socket at specified path, bind and listen. +* COSI system: observe that socket now exists, establish connection. +* COSI system: invoke `GetPluginInfo. + +#### Filesystem + +* Plugins SHALL NOT specify requirements that include or otherwise reference directories and/or files on the root filesystem of the COSI system. +* Plugins SHALL NOT create additional files or directories adjacent to the UNIX socket specified by `COSI_ENDPOINT`; violations of this requirement constitute "abuse". + * The Provisioner Sidecar is the ultimate authority of the directory in which the UNIX socket endpoint is created and MAY enforce policies to prevent and/or mitigate abuse of the directory by Plugins. + +### Supervised Lifecycle Management + +* For Plugins packaged in software form: + * Plugin Packages SHOULD use a well-documented container image format (e.g., Docker, OCI). + * The chosen package image format MAY expose configurable Plugin properties as environment variables, unless otherwise indicated in the section below. + Variables so exposed SHOULD be assigned default values in the image manifest. + * A Provisioner Sidecar MAY programmatically evaluate or otherwise scan a Plugin Package’s image manifest in order to discover configurable environment variables. + * A Plugin SHALL NOT assume that an operator or Provisioner Sidecar will scan an image manifest for environment variables. + +#### Environment Variables + +* Variables defined by this specification SHALL be identifiable by their `COSI_` name prefix. +* Configuration properties not defined by the COSI specification SHALL NOT use the same `COSI_` name prefix; this prefix is reserved for common configuration properties defined by the COSI specification. +* The Provisioner Sidecar SHOULD supply all RECOMMENDED COSI environment variables to a Plugin. +* The Provisioner Sidecar SHALL supply all REQUIRED COSI environment variables to a Plugin. + +##### `COSI_ENDPOINT` + +Network endpoint at which a Plugin SHALL host COSI RPC services. The general format is: + + {scheme}://{authority}{endpoint} + +The following address types SHALL be supported by Plugins: + + unix:///path/to/unix/socket.sock + +Note: All UNIX endpoints SHALL end with `.sock`. See [gRPC Name Resolution](https://github.com/grpc/grpc/blob/master/doc/naming.md). + +This variable is REQUIRED. + +#### Operational Recommendations + +The Provisioner Sidecar expects that a Plugin SHALL act as a long-running service vs. an on-demand, CLI-driven process. + +Supervised plugins MAY be isolated and/or resource-bounded. + +##### Logging + +* Plugins SHOULD generate log messages to ONLY standard output and/or standard error. + * In this case the Provisioner Sidecar SHALL assume responsibility for all log lifecycle management. +* Plugin implementations that deviate from the above recommendation SHALL clearly and unambiguously document the following: + * Logging configuration flags and/or variables, including working sample configurations. + * Default log destination(s) (where do the logs go if no configuration is specified?) + * Log lifecycle management ownership and related guidance (size limits, rate limits, rolling, archiving, expunging, etc.) applicable to the logging mechanism embedded within the Plugin. +* Plugins SHOULD NOT write potentially sensitive data to logs (e.g. secrets). + +##### Available Services + +* Plugin Packages MAY support all or a subset of COSI services; service combinations MAY be configurable at runtime by the Provisioner Sidecar. + * A plugin MUST know the "mode" in which it is operating (e.g. node, controller, or both). + * This specification does not dictate the mechanism by which mode of operation MUST be discovered, and instead places that burden upon the SP. +* Misconfigured plugin software SHOULD fail-fast with an OS-appropriate error code. + +##### Linux Capabilities + +* Provisioner Sidecar SHALL guarantee that plugins will have necessary permission to connect to their backend Object Storage System +* Plugins SHOULD clearly document any additionally required capabilities and/or security context. + +##### Namespaces + +* A Plugin SHOULD NOT assume that it is in the same [Linux namespaces](https://en.wikipedia.org/wiki/Linux_namespaces) as the Provisioner Sidecar. + The COSI system MUST clearly document the CSI dependency requirements on ephemeral volumes for the plugins and the Provisioner Sidecar SHALL satisfy the COSI system’s requirements. + +##### Cgroup Isolation + +* A Plugin MAY be constrained by cgroups. +* An operator or Provisioner Sidecar MAY configure the devices cgroup subsystem to ensure that a Plugin MAY access requisite devices. +* A Provisioner Sidecar MAY define resource limits for a Plugin. + +##### Resource Requirements +* SPs SHOULD unambiguously document all of a Plugin’s resource requirements. From 76f98f07c6946b65e2a6eeb8de867b85b55a2ba6 Mon Sep 17 00:00:00 2001 From: wlan0 Date: Sat, 23 Jan 2021 18:16:40 -0800 Subject: [PATCH 144/242] update docs --- README.md | 74 +++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 50 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 624d4687..fa97ce95 100644 --- a/README.md +++ b/README.md @@ -1,43 +1,69 @@ -COSI repos and images: +![version](https://img.shields.io/badge/status-pre--alpha-lightgrey) -[Spec](https://github.com/kubernetes-sigs/container-object-storage-interface-spec) \ -[API](https://github.com/kubernetes-sigs/container-object-storage-interface-api) \ -[Controller](https://github.com/kubernetes-sigs/container-object-storage-interface-controller)
-  - [images: cosi-controller](https://quay.io/repository/containerobjectstorage/objectstorage-controller?tab=tags) \ - [Provisioner Sidecar](https://github.com/kubernetes-sigs/container-object-storage-interface-provisioner-sidecar)
-   - images: cosi-provisioner \ - [CSI Adapter](https://github.com/kubernetes-sigs/container-object-storage-interface-csi-adapter)
-   - images: cosi-node-adapter +# Container Object Storage Interface Spec -COSI deprecated repos: +This repository hosts the gRPC API for the Container Object Storage Interface (COSI) standard. The interfaces defined in the [gRPC specification](cosi.proto) are meant to be the common interface for object storage provisioning and management across various object storage vendors. +For more information about the COSI effort, visit our [documentation](https://github.com/kubernetes-sigs/container-object-storage-interface-api/tree/master/docs/index.md). +## Why another standard? -[Spec](https://github.com/container-object-storage-interface/spec) \ -[API](https://github.com/container-object-storage-interface/api) \ -[Manager (i.e. Controller)](https://github.com/container-object-storage-interface/cosi-controller-manager) \ -[Provisioner Sidecar](https://github.com/container-object-storage-interface/cosi-provisioner-sidecar) \ -[Ephemeral CSI Driver](https://github.com/container-object-storage-interface/ephemeral-csi-driver) +Kubernetes abstracts file/block storage via the CSI standard. The primitives for file/block storage do not extend well to object storage. Here is the **_extremely_** concise and incomplete list of reasons why: + - Unit of provisioned storage - Bucket instead of filesystem mount or block device. + - Access is over the network instead of local POSIX calls. + - No common protocol for consumption across various implementations of object storage. + - Management policies and primitives - for instance, mounting and unmounting do not apply to object storage. +The existing primitives in CSI do not apply to objectstorage. Thus the need for a new standard to automate the management of objectstorage. -# Container Object Storage Specification +## Developer Guide -Kubernetes specific Container Object Storage Interface (COSI) components. +All API definitions **_MUST_** satisfy the following requirements: -## Community, discussion, contribution, and support + + - Must be in-sync with the API definitions in [sigs.k8s.io/container-object-storage-interface-api](https://github.com/kubernetes-sigs/container-object-storage-interface-api) + +### Build and Test + +1. `cosi.proto` is generated from the specification defined in `spec.md` + +2. In order to update the API, make changes to `spec.md`. Then, generate `cosi.proto` using: + +```sh +# generates cosi.proto +make generate +``` -If you are new to a SIG Storage project, check out this [contributing guide](https://github.com/kubernetes/community/blob/master/sig-storage/CONTRIBUTING.md) -and the [community page](https://github.com/kubernetes/community/tree/master/sig-storage). +3. Clean and Build -If you are new to the SIG Storage COSI project, check out the [spec](https://github.com/kubernetes-sigs/container-object-storage-interface-spec/blob/master/spec.md), [KEP](https://github.com/kubernetes/enhancements/tree/master/keps/sig-storage/1979-object-storage-support), and [project board](https://github.com/orgs/kubernetes-sigs/projects/). +```sh +# cleans up old build files +make clobber +# builds the go bindings +make +``` -Learn how to engage with the Kubernetes community on the [community page](http://kubernetes.io/community/). +4. Do it all in 1 step: + +``` +# generates cosi.proto and builds the go bindings +make all +``` + +## References + + - [Documentation](https://github.com/kubernetes-sigs/container-object-storage-interface-api/tree/master/docs/index.md) + - [Deployment Guide](https://github.com/kubernetes-sigs/container-object-storage-interface-api/tree/master/docs/deployment-guide.md) + - [Weekly Meetings](https://github.com/kubernetes-sigs/container-object-storage-interface-api/tree/master/docs/meetings.md) + - [Roadmap](https://github.com/orgs/kubernetes-sigs/projects/8) + +## Community, discussion, contribution, and support You can reach the maintainers of this project at: -- [Slack](https://kubernetes.slack.com/messages/sig-storage-cosi) -- [Mailing List](https://groups.google.com/g/container-object-storage-interface-wg?pli=1) + - [#sig-storage-cosi](https://kubernetes.slack.com/messages/sig-storage-cosi) slack channel + - [container-object-storage-interface](https://groups.google.com/g/container-object-storage-interface-wg?pli=1) mailing list ### Code of conduct From 5faf7aae1039fa009a777402d32e88b5315d3d76 Mon Sep 17 00:00:00 2001 From: Rob Rati Date: Thu, 14 Jan 2021 18:38:25 -0500 Subject: [PATCH 145/242] Define Protocol message and use in ProvisionerCreateBucketRequest #21 - Remove opaque parameters from ProvisionerDeleteBucket - Makefile fixes - Add comments in cosi.proto --- .gitignore | 1 + Makefile | 53 +- cosi.pb.go | 1441 +++++++++++++++++++++++++++++++++-------------- cosi.pb.json.go | 262 +++++++++ cosi.proto | 137 +++-- fake/cosi.pb.go | 46 -- go.mod | 9 +- go.sum | 55 +- spec.md | 135 +++-- 9 files changed, 1581 insertions(+), 558 deletions(-) create mode 100644 cosi.pb.json.go delete mode 100644 fake/cosi.pb.go diff --git a/.gitignore b/.gitignore index 6bf2a963..d638623a 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ cosi.proto.tmp protoc protoc-gen-go +protoc-gen-go-json cosi.a .protoc .idea diff --git a/Makefile b/Makefile index 1bb21787..18e06277 100644 --- a/Makefile +++ b/Makefile @@ -69,6 +69,25 @@ $(PROTOC_GEN_GO): go build -o "$@" $(PROTOC_GEN_GO_PKG) +######################################################################## +## PROTOC-GEN-GO-JSON ## +######################################################################## + +# This is the recipe for getting and installing the json plug-in +# for protoc-gen-go +PROTOC_GEN_GO_JSON_PKG := github.com/mitchellh/protoc-gen-go-json +PROTOC_GEN_GO_JSON := protoc-gen-go-json +$(PROTOC_GEN_GO_JSON): PROTOC_GEN_GO_JSON_VERSION := v1.0.0 +$(PROTOC_GEN_GO_JSON): + mkdir -p $(dir $(GOPATH)/src/$(PROTOC_GEN_GO_JSON_PKG)) + test -d $(GOPATH)/src/$(PROTOC_GEN_GO_JSON_PKG)/.git || git clone https://$(PROTOC_GEN_GO_JSON_PKG) $(GOPATH)/src/$(PROTOC_GEN_GO_JSON_PKG) + (cd $(GOPATH)/src/$(PROTOC_GEN_GO_JSON_PKG) && \ + (test "$$(git describe --tags | head -1)" = "$(PROTOC_GEN_GO_JSON_VERSION)" || \ + (git fetch && git checkout tags/$(PROTOC_GEN_GO_JSON_VERSION)))) + (cd $(GOPATH)/src/$(PROTOC_GEN_GO_JSON_PKG) && go get -v -d $$(go list -f '{{ .ImportPath }}' ./...)) && \ + go build -o "$@" $(PROTOC_GEN_GO_JSON_PKG) + + ######################################################################## ## GEN-PROTO-GO ## ######################################################################## @@ -123,12 +142,15 @@ export PATH := $(shell pwd):$(PATH) ## BUILD ## ######################################################################## COSI_PROTO := ./cosi.proto -COSI_PKG_ROOT := github.com/kubernetes-sigs/container-object-storage-interface-spec +COSI_SPEC := spec.md +COSI_PKG_ROOT := sigs.k8s.io/container-object-storage-interface-spec COSI_PKG_SUB := . COSI_BUILD := $(COSI_PKG_SUB)/.build COSI_GO := $(COSI_PKG_SUB)/cosi.pb.go +COSI_GO_JSON := $(COSI_PKG_SUB)/cosi.pb.json.go COSI_A := cosi.a COSI_GO_TMP := $(COSI_BUILD)/$(COSI_PKG_ROOT)/cosi.pb.go +COSI_GO_JSON_TMP := $(COSI_BUILD)/$(COSI_PKG_ROOT)/cosi.pb.json.go # This recipe generates the go language bindings to a temp area. $(COSI_GO_TMP): HERE := $(shell pwd) @@ -137,11 +159,13 @@ $(COSI_GO_TMP): GO_OUT := plugins=grpc $(COSI_GO_TMP): GO_OUT := $(GO_OUT),Mgoogle/protobuf/descriptor.proto=github.com/golang/protobuf/protoc-gen-go/descriptor $(COSI_GO_TMP): GO_OUT := $(GO_OUT),Mgoogle/protobuf/wrappers.proto=$(PTYPES_PKG)/wrappers $(COSI_GO_TMP): GO_OUT := $(GO_OUT):"$(HERE)/$(COSI_BUILD)" +$(COSI_GO_TMP): GO_JSON_OUT := emit_defaults +$(COSI_GO_TMP): GO_JSON_OUT := $(GO_JSON_OUT):"$(HERE)/$(COSI_BUILD)" $(COSI_GO_TMP): INCLUDE := -I$(GOPATH)/src -I$(HERE)/$(PROTOC_TMP_DIR)/include -$(COSI_GO_TMP): $(COSI_PROTO) | $(PROTOC) $(PROTOC_GEN_GO) +$(COSI_GO_TMP): $(COSI_PROTO) | $(PROTOC) $(PROTOC_GEN_GO) $(PROTOC_GEN_GO_JSON) @mkdir -p "$(@D)" (cd "$(GOPATH)/src" && \ - $(HERE)/$(PROTOC) $(INCLUDE) --go_out=$(GO_OUT) "$(COSI_PKG_ROOT)/$( /dev/null 2>&1 || cp -f "$?" "$@" endif +# The temp language bindings are compared to the ones that are +# versioned. If they are different then it means the language +# bindings were not updated prior to being committed. +$(COSI_GO_JSON): $(COSI_GO_JSON_TMP) +ifeq (true,$(TRAVIS)) + diff "$@" "$?" +else + @mkdir -p "$(@D)" + diff "$@" "$?" > /dev/null 2>&1 || cp -f "$?" "$@" +endif + # This recipe builds the Go archive from the sources in three steps: # # 1. Go get any missing dependencies. # 2. Cache the packages. # 3. Build the archive file. -$(COSI_A): $(COSI_GO) $(GENPROTO_BUILD_GO) $(GRPC_BUILD_GO) +$(COSI_A): $(COSI_GO) $(COSI_GO_JSON) $(GENPROTO_BUILD_GO) $(GRPC_BUILD_GO) go get -v -d ./... go install ./$(COSI_PKG_SUB) go build -o "$@" ./$(COSI_PKG_SUB) -build: $(COSI_A) +generate: + echo "// Code generated by make; DO NOT EDIT." > "$(COSI_PROTO)" + cat $(COSI_SPEC) | sed -n -e '/```protobuf$$/,/^```$$/ p' | sed '/^```/d' >> "$(COSI_PROTO)" + +build: generate $(COSI_A) clean: go clean -i ./... - rm -rf "$(COSI_A)" "$(COSI_GO)" "$(COSI_BUILD)" + rm -rf "$(COSI_PROTO)" "$(COSI_A)" "$(COSI_GO)" "$(COSI_GO_JSON)" "$(COSI_BUILD)" clobber: clean - rm -fr "$(PROTOC)" "$(PROTOC_GEN_GO)" "$(COSI_PKG_SUB)" + rm -fr "$(PROTOC)" "$(PROTOC_TMP_DIR)" "$(PROTOC_GEN_GO)" "$(PROTOC_GEN_GO_JSON)" .PHONY: clean clobber $(GRPC_BUILD_GO) $(GENPROTO_BUILD_GO) diff --git a/cosi.pb.go b/cosi.pb.go index afc32712..a0029890 100644 --- a/cosi.pb.go +++ b/cosi.pb.go @@ -1,8 +1,10 @@ +// Code generated by make; DO NOT EDIT. + // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.23.0 +// protoc-gen-go v1.25.0 // protoc v3.9.1 -// source: github.com/kubernetes-sigs/container-object-storage-interface-spec/cosi.proto +// source: sigs.k8s.io/container-object-storage-interface-spec/cosi.proto package cosi @@ -30,62 +32,491 @@ const ( // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 -type ProvisionerCreateBucketRequest_AnonymousBucketAccessMode int32 +type ProtocolName int32 const ( + ProtocolName_UnknownProtocol ProtocolName = 0 + // S3, AWS S3 protocol + ProtocolName_S3 ProtocolName = 1 + // AZURE, Microsoft Azure protocol + ProtocolName_AZURE ProtocolName = 2 + // GCS, Google GCS protocol + ProtocolName_GCS ProtocolName = 3 +) + +// Enum value maps for ProtocolName. +var ( + ProtocolName_name = map[int32]string{ + 0: "UnknownProtocol", + 1: "S3", + 2: "AZURE", + 3: "GCS", + } + ProtocolName_value = map[string]int32{ + "UnknownProtocol": 0, + "S3": 1, + "AZURE": 2, + "GCS": 3, + } +) + +func (x ProtocolName) Enum() *ProtocolName { + p := new(ProtocolName) + *p = x + return p +} + +func (x ProtocolName) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ProtocolName) Descriptor() protoreflect.EnumDescriptor { + return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_enumTypes[0].Descriptor() +} + +func (ProtocolName) Type() protoreflect.EnumType { + return &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_enumTypes[0] +} + +func (x ProtocolName) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ProtocolName.Descriptor instead. +func (ProtocolName) EnumDescriptor() ([]byte, []int) { + return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{0} +} + +// S3SignatureVersion is the version of the signing algorithm for all s3 requests +type S3SignatureVersion int32 + +const ( + S3SignatureVersion_UnknownSignature S3SignatureVersion = 0 + // S3V2, Signature version v2 + S3SignatureVersion_S3V2 S3SignatureVersion = 1 + // S3V4, Signature version v4 + S3SignatureVersion_S3V4 S3SignatureVersion = 2 +) + +// Enum value maps for S3SignatureVersion. +var ( + S3SignatureVersion_name = map[int32]string{ + 0: "UnknownSignature", + 1: "S3V2", + 2: "S3V4", + } + S3SignatureVersion_value = map[string]int32{ + "UnknownSignature": 0, + "S3V2": 1, + "S3V4": 2, + } +) + +func (x S3SignatureVersion) Enum() *S3SignatureVersion { + p := new(S3SignatureVersion) + *p = x + return p +} + +func (x S3SignatureVersion) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (S3SignatureVersion) Descriptor() protoreflect.EnumDescriptor { + return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_enumTypes[1].Descriptor() +} + +func (S3SignatureVersion) Type() protoreflect.EnumType { + return &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_enumTypes[1] +} + +func (x S3SignatureVersion) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use S3SignatureVersion.Descriptor instead. +func (S3SignatureVersion) EnumDescriptor() ([]byte, []int) { + return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{1} +} + +type AnonymousBucketAccessMode int32 + +const ( + AnonymousBucketAccessMode_UnknownBucketAccessMode AnonymousBucketAccessMode = 0 // Default, disallow uncredentialed access to the backend storage. - ProvisionerCreateBucketRequest_BUCKET_PRIVATE ProvisionerCreateBucketRequest_AnonymousBucketAccessMode = 0 + AnonymousBucketAccessMode_Private AnonymousBucketAccessMode = 1 // Read only, uncredentialed users can call ListBucket and GetObject. - ProvisionerCreateBucketRequest_BUCKET_READ_ONLY ProvisionerCreateBucketRequest_AnonymousBucketAccessMode = 1 + AnonymousBucketAccessMode_ReadOnly AnonymousBucketAccessMode = 2 // Write only, uncredentialed users can only call PutObject. - ProvisionerCreateBucketRequest_BUCKET_WRITE_ONLY ProvisionerCreateBucketRequest_AnonymousBucketAccessMode = 2 - // Read/Write, same as ro with the addition of PutObject being allowed. - ProvisionerCreateBucketRequest_BUCKET_READ_WRITE ProvisionerCreateBucketRequest_AnonymousBucketAccessMode = 3 + AnonymousBucketAccessMode_WriteOnly AnonymousBucketAccessMode = 3 + // Read/Write, uncredentialed users can read objects as well as PutObject. + AnonymousBucketAccessMode_ReadWrite AnonymousBucketAccessMode = 4 ) -// Enum value maps for ProvisionerCreateBucketRequest_AnonymousBucketAccessMode. +// Enum value maps for AnonymousBucketAccessMode. var ( - ProvisionerCreateBucketRequest_AnonymousBucketAccessMode_name = map[int32]string{ - 0: "BUCKET_PRIVATE", - 1: "BUCKET_READ_ONLY", - 2: "BUCKET_WRITE_ONLY", - 3: "BUCKET_READ_WRITE", - } - ProvisionerCreateBucketRequest_AnonymousBucketAccessMode_value = map[string]int32{ - "BUCKET_PRIVATE": 0, - "BUCKET_READ_ONLY": 1, - "BUCKET_WRITE_ONLY": 2, - "BUCKET_READ_WRITE": 3, + AnonymousBucketAccessMode_name = map[int32]string{ + 0: "UnknownBucketAccessMode", + 1: "Private", + 2: "ReadOnly", + 3: "WriteOnly", + 4: "ReadWrite", + } + AnonymousBucketAccessMode_value = map[string]int32{ + "UnknownBucketAccessMode": 0, + "Private": 1, + "ReadOnly": 2, + "WriteOnly": 3, + "ReadWrite": 4, } ) -func (x ProvisionerCreateBucketRequest_AnonymousBucketAccessMode) Enum() *ProvisionerCreateBucketRequest_AnonymousBucketAccessMode { - p := new(ProvisionerCreateBucketRequest_AnonymousBucketAccessMode) +func (x AnonymousBucketAccessMode) Enum() *AnonymousBucketAccessMode { + p := new(AnonymousBucketAccessMode) *p = x return p } -func (x ProvisionerCreateBucketRequest_AnonymousBucketAccessMode) String() string { +func (x AnonymousBucketAccessMode) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } -func (ProvisionerCreateBucketRequest_AnonymousBucketAccessMode) Descriptor() protoreflect.EnumDescriptor { - return file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_enumTypes[0].Descriptor() +func (AnonymousBucketAccessMode) Descriptor() protoreflect.EnumDescriptor { + return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_enumTypes[2].Descriptor() } -func (ProvisionerCreateBucketRequest_AnonymousBucketAccessMode) Type() protoreflect.EnumType { - return &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_enumTypes[0] +func (AnonymousBucketAccessMode) Type() protoreflect.EnumType { + return &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_enumTypes[2] } -func (x ProvisionerCreateBucketRequest_AnonymousBucketAccessMode) Number() protoreflect.EnumNumber { +func (x AnonymousBucketAccessMode) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } -// Deprecated: Use ProvisionerCreateBucketRequest_AnonymousBucketAccessMode.Descriptor instead. -func (ProvisionerCreateBucketRequest_AnonymousBucketAccessMode) EnumDescriptor() ([]byte, []int) { - return file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{2, 0} +// Deprecated: Use AnonymousBucketAccessMode.Descriptor instead. +func (AnonymousBucketAccessMode) EnumDescriptor() ([]byte, []int) { + return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{2} +} + +type S3Parameters struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // endpoint denotes the URL of the S3 server + Endpoint string `protobuf:"bytes,1,opt,name=endpoint,proto3" json:"endpoint,omitempty"` + // bucket_name denotes the name of the bucket in the storage backend + BucketName string `protobuf:"bytes,2,opt,name=bucket_name,json=bucketName,proto3" json:"bucket_name,omitempty"` + // region denotes the geographical region where the S3 server is running + Region string `protobuf:"bytes,3,opt,name=region,proto3" json:"region,omitempty"` + // signature_version denotes the signature version for signing all s3 requests + SignatureVersion S3SignatureVersion `protobuf:"varint,4,opt,name=signature_version,json=signatureVersion,proto3,enum=cosi.v1alpha1.S3SignatureVersion" json:"signature_version,omitempty"` +} + +func (x *S3Parameters) Reset() { + *x = S3Parameters{} + if protoimpl.UnsafeEnabled { + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *S3Parameters) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*S3Parameters) ProtoMessage() {} + +func (x *S3Parameters) ProtoReflect() protoreflect.Message { + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use S3Parameters.ProtoReflect.Descriptor instead. +func (*S3Parameters) Descriptor() ([]byte, []int) { + return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{0} +} + +func (x *S3Parameters) GetEndpoint() string { + if x != nil { + return x.Endpoint + } + return "" +} + +func (x *S3Parameters) GetBucketName() string { + if x != nil { + return x.BucketName + } + return "" +} + +func (x *S3Parameters) GetRegion() string { + if x != nil { + return x.Region + } + return "" +} + +func (x *S3Parameters) GetSignatureVersion() S3SignatureVersion { + if x != nil { + return x.SignatureVersion + } + return S3SignatureVersion_UnknownSignature +} + +type AzureBlobParameters struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // container_name is the name of the azure container + ContainerName string `protobuf:"bytes,1,opt,name=container_name,json=containerName,proto3" json:"container_name,omitempty"` + // storage_account is the id of the azure storage account + StorageAccount string `protobuf:"bytes,2,opt,name=storage_account,json=storageAccount,proto3" json:"storage_account,omitempty"` +} + +func (x *AzureBlobParameters) Reset() { + *x = AzureBlobParameters{} + if protoimpl.UnsafeEnabled { + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AzureBlobParameters) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AzureBlobParameters) ProtoMessage() {} + +func (x *AzureBlobParameters) ProtoReflect() protoreflect.Message { + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AzureBlobParameters.ProtoReflect.Descriptor instead. +func (*AzureBlobParameters) Descriptor() ([]byte, []int) { + return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{1} +} + +func (x *AzureBlobParameters) GetContainerName() string { + if x != nil { + return x.ContainerName + } + return "" +} + +func (x *AzureBlobParameters) GetStorageAccount() string { + if x != nil { + return x.StorageAccount + } + return "" +} + +type GCSParameters struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // bucket_name denotes the name of the bucket in the storage backend + BucketName string `protobuf:"bytes,1,opt,name=bucket_name,json=bucketName,proto3" json:"bucket_name,omitempty"` + // private_key_name denotes the name of the private key in the storage backend + PrivateKeyName string `protobuf:"bytes,2,opt,name=private_key_name,json=privateKeyName,proto3" json:"private_key_name,omitempty"` + // project_id denotes the name of the project id in the storage backend + ProjectId string `protobuf:"bytes,3,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` + // service_account denotes the name of the service account in the storage backend + ServiceAccount string `protobuf:"bytes,4,opt,name=service_account,json=serviceAccount,proto3" json:"service_account,omitempty"` +} + +func (x *GCSParameters) Reset() { + *x = GCSParameters{} + if protoimpl.UnsafeEnabled { + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GCSParameters) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GCSParameters) ProtoMessage() {} + +func (x *GCSParameters) ProtoReflect() protoreflect.Message { + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GCSParameters.ProtoReflect.Descriptor instead. +func (*GCSParameters) Descriptor() ([]byte, []int) { + return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{2} +} + +func (x *GCSParameters) GetBucketName() string { + if x != nil { + return x.BucketName + } + return "" +} + +func (x *GCSParameters) GetPrivateKeyName() string { + if x != nil { + return x.PrivateKeyName + } + return "" +} + +func (x *GCSParameters) GetProjectId() string { + if x != nil { + return x.ProjectId + } + return "" +} + +func (x *GCSParameters) GetServiceAccount() string { + if x != nil { + return x.ServiceAccount + } + return "" +} + +type Protocol struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // ProtocolName is the name of the protocol + Name ProtocolName `protobuf:"varint,1,opt,name=name,proto3,enum=cosi.v1alpha1.ProtocolName" json:"name,omitempty"` + // version is the name of the protocol version + Version string `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"` + // Types that are assignable to Type: + // *Protocol_S3 + // *Protocol_AzureBlob + // *Protocol_Gcs + Type isProtocol_Type `protobuf_oneof:"type"` +} + +func (x *Protocol) Reset() { + *x = Protocol{} + if protoimpl.UnsafeEnabled { + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Protocol) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Protocol) ProtoMessage() {} + +func (x *Protocol) ProtoReflect() protoreflect.Message { + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Protocol.ProtoReflect.Descriptor instead. +func (*Protocol) Descriptor() ([]byte, []int) { + return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{3} +} + +func (x *Protocol) GetName() ProtocolName { + if x != nil { + return x.Name + } + return ProtocolName_UnknownProtocol +} + +func (x *Protocol) GetVersion() string { + if x != nil { + return x.Version + } + return "" } +func (m *Protocol) GetType() isProtocol_Type { + if m != nil { + return m.Type + } + return nil +} + +func (x *Protocol) GetS3() *S3Parameters { + if x, ok := x.GetType().(*Protocol_S3); ok { + return x.S3 + } + return nil +} + +func (x *Protocol) GetAzureBlob() *AzureBlobParameters { + if x, ok := x.GetType().(*Protocol_AzureBlob); ok { + return x.AzureBlob + } + return nil +} + +func (x *Protocol) GetGcs() *GCSParameters { + if x, ok := x.GetType().(*Protocol_Gcs); ok { + return x.Gcs + } + return nil +} + +type isProtocol_Type interface { + isProtocol_Type() +} + +type Protocol_S3 struct { + S3 *S3Parameters `protobuf:"bytes,3,opt,name=s3,proto3,oneof"` +} + +type Protocol_AzureBlob struct { + AzureBlob *AzureBlobParameters `protobuf:"bytes,4,opt,name=azureBlob,proto3,oneof"` +} + +type Protocol_Gcs struct { + Gcs *GCSParameters `protobuf:"bytes,5,opt,name=gcs,proto3,oneof"` +} + +func (*Protocol_S3) isProtocol_Type() {} + +func (*Protocol_AzureBlob) isProtocol_Type() {} + +func (*Protocol_Gcs) isProtocol_Type() {} + type ProvisionerGetInfoRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -95,7 +526,7 @@ type ProvisionerGetInfoRequest struct { func (x *ProvisionerGetInfoRequest) Reset() { *x = ProvisionerGetInfoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[0] + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -108,7 +539,7 @@ func (x *ProvisionerGetInfoRequest) String() string { func (*ProvisionerGetInfoRequest) ProtoMessage() {} func (x *ProvisionerGetInfoRequest) ProtoReflect() protoreflect.Message { - mi := &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[0] + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -121,7 +552,7 @@ func (x *ProvisionerGetInfoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ProvisionerGetInfoRequest.ProtoReflect.Descriptor instead. func (*ProvisionerGetInfoRequest) Descriptor() ([]byte, []int) { - return file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{0} + return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{4} } type ProvisionerGetInfoResponse struct { @@ -143,7 +574,7 @@ type ProvisionerGetInfoResponse struct { func (x *ProvisionerGetInfoResponse) Reset() { *x = ProvisionerGetInfoResponse{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[1] + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -156,7 +587,7 @@ func (x *ProvisionerGetInfoResponse) String() string { func (*ProvisionerGetInfoResponse) ProtoMessage() {} func (x *ProvisionerGetInfoResponse) ProtoReflect() protoreflect.Message { - mi := &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[1] + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -169,7 +600,7 @@ func (x *ProvisionerGetInfoResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ProvisionerGetInfoResponse.ProtoReflect.Descriptor instead. func (*ProvisionerGetInfoResponse) Descriptor() ([]byte, []int) { - return file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{1} + return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{5} } func (x *ProvisionerGetInfoResponse) GetName() string { @@ -185,20 +616,21 @@ type ProvisionerCreateBucketRequest struct { unknownFields protoimpl.UnknownFields // This field is REQUIRED - // Bucket name. - BucketName string `protobuf:"bytes,1,opt,name=bucket_name,json=bucketName,proto3" json:"bucket_name,omitempty"` - // This field is OPTIONAL // Protocol specific information required by the call is passed in as key,value pairs. - BucketContext map[string]string `protobuf:"bytes,2,rep,name=bucket_context,json=bucketContext,proto3" json:"bucket_context,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Protocol *Protocol `protobuf:"bytes,1,opt,name=protocol,proto3" json:"protocol,omitempty"` + // This field is OPTIONAL + // The caller should treat the values in parameters as opaque. + // The receiver is responsible for parsing and validating the values. + Parameters map[string]string `protobuf:"bytes,2,rep,name=parameters,proto3" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // This field is OPTIONAL // Allow uncredentialed access to bucket. - AnonymousBucketAccessMode ProvisionerCreateBucketRequest_AnonymousBucketAccessMode `protobuf:"varint,3,opt,name=anonymous_bucket_access_mode,json=anonymousBucketAccessMode,proto3,enum=cosi.v1alpha1.ProvisionerCreateBucketRequest_AnonymousBucketAccessMode" json:"anonymous_bucket_access_mode,omitempty"` + AnonymousBucketAccessMode AnonymousBucketAccessMode `protobuf:"varint,3,opt,name=anonymous_bucket_access_mode,json=anonymousBucketAccessMode,proto3,enum=cosi.v1alpha1.AnonymousBucketAccessMode" json:"anonymous_bucket_access_mode,omitempty"` } func (x *ProvisionerCreateBucketRequest) Reset() { *x = ProvisionerCreateBucketRequest{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[2] + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -211,7 +643,7 @@ func (x *ProvisionerCreateBucketRequest) String() string { func (*ProvisionerCreateBucketRequest) ProtoMessage() {} func (x *ProvisionerCreateBucketRequest) ProtoReflect() protoreflect.Message { - mi := &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[2] + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -224,28 +656,28 @@ func (x *ProvisionerCreateBucketRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ProvisionerCreateBucketRequest.ProtoReflect.Descriptor instead. func (*ProvisionerCreateBucketRequest) Descriptor() ([]byte, []int) { - return file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{2} + return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{6} } -func (x *ProvisionerCreateBucketRequest) GetBucketName() string { +func (x *ProvisionerCreateBucketRequest) GetProtocol() *Protocol { if x != nil { - return x.BucketName + return x.Protocol } - return "" + return nil } -func (x *ProvisionerCreateBucketRequest) GetBucketContext() map[string]string { +func (x *ProvisionerCreateBucketRequest) GetParameters() map[string]string { if x != nil { - return x.BucketContext + return x.Parameters } return nil } -func (x *ProvisionerCreateBucketRequest) GetAnonymousBucketAccessMode() ProvisionerCreateBucketRequest_AnonymousBucketAccessMode { +func (x *ProvisionerCreateBucketRequest) GetAnonymousBucketAccessMode() AnonymousBucketAccessMode { if x != nil { return x.AnonymousBucketAccessMode } - return ProvisionerCreateBucketRequest_BUCKET_PRIVATE + return AnonymousBucketAccessMode_UnknownBucketAccessMode } type ProvisionerCreateBucketResponse struct { @@ -257,7 +689,7 @@ type ProvisionerCreateBucketResponse struct { func (x *ProvisionerCreateBucketResponse) Reset() { *x = ProvisionerCreateBucketResponse{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[3] + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -270,7 +702,7 @@ func (x *ProvisionerCreateBucketResponse) String() string { func (*ProvisionerCreateBucketResponse) ProtoMessage() {} func (x *ProvisionerCreateBucketResponse) ProtoReflect() protoreflect.Message { - mi := &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[3] + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -283,7 +715,7 @@ func (x *ProvisionerCreateBucketResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ProvisionerCreateBucketResponse.ProtoReflect.Descriptor instead. func (*ProvisionerCreateBucketResponse) Descriptor() ([]byte, []int) { - return file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{3} + return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{7} } type ProvisionerDeleteBucketRequest struct { @@ -292,17 +724,19 @@ type ProvisionerDeleteBucketRequest struct { unknownFields protoimpl.UnknownFields // This field is REQUIRED - // Bucket name. - BucketName string `protobuf:"bytes,1,opt,name=bucket_name,json=bucketName,proto3" json:"bucket_name,omitempty"` + // Protocol specific information required by the call is passed in as key,value pairs. + Protocol *Protocol `protobuf:"bytes,1,opt,name=protocol,proto3" json:"protocol,omitempty"` // This field is OPTIONAL // Protocol specific information required by the call is passed in as key,value pairs. - BucketContext map[string]string `protobuf:"bytes,2,rep,name=bucket_context,json=bucketContext,proto3" json:"bucket_context,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // The caller should treat the values in parameters as opaque. + // The receiver is responsible for parsing and validating the values. + Parameters map[string]string `protobuf:"bytes,2,rep,name=parameters,proto3" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *ProvisionerDeleteBucketRequest) Reset() { *x = ProvisionerDeleteBucketRequest{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[4] + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -315,7 +749,7 @@ func (x *ProvisionerDeleteBucketRequest) String() string { func (*ProvisionerDeleteBucketRequest) ProtoMessage() {} func (x *ProvisionerDeleteBucketRequest) ProtoReflect() protoreflect.Message { - mi := &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[4] + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -328,19 +762,19 @@ func (x *ProvisionerDeleteBucketRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ProvisionerDeleteBucketRequest.ProtoReflect.Descriptor instead. func (*ProvisionerDeleteBucketRequest) Descriptor() ([]byte, []int) { - return file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{4} + return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{8} } -func (x *ProvisionerDeleteBucketRequest) GetBucketName() string { +func (x *ProvisionerDeleteBucketRequest) GetProtocol() *Protocol { if x != nil { - return x.BucketName + return x.Protocol } - return "" + return nil } -func (x *ProvisionerDeleteBucketRequest) GetBucketContext() map[string]string { +func (x *ProvisionerDeleteBucketRequest) GetParameters() map[string]string { if x != nil { - return x.BucketContext + return x.Parameters } return nil } @@ -354,7 +788,7 @@ type ProvisionerDeleteBucketResponse struct { func (x *ProvisionerDeleteBucketResponse) Reset() { *x = ProvisionerDeleteBucketResponse{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[5] + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -367,7 +801,7 @@ func (x *ProvisionerDeleteBucketResponse) String() string { func (*ProvisionerDeleteBucketResponse) ProtoMessage() {} func (x *ProvisionerDeleteBucketResponse) ProtoReflect() protoreflect.Message { - mi := &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[5] + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -380,7 +814,7 @@ func (x *ProvisionerDeleteBucketResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ProvisionerDeleteBucketResponse.ProtoReflect.Descriptor instead. func (*ProvisionerDeleteBucketResponse) Descriptor() ([]byte, []int) { - return file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{5} + return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{9} } type ProvisionerGrantBucketAccessRequest struct { @@ -389,11 +823,11 @@ type ProvisionerGrantBucketAccessRequest struct { unknownFields protoimpl.UnknownFields // This field is REQUIRED - // Bucket name. - BucketName string `protobuf:"bytes,1,opt,name=bucket_name,json=bucketName,proto3" json:"bucket_name,omitempty"` + // Protocol specific information required by the call is passed in as key,value pairs. + Protocol *Protocol `protobuf:"bytes,1,opt,name=protocol,proto3" json:"protocol,omitempty"` // This field is OPTIONAL // Protocol specific information required by the call is passed in as key,value pairs. - BucketContext map[string]string `protobuf:"bytes,2,rep,name=bucket_context,json=bucketContext,proto3" json:"bucket_context,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Parameters map[string]string `protobuf:"bytes,2,rep,name=parameters,proto3" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // This field is OPTIONAL // Principal for which access is requested Principal string `protobuf:"bytes,3,opt,name=principal,proto3" json:"principal,omitempty"` @@ -405,7 +839,7 @@ type ProvisionerGrantBucketAccessRequest struct { func (x *ProvisionerGrantBucketAccessRequest) Reset() { *x = ProvisionerGrantBucketAccessRequest{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[6] + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -418,7 +852,7 @@ func (x *ProvisionerGrantBucketAccessRequest) String() string { func (*ProvisionerGrantBucketAccessRequest) ProtoMessage() {} func (x *ProvisionerGrantBucketAccessRequest) ProtoReflect() protoreflect.Message { - mi := &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[6] + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -431,19 +865,19 @@ func (x *ProvisionerGrantBucketAccessRequest) ProtoReflect() protoreflect.Messag // Deprecated: Use ProvisionerGrantBucketAccessRequest.ProtoReflect.Descriptor instead. func (*ProvisionerGrantBucketAccessRequest) Descriptor() ([]byte, []int) { - return file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{6} + return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{10} } -func (x *ProvisionerGrantBucketAccessRequest) GetBucketName() string { +func (x *ProvisionerGrantBucketAccessRequest) GetProtocol() *Protocol { if x != nil { - return x.BucketName + return x.Protocol } - return "" + return nil } -func (x *ProvisionerGrantBucketAccessRequest) GetBucketContext() map[string]string { +func (x *ProvisionerGrantBucketAccessRequest) GetParameters() map[string]string { if x != nil { - return x.BucketContext + return x.Parameters } return nil } @@ -482,7 +916,7 @@ type ProvisionerGrantBucketAccessResponse struct { func (x *ProvisionerGrantBucketAccessResponse) Reset() { *x = ProvisionerGrantBucketAccessResponse{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[7] + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -495,7 +929,7 @@ func (x *ProvisionerGrantBucketAccessResponse) String() string { func (*ProvisionerGrantBucketAccessResponse) ProtoMessage() {} func (x *ProvisionerGrantBucketAccessResponse) ProtoReflect() protoreflect.Message { - mi := &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[7] + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -508,7 +942,7 @@ func (x *ProvisionerGrantBucketAccessResponse) ProtoReflect() protoreflect.Messa // Deprecated: Use ProvisionerGrantBucketAccessResponse.ProtoReflect.Descriptor instead. func (*ProvisionerGrantBucketAccessResponse) Descriptor() ([]byte, []int) { - return file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{7} + return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{11} } func (x *ProvisionerGrantBucketAccessResponse) GetPrincipal() string { @@ -538,11 +972,11 @@ type ProvisionerRevokeBucketAccessRequest struct { unknownFields protoimpl.UnknownFields // This field is REQUIRED - // Bucket name. - BucketName string `protobuf:"bytes,1,opt,name=bucket_name,json=bucketName,proto3" json:"bucket_name,omitempty"` + // Protocol specific information required by the call is passed in as key,value pairs. + Protocol *Protocol `protobuf:"bytes,1,opt,name=protocol,proto3" json:"protocol,omitempty"` // This field is OPTIONAL // Protocol specific information required by the call is passed in as key,value pairs. - BucketContext map[string]string `protobuf:"bytes,2,rep,name=bucket_context,json=bucketContext,proto3" json:"bucket_context,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Parameters map[string]string `protobuf:"bytes,2,rep,name=parameters,proto3" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // This field is REQUIRED // This is the account that is being revoked access. Principal string `protobuf:"bytes,3,opt,name=principal,proto3" json:"principal,omitempty"` @@ -551,7 +985,7 @@ type ProvisionerRevokeBucketAccessRequest struct { func (x *ProvisionerRevokeBucketAccessRequest) Reset() { *x = ProvisionerRevokeBucketAccessRequest{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[8] + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -564,7 +998,7 @@ func (x *ProvisionerRevokeBucketAccessRequest) String() string { func (*ProvisionerRevokeBucketAccessRequest) ProtoMessage() {} func (x *ProvisionerRevokeBucketAccessRequest) ProtoReflect() protoreflect.Message { - mi := &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[8] + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -577,19 +1011,19 @@ func (x *ProvisionerRevokeBucketAccessRequest) ProtoReflect() protoreflect.Messa // Deprecated: Use ProvisionerRevokeBucketAccessRequest.ProtoReflect.Descriptor instead. func (*ProvisionerRevokeBucketAccessRequest) Descriptor() ([]byte, []int) { - return file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{8} + return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{12} } -func (x *ProvisionerRevokeBucketAccessRequest) GetBucketName() string { +func (x *ProvisionerRevokeBucketAccessRequest) GetProtocol() *Protocol { if x != nil { - return x.BucketName + return x.Protocol } - return "" + return nil } -func (x *ProvisionerRevokeBucketAccessRequest) GetBucketContext() map[string]string { +func (x *ProvisionerRevokeBucketAccessRequest) GetParameters() map[string]string { if x != nil { - return x.BucketContext + return x.Parameters } return nil } @@ -610,7 +1044,7 @@ type ProvisionerRevokeBucketAccessResponse struct { func (x *ProvisionerRevokeBucketAccessResponse) Reset() { *x = ProvisionerRevokeBucketAccessResponse{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[9] + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -623,7 +1057,7 @@ func (x *ProvisionerRevokeBucketAccessResponse) String() string { func (*ProvisionerRevokeBucketAccessResponse) ProtoMessage() {} func (x *ProvisionerRevokeBucketAccessResponse) ProtoReflect() protoreflect.Message { - mi := &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[9] + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -636,17 +1070,17 @@ func (x *ProvisionerRevokeBucketAccessResponse) ProtoReflect() protoreflect.Mess // Deprecated: Use ProvisionerRevokeBucketAccessResponse.ProtoReflect.Descriptor instead. func (*ProvisionerRevokeBucketAccessResponse) Descriptor() ([]byte, []int) { - return file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{9} + return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{13} } -var file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_extTypes = []protoimpl.ExtensionInfo{ +var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_extTypes = []protoimpl.ExtensionInfo{ { ExtendedType: (*descriptor.EnumOptions)(nil), ExtensionType: (*bool)(nil), Field: 1060, Name: "cosi.v1alpha1.alpha_enum", Tag: "varint,1060,opt,name=alpha_enum", - Filename: "github.com/kubernetes-sigs/container-object-storage-interface-spec/cosi.proto", + Filename: "sigs.k8s.io/container-object-storage-interface-spec/cosi.proto", }, { ExtendedType: (*descriptor.EnumValueOptions)(nil), @@ -654,7 +1088,7 @@ var file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi Field: 1060, Name: "cosi.v1alpha1.alpha_enum_value", Tag: "varint,1060,opt,name=alpha_enum_value", - Filename: "github.com/kubernetes-sigs/container-object-storage-interface-spec/cosi.proto", + Filename: "sigs.k8s.io/container-object-storage-interface-spec/cosi.proto", }, { ExtendedType: (*descriptor.FieldOptions)(nil), @@ -662,7 +1096,7 @@ var file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi Field: 1059, Name: "cosi.v1alpha1.cosi_secret", Tag: "varint,1059,opt,name=cosi_secret", - Filename: "github.com/kubernetes-sigs/container-object-storage-interface-spec/cosi.proto", + Filename: "sigs.k8s.io/container-object-storage-interface-spec/cosi.proto", }, { ExtendedType: (*descriptor.FieldOptions)(nil), @@ -670,7 +1104,7 @@ var file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi Field: 1060, Name: "cosi.v1alpha1.alpha_field", Tag: "varint,1060,opt,name=alpha_field", - Filename: "github.com/kubernetes-sigs/container-object-storage-interface-spec/cosi.proto", + Filename: "sigs.k8s.io/container-object-storage-interface-spec/cosi.proto", }, { ExtendedType: (*descriptor.MessageOptions)(nil), @@ -678,7 +1112,7 @@ var file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi Field: 1060, Name: "cosi.v1alpha1.alpha_message", Tag: "varint,1060,opt,name=alpha_message", - Filename: "github.com/kubernetes-sigs/container-object-storage-interface-spec/cosi.proto", + Filename: "sigs.k8s.io/container-object-storage-interface-spec/cosi.proto", }, { ExtendedType: (*descriptor.MethodOptions)(nil), @@ -686,7 +1120,7 @@ var file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi Field: 1060, Name: "cosi.v1alpha1.alpha_method", Tag: "varint,1060,opt,name=alpha_method", - Filename: "github.com/kubernetes-sigs/container-object-storage-interface-spec/cosi.proto", + Filename: "sigs.k8s.io/container-object-storage-interface-spec/cosi.proto", }, { ExtendedType: (*descriptor.ServiceOptions)(nil), @@ -694,7 +1128,7 @@ var file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi Field: 1060, Name: "cosi.v1alpha1.alpha_service", Tag: "varint,1060,opt,name=alpha_service", - Filename: "github.com/kubernetes-sigs/container-object-storage-interface-spec/cosi.proto", + Filename: "sigs.k8s.io/container-object-storage-interface-spec/cosi.proto", }, } @@ -705,7 +1139,7 @@ var ( // releases. // // optional bool alpha_enum = 1060; - E_AlphaEnum = &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_extTypes[0] + E_AlphaEnum = &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_extTypes[0] ) // Extension fields to descriptor.EnumValueOptions. @@ -715,7 +1149,7 @@ var ( // between minor releases. // // optional bool alpha_enum_value = 1060; - E_AlphaEnumValue = &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_extTypes[1] + E_AlphaEnumValue = &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_extTypes[1] ) // Extension fields to descriptor.FieldOptions. @@ -724,13 +1158,13 @@ var ( // and MUST be treated as such (e.g. not logged). // // optional bool cosi_secret = 1059; - E_CosiSecret = &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_extTypes[2] + E_CosiSecret = &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_extTypes[2] // Indicates that this field is OPTIONAL and part of an experimental // API that may be deprecated and eventually removed between minor // releases. // // optional bool alpha_field = 1060; - E_AlphaField = &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_extTypes[3] + E_AlphaField = &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_extTypes[3] ) // Extension fields to descriptor.MessageOptions. @@ -740,7 +1174,7 @@ var ( // releases. // // optional bool alpha_message = 1060; - E_AlphaMessage = &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_extTypes[4] + E_AlphaMessage = &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_extTypes[4] ) // Extension fields to descriptor.MethodOptions. @@ -750,7 +1184,7 @@ var ( // releases. // // optional bool alpha_method = 1060; - E_AlphaMethod = &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_extTypes[5] + E_AlphaMethod = &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_extTypes[5] ) // Extension fields to descriptor.ServiceOptions. @@ -760,277 +1194,393 @@ var ( // releases. // // optional bool alpha_service = 1060; - E_AlphaService = &file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_extTypes[6] + E_AlphaService = &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_extTypes[6] ) -var File_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto protoreflect.FileDescriptor - -var file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_rawDesc = []byte{ - 0x0a, 0x4d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x62, - 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x2d, 0x73, 0x69, 0x67, 0x73, 0x2f, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2d, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2d, 0x73, 0x74, - 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2d, - 0x73, 0x70, 0x65, 0x63, 0x2f, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, - 0x0d, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x1a, 0x20, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x22, 0x1b, 0x0a, 0x19, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, - 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x30, 0x0a, - 0x1a, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, - 0xec, 0x03, 0x0a, 0x1e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x67, 0x0a, 0x0e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x63, 0x6f, - 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, +var File_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto protoreflect.FileDescriptor + +var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDesc = []byte{ + 0x0a, 0x3e, 0x73, 0x69, 0x67, 0x73, 0x2e, 0x6b, 0x38, 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2d, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2d, 0x73, + 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, + 0x2d, 0x73, 0x70, 0x65, 0x63, 0x2f, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x12, 0x0d, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x1a, + 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x22, 0xb3, 0x01, 0x0a, 0x0c, 0x53, 0x33, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x1f, + 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x4e, 0x0a, 0x11, 0x73, 0x69, 0x67, 0x6e, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x53, 0x33, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x65, 0x0a, 0x13, 0x41, 0x7a, 0x75, 0x72, 0x65, + 0x42, 0x6c, 0x6f, 0x62, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x25, + 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, + 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xa2, + 0x01, 0x0a, 0x0d, 0x47, 0x43, 0x53, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x28, 0x0a, 0x10, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x22, 0x82, 0x02, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, + 0x12, 0x2f, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, + 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x02, 0x73, + 0x33, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x33, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x48, 0x00, 0x52, 0x02, 0x73, 0x33, 0x12, 0x42, 0x0a, 0x09, 0x61, 0x7a, + 0x75, 0x72, 0x65, 0x42, 0x6c, 0x6f, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, + 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x7a, + 0x75, 0x72, 0x65, 0x42, 0x6c, 0x6f, 0x62, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x48, 0x00, 0x52, 0x09, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x42, 0x6c, 0x6f, 0x62, 0x12, 0x30, + 0x0a, 0x03, 0x67, 0x63, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6f, + 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x43, 0x53, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x48, 0x00, 0x52, 0x03, 0x67, 0x63, 0x73, + 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x1b, 0x0a, 0x19, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x30, 0x0a, 0x1a, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xde, 0x02, 0x0a, 0x1e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, - 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, - 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x62, - 0x75, 0x63, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x88, 0x01, 0x0a, - 0x1c, 0x61, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x6f, 0x75, 0x73, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, - 0x74, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x47, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x33, 0x0a, 0x08, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, + 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, + 0x5d, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x2e, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x6f, 0x75, 0x73, 0x42, 0x75, 0x63, 0x6b, - 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x19, 0x61, 0x6e, - 0x6f, 0x6e, 0x79, 0x6d, 0x6f, 0x75, 0x73, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x1a, 0x40, 0x0a, 0x12, 0x42, 0x75, 0x63, 0x6b, 0x65, - 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x73, 0x0a, 0x19, 0x41, 0x6e, 0x6f, - 0x6e, 0x79, 0x6d, 0x6f, 0x75, 0x73, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x55, 0x43, 0x4b, 0x45, 0x54, - 0x5f, 0x50, 0x52, 0x49, 0x56, 0x41, 0x54, 0x45, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x42, 0x55, - 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x01, - 0x12, 0x15, 0x0a, 0x11, 0x42, 0x55, 0x43, 0x4b, 0x45, 0x54, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, - 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x42, 0x55, 0x43, 0x4b, 0x45, - 0x54, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x10, 0x03, 0x22, 0x21, - 0x0a, 0x1f, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0xec, 0x01, 0x0a, 0x1e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, - 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, - 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x67, 0x0a, 0x0e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, - 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, - 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, - 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, - 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x42, 0x75, 0x63, - 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0d, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x1a, 0x40, - 0x0a, 0x12, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x21, 0x0a, 0x1f, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0xb9, 0x02, 0x0a, 0x23, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x62, - 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x6c, 0x0a, 0x0e, - 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x45, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, - 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x62, 0x75, 0x63, - 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, - 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, - 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0c, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x1a, 0x40, 0x0a, - 0x12, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0xb4, 0x01, 0x0a, 0x24, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, - 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x69, 0x6e, - 0x63, 0x69, 0x70, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x69, - 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x12, 0x3a, 0x0a, 0x19, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x61, 0x6c, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x63, 0x72, 0x65, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, - 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x13, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x46, 0x69, - 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x22, 0x96, 0x02, 0x0a, 0x24, 0x50, 0x72, 0x6f, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, - 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1f, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x6d, 0x0a, 0x0e, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, - 0x78, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, - 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x42, 0x75, - 0x63, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x0d, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, - 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x1a, 0x40, 0x0a, - 0x12, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x27, 0x0a, 0x25, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, - 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x89, 0x05, 0x0a, 0x0b, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x12, 0x6b, 0x0a, 0x12, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x28, + 0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x69, + 0x0a, 0x1c, 0x61, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x6f, 0x75, 0x73, 0x5f, 0x62, 0x75, 0x63, 0x6b, + 0x65, 0x74, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x6f, 0x75, 0x73, 0x42, 0x75, + 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x19, + 0x61, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x6f, 0x75, 0x73, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x21, 0x0a, 0x1f, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, + 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xf3, 0x01, 0x0a, 0x1e, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x33, + 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x6f, 0x6c, 0x12, 0x5d, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x21, 0x0a, 0x1f, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc0, 0x02, 0x0a, 0x23, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x33, 0x0a, 0x08, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7a, 0x0a, 0x17, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, - 0x12, 0x2d, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2e, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, + 0x6c, 0x12, 0x62, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, + 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, + 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, + 0x70, 0x61, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb4, 0x01, 0x0a, 0x24, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, + 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x12, 0x3a, + 0x0a, 0x19, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x5f, 0x66, 0x69, + 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x17, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x46, 0x69, + 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x63, 0x72, + 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, + 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x63, 0x72, 0x65, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x22, 0x9d, + 0x02, 0x0a, 0x24, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, + 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x33, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x73, 0x69, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6c, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x63, 0x0a, 0x0a, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x43, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, + 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x1a, + 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x27, + 0x0a, 0x25, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x76, + 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x3f, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x13, 0x0a, 0x0f, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, + 0x77, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, + 0x53, 0x33, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x5a, 0x55, 0x52, 0x45, 0x10, 0x02, 0x12, + 0x07, 0x0a, 0x03, 0x47, 0x43, 0x53, 0x10, 0x03, 0x2a, 0x3e, 0x0a, 0x12, 0x53, 0x33, 0x53, 0x69, + 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, + 0x0a, 0x10, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x33, 0x56, 0x32, 0x10, 0x01, 0x12, 0x08, + 0x0a, 0x04, 0x53, 0x33, 0x56, 0x34, 0x10, 0x02, 0x2a, 0x71, 0x0a, 0x19, 0x41, 0x6e, 0x6f, 0x6e, + 0x79, 0x6d, 0x6f, 0x75, 0x73, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x0a, 0x17, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, + 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, + 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x10, 0x01, 0x12, + 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x02, 0x12, 0x0d, 0x0a, + 0x09, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, + 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x04, 0x32, 0x77, 0x0a, 0x08, 0x49, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x6b, 0x0a, 0x12, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x28, 0x2e, + 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x32, 0x9c, 0x04, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x65, 0x72, 0x12, 0x7a, 0x0a, 0x17, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, + 0x2d, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x7a, 0x0a, 0x17, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x2d, 0x2e, 0x63, - 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, - 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x63, 0x6f, + 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, + 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x7a, 0x0a, 0x17, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x2d, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, - 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x87, 0x01, - 0x0a, 0x1c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, - 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x32, - 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, - 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, - 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8a, 0x01, 0x0a, 0x1d, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, - 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x33, 0x2e, 0x63, 0x6f, 0x73, 0x69, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, - 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, - 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, - 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x3a, 0x3c, 0x0a, 0x0a, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x65, 0x6e, - 0x75, 0x6d, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x45, 0x6e, - 0x75, 0x6d, 0x3a, 0x4c, 0x0a, 0x10, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x65, 0x6e, 0x75, 0x6d, - 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0e, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x3f, 0x0a, 0x0b, 0x63, 0x6f, 0x73, 0x69, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, - 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, - 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x63, 0x6f, 0x73, 0x69, 0x53, 0x65, 0x63, 0x72, 0x65, - 0x74, 0x3a, 0x3f, 0x0a, 0x0b, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, - 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x46, 0x69, 0x65, - 0x6c, 0x64, 0x3a, 0x45, 0x0a, 0x0d, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x42, 0x0a, 0x0c, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, - 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0b, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3a, 0x45, 0x0a, - 0x0d, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1f, + 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x63, 0x6f, 0x73, + 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, + 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x87, 0x01, 0x0a, + 0x1c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, + 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x32, 0x2e, + 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, + 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x33, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, + 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8a, 0x01, 0x0a, 0x1d, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, + 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x33, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, + 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, + 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x3a, 0x3c, 0x0a, 0x0a, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x65, 0x6e, 0x75, + 0x6d, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x45, 0x6e, 0x75, + 0x6d, 0x3a, 0x4c, 0x0a, 0x10, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x5f, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0e, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x3f, 0x0a, 0x0b, 0x63, 0x6f, 0x73, 0x69, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x42, 0x06, 0x5a, 0x04, 0x63, 0x6f, 0x73, 0x69, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x08, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x63, 0x6f, 0x73, 0x69, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x3a, 0x3f, 0x0a, 0x0b, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, + 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, + 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x46, 0x69, 0x65, 0x6c, + 0x64, 0x3a, 0x45, 0x0a, 0x0d, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x42, 0x0a, 0x0c, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, + 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0b, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3a, 0x45, 0x0a, 0x0d, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1f, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, + 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x42, 0x3a, 0x5a, 0x38, 0x73, 0x69, 0x67, 0x73, 0x2e, 0x6b, 0x38, 0x73, 0x2e, + 0x69, 0x6f, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2d, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x2d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2d, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x66, 0x61, 0x63, 0x65, 0x2d, 0x73, 0x70, 0x65, 0x63, 0x3b, 0x63, 0x6f, 0x73, 0x69, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( - file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_rawDescOnce sync.Once - file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_rawDescData = file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_rawDesc + file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescOnce sync.Once + file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescData = file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDesc ) -func file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_rawDescGZIP() []byte { - file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_rawDescOnce.Do(func() { - file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_rawDescData = protoimpl.X.CompressGZIP(file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_rawDescData) +func file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP() []byte { + file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescOnce.Do(func() { + file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescData = protoimpl.X.CompressGZIP(file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescData) }) - return file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_rawDescData -} - -var file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes = make([]protoimpl.MessageInfo, 14) -var file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_goTypes = []interface{}{ - (ProvisionerCreateBucketRequest_AnonymousBucketAccessMode)(0), // 0: cosi.v1alpha1.ProvisionerCreateBucketRequest.AnonymousBucketAccessMode - (*ProvisionerGetInfoRequest)(nil), // 1: cosi.v1alpha1.ProvisionerGetInfoRequest - (*ProvisionerGetInfoResponse)(nil), // 2: cosi.v1alpha1.ProvisionerGetInfoResponse - (*ProvisionerCreateBucketRequest)(nil), // 3: cosi.v1alpha1.ProvisionerCreateBucketRequest - (*ProvisionerCreateBucketResponse)(nil), // 4: cosi.v1alpha1.ProvisionerCreateBucketResponse - (*ProvisionerDeleteBucketRequest)(nil), // 5: cosi.v1alpha1.ProvisionerDeleteBucketRequest - (*ProvisionerDeleteBucketResponse)(nil), // 6: cosi.v1alpha1.ProvisionerDeleteBucketResponse - (*ProvisionerGrantBucketAccessRequest)(nil), // 7: cosi.v1alpha1.ProvisionerGrantBucketAccessRequest - (*ProvisionerGrantBucketAccessResponse)(nil), // 8: cosi.v1alpha1.ProvisionerGrantBucketAccessResponse - (*ProvisionerRevokeBucketAccessRequest)(nil), // 9: cosi.v1alpha1.ProvisionerRevokeBucketAccessRequest - (*ProvisionerRevokeBucketAccessResponse)(nil), // 10: cosi.v1alpha1.ProvisionerRevokeBucketAccessResponse - nil, // 11: cosi.v1alpha1.ProvisionerCreateBucketRequest.BucketContextEntry - nil, // 12: cosi.v1alpha1.ProvisionerDeleteBucketRequest.BucketContextEntry - nil, // 13: cosi.v1alpha1.ProvisionerGrantBucketAccessRequest.BucketContextEntry - nil, // 14: cosi.v1alpha1.ProvisionerRevokeBucketAccessRequest.BucketContextEntry - (*descriptor.EnumOptions)(nil), // 15: google.protobuf.EnumOptions - (*descriptor.EnumValueOptions)(nil), // 16: google.protobuf.EnumValueOptions - (*descriptor.FieldOptions)(nil), // 17: google.protobuf.FieldOptions - (*descriptor.MessageOptions)(nil), // 18: google.protobuf.MessageOptions - (*descriptor.MethodOptions)(nil), // 19: google.protobuf.MethodOptions - (*descriptor.ServiceOptions)(nil), // 20: google.protobuf.ServiceOptions -} -var file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_depIdxs = []int32{ - 11, // 0: cosi.v1alpha1.ProvisionerCreateBucketRequest.bucket_context:type_name -> cosi.v1alpha1.ProvisionerCreateBucketRequest.BucketContextEntry - 0, // 1: cosi.v1alpha1.ProvisionerCreateBucketRequest.anonymous_bucket_access_mode:type_name -> cosi.v1alpha1.ProvisionerCreateBucketRequest.AnonymousBucketAccessMode - 12, // 2: cosi.v1alpha1.ProvisionerDeleteBucketRequest.bucket_context:type_name -> cosi.v1alpha1.ProvisionerDeleteBucketRequest.BucketContextEntry - 13, // 3: cosi.v1alpha1.ProvisionerGrantBucketAccessRequest.bucket_context:type_name -> cosi.v1alpha1.ProvisionerGrantBucketAccessRequest.BucketContextEntry - 14, // 4: cosi.v1alpha1.ProvisionerRevokeBucketAccessRequest.bucket_context:type_name -> cosi.v1alpha1.ProvisionerRevokeBucketAccessRequest.BucketContextEntry - 15, // 5: cosi.v1alpha1.alpha_enum:extendee -> google.protobuf.EnumOptions - 16, // 6: cosi.v1alpha1.alpha_enum_value:extendee -> google.protobuf.EnumValueOptions - 17, // 7: cosi.v1alpha1.cosi_secret:extendee -> google.protobuf.FieldOptions - 17, // 8: cosi.v1alpha1.alpha_field:extendee -> google.protobuf.FieldOptions - 18, // 9: cosi.v1alpha1.alpha_message:extendee -> google.protobuf.MessageOptions - 19, // 10: cosi.v1alpha1.alpha_method:extendee -> google.protobuf.MethodOptions - 20, // 11: cosi.v1alpha1.alpha_service:extendee -> google.protobuf.ServiceOptions - 1, // 12: cosi.v1alpha1.Provisioner.ProvisionerGetInfo:input_type -> cosi.v1alpha1.ProvisionerGetInfoRequest - 3, // 13: cosi.v1alpha1.Provisioner.ProvisionerCreateBucket:input_type -> cosi.v1alpha1.ProvisionerCreateBucketRequest - 5, // 14: cosi.v1alpha1.Provisioner.ProvisionerDeleteBucket:input_type -> cosi.v1alpha1.ProvisionerDeleteBucketRequest - 7, // 15: cosi.v1alpha1.Provisioner.ProvisionerGrantBucketAccess:input_type -> cosi.v1alpha1.ProvisionerGrantBucketAccessRequest - 9, // 16: cosi.v1alpha1.Provisioner.ProvisionerRevokeBucketAccess:input_type -> cosi.v1alpha1.ProvisionerRevokeBucketAccessRequest - 2, // 17: cosi.v1alpha1.Provisioner.ProvisionerGetInfo:output_type -> cosi.v1alpha1.ProvisionerGetInfoResponse - 4, // 18: cosi.v1alpha1.Provisioner.ProvisionerCreateBucket:output_type -> cosi.v1alpha1.ProvisionerCreateBucketResponse - 6, // 19: cosi.v1alpha1.Provisioner.ProvisionerDeleteBucket:output_type -> cosi.v1alpha1.ProvisionerDeleteBucketResponse - 8, // 20: cosi.v1alpha1.Provisioner.ProvisionerGrantBucketAccess:output_type -> cosi.v1alpha1.ProvisionerGrantBucketAccessResponse - 10, // 21: cosi.v1alpha1.Provisioner.ProvisionerRevokeBucketAccess:output_type -> cosi.v1alpha1.ProvisionerRevokeBucketAccessResponse - 17, // [17:22] is the sub-list for method output_type - 12, // [12:17] is the sub-list for method input_type - 12, // [12:12] is the sub-list for extension type_name - 5, // [5:12] is the sub-list for extension extendee - 0, // [0:5] is the sub-list for field type_name -} - -func init() { - file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_init() -} -func file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_init() { - if File_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto != nil { + return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescData +} + +var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_enumTypes = make([]protoimpl.EnumInfo, 3) +var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes = make([]protoimpl.MessageInfo, 18) +var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_goTypes = []interface{}{ + (ProtocolName)(0), // 0: cosi.v1alpha1.ProtocolName + (S3SignatureVersion)(0), // 1: cosi.v1alpha1.S3SignatureVersion + (AnonymousBucketAccessMode)(0), // 2: cosi.v1alpha1.AnonymousBucketAccessMode + (*S3Parameters)(nil), // 3: cosi.v1alpha1.S3Parameters + (*AzureBlobParameters)(nil), // 4: cosi.v1alpha1.AzureBlobParameters + (*GCSParameters)(nil), // 5: cosi.v1alpha1.GCSParameters + (*Protocol)(nil), // 6: cosi.v1alpha1.Protocol + (*ProvisionerGetInfoRequest)(nil), // 7: cosi.v1alpha1.ProvisionerGetInfoRequest + (*ProvisionerGetInfoResponse)(nil), // 8: cosi.v1alpha1.ProvisionerGetInfoResponse + (*ProvisionerCreateBucketRequest)(nil), // 9: cosi.v1alpha1.ProvisionerCreateBucketRequest + (*ProvisionerCreateBucketResponse)(nil), // 10: cosi.v1alpha1.ProvisionerCreateBucketResponse + (*ProvisionerDeleteBucketRequest)(nil), // 11: cosi.v1alpha1.ProvisionerDeleteBucketRequest + (*ProvisionerDeleteBucketResponse)(nil), // 12: cosi.v1alpha1.ProvisionerDeleteBucketResponse + (*ProvisionerGrantBucketAccessRequest)(nil), // 13: cosi.v1alpha1.ProvisionerGrantBucketAccessRequest + (*ProvisionerGrantBucketAccessResponse)(nil), // 14: cosi.v1alpha1.ProvisionerGrantBucketAccessResponse + (*ProvisionerRevokeBucketAccessRequest)(nil), // 15: cosi.v1alpha1.ProvisionerRevokeBucketAccessRequest + (*ProvisionerRevokeBucketAccessResponse)(nil), // 16: cosi.v1alpha1.ProvisionerRevokeBucketAccessResponse + nil, // 17: cosi.v1alpha1.ProvisionerCreateBucketRequest.ParametersEntry + nil, // 18: cosi.v1alpha1.ProvisionerDeleteBucketRequest.ParametersEntry + nil, // 19: cosi.v1alpha1.ProvisionerGrantBucketAccessRequest.ParametersEntry + nil, // 20: cosi.v1alpha1.ProvisionerRevokeBucketAccessRequest.ParametersEntry + (*descriptor.EnumOptions)(nil), // 21: google.protobuf.EnumOptions + (*descriptor.EnumValueOptions)(nil), // 22: google.protobuf.EnumValueOptions + (*descriptor.FieldOptions)(nil), // 23: google.protobuf.FieldOptions + (*descriptor.MessageOptions)(nil), // 24: google.protobuf.MessageOptions + (*descriptor.MethodOptions)(nil), // 25: google.protobuf.MethodOptions + (*descriptor.ServiceOptions)(nil), // 26: google.protobuf.ServiceOptions +} +var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_depIdxs = []int32{ + 1, // 0: cosi.v1alpha1.S3Parameters.signature_version:type_name -> cosi.v1alpha1.S3SignatureVersion + 0, // 1: cosi.v1alpha1.Protocol.name:type_name -> cosi.v1alpha1.ProtocolName + 3, // 2: cosi.v1alpha1.Protocol.s3:type_name -> cosi.v1alpha1.S3Parameters + 4, // 3: cosi.v1alpha1.Protocol.azureBlob:type_name -> cosi.v1alpha1.AzureBlobParameters + 5, // 4: cosi.v1alpha1.Protocol.gcs:type_name -> cosi.v1alpha1.GCSParameters + 6, // 5: cosi.v1alpha1.ProvisionerCreateBucketRequest.protocol:type_name -> cosi.v1alpha1.Protocol + 17, // 6: cosi.v1alpha1.ProvisionerCreateBucketRequest.parameters:type_name -> cosi.v1alpha1.ProvisionerCreateBucketRequest.ParametersEntry + 2, // 7: cosi.v1alpha1.ProvisionerCreateBucketRequest.anonymous_bucket_access_mode:type_name -> cosi.v1alpha1.AnonymousBucketAccessMode + 6, // 8: cosi.v1alpha1.ProvisionerDeleteBucketRequest.protocol:type_name -> cosi.v1alpha1.Protocol + 18, // 9: cosi.v1alpha1.ProvisionerDeleteBucketRequest.parameters:type_name -> cosi.v1alpha1.ProvisionerDeleteBucketRequest.ParametersEntry + 6, // 10: cosi.v1alpha1.ProvisionerGrantBucketAccessRequest.protocol:type_name -> cosi.v1alpha1.Protocol + 19, // 11: cosi.v1alpha1.ProvisionerGrantBucketAccessRequest.parameters:type_name -> cosi.v1alpha1.ProvisionerGrantBucketAccessRequest.ParametersEntry + 6, // 12: cosi.v1alpha1.ProvisionerRevokeBucketAccessRequest.protocol:type_name -> cosi.v1alpha1.Protocol + 20, // 13: cosi.v1alpha1.ProvisionerRevokeBucketAccessRequest.parameters:type_name -> cosi.v1alpha1.ProvisionerRevokeBucketAccessRequest.ParametersEntry + 21, // 14: cosi.v1alpha1.alpha_enum:extendee -> google.protobuf.EnumOptions + 22, // 15: cosi.v1alpha1.alpha_enum_value:extendee -> google.protobuf.EnumValueOptions + 23, // 16: cosi.v1alpha1.cosi_secret:extendee -> google.protobuf.FieldOptions + 23, // 17: cosi.v1alpha1.alpha_field:extendee -> google.protobuf.FieldOptions + 24, // 18: cosi.v1alpha1.alpha_message:extendee -> google.protobuf.MessageOptions + 25, // 19: cosi.v1alpha1.alpha_method:extendee -> google.protobuf.MethodOptions + 26, // 20: cosi.v1alpha1.alpha_service:extendee -> google.protobuf.ServiceOptions + 7, // 21: cosi.v1alpha1.Identity.ProvisionerGetInfo:input_type -> cosi.v1alpha1.ProvisionerGetInfoRequest + 9, // 22: cosi.v1alpha1.Provisioner.ProvisionerCreateBucket:input_type -> cosi.v1alpha1.ProvisionerCreateBucketRequest + 11, // 23: cosi.v1alpha1.Provisioner.ProvisionerDeleteBucket:input_type -> cosi.v1alpha1.ProvisionerDeleteBucketRequest + 13, // 24: cosi.v1alpha1.Provisioner.ProvisionerGrantBucketAccess:input_type -> cosi.v1alpha1.ProvisionerGrantBucketAccessRequest + 15, // 25: cosi.v1alpha1.Provisioner.ProvisionerRevokeBucketAccess:input_type -> cosi.v1alpha1.ProvisionerRevokeBucketAccessRequest + 8, // 26: cosi.v1alpha1.Identity.ProvisionerGetInfo:output_type -> cosi.v1alpha1.ProvisionerGetInfoResponse + 10, // 27: cosi.v1alpha1.Provisioner.ProvisionerCreateBucket:output_type -> cosi.v1alpha1.ProvisionerCreateBucketResponse + 12, // 28: cosi.v1alpha1.Provisioner.ProvisionerDeleteBucket:output_type -> cosi.v1alpha1.ProvisionerDeleteBucketResponse + 14, // 29: cosi.v1alpha1.Provisioner.ProvisionerGrantBucketAccess:output_type -> cosi.v1alpha1.ProvisionerGrantBucketAccessResponse + 16, // 30: cosi.v1alpha1.Provisioner.ProvisionerRevokeBucketAccess:output_type -> cosi.v1alpha1.ProvisionerRevokeBucketAccessResponse + 26, // [26:31] is the sub-list for method output_type + 21, // [21:26] is the sub-list for method input_type + 21, // [21:21] is the sub-list for extension type_name + 14, // [14:21] is the sub-list for extension extendee + 0, // [0:14] is the sub-list for field type_name +} + +func init() { file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_init() } +func file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_init() { + if File_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto != nil { return } if !protoimpl.UnsafeEnabled { - file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*S3Parameters); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AzureBlobParameters); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GCSParameters); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Protocol); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProvisionerGetInfoRequest); i { case 0: return &v.state @@ -1042,7 +1592,7 @@ func file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cos return nil } } - file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProvisionerGetInfoResponse); i { case 0: return &v.state @@ -1054,7 +1604,7 @@ func file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cos return nil } } - file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProvisionerCreateBucketRequest); i { case 0: return &v.state @@ -1066,7 +1616,7 @@ func file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cos return nil } } - file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProvisionerCreateBucketResponse); i { case 0: return &v.state @@ -1078,7 +1628,7 @@ func file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cos return nil } } - file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProvisionerDeleteBucketRequest); i { case 0: return &v.state @@ -1090,7 +1640,7 @@ func file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cos return nil } } - file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProvisionerDeleteBucketResponse); i { case 0: return &v.state @@ -1102,7 +1652,7 @@ func file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cos return nil } } - file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProvisionerGrantBucketAccessRequest); i { case 0: return &v.state @@ -1114,7 +1664,7 @@ func file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cos return nil } } - file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProvisionerGrantBucketAccessResponse); i { case 0: return &v.state @@ -1126,7 +1676,7 @@ func file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cos return nil } } - file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProvisionerRevokeBucketAccessRequest); i { case 0: return &v.state @@ -1138,7 +1688,7 @@ func file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cos return nil } } - file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProvisionerRevokeBucketAccessResponse); i { case 0: return &v.state @@ -1151,26 +1701,31 @@ func file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cos } } } + file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[3].OneofWrappers = []interface{}{ + (*Protocol_S3)(nil), + (*Protocol_AzureBlob)(nil), + (*Protocol_Gcs)(nil), + } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_rawDesc, - NumEnums: 1, - NumMessages: 14, + RawDescriptor: file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDesc, + NumEnums: 3, + NumMessages: 18, NumExtensions: 7, - NumServices: 1, + NumServices: 2, }, - GoTypes: file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_goTypes, - DependencyIndexes: file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_depIdxs, - EnumInfos: file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_enumTypes, - MessageInfos: file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_msgTypes, - ExtensionInfos: file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_extTypes, + GoTypes: file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_goTypes, + DependencyIndexes: file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_depIdxs, + EnumInfos: file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_enumTypes, + MessageInfos: file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes, + ExtensionInfos: file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_extTypes, }.Build() - File_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto = out.File - file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_rawDesc = nil - file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_goTypes = nil - file_github_com_kubernetes_sigs_container_object_storage_interface_spec_cosi_proto_depIdxs = nil + File_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto = out.File + file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDesc = nil + file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_goTypes = nil + file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_depIdxs = nil } // Reference imports to suppress errors if they are not otherwise used. @@ -1181,13 +1736,86 @@ var _ grpc.ClientConnInterface // is compatible with the grpc package it is being compiled against. const _ = grpc.SupportPackageIsVersion6 -// ProvisionerClient is the client API for Provisioner service. +// IdentityClient is the client API for Identity service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type ProvisionerClient interface { +type IdentityClient interface { // This call is meant to retrieve the unique provisioner Identity. // This identity will have to be set in BucketRequest.Provisioner field in order to invoke this specific provisioner. ProvisionerGetInfo(ctx context.Context, in *ProvisionerGetInfoRequest, opts ...grpc.CallOption) (*ProvisionerGetInfoResponse, error) +} + +type identityClient struct { + cc grpc.ClientConnInterface +} + +func NewIdentityClient(cc grpc.ClientConnInterface) IdentityClient { + return &identityClient{cc} +} + +func (c *identityClient) ProvisionerGetInfo(ctx context.Context, in *ProvisionerGetInfoRequest, opts ...grpc.CallOption) (*ProvisionerGetInfoResponse, error) { + out := new(ProvisionerGetInfoResponse) + err := c.cc.Invoke(ctx, "/cosi.v1alpha1.Identity/ProvisionerGetInfo", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// IdentityServer is the server API for Identity service. +type IdentityServer interface { + // This call is meant to retrieve the unique provisioner Identity. + // This identity will have to be set in BucketRequest.Provisioner field in order to invoke this specific provisioner. + ProvisionerGetInfo(context.Context, *ProvisionerGetInfoRequest) (*ProvisionerGetInfoResponse, error) +} + +// UnimplementedIdentityServer can be embedded to have forward compatible implementations. +type UnimplementedIdentityServer struct { +} + +func (*UnimplementedIdentityServer) ProvisionerGetInfo(context.Context, *ProvisionerGetInfoRequest) (*ProvisionerGetInfoResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ProvisionerGetInfo not implemented") +} + +func RegisterIdentityServer(s *grpc.Server, srv IdentityServer) { + s.RegisterService(&_Identity_serviceDesc, srv) +} + +func _Identity_ProvisionerGetInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ProvisionerGetInfoRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(IdentityServer).ProvisionerGetInfo(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/cosi.v1alpha1.Identity/ProvisionerGetInfo", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(IdentityServer).ProvisionerGetInfo(ctx, req.(*ProvisionerGetInfoRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _Identity_serviceDesc = grpc.ServiceDesc{ + ServiceName: "cosi.v1alpha1.Identity", + HandlerType: (*IdentityServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "ProvisionerGetInfo", + Handler: _Identity_ProvisionerGetInfo_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "sigs.k8s.io/container-object-storage-interface-spec/cosi.proto", +} + +// ProvisionerClient is the client API for Provisioner service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type ProvisionerClient interface { // This call is made to create the bucket in the backend. // This call is idempotent // 1. If a bucket that matches both name and parameters already exists, then OK (success) must be returned. @@ -1213,15 +1841,6 @@ func NewProvisionerClient(cc grpc.ClientConnInterface) ProvisionerClient { return &provisionerClient{cc} } -func (c *provisionerClient) ProvisionerGetInfo(ctx context.Context, in *ProvisionerGetInfoRequest, opts ...grpc.CallOption) (*ProvisionerGetInfoResponse, error) { - out := new(ProvisionerGetInfoResponse) - err := c.cc.Invoke(ctx, "/cosi.v1alpha1.Provisioner/ProvisionerGetInfo", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *provisionerClient) ProvisionerCreateBucket(ctx context.Context, in *ProvisionerCreateBucketRequest, opts ...grpc.CallOption) (*ProvisionerCreateBucketResponse, error) { out := new(ProvisionerCreateBucketResponse) err := c.cc.Invoke(ctx, "/cosi.v1alpha1.Provisioner/ProvisionerCreateBucket", in, out, opts...) @@ -1260,9 +1879,6 @@ func (c *provisionerClient) ProvisionerRevokeBucketAccess(ctx context.Context, i // ProvisionerServer is the server API for Provisioner service. type ProvisionerServer interface { - // This call is meant to retrieve the unique provisioner Identity. - // This identity will have to be set in BucketRequest.Provisioner field in order to invoke this specific provisioner. - ProvisionerGetInfo(context.Context, *ProvisionerGetInfoRequest) (*ProvisionerGetInfoResponse, error) // This call is made to create the bucket in the backend. // This call is idempotent // 1. If a bucket that matches both name and parameters already exists, then OK (success) must be returned. @@ -1284,9 +1900,6 @@ type ProvisionerServer interface { type UnimplementedProvisionerServer struct { } -func (*UnimplementedProvisionerServer) ProvisionerGetInfo(context.Context, *ProvisionerGetInfoRequest) (*ProvisionerGetInfoResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ProvisionerGetInfo not implemented") -} func (*UnimplementedProvisionerServer) ProvisionerCreateBucket(context.Context, *ProvisionerCreateBucketRequest) (*ProvisionerCreateBucketResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ProvisionerCreateBucket not implemented") } @@ -1304,24 +1917,6 @@ func RegisterProvisionerServer(s *grpc.Server, srv ProvisionerServer) { s.RegisterService(&_Provisioner_serviceDesc, srv) } -func _Provisioner_ProvisionerGetInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ProvisionerGetInfoRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ProvisionerServer).ProvisionerGetInfo(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/cosi.v1alpha1.Provisioner/ProvisionerGetInfo", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ProvisionerServer).ProvisionerGetInfo(ctx, req.(*ProvisionerGetInfoRequest)) - } - return interceptor(ctx, in, info, handler) -} - func _Provisioner_ProvisionerCreateBucket_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ProvisionerCreateBucketRequest) if err := dec(in); err != nil { @@ -1398,10 +1993,6 @@ var _Provisioner_serviceDesc = grpc.ServiceDesc{ ServiceName: "cosi.v1alpha1.Provisioner", HandlerType: (*ProvisionerServer)(nil), Methods: []grpc.MethodDesc{ - { - MethodName: "ProvisionerGetInfo", - Handler: _Provisioner_ProvisionerGetInfo_Handler, - }, { MethodName: "ProvisionerCreateBucket", Handler: _Provisioner_ProvisionerCreateBucket_Handler, @@ -1420,5 +2011,5 @@ var _Provisioner_serviceDesc = grpc.ServiceDesc{ }, }, Streams: []grpc.StreamDesc{}, - Metadata: "github.com/kubernetes-sigs/container-object-storage-interface-spec/cosi.proto", + Metadata: "sigs.k8s.io/container-object-storage-interface-spec/cosi.proto", } diff --git a/cosi.pb.json.go b/cosi.pb.json.go new file mode 100644 index 00000000..0a4fc693 --- /dev/null +++ b/cosi.pb.json.go @@ -0,0 +1,262 @@ +// Code generated by protoc-gen-go-json. DO NOT EDIT. +// source: sigs.k8s.io/container-object-storage-interface-spec/cosi.proto + +package cosi + +import ( + "bytes" + + "github.com/golang/protobuf/jsonpb" +) + +// MarshalJSON implements json.Marshaler +func (msg *S3Parameters) MarshalJSON() ([]byte, error) { + var buf bytes.Buffer + err := (&jsonpb.Marshaler{ + EnumsAsInts: false, + EmitDefaults: true, + OrigName: false, + }).Marshal(&buf, msg) + return buf.Bytes(), err +} + +// UnmarshalJSON implements json.Unmarshaler +func (msg *S3Parameters) UnmarshalJSON(b []byte) error { + return (&jsonpb.Unmarshaler{ + AllowUnknownFields: false, + }).Unmarshal(bytes.NewReader(b), msg) +} + +// MarshalJSON implements json.Marshaler +func (msg *AzureBlobParameters) MarshalJSON() ([]byte, error) { + var buf bytes.Buffer + err := (&jsonpb.Marshaler{ + EnumsAsInts: false, + EmitDefaults: true, + OrigName: false, + }).Marshal(&buf, msg) + return buf.Bytes(), err +} + +// UnmarshalJSON implements json.Unmarshaler +func (msg *AzureBlobParameters) UnmarshalJSON(b []byte) error { + return (&jsonpb.Unmarshaler{ + AllowUnknownFields: false, + }).Unmarshal(bytes.NewReader(b), msg) +} + +// MarshalJSON implements json.Marshaler +func (msg *GCSParameters) MarshalJSON() ([]byte, error) { + var buf bytes.Buffer + err := (&jsonpb.Marshaler{ + EnumsAsInts: false, + EmitDefaults: true, + OrigName: false, + }).Marshal(&buf, msg) + return buf.Bytes(), err +} + +// UnmarshalJSON implements json.Unmarshaler +func (msg *GCSParameters) UnmarshalJSON(b []byte) error { + return (&jsonpb.Unmarshaler{ + AllowUnknownFields: false, + }).Unmarshal(bytes.NewReader(b), msg) +} + +// MarshalJSON implements json.Marshaler +func (msg *Protocol) MarshalJSON() ([]byte, error) { + var buf bytes.Buffer + err := (&jsonpb.Marshaler{ + EnumsAsInts: false, + EmitDefaults: true, + OrigName: false, + }).Marshal(&buf, msg) + return buf.Bytes(), err +} + +// UnmarshalJSON implements json.Unmarshaler +func (msg *Protocol) UnmarshalJSON(b []byte) error { + return (&jsonpb.Unmarshaler{ + AllowUnknownFields: false, + }).Unmarshal(bytes.NewReader(b), msg) +} + +// MarshalJSON implements json.Marshaler +func (msg *ProvisionerGetInfoRequest) MarshalJSON() ([]byte, error) { + var buf bytes.Buffer + err := (&jsonpb.Marshaler{ + EnumsAsInts: false, + EmitDefaults: true, + OrigName: false, + }).Marshal(&buf, msg) + return buf.Bytes(), err +} + +// UnmarshalJSON implements json.Unmarshaler +func (msg *ProvisionerGetInfoRequest) UnmarshalJSON(b []byte) error { + return (&jsonpb.Unmarshaler{ + AllowUnknownFields: false, + }).Unmarshal(bytes.NewReader(b), msg) +} + +// MarshalJSON implements json.Marshaler +func (msg *ProvisionerGetInfoResponse) MarshalJSON() ([]byte, error) { + var buf bytes.Buffer + err := (&jsonpb.Marshaler{ + EnumsAsInts: false, + EmitDefaults: true, + OrigName: false, + }).Marshal(&buf, msg) + return buf.Bytes(), err +} + +// UnmarshalJSON implements json.Unmarshaler +func (msg *ProvisionerGetInfoResponse) UnmarshalJSON(b []byte) error { + return (&jsonpb.Unmarshaler{ + AllowUnknownFields: false, + }).Unmarshal(bytes.NewReader(b), msg) +} + +// MarshalJSON implements json.Marshaler +func (msg *ProvisionerCreateBucketRequest) MarshalJSON() ([]byte, error) { + var buf bytes.Buffer + err := (&jsonpb.Marshaler{ + EnumsAsInts: false, + EmitDefaults: true, + OrigName: false, + }).Marshal(&buf, msg) + return buf.Bytes(), err +} + +// UnmarshalJSON implements json.Unmarshaler +func (msg *ProvisionerCreateBucketRequest) UnmarshalJSON(b []byte) error { + return (&jsonpb.Unmarshaler{ + AllowUnknownFields: false, + }).Unmarshal(bytes.NewReader(b), msg) +} + +// MarshalJSON implements json.Marshaler +func (msg *ProvisionerCreateBucketResponse) MarshalJSON() ([]byte, error) { + var buf bytes.Buffer + err := (&jsonpb.Marshaler{ + EnumsAsInts: false, + EmitDefaults: true, + OrigName: false, + }).Marshal(&buf, msg) + return buf.Bytes(), err +} + +// UnmarshalJSON implements json.Unmarshaler +func (msg *ProvisionerCreateBucketResponse) UnmarshalJSON(b []byte) error { + return (&jsonpb.Unmarshaler{ + AllowUnknownFields: false, + }).Unmarshal(bytes.NewReader(b), msg) +} + +// MarshalJSON implements json.Marshaler +func (msg *ProvisionerDeleteBucketRequest) MarshalJSON() ([]byte, error) { + var buf bytes.Buffer + err := (&jsonpb.Marshaler{ + EnumsAsInts: false, + EmitDefaults: true, + OrigName: false, + }).Marshal(&buf, msg) + return buf.Bytes(), err +} + +// UnmarshalJSON implements json.Unmarshaler +func (msg *ProvisionerDeleteBucketRequest) UnmarshalJSON(b []byte) error { + return (&jsonpb.Unmarshaler{ + AllowUnknownFields: false, + }).Unmarshal(bytes.NewReader(b), msg) +} + +// MarshalJSON implements json.Marshaler +func (msg *ProvisionerDeleteBucketResponse) MarshalJSON() ([]byte, error) { + var buf bytes.Buffer + err := (&jsonpb.Marshaler{ + EnumsAsInts: false, + EmitDefaults: true, + OrigName: false, + }).Marshal(&buf, msg) + return buf.Bytes(), err +} + +// UnmarshalJSON implements json.Unmarshaler +func (msg *ProvisionerDeleteBucketResponse) UnmarshalJSON(b []byte) error { + return (&jsonpb.Unmarshaler{ + AllowUnknownFields: false, + }).Unmarshal(bytes.NewReader(b), msg) +} + +// MarshalJSON implements json.Marshaler +func (msg *ProvisionerGrantBucketAccessRequest) MarshalJSON() ([]byte, error) { + var buf bytes.Buffer + err := (&jsonpb.Marshaler{ + EnumsAsInts: false, + EmitDefaults: true, + OrigName: false, + }).Marshal(&buf, msg) + return buf.Bytes(), err +} + +// UnmarshalJSON implements json.Unmarshaler +func (msg *ProvisionerGrantBucketAccessRequest) UnmarshalJSON(b []byte) error { + return (&jsonpb.Unmarshaler{ + AllowUnknownFields: false, + }).Unmarshal(bytes.NewReader(b), msg) +} + +// MarshalJSON implements json.Marshaler +func (msg *ProvisionerGrantBucketAccessResponse) MarshalJSON() ([]byte, error) { + var buf bytes.Buffer + err := (&jsonpb.Marshaler{ + EnumsAsInts: false, + EmitDefaults: true, + OrigName: false, + }).Marshal(&buf, msg) + return buf.Bytes(), err +} + +// UnmarshalJSON implements json.Unmarshaler +func (msg *ProvisionerGrantBucketAccessResponse) UnmarshalJSON(b []byte) error { + return (&jsonpb.Unmarshaler{ + AllowUnknownFields: false, + }).Unmarshal(bytes.NewReader(b), msg) +} + +// MarshalJSON implements json.Marshaler +func (msg *ProvisionerRevokeBucketAccessRequest) MarshalJSON() ([]byte, error) { + var buf bytes.Buffer + err := (&jsonpb.Marshaler{ + EnumsAsInts: false, + EmitDefaults: true, + OrigName: false, + }).Marshal(&buf, msg) + return buf.Bytes(), err +} + +// UnmarshalJSON implements json.Unmarshaler +func (msg *ProvisionerRevokeBucketAccessRequest) UnmarshalJSON(b []byte) error { + return (&jsonpb.Unmarshaler{ + AllowUnknownFields: false, + }).Unmarshal(bytes.NewReader(b), msg) +} + +// MarshalJSON implements json.Marshaler +func (msg *ProvisionerRevokeBucketAccessResponse) MarshalJSON() ([]byte, error) { + var buf bytes.Buffer + err := (&jsonpb.Marshaler{ + EnumsAsInts: false, + EmitDefaults: true, + OrigName: false, + }).Marshal(&buf, msg) + return buf.Bytes(), err +} + +// UnmarshalJSON implements json.Unmarshaler +func (msg *ProvisionerRevokeBucketAccessResponse) UnmarshalJSON(b []byte) error { + return (&jsonpb.Unmarshaler{ + AllowUnknownFields: false, + }).Unmarshal(bytes.NewReader(b), msg) +} diff --git a/cosi.proto b/cosi.proto index 04d0f19a..d55a5b6f 100644 --- a/cosi.proto +++ b/cosi.proto @@ -1,9 +1,10 @@ +// Code generated by make; DO NOT EDIT. syntax = "proto3"; package cosi.v1alpha1; import "google/protobuf/descriptor.proto"; -option go_package = "cosi"; +option go_package = "sigs.k8s.io/container-object-storage-interface-spec;cosi"; extend google.protobuf.EnumOptions { // Indicates that this enum is OPTIONAL and part of an experimental @@ -51,11 +52,13 @@ extend google.protobuf.ServiceOptions { bool alpha_service = 1060; } -service Provisioner { +service Identity { // This call is meant to retrieve the unique provisioner Identity. // This identity will have to be set in BucketRequest.Provisioner field in order to invoke this specific provisioner. rpc ProvisionerGetInfo (ProvisionerGetInfoRequest) returns (ProvisionerGetInfoResponse) {} +} +service Provisioner { // This call is made to create the bucket in the backend. // This call is idempotent // 1. If a bucket that matches both name and parameters already exists, then OK (success) must be returned. @@ -74,6 +77,79 @@ service Provisioner { rpc ProvisionerRevokeBucketAccess (ProvisionerRevokeBucketAccessRequest) returns (ProvisionerRevokeBucketAccessResponse); } +enum ProtocolName { + UnknownProtocol = 0; + // S3, AWS S3 protocol + S3 = 1; + // AZURE, Microsoft Azure protocol + AZURE = 2; + // GCS, Google GCS protocol + GCS = 3; +} + +// S3SignatureVersion is the version of the signing algorithm for all s3 requests +enum S3SignatureVersion { + UnknownSignature = 0; + // S3V2, Signature version v2 + S3V2 = 1; + // S3V4, Signature version v4 + S3V4 = 2; +} + +enum AnonymousBucketAccessMode { + UnknownBucketAccessMode = 0; + // Default, disallow uncredentialed access to the backend storage. + Private = 1; + // Read only, uncredentialed users can call ListBucket and GetObject. + ReadOnly = 2; + // Write only, uncredentialed users can only call PutObject. + WriteOnly = 3; + // Read/Write, uncredentialed users can read objects as well as PutObject. + ReadWrite = 4; +} + +message S3Parameters { + // endpoint denotes the URL of the S3 server + string endpoint = 1; + // bucket_name denotes the name of the bucket in the storage backend + string bucket_name = 2; + // region denotes the geographical region where the S3 server is running + string region = 3; + // signature_version denotes the signature version for signing all s3 requests + S3SignatureVersion signature_version = 4; +} + +message AzureBlobParameters { + // container_name is the name of the azure container + string container_name = 1; + // storage_account is the id of the azure storage account + string storage_account = 2; +} + +message GCSParameters { + // bucket_name denotes the name of the bucket in the storage backend + string bucket_name = 1; + // private_key_name denotes the name of the private key in the storage backend + string private_key_name = 2; + // project_id denotes the name of the project id in the storage backend + string project_id = 3; + // service_account denotes the name of the service account in the storage backend + string service_account = 4; +} + +message Protocol { + // ProtocolName is the name of the protocol + ProtocolName name = 1; + // version is the name of the protocol version + string version = 2; + + oneof type { + S3Parameters s3 = 3; + AzureBlobParameters azureBlob = 4; + GCSParameters gcs = 5; + } +} + message ProvisionerGetInfoRequest { // Intentionally left blank } @@ -92,24 +168,14 @@ message ProvisionerGetInfoResponse { message ProvisionerCreateBucketRequest { // This field is REQUIRED - // Bucket name. - string bucket_name = 1; + // Protocol specific information required by the call is passed in as key,value pairs. + Protocol protocol = 1; // This field is OPTIONAL - // Protocol specific information required by the call is passed in as key,value pairs. - map bucket_context = 2; - - enum AnonymousBucketAccessMode { - // Default, disallow uncredentialed access to the backend storage. - BUCKET_PRIVATE = 0; - // Read only, uncredentialed users can call ListBucket and GetObject. - BUCKET_READ_ONLY = 1; - // Write only, uncredentialed users can only call PutObject. - BUCKET_WRITE_ONLY = 2; - // Read/Write, same as ro with the addition of PutObject being allowed. - BUCKET_READ_WRITE = 3; - } - + // The caller should treat the values in parameters as opaque. + // The receiver is responsible for parsing and validating the values. + map parameters = 2; + // This field is OPTIONAL // Allow uncredentialed access to bucket. AnonymousBucketAccessMode anonymous_bucket_access_mode = 3; @@ -121,31 +187,33 @@ message ProvisionerCreateBucketResponse { message ProvisionerDeleteBucketRequest { // This field is REQUIRED - // Bucket name. - string bucket_name = 1; - + // Protocol specific information required by the call is passed in as key,value pairs. + Protocol protocol = 1; + // This field is OPTIONAL // Protocol specific information required by the call is passed in as key,value pairs. - map bucket_context = 2; + // The caller should treat the values in parameters as opaque. + // The receiver is responsible for parsing and validating the values. + map parameters = 2; } message ProvisionerDeleteBucketResponse { - // Intentionally left blank + // Intentionally left blank } message ProvisionerGrantBucketAccessRequest { // This field is REQUIRED - // Bucket name. - string bucket_name = 1; - + // Protocol specific information required by the call is passed in as key,value pairs. + Protocol protocol = 1; + // This field is OPTIONAL // Protocol specific information required by the call is passed in as key,value pairs. - map bucket_context = 2; + map parameters = 2; // This field is OPTIONAL // Principal for which access is requested string principal = 3; - + // This field is REQUIRED // Requested Access policy, ex: {"Effect":"Allow","Action":"s3:PutObject","Resource":"arn:aws:s3:::profilepics/*"} string access_policy = 4; @@ -156,11 +224,11 @@ message ProvisionerGrantBucketAccessResponse { // This is the account that is being provided access. This will // be required later to revoke access. string principal = 1; - + // This field is OPTIONAL // Contents of the credential file, ex: aws access key id and secret, etc. string credentials_file_contents = 2; - + // This field is OPTIONAL // Path where the credential file will be mounted. string credentials_file_path = 3; @@ -168,12 +236,12 @@ message ProvisionerGrantBucketAccessResponse { message ProvisionerRevokeBucketAccessRequest { // This field is REQUIRED - // Bucket name. - string bucket_name = 1; - + // Protocol specific information required by the call is passed in as key,value pairs. + Protocol protocol = 1; + // This field is OPTIONAL // Protocol specific information required by the call is passed in as key,value pairs. - map bucket_context = 2; + map parameters = 2; // This field is REQUIRED // This is the account that is being revoked access. @@ -183,3 +251,4 @@ message ProvisionerRevokeBucketAccessRequest { message ProvisionerRevokeBucketAccessResponse { // Intentionally left blank } + diff --git a/fake/cosi.pb.go b/fake/cosi.pb.go deleted file mode 100644 index b0487a9d..00000000 --- a/fake/cosi.pb.go +++ /dev/null @@ -1,46 +0,0 @@ -package fake - -import ( - "context" - - cosi "github.com/kubernetes-sigs/container-object-storage-interface-spec" - - "google.golang.org/grpc" -) - -// this ensures that the mock implements the client interface -var _ cosi.ProvisionerClient = (*MockProvisionerClient)(nil) - -// MockProvisionerClient is a type that implements all the methods for RolePolicyAttachmentClient interface -type MockProvisionerClient struct { - GetInfo func(ctx context.Context, in *cosi.ProvisionerGetInfoRequest, opts ...grpc.CallOption) (*cosi.ProvisionerGetInfoResponse, error) - CreateBucket func(ctx context.Context, in *cosi.ProvisionerCreateBucketRequest, opts ...grpc.CallOption) (*cosi.ProvisionerCreateBucketResponse, error) - DeleteBucket func(ctx context.Context, in *cosi.ProvisionerDeleteBucketRequest, opts ...grpc.CallOption) (*cosi.ProvisionerDeleteBucketResponse, error) - GrantBucketAccess func(ctx context.Context, in *cosi.ProvisionerGrantBucketAccessRequest, opts ...grpc.CallOption) (*cosi.ProvisionerGrantBucketAccessResponse, error) - RevokeBucketAccess func(ctx context.Context, in *cosi.ProvisionerRevokeBucketAccessRequest, opts ...grpc.CallOption) (*cosi.ProvisionerRevokeBucketAccessResponse, error) -} - -// ProvisionerCreateBucket mocks GetBucketPolicyRequest method -func (m *MockProvisionerClient) ProvisionerCreateBucket(ctx context.Context, in *cosi.ProvisionerCreateBucketRequest, opts ...grpc.CallOption) (*cosi.ProvisionerCreateBucketResponse, error) { - return m.CreateBucket(ctx, in, opts...) -} - -// ProvisionerDeleteBucket mocks PutBucketPolicyRequest method -func (m *MockProvisionerClient) ProvisionerDeleteBucket(ctx context.Context, in *cosi.ProvisionerDeleteBucketRequest, opts ...grpc.CallOption) (*cosi.ProvisionerDeleteBucketResponse, error) { - return m.DeleteBucket(ctx, in, opts...) -} - -// ProvisionerGrantBucketAccess mocks DeleteBucketPolicyRequest method -func (m *MockProvisionerClient) ProvisionerGrantBucketAccess(ctx context.Context, in *cosi.ProvisionerGrantBucketAccessRequest, opts ...grpc.CallOption) (*cosi.ProvisionerGrantBucketAccessResponse, error) { - return m.GrantBucketAccess(ctx, in, opts...) -} - -// ProvisionerRevokeBucketAccess mocks DeleteBucketPolicyRequest method -func (m *MockProvisionerClient) ProvisionerRevokeBucketAccess(ctx context.Context, in *cosi.ProvisionerRevokeBucketAccessRequest, opts ...grpc.CallOption) (*cosi.ProvisionerRevokeBucketAccessResponse, error) { - return m.RevokeBucketAccess(ctx, in, opts...) -} - -// ProvisionerRevokeBucketAccess mocks DeleteBucketPolicyRequest method -func (m *MockProvisionerClient) ProvisionerGetInfo(ctx context.Context, in *cosi.ProvisionerGetInfoRequest, opts ...grpc.CallOption) (*cosi.ProvisionerGetInfoResponse, error) { - return m.GetInfo(ctx, in, opts...) -} diff --git a/go.mod b/go.mod index 642ca5cc..2c28417b 100644 --- a/go.mod +++ b/go.mod @@ -1,9 +1,10 @@ -module github.com/kubernetes-sigs/container-object-storage-interface-spec +module sigs.k8s.io/container-object-storage-interface-spec go 1.15 require ( - github.com/golang/protobuf v1.4.2 - google.golang.org/grpc v1.30.0 - google.golang.org/protobuf v1.23.0 + github.com/golang/protobuf v1.4.3 + github.com/mitchellh/protoc-gen-go-json v1.0.0 // indirect + google.golang.org/grpc v1.35.0 + google.golang.org/protobuf v1.25.0 ) diff --git a/go.sum b/go.sum index d631fb98..fda500c5 100644 --- a/go.sum +++ b/go.sum @@ -1,11 +1,20 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 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= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -16,14 +25,29 @@ github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:x github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/grpc-ecosystem/grpc-gateway v1.14.6 h1:8ERzHx8aj1Sc47mu9n/AksaKCSWrMchFtkdrS4BIj5o= +github.com/grpc-ecosystem/grpc-gateway v1.14.6/go.mod h1:zdiPV4Yse/1gnckTHtghG4GkDEdKCRJduHpTxT3/jcw= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/mitchellh/protoc-gen-go-json v1.0.0 h1:cTehjZlYXXoSR1WIlV0BEAg4Tz35l7QEDr6BHOHCDCs= +github.com/mitchellh/protoc-gen-go-json v1.0.0/go.mod h1:RB1NY3ZteDVJDkCF+RJz0/zRd/FV5XR7RGRp4OIkIFI= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -31,12 +55,16 @@ golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvx golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 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-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20191002035440-2ec189313ef0 h1:2mqDk8w/o6UmeUCu5Qiq2y7iMf6anbx+YA8d1JFoFrs= +golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= @@ -47,24 +75,35 @@ golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGm 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-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2ElGhA4+qG2zF97qiUzTM+rQ0klBOcE= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.30.0 h1:M5a8xTlYTxwMn5ZFkwhRabsygDY5G8TYLyQDBxJNAxE= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.35.0 h1:TwIQcH3es+MojMVojxxfQ3l3OF2KzlRxML2xZq0kRo8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= 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= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +gopkg.in/check.v1 v0.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/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3 h1:fvjTMHxHEw/mxHbtzPi3JCcKXQRAnQTBRo6YCJSVHKI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/spec.md b/spec.md index 1684a5f6..46ddfd8b 100644 --- a/spec.md +++ b/spec.md @@ -132,7 +132,7 @@ package cosi.v1alpha1; import "google/protobuf/descriptor.proto"; -option go_package = "cosi"; +option go_package = "sigs.k8s.io/container-object-storage-interface-spec;cosi"; extend google.protobuf.EnumOptions { // Indicates that this enum is OPTIONAL and part of an experimental @@ -180,11 +180,13 @@ extend google.protobuf.ServiceOptions { bool alpha_service = 1060; } -service Provisioner { +service Identity { // This call is meant to retrieve the unique provisioner Identity. // This identity will have to be set in BucketRequest.Provisioner field in order to invoke this specific provisioner. rpc ProvisionerGetInfo (ProvisionerGetInfoRequest) returns (ProvisionerGetInfoResponse) {} +} +service Provisioner { // This call is made to create the bucket in the backend. // This call is idempotent // 1. If a bucket that matches both name and parameters already exists, then OK (success) must be returned. @@ -203,12 +205,85 @@ service Provisioner { rpc ProvisionerRevokeBucketAccess (ProvisionerRevokeBucketAccessRequest) returns (ProvisionerRevokeBucketAccessResponse); } +enum ProtocolName { + UnknownProtocol = 0; + // S3, AWS S3 protocol + S3 = 1; + // AZURE, Microsoft Azure protocol + AZURE = 2; + // GCS, Google GCS protocol + GCS = 3; +} + +// S3SignatureVersion is the version of the signing algorithm for all s3 requests +enum S3SignatureVersion { + UnknownSignature = 0; + // S3V2, Signature version v2 + S3V2 = 1; + // S3V4, Signature version v4 + S3V4 = 2; +} + +enum AnonymousBucketAccessMode { + UnknownBucketAccessMode = 0; + // Default, disallow uncredentialed access to the backend storage. + Private = 1; + // Read only, uncredentialed users can call ListBucket and GetObject. + ReadOnly = 2; + // Write only, uncredentialed users can only call PutObject. + WriteOnly = 3; + // Read/Write, uncredentialed users can read objects as well as PutObject. + ReadWrite = 4; +} + +message S3Parameters { + // endpoint denotes the URL of the S3 server + string endpoint = 1; + // bucket_name denotes the name of the bucket in the storage backend + string bucket_name = 2; + // region denotes the geographical region where the S3 server is running + string region = 3; + // signature_version denotes the signature version for signing all s3 requests + S3SignatureVersion signature_version = 4; +} + +message AzureBlobParameters { + // container_name is the name of the azure container + string container_name = 1; + // storage_account is the id of the azure storage account + string storage_account = 2; +} + +message GCSParameters { + // bucket_name denotes the name of the bucket in the storage backend + string bucket_name = 1; + // private_key_name denotes the name of the private key in the storage backend + string private_key_name = 2; + // project_id denotes the name of the project id in the storage backend + string project_id = 3; + // service_account denotes the name of the service account in the storage backend + string service_account = 4; +} + +message Protocol { + // ProtocolName is the name of the protocol + ProtocolName name = 1; + // version is the name of the protocol version + string version = 2; + + oneof type { + S3Parameters s3 = 3; + AzureBlobParameters azureBlob = 4; + GCSParameters gcs = 5; + } +} + message ProvisionerGetInfoRequest { // Intentionally left blank } message ProvisionerGetInfoResponse { - // This field is REQUIRED + // This field is REQUIRED // The name MUST follow domain name notation format // (https://tools.ietf.org/html/rfc1035#section-2.3.1). It SHOULD // include the plugin's host company name and the plugin name, @@ -221,24 +296,14 @@ message ProvisionerGetInfoResponse { message ProvisionerCreateBucketRequest { // This field is REQUIRED - // Bucket name. - string bucket_name = 1; + // Protocol specific information required by the call is passed in as key,value pairs. + Protocol protocol = 1; // This field is OPTIONAL - // Protocol specific information required by the call is passed in as key,value pairs. - map bucket_context = 2; + // The caller should treat the values in parameters as opaque. + // The receiver is responsible for parsing and validating the values. + map parameters = 2; - enum AnonymousBucketAccessMode { - // Default, disallow uncredentialed access to the backend storage. - BUCKET_PRIVATE = 0; - // Read only, uncredentialed users can call ListBucket and GetObject. - BUCKET_READ_ONLY = 1; - // Write only, uncredentialed users can only call PutObject. - BUCKET_WRITE_ONLY = 2; - // Read/Write, same as ro with the addition of PutObject being allowed. - BUCKET_READ_WRITE = 3; - } - // This field is OPTIONAL // Allow uncredentialed access to bucket. AnonymousBucketAccessMode anonymous_bucket_access_mode = 3; @@ -250,31 +315,33 @@ message ProvisionerCreateBucketResponse { message ProvisionerDeleteBucketRequest { // This field is REQUIRED - // Bucket name. - string bucket_name = 1; - + // Protocol specific information required by the call is passed in as key,value pairs. + Protocol protocol = 1; + // This field is OPTIONAL // Protocol specific information required by the call is passed in as key,value pairs. - map bucket_context = 2; + // The caller should treat the values in parameters as opaque. + // The receiver is responsible for parsing and validating the values. + map parameters = 2; } message ProvisionerDeleteBucketResponse { - // Intentionally left blank + // Intentionally left blank } message ProvisionerGrantBucketAccessRequest { // This field is REQUIRED - // Bucket name. - string bucket_name = 1; - + // Protocol specific information required by the call is passed in as key,value pairs. + Protocol protocol = 1; + // This field is OPTIONAL // Protocol specific information required by the call is passed in as key,value pairs. - map bucket_context = 2; + map parameters = 2; // This field is OPTIONAL // Principal for which access is requested string principal = 3; - + // This field is REQUIRED // Requested Access policy, ex: {"Effect":"Allow","Action":"s3:PutObject","Resource":"arn:aws:s3:::profilepics/*"} string access_policy = 4; @@ -285,11 +352,11 @@ message ProvisionerGrantBucketAccessResponse { // This is the account that is being provided access. This will // be required later to revoke access. string principal = 1; - + // This field is OPTIONAL // Contents of the credential file, ex: aws access key id and secret, etc. string credentials_file_contents = 2; - + // This field is OPTIONAL // Path where the credential file will be mounted. string credentials_file_path = 3; @@ -297,12 +364,12 @@ message ProvisionerGrantBucketAccessResponse { message ProvisionerRevokeBucketAccessRequest { // This field is REQUIRED - // Bucket name. - string bucket_name = 1; - + // Protocol specific information required by the call is passed in as key,value pairs. + Protocol protocol = 1; + // This field is OPTIONAL // Protocol specific information required by the call is passed in as key,value pairs. - map bucket_context = 2; + map parameters = 2; // This field is REQUIRED // This is the account that is being revoked access. From 62c01843b0d87c6936fefcfa3ab5e6d4e57f2aeb Mon Sep 17 00:00:00 2001 From: Krish Chowdhary Date: Wed, 17 Feb 2021 15:31:43 -0500 Subject: [PATCH 146/242] fake client: code gen added --- .gitignore | 4 +- Makefile | 36 ++++++-- fake/cosi.pb.fake.go | 39 +++++++++ hack/fake-gen/main.go | 196 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 267 insertions(+), 8 deletions(-) create mode 100644 fake/cosi.pb.fake.go create mode 100644 hack/fake-gen/main.go diff --git a/.gitignore b/.gitignore index d638623a..c105ac95 100644 --- a/.gitignore +++ b/.gitignore @@ -3,9 +3,7 @@ .build *.swp cosi.proto.tmp -protoc -protoc-gen-go -protoc-gen-go-json +protoc* cosi.a .protoc .idea diff --git a/Makefile b/Makefile index 18e06277..ca2ad76a 100644 --- a/Makefile +++ b/Makefile @@ -107,7 +107,6 @@ $(GENPROTO_BUILD_GO): (cd $(GOPATH)/src/$(GENPROTO_GO_PKG) && go get -v -d $$(go list -f '{{ .ImportPath }}' ./...)) - ######################################################################## ## GRPC-GO ## ######################################################################## @@ -127,6 +126,16 @@ $(GRPC_BUILD_GO): go build -o "$@" $(GRPC_GO_PKG)) +######################################################################## +## PROTOC-GEN-GO-FAKE ## +######################################################################## + +# This is the recipe for getting and installing the grpc go +PROTOC_GEN_GO_FAKE_SRC := ./hack/fake-gen +PROTOC_GEN_GO_FAKE := protoc-gen-gofake +$(PROTOC_GEN_GO_FAKE): + go build -o $(PROTOC_GEN_GO_FAKE) $(PROTOC_GEN_GO_FAKE_SRC) + ######################################################################## ## PATH ## @@ -148,9 +157,11 @@ COSI_PKG_SUB := . COSI_BUILD := $(COSI_PKG_SUB)/.build COSI_GO := $(COSI_PKG_SUB)/cosi.pb.go COSI_GO_JSON := $(COSI_PKG_SUB)/cosi.pb.json.go +COSI_GO_FAKE := $(COSI_PKG_SUB)/fake/cosi.pb.fake.go COSI_A := cosi.a COSI_GO_TMP := $(COSI_BUILD)/$(COSI_PKG_ROOT)/cosi.pb.go COSI_GO_JSON_TMP := $(COSI_BUILD)/$(COSI_PKG_ROOT)/cosi.pb.json.go +COSI_GO_FAKE_TMP := $(COSI_BUILD)/fake/$(COSI_PKG_ROOT)/cosi.pb.fake.go # This recipe generates the go language bindings to a temp area. $(COSI_GO_TMP): HERE := $(shell pwd) @@ -161,11 +172,15 @@ $(COSI_GO_TMP): GO_OUT := $(GO_OUT),Mgoogle/protobuf/wrappers.proto=$(PTYPES_PKG $(COSI_GO_TMP): GO_OUT := $(GO_OUT):"$(HERE)/$(COSI_BUILD)" $(COSI_GO_TMP): GO_JSON_OUT := emit_defaults $(COSI_GO_TMP): GO_JSON_OUT := $(GO_JSON_OUT):"$(HERE)/$(COSI_BUILD)" +$(COSI_GO_TMP): GO_FAKE_OUT := emit_defaults +$(COSI_GO_TMP): GO_FAKE_OUT := $(GO_FAKE_OUT),package=cosi,packagePath=sigs.k8s.io/container-object-storage-interface-spec +$(COSI_GO_TMP): GO_FAKE_OUT := $(GO_FAKE_OUT):"$(HERE)/$(COSI_BUILD)"/fake $(COSI_GO_TMP): INCLUDE := -I$(GOPATH)/src -I$(HERE)/$(PROTOC_TMP_DIR)/include -$(COSI_GO_TMP): $(COSI_PROTO) | $(PROTOC) $(PROTOC_GEN_GO) $(PROTOC_GEN_GO_JSON) +$(COSI_GO_TMP): $(COSI_PROTO) | $(PROTOC) $(PROTOC_GEN_GO) $(PROTOC_GEN_GO_JSON) $(PROTOC_GEN_GO_FAKE) @mkdir -p "$(@D)" + @mkdir -p "$(COSI_BUILD)/fake" (cd "$(GOPATH)/src" && \ - $(HERE)/$(PROTOC) $(INCLUDE) --go_out=$(GO_OUT) --go-json_out=$(GO_JSON_OUT) "$(COSI_PKG_ROOT)/$( /dev/null 2>&1 || cp -f "$?" "$@" endif +# The temp language bindings are compared to the ones that are +# versioned. If they are different then it means the language +# bindings were not updated prior to being committed. +$(COSI_GO_FAKE): $(COSI_GO_FAKE_TMP) +ifeq (true,$(TRAVIS)) + diff "$@" "$?" +else + @mkdir -p "$(@D)" + diff "$@" "$?" > /dev/null 2>&1 || cp -f "$?" "$@" +endif + # This recipe builds the Go archive from the sources in three steps: # # 1. Go get any missing dependencies. # 2. Cache the packages. # 3. Build the archive file. -$(COSI_A): $(COSI_GO) $(COSI_GO_JSON) $(GENPROTO_BUILD_GO) $(GRPC_BUILD_GO) +$(COSI_A): $(COSI_GO) $(COSI_GO_JSON) $(COSI_GO_FAKE) $(GENPROTO_BUILD_GO) $(GRPC_BUILD_GO) go get -v -d ./... go install ./$(COSI_PKG_SUB) go build -o "$@" ./$(COSI_PKG_SUB) @@ -210,6 +236,6 @@ clean: rm -rf "$(COSI_PROTO)" "$(COSI_A)" "$(COSI_GO)" "$(COSI_GO_JSON)" "$(COSI_BUILD)" clobber: clean - rm -fr "$(PROTOC)" "$(PROTOC_TMP_DIR)" "$(PROTOC_GEN_GO)" "$(PROTOC_GEN_GO_JSON)" + rm -fr "$(PROTOC)" "$(PROTOC_TMP_DIR)" "$(PROTOC_GEN_GO)" "$(PROTOC_GEN_GO_JSON)" "$(PROTOC_GEN_GO_FAKE)" .PHONY: clean clobber $(GRPC_BUILD_GO) $(GENPROTO_BUILD_GO) diff --git a/fake/cosi.pb.fake.go b/fake/cosi.pb.fake.go new file mode 100644 index 00000000..2e792fbe --- /dev/null +++ b/fake/cosi.pb.fake.go @@ -0,0 +1,39 @@ +package fake + +import ( + "context" + "google.golang.org/grpc" + cosi "sigs.k8s.io/container-object-storage-interface-spec" +) + +type FakeIdentityClient struct { + FakeProvisionerGetInfo func(ctx context.Context, in *cosi.ProvisionerGetInfoRequest, opts ...grpc.CallOption) (*cosi.ProvisionerGetInfoResponse, error) +} + +func (f *FakeIdentityClient) ProvisionerGetInfo(ctx context.Context, in *cosi.ProvisionerGetInfoRequest, opts ...grpc.CallOption) (*cosi.ProvisionerGetInfoResponse, error) { + return f.FakeProvisionerGetInfo(ctx, in, opts...) +} + +type FakeProvisionerClient struct { + FakeProvisionerCreateBucket func(ctx context.Context, in *cosi.ProvisionerCreateBucketRequest, opts ...grpc.CallOption) (*cosi.ProvisionerCreateBucketResponse, error) + FakeProvisionerDeleteBucket func(ctx context.Context, in *cosi.ProvisionerDeleteBucketRequest, opts ...grpc.CallOption) (*cosi.ProvisionerDeleteBucketResponse, error) + FakeProvisionerGrantBucketAccess func(ctx context.Context, in *cosi.ProvisionerGrantBucketAccessRequest, opts ...grpc.CallOption) (*cosi.ProvisionerGrantBucketAccessResponse, error) + FakeProvisionerRevokeBucketAccess func(ctx context.Context, in *cosi.ProvisionerRevokeBucketAccessRequest, opts ...grpc.CallOption) (*cosi.ProvisionerRevokeBucketAccessResponse, error) +} + +func (f *FakeProvisionerClient) ProvisionerCreateBucket(ctx context.Context, in *cosi.ProvisionerCreateBucketRequest, opts ...grpc.CallOption) (*cosi.ProvisionerCreateBucketResponse, error) { + return f.FakeProvisionerCreateBucket(ctx, in, opts...) +} + +func (f *FakeProvisionerClient) ProvisionerDeleteBucket(ctx context.Context, in *cosi.ProvisionerDeleteBucketRequest, opts ...grpc.CallOption) (*cosi.ProvisionerDeleteBucketResponse, error) { + return f.FakeProvisionerDeleteBucket(ctx, in, opts...) +} + +func (f *FakeProvisionerClient) ProvisionerGrantBucketAccess(ctx context.Context, in *cosi.ProvisionerGrantBucketAccessRequest, opts ...grpc.CallOption) (*cosi.ProvisionerGrantBucketAccessResponse, error) { + return f.FakeProvisionerGrantBucketAccess(ctx, in, opts...) +} + +func (f *FakeProvisionerClient) ProvisionerRevokeBucketAccess(ctx context.Context, in *cosi.ProvisionerRevokeBucketAccessRequest, opts ...grpc.CallOption) (*cosi.ProvisionerRevokeBucketAccessResponse, error) { + return f.FakeProvisionerRevokeBucketAccess(ctx, in, opts...) +} + diff --git a/hack/fake-gen/main.go b/hack/fake-gen/main.go new file mode 100644 index 00000000..916364e7 --- /dev/null +++ b/hack/fake-gen/main.go @@ -0,0 +1,196 @@ +/* +If this program is on the path of your machine you can invoke it in the following way: + +protoc --plugin protoc-gen-gofake --goexample_out=package=cosi,packagePath=sigs.k8s.io/container-object-storage-interface-spec:fake cosi.proto + +Requires package, and packagePath to be specified +*/ +package main + +import ( + "bytes" + "fmt" + "io" + "io/ioutil" + "os" + "strings" + "text/tabwriter" + + "github.com/golang/protobuf/proto" + plugin "github.com/golang/protobuf/protoc-gen-go/plugin" +) + +type GoFake struct { + Request *plugin.CodeGeneratorRequest + Response *plugin.CodeGeneratorResponse + Parameters map[string]string +} + +type FakeService struct { + Name string + Methods []Method +} + +type Method struct { + Name string + Input string + Output string +} + +func (runner *GoFake) PrintParameters(w io.Writer) { + const padding = 3 + tw := tabwriter.NewWriter(w, 0, 0, padding, ' ', tabwriter.TabIndent) + fmt.Fprintf(tw, "Parameters:\n") + for k, v := range runner.Parameters { + fmt.Fprintf(tw, "%s:\t%s\n", k, v) + } + fmt.Fprintln(tw, "") + tw.Flush() +} + +func cleanInput(val string) string { + spl := strings.Split(val, ".") + return spl[len(spl)-1] +} + +func (runner *GoFake) getLocationMessage() map[string][]*FakeService { + ret := make(map[string][]*FakeService) + for _, protoFile := range runner.Request.ProtoFile { + _, _ = fmt.Fprintf(os.Stderr, "%s\n", *protoFile.Name) + fakeServices := make([]*FakeService, 0) + _, _ = fmt.Fprintf(os.Stderr, "%+v\n", protoFile.GetService()) + svcs := protoFile.GetService() + for _, svc := range svcs { + _, _ = fmt.Fprintf(os.Stderr, "service: %+v\n", svc) + current := &FakeService{ + Name: fmt.Sprintf("%sClient", *svc.Name), + } + methods := make([]Method, 0) + for _, mtd := range svc.Method { + method := Method{Name: *mtd.Name} + if mtd.InputType != nil { + method.Input = cleanInput(*mtd.InputType) + } + if mtd.OutputType != nil { + method.Output = cleanInput(*mtd.OutputType) + } + methods = append(methods, method) + } + current.Methods = methods + + fakeServices = append(fakeServices, current) + } + ret[*protoFile.Name] = fakeServices + } + return ret +} + +func (runner *GoFake) WriteImports(buf *bytes.Buffer, imports... string) { + for _, i := range imports { + buf.WriteString(fmt.Sprintf("\t\"%s\"\n", i)) + } +} + +func (runner *GoFake) CreateFakeFile(filename string, fakeSVC []*FakeService) error { + var outfileName string + var content string + outfileName = strings.Replace(filename, ".proto", ".pb.fake.go", -1) + var mdFile plugin.CodeGeneratorResponse_File + mdFile.Name = &outfileName + var buf bytes.Buffer + + pkg := runner.Parameters["package"] + pkgPath := runner.Parameters["packagePath"] + + buf.WriteString("package fake\n\n") + buf.WriteString("import (\n") + runner.WriteImports(&buf, "context", "google.golang.org/grpc") + buf.WriteString(fmt.Sprintf("\t%s \"%s\"\n", pkg, pkgPath)) + buf.WriteString(")\n\n") + for _, fakeSVC := range fakeSVC { + buf.WriteString(fmt.Sprintf("type Fake%s struct {\n", fakeSVC.Name)) + for _, mtd := range fakeSVC.Methods { + buf.WriteString(fmt.Sprintf("\tFake%s func(ctx context.Context, in *%s.%s, opts ...grpc.CallOption) (*%s.%s, error)\n", + mtd.Name, pkg, mtd.Input, pkg, mtd.Output)) + } + buf.WriteString("}\n\n") + for _, mtd := range fakeSVC.Methods { + buf.WriteString(fmt.Sprintf("func (f *Fake%s) %s(ctx context.Context, in *%s.%s, opts ...grpc.CallOption) (*%s.%s, error) {\n", + fakeSVC.Name, mtd.Name, pkg, mtd.Input, pkg, mtd.Output)) + buf.WriteString(fmt.Sprintf("\treturn f.Fake%s(ctx, in, opts...)\n", + mtd.Name)) + buf.WriteString("}\n\n") + } + } + content = buf.String() + mdFile.Content = &content + runner.Response.File = append(runner.Response.File, &mdFile) + return nil +} + +func (runner *GoFake) generateMessageMarkdown() error { + // This convenience method will return a structure of some types that I use + for filename, locationMessages := range runner.getLocationMessage() { + runner.CreateFakeFile(filename, locationMessages) + } + return nil +} + +func (runner *GoFake) generateCode() error { + // Initialize the output file slice + files := make([]*plugin.CodeGeneratorResponse_File, 0) + runner.Response.File = files + + err := runner.generateMessageMarkdown() + if err != nil { + return err + } + return nil +} + +func main() { + // os.Stdin will contain data which will unmarshal into the following object: + // https://godoc.org/github.com/golang/protobuf/protoc-gen-go/plugin#CodeGeneratorRequest + req := &plugin.CodeGeneratorRequest{} + resp := &plugin.CodeGeneratorResponse{} + + data, err := ioutil.ReadAll(os.Stdin) + if err != nil { + panic(err) + } + + // You must use the requests unmarshal method to handle this type + if err := proto.Unmarshal(data, req); err != nil { + panic(err) + } + + // You may require more data than what is in the proto files alone. There are a couple ways in which to do this. + // The first is by parameters. Another may be using leading comments in the proto files which I will cover in generateCode. + parameters := req.GetParameter() + // =grpc,import_path=mypackage:. + exampleRunner := &GoFake{ + Request: req, + Response: resp, + Parameters: make(map[string]string), + } + groupkv := strings.Split(parameters, ",") + for _, element := range groupkv { + kv := strings.Split(element, "=") + if len(kv) > 1 { + exampleRunner.Parameters[kv[0]] = kv[1] + } + } + // Print the parameters for example + exampleRunner.PrintParameters(os.Stderr) + + err = exampleRunner.generateCode() + if err != nil { + panic(err) + } + + marshalled, err := proto.Marshal(resp) + if err != nil { + panic(err) + } + os.Stdout.Write(marshalled) +} From 5ce49a94aa2b59d252f8d739f71e6edaa35c73f1 Mon Sep 17 00:00:00 2001 From: Yiannis Gkoufas Date: Thu, 18 Feb 2021 15:13:44 +0000 Subject: [PATCH 147/242] first readme draft --- README.md | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/README.md b/README.md index c8b6bfd8..7b13f414 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,43 @@ # Container Object Storage Controller Container Object Storage Interface (COSI) controller responsible to manage lifecycle of COSI objects. +Specifically, this controller monitors the lifecycle of the user-facing CRDs: + +- BucketRequest - Represents a request to provision a Bucket +- BucketAccessRequest - Represents a request to access a Bucket + +and makes the necessary gRPC calls to the associated [provisioner](https://github.com/kubernetes-sigs/container-object-storage-interface-provisioner-sidecar) + +## Developer Guide + +Before diving into the code of this repo, we suggest that you familiarize yourself with: + +- The Spec of CRDs in [objectstorage.k8s.io/v1alpha1/types.go](https://github.com/kubernetes-sigs/container-object-storage-interface-api/blob/master/apis/objectstorage.k8s.io/v1alpha1/types.go) +- The Spec of the COSI objects [sigs.k8s.io/container-object-storage-interface-spec](https://github.com/kubernetes-sigs/container-object-storage-interface-spec) + +A good starting point towards understanding the functionality of this repo would be to study the tests: + +- [BucketRequest Test](./pkg/bucketrequest/bucketrequest_test.go) +- [BucketAccessRequest Test](./pkg/bucketaccessrequest/bucketaccessrequest_test.go) + +### Build and Test + +In order to build and generate a Docker image execute: +```bash +make container +``` + +In order to run the tests execute: +```bash +make test +``` + +## References + +- [Documentation](https://github.com/kubernetes-sigs/container-object-storage-interface-api/tree/master/docs/index.md) +- [Deployment Guide](https://github.com/kubernetes-sigs/container-object-storage-interface-api/tree/master/docs/deployment-guide.md) +- [Weekly Meetings](https://github.com/kubernetes-sigs/container-object-storage-interface-api/tree/master/docs/meetings.md) +- [Roadmap](https://github.com/orgs/kubernetes-sigs/projects/8) ## Community, discussion, contribution, and support From 9399de2d0bed233db10459e660fcc34cbeaed084 Mon Sep 17 00:00:00 2001 From: Krish Chowdhary Date: Fri, 19 Feb 2021 16:56:55 -0500 Subject: [PATCH 148/242] fake client: move to jennifer for code generation --- Makefile | 2 +- fake/cosi.pb.fake.go | 28 ++++++++---------- go.mod | 3 +- go.sum | 28 +++--------------- hack/fake-gen/main.go | 69 ++++++++++++++++++------------------------- 5 files changed, 48 insertions(+), 82 deletions(-) diff --git a/Makefile b/Makefile index ca2ad76a..5d044cf8 100644 --- a/Makefile +++ b/Makefile @@ -173,7 +173,7 @@ $(COSI_GO_TMP): GO_OUT := $(GO_OUT):"$(HERE)/$(COSI_BUILD)" $(COSI_GO_TMP): GO_JSON_OUT := emit_defaults $(COSI_GO_TMP): GO_JSON_OUT := $(GO_JSON_OUT):"$(HERE)/$(COSI_BUILD)" $(COSI_GO_TMP): GO_FAKE_OUT := emit_defaults -$(COSI_GO_TMP): GO_FAKE_OUT := $(GO_FAKE_OUT),package=cosi,packagePath=sigs.k8s.io/container-object-storage-interface-spec +$(COSI_GO_TMP): GO_FAKE_OUT := $(GO_FAKE_OUT),packagePath=sigs.k8s.io/container-object-storage-interface-spec $(COSI_GO_TMP): GO_FAKE_OUT := $(GO_FAKE_OUT):"$(HERE)/$(COSI_BUILD)"/fake $(COSI_GO_TMP): INCLUDE := -I$(GOPATH)/src -I$(HERE)/$(PROTOC_TMP_DIR)/include $(COSI_GO_TMP): $(COSI_PROTO) | $(PROTOC) $(PROTOC_GEN_GO) $(PROTOC_GEN_GO_JSON) $(PROTOC_GEN_GO_FAKE) diff --git a/fake/cosi.pb.fake.go b/fake/cosi.pb.fake.go index 2e792fbe..3e142479 100644 --- a/fake/cosi.pb.fake.go +++ b/fake/cosi.pb.fake.go @@ -2,38 +2,34 @@ package fake import ( "context" - "google.golang.org/grpc" - cosi "sigs.k8s.io/container-object-storage-interface-spec" + grpc "google.golang.org/grpc" + containerobjectstorageinterfacespec "sigs.k8s.io/container-object-storage-interface-spec" ) type FakeIdentityClient struct { - FakeProvisionerGetInfo func(ctx context.Context, in *cosi.ProvisionerGetInfoRequest, opts ...grpc.CallOption) (*cosi.ProvisionerGetInfoResponse, error) + FakeProvisionerGetInfo func(ctx context.Context, in *containerobjectstorageinterfacespec.ProvisionerGetInfoRequest, opts ...grpc.CallOption) (*containerobjectstorageinterfacespec.ProvisionerGetInfoResponse, error) } -func (f *FakeIdentityClient) ProvisionerGetInfo(ctx context.Context, in *cosi.ProvisionerGetInfoRequest, opts ...grpc.CallOption) (*cosi.ProvisionerGetInfoResponse, error) { +func (f *FakeIdentityClient) ProvisionerGetInfo(ctx context.Context, in *containerobjectstorageinterfacespec.ProvisionerGetInfoRequest, opts ...grpc.CallOption) (*containerobjectstorageinterfacespec.ProvisionerGetInfoResponse, error) { return f.FakeProvisionerGetInfo(ctx, in, opts...) } type FakeProvisionerClient struct { - FakeProvisionerCreateBucket func(ctx context.Context, in *cosi.ProvisionerCreateBucketRequest, opts ...grpc.CallOption) (*cosi.ProvisionerCreateBucketResponse, error) - FakeProvisionerDeleteBucket func(ctx context.Context, in *cosi.ProvisionerDeleteBucketRequest, opts ...grpc.CallOption) (*cosi.ProvisionerDeleteBucketResponse, error) - FakeProvisionerGrantBucketAccess func(ctx context.Context, in *cosi.ProvisionerGrantBucketAccessRequest, opts ...grpc.CallOption) (*cosi.ProvisionerGrantBucketAccessResponse, error) - FakeProvisionerRevokeBucketAccess func(ctx context.Context, in *cosi.ProvisionerRevokeBucketAccessRequest, opts ...grpc.CallOption) (*cosi.ProvisionerRevokeBucketAccessResponse, error) + FakeProvisionerCreateBucket func(ctx context.Context, in *containerobjectstorageinterfacespec.ProvisionerCreateBucketRequest, opts ...grpc.CallOption) (*containerobjectstorageinterfacespec.ProvisionerCreateBucketResponse, error) + FakeProvisionerDeleteBucket func(ctx context.Context, in *containerobjectstorageinterfacespec.ProvisionerDeleteBucketRequest, opts ...grpc.CallOption) (*containerobjectstorageinterfacespec.ProvisionerDeleteBucketResponse, error) + FakeProvisionerGrantBucketAccess func(ctx context.Context, in *containerobjectstorageinterfacespec.ProvisionerGrantBucketAccessRequest, opts ...grpc.CallOption) (*containerobjectstorageinterfacespec.ProvisionerGrantBucketAccessResponse, error) + FakeProvisionerRevokeBucketAccess func(ctx context.Context, in *containerobjectstorageinterfacespec.ProvisionerRevokeBucketAccessRequest, opts ...grpc.CallOption) (*containerobjectstorageinterfacespec.ProvisionerRevokeBucketAccessResponse, error) } -func (f *FakeProvisionerClient) ProvisionerCreateBucket(ctx context.Context, in *cosi.ProvisionerCreateBucketRequest, opts ...grpc.CallOption) (*cosi.ProvisionerCreateBucketResponse, error) { +func (f *FakeProvisionerClient) ProvisionerCreateBucket(ctx context.Context, in *containerobjectstorageinterfacespec.ProvisionerCreateBucketRequest, opts ...grpc.CallOption) (*containerobjectstorageinterfacespec.ProvisionerCreateBucketResponse, error) { return f.FakeProvisionerCreateBucket(ctx, in, opts...) } - -func (f *FakeProvisionerClient) ProvisionerDeleteBucket(ctx context.Context, in *cosi.ProvisionerDeleteBucketRequest, opts ...grpc.CallOption) (*cosi.ProvisionerDeleteBucketResponse, error) { +func (f *FakeProvisionerClient) ProvisionerDeleteBucket(ctx context.Context, in *containerobjectstorageinterfacespec.ProvisionerDeleteBucketRequest, opts ...grpc.CallOption) (*containerobjectstorageinterfacespec.ProvisionerDeleteBucketResponse, error) { return f.FakeProvisionerDeleteBucket(ctx, in, opts...) } - -func (f *FakeProvisionerClient) ProvisionerGrantBucketAccess(ctx context.Context, in *cosi.ProvisionerGrantBucketAccessRequest, opts ...grpc.CallOption) (*cosi.ProvisionerGrantBucketAccessResponse, error) { +func (f *FakeProvisionerClient) ProvisionerGrantBucketAccess(ctx context.Context, in *containerobjectstorageinterfacespec.ProvisionerGrantBucketAccessRequest, opts ...grpc.CallOption) (*containerobjectstorageinterfacespec.ProvisionerGrantBucketAccessResponse, error) { return f.FakeProvisionerGrantBucketAccess(ctx, in, opts...) } - -func (f *FakeProvisionerClient) ProvisionerRevokeBucketAccess(ctx context.Context, in *cosi.ProvisionerRevokeBucketAccessRequest, opts ...grpc.CallOption) (*cosi.ProvisionerRevokeBucketAccessResponse, error) { +func (f *FakeProvisionerClient) ProvisionerRevokeBucketAccess(ctx context.Context, in *containerobjectstorageinterfacespec.ProvisionerRevokeBucketAccessRequest, opts ...grpc.CallOption) (*containerobjectstorageinterfacespec.ProvisionerRevokeBucketAccessResponse, error) { return f.FakeProvisionerRevokeBucketAccess(ctx, in, opts...) } - diff --git a/go.mod b/go.mod index 2c28417b..98403634 100644 --- a/go.mod +++ b/go.mod @@ -3,8 +3,9 @@ module sigs.k8s.io/container-object-storage-interface-spec go 1.15 require ( + github.com/dave/jennifer v1.4.1 github.com/golang/protobuf v1.4.3 - github.com/mitchellh/protoc-gen-go-json v1.0.0 // indirect + golang.org/x/net v0.0.0-20191002035440-2ec189313ef0 // indirect google.golang.org/grpc v1.35.0 google.golang.org/protobuf v1.25.0 ) diff --git a/go.sum b/go.sum index fda500c5..ac6afbc7 100644 --- a/go.sum +++ b/go.sum @@ -1,25 +1,20 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/dave/jennifer v1.4.1 h1:XyqG6cn5RQsTj3qlWQTKlRGAyrTcsk1kUmWdZBzRjDw= +github.com/dave/jennifer v1.4.1/go.mod h1:7jEdnm+qBcxl8PC0zyp7vxcpSRnzXSt9r39tpTVGlwA= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 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= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= @@ -33,20 +28,12 @@ github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5a github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/grpc-ecosystem/grpc-gateway v1.14.6 h1:8ERzHx8aj1Sc47mu9n/AksaKCSWrMchFtkdrS4BIj5o= -github.com/grpc-ecosystem/grpc-gateway v1.14.6/go.mod h1:zdiPV4Yse/1gnckTHtghG4GkDEdKCRJduHpTxT3/jcw= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/mitchellh/protoc-gen-go-json v1.0.0 h1:cTehjZlYXXoSR1WIlV0BEAg4Tz35l7QEDr6BHOHCDCs= -github.com/mitchellh/protoc-gen-go-json v1.0.0/go.mod h1:RB1NY3ZteDVJDkCF+RJz0/zRd/FV5XR7RGRp4OIkIFI= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -55,16 +42,13 @@ golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvx golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 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-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20191002035440-2ec189313ef0 h1:2mqDk8w/o6UmeUCu5Qiq2y7iMf6anbx+YA8d1JFoFrs= golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= @@ -75,19 +59,18 @@ golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGm 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-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.35.0 h1:TwIQcH3es+MojMVojxxfQ3l3OF2KzlRxML2xZq0kRo8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= @@ -101,9 +84,6 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= gopkg.in/check.v1 v0.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/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3 h1:fvjTMHxHEw/mxHbtzPi3JCcKXQRAnQTBRo6YCJSVHKI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/hack/fake-gen/main.go b/hack/fake-gen/main.go index 916364e7..942d7717 100644 --- a/hack/fake-gen/main.go +++ b/hack/fake-gen/main.go @@ -8,14 +8,12 @@ Requires package, and packagePath to be specified package main import ( - "bytes" "fmt" - "io" "io/ioutil" "os" "strings" - "text/tabwriter" + . "github.com/dave/jennifer/jen" "github.com/golang/protobuf/proto" plugin "github.com/golang/protobuf/protoc-gen-go/plugin" ) @@ -37,17 +35,6 @@ type Method struct { Output string } -func (runner *GoFake) PrintParameters(w io.Writer) { - const padding = 3 - tw := tabwriter.NewWriter(w, 0, 0, padding, ' ', tabwriter.TabIndent) - fmt.Fprintf(tw, "Parameters:\n") - for k, v := range runner.Parameters { - fmt.Fprintf(tw, "%s:\t%s\n", k, v) - } - fmt.Fprintln(tw, "") - tw.Flush() -} - func cleanInput(val string) string { spl := strings.Split(val, ".") return spl[len(spl)-1] @@ -85,44 +72,48 @@ func (runner *GoFake) getLocationMessage() map[string][]*FakeService { return ret } -func (runner *GoFake) WriteImports(buf *bytes.Buffer, imports... string) { - for _, i := range imports { - buf.WriteString(fmt.Sprintf("\t\"%s\"\n", i)) - } -} - func (runner *GoFake) CreateFakeFile(filename string, fakeSVC []*FakeService) error { var outfileName string var content string outfileName = strings.Replace(filename, ".proto", ".pb.fake.go", -1) var mdFile plugin.CodeGeneratorResponse_File mdFile.Name = &outfileName - var buf bytes.Buffer - pkg := runner.Parameters["package"] pkgPath := runner.Parameters["packagePath"] - buf.WriteString("package fake\n\n") - buf.WriteString("import (\n") - runner.WriteImports(&buf, "context", "google.golang.org/grpc") - buf.WriteString(fmt.Sprintf("\t%s \"%s\"\n", pkg, pkgPath)) - buf.WriteString(")\n\n") + f := NewFile("fake") for _, fakeSVC := range fakeSVC { - buf.WriteString(fmt.Sprintf("type Fake%s struct {\n", fakeSVC.Name)) - for _, mtd := range fakeSVC.Methods { - buf.WriteString(fmt.Sprintf("\tFake%s func(ctx context.Context, in *%s.%s, opts ...grpc.CallOption) (*%s.%s, error)\n", - mtd.Name, pkg, mtd.Input, pkg, mtd.Output)) + s := f.Type().Id(fmt.Sprintf("Fake%s", fakeSVC.Name)) + fakeMethds := make([]Code, len(fakeSVC.Methods)) + for i, mtd := range fakeSVC.Methods { + fakeMethds[i] = Id(fmt.Sprintf("Fake%s", mtd.Name)).Func().Params( + Id("ctx").Qual("context", "Context"), + Id("in").Op("*").Qual(pkgPath, mtd.Input), + Id("opts").Op("...").Qual("google.golang.org/grpc", "CallOption"), + ).Op("(").List( + Op("*").Qual(pkgPath, mtd.Output), + Error(), + ).Op(")") } - buf.WriteString("}\n\n") + s.Struct(fakeMethds...) for _, mtd := range fakeSVC.Methods { - buf.WriteString(fmt.Sprintf("func (f *Fake%s) %s(ctx context.Context, in *%s.%s, opts ...grpc.CallOption) (*%s.%s, error) {\n", - fakeSVC.Name, mtd.Name, pkg, mtd.Input, pkg, mtd.Output)) - buf.WriteString(fmt.Sprintf("\treturn f.Fake%s(ctx, in, opts...)\n", - mtd.Name)) - buf.WriteString("}\n\n") + f.Func().Params(Id("f").Id(fmt.Sprintf("*Fake%s", fakeSVC.Name))).Id(mtd.Name).Params( + Id("ctx").Qual("context", "Context"), + Id("in").Op("*").Qual(pkgPath, mtd.Input), + Id("opts").Op("...").Qual("google.golang.org/grpc", "CallOption"), + ).Op("(").List( + Op("*").Qual(pkgPath, mtd.Output), + Error(), + ).Op(")").Block( + Return(Id("f").Dot(fmt.Sprintf("Fake%s", mtd.Name)).Call( + Id("ctx"), + Id("in"), + Id("opts").Op("..."), + )), + ) } } - content = buf.String() + content = fmt.Sprintf("%#v", f) mdFile.Content = &content runner.Response.File = append(runner.Response.File, &mdFile) return nil @@ -180,8 +171,6 @@ func main() { exampleRunner.Parameters[kv[0]] = kv[1] } } - // Print the parameters for example - exampleRunner.PrintParameters(os.Stderr) err = exampleRunner.generateCode() if err != nil { From d4d49439756b6c33209e5fca241b57ab67bdcc95 Mon Sep 17 00:00:00 2001 From: "mengjiao.liu" Date: Tue, 23 Feb 2021 17:37:39 +0800 Subject: [PATCH 149/242] Add deployment documentation --- docs/deployment-guide.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 docs/deployment-guide.md diff --git a/docs/deployment-guide.md b/docs/deployment-guide.md new file mode 100644 index 00000000..7373d6ab --- /dev/null +++ b/docs/deployment-guide.md @@ -0,0 +1,21 @@ +# Deploying Container Object Storage Interface (COSI) Controller On Kubernetes + +This document describes steps for Kubernetes administrators to setup Container Object Storage Interface Controller (COSI) Controller onto a Kubernetes cluster. + +COSI controller can be setup using the [kustomization file](https://github.com/kubernetes-sigs/container-object-storage-interface-controller/blob/master/kustomization.yaml) from the [container-object-storage-interface-controller](https://github.com/kubernetes-sigs/container-object-storage-interface-controller) repository with following command: + +```sh +kubectl create -k github.com/kubernetes-sigs/container-object-storage-interface-controller +``` +The output should look like the following: +```sh +serviceaccount/objectstorage-controller-sa created +role.rbac.authorization.k8s.io/objectstorage-controller created +clusterrole.rbac.authorization.k8s.io/objectstorage-controller-role created +rolebinding.rbac.authorization.k8s.io/objectstorage-controller created +clusterrolebinding.rbac.authorization.k8s.io/objectstorage-controller created +deployment.apps/objectstorage-controller created +``` + +The controller will be deployed in the `default` namespace. + From 4dd818ac6da44ffa99128f6213dd59514dbf226e Mon Sep 17 00:00:00 2001 From: Yiannis Gkoufas Date: Tue, 23 Feb 2021 15:02:54 +0000 Subject: [PATCH 150/242] fix for CRDs generation --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 7b13f414..d83e2bff 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,10 @@ Specifically, this controller monitors the lifecycle of the user-facing CRDs: - BucketRequest - Represents a request to provision a Bucket - BucketAccessRequest - Represents a request to access a Bucket -and makes the necessary gRPC calls to the associated [provisioner](https://github.com/kubernetes-sigs/container-object-storage-interface-provisioner-sidecar) +and generates the associated CRDs: + +- Bucket - Represents a Bucket or its equivalent in the storage backend +- BucketAccess - Represents a access token or service account in the storage backend ## Developer Guide From 6f60b7e32befa4fadd465475743d076453a08884 Mon Sep 17 00:00:00 2001 From: wlan0 Date: Wed, 3 Mar 2021 22:53:40 -0800 Subject: [PATCH 151/242] remove opaque parameters from delete request and return bucket name on succesful bucket creation --- cosi.pb.go | 395 ++++++++++++++++++++++++----------------------------- cosi.proto | 16 +-- spec.md | 16 +-- 3 files changed, 189 insertions(+), 238 deletions(-) diff --git a/cosi.pb.go b/cosi.pb.go index a0029890..9f23fcb7 100644 --- a/cosi.pb.go +++ b/cosi.pb.go @@ -684,6 +684,10 @@ type ProvisionerCreateBucketResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + + // BucketName returned here is expected to be the globally unique + // identifier for the bucket in the object storage provider + BucketName string `protobuf:"bytes,1,opt,name=BucketName,proto3" json:"BucketName,omitempty"` } func (x *ProvisionerCreateBucketResponse) Reset() { @@ -718,6 +722,13 @@ func (*ProvisionerCreateBucketResponse) Descriptor() ([]byte, []int) { return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{7} } +func (x *ProvisionerCreateBucketResponse) GetBucketName() string { + if x != nil { + return x.BucketName + } + return "" +} + type ProvisionerDeleteBucketRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -726,11 +737,6 @@ type ProvisionerDeleteBucketRequest struct { // This field is REQUIRED // Protocol specific information required by the call is passed in as key,value pairs. Protocol *Protocol `protobuf:"bytes,1,opt,name=protocol,proto3" json:"protocol,omitempty"` - // This field is OPTIONAL - // Protocol specific information required by the call is passed in as key,value pairs. - // The caller should treat the values in parameters as opaque. - // The receiver is responsible for parsing and validating the values. - Parameters map[string]string `protobuf:"bytes,2,rep,name=parameters,proto3" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *ProvisionerDeleteBucketRequest) Reset() { @@ -772,13 +778,6 @@ func (x *ProvisionerDeleteBucketRequest) GetProtocol() *Protocol { return nil } -func (x *ProvisionerDeleteBucketRequest) GetParameters() map[string]string { - if x != nil { - return x.Parameters - } - return nil -} - type ProvisionerDeleteBucketResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -974,12 +973,9 @@ type ProvisionerRevokeBucketAccessRequest struct { // This field is REQUIRED // Protocol specific information required by the call is passed in as key,value pairs. Protocol *Protocol `protobuf:"bytes,1,opt,name=protocol,proto3" json:"protocol,omitempty"` - // This field is OPTIONAL - // Protocol specific information required by the call is passed in as key,value pairs. - Parameters map[string]string `protobuf:"bytes,2,rep,name=parameters,proto3" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // This field is REQUIRED // This is the account that is being revoked access. - Principal string `protobuf:"bytes,3,opt,name=principal,proto3" json:"principal,omitempty"` + Principal string `protobuf:"bytes,2,opt,name=principal,proto3" json:"principal,omitempty"` } func (x *ProvisionerRevokeBucketAccessRequest) Reset() { @@ -1021,13 +1017,6 @@ func (x *ProvisionerRevokeBucketAccessRequest) GetProtocol() *Protocol { return nil } -func (x *ProvisionerRevokeBucketAccessRequest) GetParameters() map[string]string { - if x != nil { - return x.Parameters - } - return nil -} - func (x *ProvisionerRevokeBucketAccessRequest) GetPrincipal() string { if x != nil { return x.Principal @@ -1278,170 +1267,152 @@ var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDesc 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x21, 0x0a, 0x1f, 0x50, 0x72, 0x6f, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x41, 0x0a, 0x1f, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, - 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xf3, 0x01, 0x0a, 0x1e, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x33, - 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x12, 0x5d, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, - 0x72, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x21, 0x0a, 0x1f, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc0, 0x02, 0x0a, 0x23, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x33, 0x0a, 0x08, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x12, 0x62, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, - 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, - 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, - 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, - 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, - 0x70, 0x61, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb4, 0x01, 0x0a, 0x24, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, - 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x12, 0x3a, - 0x0a, 0x19, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x5f, 0x66, 0x69, - 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x17, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x46, 0x69, - 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x63, 0x72, - 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, - 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x63, 0x72, 0x65, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x22, 0x9d, - 0x02, 0x0a, 0x24, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, + 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x42, + 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x55, 0x0a, 0x1e, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x33, 0x0a, + 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6c, 0x22, 0x21, 0x0a, 0x1f, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, + 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc0, 0x02, 0x0a, 0x23, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x33, 0x0a, + 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6c, 0x12, 0x62, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, + 0x70, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x63, + 0x69, 0x70, 0x61, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb4, 0x01, 0x0a, 0x24, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, + 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x12, + 0x3a, 0x0a, 0x19, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x5f, 0x66, + 0x69, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x17, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x46, + 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x63, + 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, + 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x63, 0x72, 0x65, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x22, + 0x79, 0x0a, 0x24, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x33, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x63, 0x0a, 0x0a, - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x43, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, - 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, - 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x1a, - 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x27, - 0x0a, 0x25, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x76, - 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x3f, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x13, 0x0a, 0x0f, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, - 0x77, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, - 0x53, 0x33, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x5a, 0x55, 0x52, 0x45, 0x10, 0x02, 0x12, - 0x07, 0x0a, 0x03, 0x47, 0x43, 0x53, 0x10, 0x03, 0x2a, 0x3e, 0x0a, 0x12, 0x53, 0x33, 0x53, 0x69, - 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, - 0x0a, 0x10, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x33, 0x56, 0x32, 0x10, 0x01, 0x12, 0x08, - 0x0a, 0x04, 0x53, 0x33, 0x56, 0x34, 0x10, 0x02, 0x2a, 0x71, 0x0a, 0x19, 0x41, 0x6e, 0x6f, 0x6e, - 0x79, 0x6d, 0x6f, 0x75, 0x73, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x0a, 0x17, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, - 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, - 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x10, 0x01, 0x12, - 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x02, 0x12, 0x0d, 0x0a, - 0x09, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, - 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x04, 0x32, 0x77, 0x0a, 0x08, 0x49, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x6b, 0x0a, 0x12, 0x50, 0x72, 0x6f, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x28, 0x2e, - 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, - 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x32, 0x9c, 0x04, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x65, 0x72, 0x12, 0x7a, 0x0a, 0x17, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, - 0x2d, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, - 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x7a, 0x0a, 0x17, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x2d, 0x2e, 0x63, 0x6f, + 0x6f, 0x6c, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x1c, 0x0a, 0x09, + 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x22, 0x27, 0x0a, 0x25, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, + 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x2a, 0x3f, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x13, 0x0a, 0x0f, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x50, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x53, 0x33, 0x10, 0x01, + 0x12, 0x09, 0x0a, 0x05, 0x41, 0x5a, 0x55, 0x52, 0x45, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x47, + 0x43, 0x53, 0x10, 0x03, 0x2a, 0x3e, 0x0a, 0x12, 0x53, 0x33, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x10, 0x55, 0x6e, + 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x10, 0x00, + 0x12, 0x08, 0x0a, 0x04, 0x53, 0x33, 0x56, 0x32, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x33, + 0x56, 0x34, 0x10, 0x02, 0x2a, 0x71, 0x0a, 0x19, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x6f, 0x75, + 0x73, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, + 0x65, 0x12, 0x1b, 0x0a, 0x17, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x42, 0x75, 0x63, 0x6b, + 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x10, 0x00, 0x12, 0x0b, + 0x0a, 0x07, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x52, + 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x04, 0x32, 0x77, 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x12, 0x6b, 0x0a, 0x12, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x28, 0x2e, 0x63, 0x6f, 0x73, 0x69, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, + 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x32, 0x9c, 0x04, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, + 0x12, 0x7a, 0x0a, 0x17, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x2d, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, - 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x87, 0x01, 0x0a, - 0x1c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, - 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x32, 0x2e, + 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, + 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7a, 0x0a, 0x17, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x2d, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x87, 0x01, 0x0a, 0x1c, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, + 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x32, 0x2e, 0x63, 0x6f, 0x73, 0x69, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, - 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x33, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, - 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8a, 0x01, 0x0a, 0x1d, 0x50, 0x72, 0x6f, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, - 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x33, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, - 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, - 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, - 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, - 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x3a, 0x3c, 0x0a, 0x0a, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x65, 0x6e, 0x75, - 0x6d, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x45, 0x6e, 0x75, - 0x6d, 0x3a, 0x4c, 0x0a, 0x10, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x5f, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0e, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x3f, 0x0a, 0x0b, 0x63, 0x6f, 0x73, 0x69, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x1d, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x08, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x63, 0x6f, 0x73, 0x69, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, - 0x3a, 0x3f, 0x0a, 0x0b, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, - 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, - 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x46, 0x69, 0x65, 0x6c, - 0x64, 0x3a, 0x45, 0x0a, 0x0d, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x42, 0x0a, 0x0c, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, - 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0b, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3a, 0x45, 0x0a, 0x0d, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1f, 0x2e, + 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x8a, 0x01, 0x0a, 0x1d, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x12, 0x33, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, + 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x63, 0x6f, 0x73, 0x69, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3a, + 0x3c, 0x0a, 0x0a, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, - 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x42, 0x3a, 0x5a, 0x38, 0x73, 0x69, 0x67, 0x73, 0x2e, 0x6b, 0x38, 0x73, 0x2e, - 0x69, 0x6f, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2d, 0x6f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x2d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2d, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x66, 0x61, 0x63, 0x65, 0x2d, 0x73, 0x70, 0x65, 0x63, 0x3b, 0x63, 0x6f, 0x73, 0x69, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x09, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x45, 0x6e, 0x75, 0x6d, 0x3a, 0x4c, 0x0a, + 0x10, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x12, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x3f, 0x0a, 0x0b, 0x63, + 0x6f, 0x73, 0x69, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x08, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0a, 0x63, 0x6f, 0x73, 0x69, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x3a, 0x3f, 0x0a, 0x0b, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, + 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0a, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x3a, 0x45, 0x0a, + 0x0d, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x3a, 0x42, 0x0a, 0x0c, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x6d, 0x65, + 0x74, 0x68, 0x6f, 0x64, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3a, 0x45, 0x0a, 0x0d, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, + 0x3a, 0x5a, 0x38, 0x73, 0x69, 0x67, 0x73, 0x2e, 0x6b, 0x38, 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2d, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2d, + 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, + 0x65, 0x2d, 0x73, 0x70, 0x65, 0x63, 0x3b, 0x63, 0x6f, 0x73, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( @@ -1457,7 +1428,7 @@ func file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDesc } var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes = make([]protoimpl.MessageInfo, 18) +var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes = make([]protoimpl.MessageInfo, 16) var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_goTypes = []interface{}{ (ProtocolName)(0), // 0: cosi.v1alpha1.ProtocolName (S3SignatureVersion)(0), // 1: cosi.v1alpha1.S3SignatureVersion @@ -1477,15 +1448,13 @@ var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_goTypes (*ProvisionerRevokeBucketAccessRequest)(nil), // 15: cosi.v1alpha1.ProvisionerRevokeBucketAccessRequest (*ProvisionerRevokeBucketAccessResponse)(nil), // 16: cosi.v1alpha1.ProvisionerRevokeBucketAccessResponse nil, // 17: cosi.v1alpha1.ProvisionerCreateBucketRequest.ParametersEntry - nil, // 18: cosi.v1alpha1.ProvisionerDeleteBucketRequest.ParametersEntry - nil, // 19: cosi.v1alpha1.ProvisionerGrantBucketAccessRequest.ParametersEntry - nil, // 20: cosi.v1alpha1.ProvisionerRevokeBucketAccessRequest.ParametersEntry - (*descriptor.EnumOptions)(nil), // 21: google.protobuf.EnumOptions - (*descriptor.EnumValueOptions)(nil), // 22: google.protobuf.EnumValueOptions - (*descriptor.FieldOptions)(nil), // 23: google.protobuf.FieldOptions - (*descriptor.MessageOptions)(nil), // 24: google.protobuf.MessageOptions - (*descriptor.MethodOptions)(nil), // 25: google.protobuf.MethodOptions - (*descriptor.ServiceOptions)(nil), // 26: google.protobuf.ServiceOptions + nil, // 18: cosi.v1alpha1.ProvisionerGrantBucketAccessRequest.ParametersEntry + (*descriptor.EnumOptions)(nil), // 19: google.protobuf.EnumOptions + (*descriptor.EnumValueOptions)(nil), // 20: google.protobuf.EnumValueOptions + (*descriptor.FieldOptions)(nil), // 21: google.protobuf.FieldOptions + (*descriptor.MessageOptions)(nil), // 22: google.protobuf.MessageOptions + (*descriptor.MethodOptions)(nil), // 23: google.protobuf.MethodOptions + (*descriptor.ServiceOptions)(nil), // 24: google.protobuf.ServiceOptions } var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_depIdxs = []int32{ 1, // 0: cosi.v1alpha1.S3Parameters.signature_version:type_name -> cosi.v1alpha1.S3SignatureVersion @@ -1497,33 +1466,31 @@ var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_depIdxs 17, // 6: cosi.v1alpha1.ProvisionerCreateBucketRequest.parameters:type_name -> cosi.v1alpha1.ProvisionerCreateBucketRequest.ParametersEntry 2, // 7: cosi.v1alpha1.ProvisionerCreateBucketRequest.anonymous_bucket_access_mode:type_name -> cosi.v1alpha1.AnonymousBucketAccessMode 6, // 8: cosi.v1alpha1.ProvisionerDeleteBucketRequest.protocol:type_name -> cosi.v1alpha1.Protocol - 18, // 9: cosi.v1alpha1.ProvisionerDeleteBucketRequest.parameters:type_name -> cosi.v1alpha1.ProvisionerDeleteBucketRequest.ParametersEntry - 6, // 10: cosi.v1alpha1.ProvisionerGrantBucketAccessRequest.protocol:type_name -> cosi.v1alpha1.Protocol - 19, // 11: cosi.v1alpha1.ProvisionerGrantBucketAccessRequest.parameters:type_name -> cosi.v1alpha1.ProvisionerGrantBucketAccessRequest.ParametersEntry - 6, // 12: cosi.v1alpha1.ProvisionerRevokeBucketAccessRequest.protocol:type_name -> cosi.v1alpha1.Protocol - 20, // 13: cosi.v1alpha1.ProvisionerRevokeBucketAccessRequest.parameters:type_name -> cosi.v1alpha1.ProvisionerRevokeBucketAccessRequest.ParametersEntry - 21, // 14: cosi.v1alpha1.alpha_enum:extendee -> google.protobuf.EnumOptions - 22, // 15: cosi.v1alpha1.alpha_enum_value:extendee -> google.protobuf.EnumValueOptions - 23, // 16: cosi.v1alpha1.cosi_secret:extendee -> google.protobuf.FieldOptions - 23, // 17: cosi.v1alpha1.alpha_field:extendee -> google.protobuf.FieldOptions - 24, // 18: cosi.v1alpha1.alpha_message:extendee -> google.protobuf.MessageOptions - 25, // 19: cosi.v1alpha1.alpha_method:extendee -> google.protobuf.MethodOptions - 26, // 20: cosi.v1alpha1.alpha_service:extendee -> google.protobuf.ServiceOptions - 7, // 21: cosi.v1alpha1.Identity.ProvisionerGetInfo:input_type -> cosi.v1alpha1.ProvisionerGetInfoRequest - 9, // 22: cosi.v1alpha1.Provisioner.ProvisionerCreateBucket:input_type -> cosi.v1alpha1.ProvisionerCreateBucketRequest - 11, // 23: cosi.v1alpha1.Provisioner.ProvisionerDeleteBucket:input_type -> cosi.v1alpha1.ProvisionerDeleteBucketRequest - 13, // 24: cosi.v1alpha1.Provisioner.ProvisionerGrantBucketAccess:input_type -> cosi.v1alpha1.ProvisionerGrantBucketAccessRequest - 15, // 25: cosi.v1alpha1.Provisioner.ProvisionerRevokeBucketAccess:input_type -> cosi.v1alpha1.ProvisionerRevokeBucketAccessRequest - 8, // 26: cosi.v1alpha1.Identity.ProvisionerGetInfo:output_type -> cosi.v1alpha1.ProvisionerGetInfoResponse - 10, // 27: cosi.v1alpha1.Provisioner.ProvisionerCreateBucket:output_type -> cosi.v1alpha1.ProvisionerCreateBucketResponse - 12, // 28: cosi.v1alpha1.Provisioner.ProvisionerDeleteBucket:output_type -> cosi.v1alpha1.ProvisionerDeleteBucketResponse - 14, // 29: cosi.v1alpha1.Provisioner.ProvisionerGrantBucketAccess:output_type -> cosi.v1alpha1.ProvisionerGrantBucketAccessResponse - 16, // 30: cosi.v1alpha1.Provisioner.ProvisionerRevokeBucketAccess:output_type -> cosi.v1alpha1.ProvisionerRevokeBucketAccessResponse - 26, // [26:31] is the sub-list for method output_type - 21, // [21:26] is the sub-list for method input_type - 21, // [21:21] is the sub-list for extension type_name - 14, // [14:21] is the sub-list for extension extendee - 0, // [0:14] is the sub-list for field type_name + 6, // 9: cosi.v1alpha1.ProvisionerGrantBucketAccessRequest.protocol:type_name -> cosi.v1alpha1.Protocol + 18, // 10: cosi.v1alpha1.ProvisionerGrantBucketAccessRequest.parameters:type_name -> cosi.v1alpha1.ProvisionerGrantBucketAccessRequest.ParametersEntry + 6, // 11: cosi.v1alpha1.ProvisionerRevokeBucketAccessRequest.protocol:type_name -> cosi.v1alpha1.Protocol + 19, // 12: cosi.v1alpha1.alpha_enum:extendee -> google.protobuf.EnumOptions + 20, // 13: cosi.v1alpha1.alpha_enum_value:extendee -> google.protobuf.EnumValueOptions + 21, // 14: cosi.v1alpha1.cosi_secret:extendee -> google.protobuf.FieldOptions + 21, // 15: cosi.v1alpha1.alpha_field:extendee -> google.protobuf.FieldOptions + 22, // 16: cosi.v1alpha1.alpha_message:extendee -> google.protobuf.MessageOptions + 23, // 17: cosi.v1alpha1.alpha_method:extendee -> google.protobuf.MethodOptions + 24, // 18: cosi.v1alpha1.alpha_service:extendee -> google.protobuf.ServiceOptions + 7, // 19: cosi.v1alpha1.Identity.ProvisionerGetInfo:input_type -> cosi.v1alpha1.ProvisionerGetInfoRequest + 9, // 20: cosi.v1alpha1.Provisioner.ProvisionerCreateBucket:input_type -> cosi.v1alpha1.ProvisionerCreateBucketRequest + 11, // 21: cosi.v1alpha1.Provisioner.ProvisionerDeleteBucket:input_type -> cosi.v1alpha1.ProvisionerDeleteBucketRequest + 13, // 22: cosi.v1alpha1.Provisioner.ProvisionerGrantBucketAccess:input_type -> cosi.v1alpha1.ProvisionerGrantBucketAccessRequest + 15, // 23: cosi.v1alpha1.Provisioner.ProvisionerRevokeBucketAccess:input_type -> cosi.v1alpha1.ProvisionerRevokeBucketAccessRequest + 8, // 24: cosi.v1alpha1.Identity.ProvisionerGetInfo:output_type -> cosi.v1alpha1.ProvisionerGetInfoResponse + 10, // 25: cosi.v1alpha1.Provisioner.ProvisionerCreateBucket:output_type -> cosi.v1alpha1.ProvisionerCreateBucketResponse + 12, // 26: cosi.v1alpha1.Provisioner.ProvisionerDeleteBucket:output_type -> cosi.v1alpha1.ProvisionerDeleteBucketResponse + 14, // 27: cosi.v1alpha1.Provisioner.ProvisionerGrantBucketAccess:output_type -> cosi.v1alpha1.ProvisionerGrantBucketAccessResponse + 16, // 28: cosi.v1alpha1.Provisioner.ProvisionerRevokeBucketAccess:output_type -> cosi.v1alpha1.ProvisionerRevokeBucketAccessResponse + 24, // [24:29] is the sub-list for method output_type + 19, // [19:24] is the sub-list for method input_type + 19, // [19:19] is the sub-list for extension type_name + 12, // [12:19] is the sub-list for extension extendee + 0, // [0:12] is the sub-list for field type_name } func init() { file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_init() } @@ -1712,7 +1679,7 @@ func file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_init() GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDesc, NumEnums: 3, - NumMessages: 18, + NumMessages: 16, NumExtensions: 7, NumServices: 2, }, diff --git a/cosi.proto b/cosi.proto index d55a5b6f..f604bc0e 100644 --- a/cosi.proto +++ b/cosi.proto @@ -182,19 +182,15 @@ message ProvisionerCreateBucketRequest { } message ProvisionerCreateBucketResponse { - // Intentionally left blank + // BucketName returned here is expected to be the globally unique + // identifier for the bucket in the object storage provider + string BucketName = 1; } message ProvisionerDeleteBucketRequest { // This field is REQUIRED // Protocol specific information required by the call is passed in as key,value pairs. Protocol protocol = 1; - - // This field is OPTIONAL - // Protocol specific information required by the call is passed in as key,value pairs. - // The caller should treat the values in parameters as opaque. - // The receiver is responsible for parsing and validating the values. - map parameters = 2; } message ProvisionerDeleteBucketResponse { @@ -239,13 +235,9 @@ message ProvisionerRevokeBucketAccessRequest { // Protocol specific information required by the call is passed in as key,value pairs. Protocol protocol = 1; - // This field is OPTIONAL - // Protocol specific information required by the call is passed in as key,value pairs. - map parameters = 2; - // This field is REQUIRED // This is the account that is being revoked access. - string principal = 3; + string principal = 2; } message ProvisionerRevokeBucketAccessResponse { diff --git a/spec.md b/spec.md index 46ddfd8b..7a8750d5 100644 --- a/spec.md +++ b/spec.md @@ -310,19 +310,15 @@ message ProvisionerCreateBucketRequest { } message ProvisionerCreateBucketResponse { - // Intentionally left blank + // BucketName returned here is expected to be the globally unique + // identifier for the bucket in the object storage provider + string BucketName = 1; } message ProvisionerDeleteBucketRequest { // This field is REQUIRED // Protocol specific information required by the call is passed in as key,value pairs. Protocol protocol = 1; - - // This field is OPTIONAL - // Protocol specific information required by the call is passed in as key,value pairs. - // The caller should treat the values in parameters as opaque. - // The receiver is responsible for parsing and validating the values. - map parameters = 2; } message ProvisionerDeleteBucketResponse { @@ -367,13 +363,9 @@ message ProvisionerRevokeBucketAccessRequest { // Protocol specific information required by the call is passed in as key,value pairs. Protocol protocol = 1; - // This field is OPTIONAL - // Protocol specific information required by the call is passed in as key,value pairs. - map parameters = 2; - // This field is REQUIRED // This is the account that is being revoked access. - string principal = 3; + string principal = 2; } message ProvisionerRevokeBucketAccessResponse { From 80749df9585971c0748a1d64f83ad00ad73008a5 Mon Sep 17 00:00:00 2001 From: Yiannis Gkoufas Date: Thu, 4 Mar 2021 10:14:50 +0000 Subject: [PATCH 152/242] imports should change to sigs.k8s.io/container-object-storage-interface-api --- cmd/controller-manager/controller-manager.go | 2 +- go.mod | 2 +- go.sum | 4 ++-- pkg/bucketaccessrequest/bucketaccessrequest.go | 6 +++--- pkg/bucketaccessrequest/bucketaccessrequest_test.go | 4 ++-- pkg/bucketrequest/bucketrequest.go | 6 +++--- pkg/bucketrequest/bucketrequest_test.go | 4 ++-- pkg/util/util.go | 8 ++++---- 8 files changed, 18 insertions(+), 18 deletions(-) diff --git a/cmd/controller-manager/controller-manager.go b/cmd/controller-manager/controller-manager.go index e2788c8c..b2508fa4 100644 --- a/cmd/controller-manager/controller-manager.go +++ b/cmd/controller-manager/controller-manager.go @@ -10,9 +10,9 @@ import ( "github.com/spf13/cobra" "github.com/spf13/viper" - bucketcontroller "github.com/kubernetes-sigs/container-object-storage-interface-api/controller" "github.com/kubernetes-sigs/container-object-storage-interface-controller/pkg/bucketaccessrequest" "github.com/kubernetes-sigs/container-object-storage-interface-controller/pkg/bucketrequest" + bucketcontroller "sigs.k8s.io/container-object-storage-interface-api/controller" "github.com/golang/glog" ) diff --git a/go.mod b/go.mod index b5bacae4..ef1e3da7 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,6 @@ require ( github.com/google/uuid v1.1.2 // indirect github.com/gopherjs/gopherjs v0.0.0-20190328170749-bb2674552d8f // indirect github.com/kr/text v0.2.0 // indirect - github.com/kubernetes-sigs/container-object-storage-interface-api v0.0.0-20210120011359-1e91ae41e243 github.com/mailru/easyjson v0.7.6 // indirect github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect @@ -32,5 +31,6 @@ require ( k8s.io/client-go v0.19.4 k8s.io/klog/v2 v2.4.0 // indirect k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd // indirect + sigs.k8s.io/container-object-storage-interface-api v0.0.0-20210225042325-7c26b4fc1ed9 sigs.k8s.io/controller-tools v0.4.1 ) diff --git a/go.sum b/go.sum index a5f29fe3..634efa7a 100644 --- a/go.sum +++ b/go.sum @@ -303,8 +303,6 @@ github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kubernetes-sigs/container-object-storage-interface-api v0.0.0-20210120011359-1e91ae41e243 h1:iOEsQYg/QXxzYP10JaLtoQWdlGG3OS/a3sOYsrDXwdE= -github.com/kubernetes-sigs/container-object-storage-interface-api v0.0.0-20210120011359-1e91ae41e243/go.mod h1:C7tjzC+nLe7H7+3UM/Z6a7F24yxOO8FSK3ZaVZrKDPQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= @@ -796,6 +794,8 @@ k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/ rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.9/go.mod h1:dzAXnQbTRyDlZPJX2SUPEqvnB+j7AJjtlox7PEwigU0= +sigs.k8s.io/container-object-storage-interface-api v0.0.0-20210225042325-7c26b4fc1ed9 h1:ZjGviVPvDVxOhCF7+dsbAk5GPfUpEnM0DtR5yH7S6ww= +sigs.k8s.io/container-object-storage-interface-api v0.0.0-20210225042325-7c26b4fc1ed9/go.mod h1:4V9ty4CWneFEQJbr+yQPjkCdUH3EKfjXM4AQXLY4Sa8= sigs.k8s.io/controller-runtime v0.6.3 h1:SBbr+inLPEKhvlJtrvDcwIpm+uhDvp63Bl72xYJtoOE= sigs.k8s.io/controller-runtime v0.6.3/go.mod h1:WlZNXcM0++oyaQt4B7C2lEE5JYRs8vJUzRP4N4JpdAY= sigs.k8s.io/controller-tools v0.4.1 h1:VkuV0MxlRPmRu5iTgBZU4UxUX2LiR99n3sdQGRxZF4w= diff --git a/pkg/bucketaccessrequest/bucketaccessrequest.go b/pkg/bucketaccessrequest/bucketaccessrequest.go index 36ba7852..b07d1917 100644 --- a/pkg/bucketaccessrequest/bucketaccessrequest.go +++ b/pkg/bucketaccessrequest/bucketaccessrequest.go @@ -9,10 +9,10 @@ import ( kubeclientset "k8s.io/client-go/kubernetes" "k8s.io/client-go/util/retry" - "github.com/kubernetes-sigs/container-object-storage-interface-api/apis/objectstorage.k8s.io/v1alpha1" - bucketclientset "github.com/kubernetes-sigs/container-object-storage-interface-api/clientset" - bucketcontroller "github.com/kubernetes-sigs/container-object-storage-interface-api/controller" "github.com/kubernetes-sigs/container-object-storage-interface-controller/pkg/util" + "sigs.k8s.io/container-object-storage-interface-api/apis/objectstorage.k8s.io/v1alpha1" + bucketclientset "sigs.k8s.io/container-object-storage-interface-api/clientset" + bucketcontroller "sigs.k8s.io/container-object-storage-interface-api/controller" "github.com/golang/glog" ) diff --git a/pkg/bucketaccessrequest/bucketaccessrequest_test.go b/pkg/bucketaccessrequest/bucketaccessrequest_test.go index 3cbf2ee6..212041bd 100644 --- a/pkg/bucketaccessrequest/bucketaccessrequest_test.go +++ b/pkg/bucketaccessrequest/bucketaccessrequest_test.go @@ -7,11 +7,11 @@ import ( v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - bucketclientset "github.com/kubernetes-sigs/container-object-storage-interface-api/clientset/fake" "k8s.io/client-go/kubernetes/fake" + bucketclientset "sigs.k8s.io/container-object-storage-interface-api/clientset/fake" - types "github.com/kubernetes-sigs/container-object-storage-interface-api/apis/objectstorage.k8s.io/v1alpha1" "github.com/kubernetes-sigs/container-object-storage-interface-controller/pkg/util" + types "sigs.k8s.io/container-object-storage-interface-api/apis/objectstorage.k8s.io/v1alpha1" ) var sa1 = v1.ServiceAccount{ diff --git a/pkg/bucketrequest/bucketrequest.go b/pkg/bucketrequest/bucketrequest.go index b5e2099d..0403024f 100644 --- a/pkg/bucketrequest/bucketrequest.go +++ b/pkg/bucketrequest/bucketrequest.go @@ -9,11 +9,11 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/util/retry" - "github.com/kubernetes-sigs/container-object-storage-interface-api/apis/objectstorage.k8s.io/v1alpha1" - bucketclientset "github.com/kubernetes-sigs/container-object-storage-interface-api/clientset" - bucketcontroller "github.com/kubernetes-sigs/container-object-storage-interface-api/controller" "github.com/kubernetes-sigs/container-object-storage-interface-controller/pkg/util" kubeclientset "k8s.io/client-go/kubernetes" + "sigs.k8s.io/container-object-storage-interface-api/apis/objectstorage.k8s.io/v1alpha1" + bucketclientset "sigs.k8s.io/container-object-storage-interface-api/clientset" + bucketcontroller "sigs.k8s.io/container-object-storage-interface-api/controller" "github.com/golang/glog" ) diff --git a/pkg/bucketrequest/bucketrequest_test.go b/pkg/bucketrequest/bucketrequest_test.go index 8134e63a..c4fae686 100644 --- a/pkg/bucketrequest/bucketrequest_test.go +++ b/pkg/bucketrequest/bucketrequest_test.go @@ -6,11 +6,11 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - bucketclientset "github.com/kubernetes-sigs/container-object-storage-interface-api/clientset/fake" "k8s.io/client-go/kubernetes/fake" + bucketclientset "sigs.k8s.io/container-object-storage-interface-api/clientset/fake" - types "github.com/kubernetes-sigs/container-object-storage-interface-api/apis/objectstorage.k8s.io/v1alpha1" "github.com/kubernetes-sigs/container-object-storage-interface-controller/pkg/util" + types "sigs.k8s.io/container-object-storage-interface-api/apis/objectstorage.k8s.io/v1alpha1" ) var classGoldParameters = map[string]string{ diff --git a/pkg/util/util.go b/pkg/util/util.go index 28edfeac..2645d9a7 100644 --- a/pkg/util/util.go +++ b/pkg/util/util.go @@ -22,9 +22,9 @@ import ( "k8s.io/client-go/tools/clientcmd" "k8s.io/client-go/util/workqueue" - types "github.com/kubernetes-sigs/container-object-storage-interface-api/apis/objectstorage.k8s.io/v1alpha1" - bucketclientset "github.com/kubernetes-sigs/container-object-storage-interface-api/clientset" - "github.com/kubernetes-sigs/container-object-storage-interface-api/controller" + types "sigs.k8s.io/container-object-storage-interface-api/apis/objectstorage.k8s.io/v1alpha1" + bucketclientset "sigs.k8s.io/container-object-storage-interface-api/clientset" + "sigs.k8s.io/container-object-storage-interface-api/controller" "sigs.k8s.io/controller-tools/pkg/crd" crdmarkers "sigs.k8s.io/controller-tools/pkg/crd/markers" @@ -334,7 +334,7 @@ func RegisterCRDs(ctx context.Context, client apiextensions.CustomResourceDefini return err } - roots, err := loader.LoadRoots("github.com/kubernetes-sigs/container-object-storage-interface-api/apis/objectstorage.k8s.io/v1alpha1") + roots, err := loader.LoadRoots("sigs.k8s.io/container-object-storage-interface-api/apis/objectstorage.k8s.io/v1alpha1") if err != nil { return err } From 487fef274110774359e49decb89f4170100111ce Mon Sep 17 00:00:00 2001 From: Yiannis Gkoufas Date: Thu, 4 Mar 2021 13:46:58 +0000 Subject: [PATCH 153/242] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d83e2bff..70b61855 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Container Object Storage Controller -Container Object Storage Interface (COSI) controller responsible to manage lifecycle of COSI objects. +Container Object Storage Interface (COSI) controller is responsible to manage lifecycle of COSI objects. Specifically, this controller monitors the lifecycle of the user-facing CRDs: - BucketRequest - Represents a request to provision a Bucket From ca40b1de3d3388ea52fbc5aaf0e8d2d79d4a3379 Mon Sep 17 00:00:00 2001 From: wlan0 Date: Sun, 14 Mar 2021 21:06:01 -0700 Subject: [PATCH 154/242] update api version & glog -> klog --- cmd/controller-manager/controller-manager.go | 36 ++-- go.mod | 7 +- go.sum | 49 ++--- .../bucketaccessrequest.go | 22 +-- pkg/bucketrequest/bucketrequest.go | 167 ++++++++++-------- pkg/bucketrequest/bucketrequest_test.go | 6 +- pkg/util/util.go | 22 +-- 7 files changed, 145 insertions(+), 164 deletions(-) diff --git a/cmd/controller-manager/controller-manager.go b/cmd/controller-manager/controller-manager.go index b2508fa4..7d9dc866 100644 --- a/cmd/controller-manager/controller-manager.go +++ b/cmd/controller-manager/controller-manager.go @@ -14,7 +14,7 @@ import ( "github.com/kubernetes-sigs/container-object-storage-interface-controller/pkg/bucketrequest" bucketcontroller "sigs.k8s.io/container-object-storage-interface-api/controller" - "github.com/golang/glog" + "k8s.io/klog/v2" ) var cmd = &cobra.Command{ @@ -29,34 +29,20 @@ var cmd = &cobra.Command{ } var kubeConfig string +var verbosity int func init() { viper.AutomaticEnv() - cmd.PersistentFlags().AddGoFlagSet(flag.CommandLine) - flag.Set("logtostderr", "true") + flag.Set("alsologtostderr", "true") + kflags := flag.NewFlagSet("klog", flag.ExitOnError) + klog.InitFlags(kflags) - strFlag := func(c *cobra.Command, ptr *string, name string, short string, dfault string, desc string) { - c.PersistentFlags(). - StringVarP(ptr, name, short, dfault, desc) - } - strFlag(cmd, &kubeConfig, "kubeconfig", "", kubeConfig, "path to kubeconfig file") - - hideFlag := func(name string) { - cmd.PersistentFlags().MarkHidden(name) - } - hideFlag("alsologtostderr") - hideFlag("log_backtrace_at") - hideFlag("log_dir") - hideFlag("logtostderr") - hideFlag("master") - hideFlag("stderrthreshold") - hideFlag("vmodule") + cmd.PersistentFlags().AddGoFlagSet(kflags) + cmd.PersistentFlags().StringVarP(&kubeConfig, "kubeconfig", "", kubeConfig, "path to kubeconfig file") - // suppress the incorrect prefix in glog output - flag.CommandLine.Parse([]string{}) + //flag.CommandLine.Parse([]string{}) viper.BindPFlags(cmd.PersistentFlags()) - } func main() { @@ -72,16 +58,16 @@ func main() { }() if err := cmd.ExecuteContext(ctx); err != nil { - glog.Fatal(err.Error()) + klog.Error(err) } } func run(ctx context.Context, args []string) error { - ctrl, err := bucketcontroller.NewDefaultObjectStorageController("controller-manager", "leader-lock", 40) + ctrl, err := bucketcontroller.NewDefaultObjectStorageController("cosi-controller-manager", "leader-lock", 40) if err != nil { return err } - ctrl.AddBucketRequestListener(bucketrequest.NewListener()) + ctrl.AddBucketRequestListener(bucketrequest.NewBucketRequestListener()) ctrl.AddBucketAccessRequestListener(bucketaccessrequest.NewListener()) return ctrl.Run(ctx) } diff --git a/go.mod b/go.mod index ef1e3da7..65a358ad 100644 --- a/go.mod +++ b/go.mod @@ -3,10 +3,7 @@ module github.com/kubernetes-sigs/container-object-storage-interface-controller go 1.15 require ( - github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b - github.com/golang/protobuf v1.4.3 // indirect github.com/google/go-cmp v0.5.2 // indirect - github.com/google/uuid v1.1.2 // indirect github.com/gopherjs/gopherjs v0.0.0-20190328170749-bb2674552d8f // indirect github.com/kr/text v0.2.0 // indirect github.com/mailru/easyjson v0.7.6 // indirect @@ -29,8 +26,8 @@ require ( k8s.io/apiextensions-apiserver v0.19.4 k8s.io/apimachinery v0.19.4 k8s.io/client-go v0.19.4 - k8s.io/klog/v2 v2.4.0 // indirect + k8s.io/klog/v2 v2.4.0 k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd // indirect - sigs.k8s.io/container-object-storage-interface-api v0.0.0-20210225042325-7c26b4fc1ed9 + sigs.k8s.io/container-object-storage-interface-api v0.0.0-20210315005104-5e1814a6aedd sigs.k8s.io/controller-tools v0.4.1 ) diff --git a/go.sum b/go.sum index 634efa7a..824260f5 100644 --- a/go.sum +++ b/go.sum @@ -61,6 +61,7 @@ github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWR 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/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= @@ -78,6 +79,7 @@ github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwc github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= 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/dave/jennifer v1.4.1/go.mod h1:7jEdnm+qBcxl8PC0zyp7vxcpSRnzXSt9r39tpTVGlwA= 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= @@ -94,7 +96,9 @@ github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkg 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 h1:spTtZBk5DYEvbxMVutUuTyh1Ao2r4iyvLdACqsl/Ljk= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +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.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= 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= @@ -196,7 +200,6 @@ github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrU github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= @@ -205,8 +208,8 @@ github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -218,7 +221,6 @@ github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OI github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -230,7 +232,6 @@ github.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1a github.com/googleapis/gnostic v0.4.1 h1:DLJCy1n/vrD4HPjOvYcT8aYQXpPIzoRZONaYwyycI+I= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20190328170749-bb2674552d8f h1:4Gslotqbs16iAg+1KR/XdabIfq8TlAWHdwS5QJFksLc= github.com/gopherjs/gopherjs v0.0.0-20190328170749-bb2674552d8f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -266,10 +267,8 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO 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 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.5 h1:JboBksRwiiAJWvIYJVo46AfV+IAIKZpfrSzVKj42R4Q= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.9 h1:UauaLniWCFHWd+Jp9oCEkTBj8VO/9DKg3PV3VCNMDIg= github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= @@ -295,11 +294,9 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxv github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= 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 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= 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/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= 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= @@ -311,7 +308,6 @@ github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN 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 h1:aizVhC/NAAcKWb+5QsU1iNOZb4Yws5UO2I+aIprQITM= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= @@ -352,7 +348,6 @@ github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn 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.11.0 h1:JAKSXpt1YjtLA7YpPiqO9ss6sNXEsPfSGdwN0UHqzrw= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.2 h1:8mVmC9kjFFmA8H4pKMUhcblgifdkOIXPvbhN1T36q1M= @@ -360,7 +355,6 @@ github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9k github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.8.1 h1:C5Dqfs/LeauYDX0jJXIe2SWmwCbGzx9yF8C8xy3Lh34= github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= @@ -373,7 +367,6 @@ github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE 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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -408,7 +401,6 @@ github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeV github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= 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/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/assertions v1.1.1 h1:T/YLemO5Yp7KPzS+lVtu+WsHn8yoSwTfItdAd1r3cck= github.com/smartystreets/assertions v1.1.1/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= @@ -443,8 +435,8 @@ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= 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 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= @@ -488,7 +480,6 @@ golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201124201722-c8d3bf9c5392 h1:xYJJ3S178yv++9zXV/hnr29plCAGO9vAFG9dorqaFQc= golang.org/x/crypto v0.0.0-20201124201722-c8d3bf9c5392/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= @@ -538,12 +529,12 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 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-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-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/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-20200707034311-ab3426394381 h1:VXak5I6aEWmAXeQjA+QSZzlgNrpq9mjcfDemuexIKsU= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201216054612-986b41b23924 h1:QsnDpLLOKwHBBDa8nDws4DYNc/ryVW2vCpxCs09d4PY= @@ -551,7 +542,6 @@ golang.org/x/net v0.0.0-20201216054612-986b41b23924/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6 h1:pE8b58s1HRDMi8RDc79m0HISf9D4TzseP40cEA6IGfs= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -597,7 +587,6 @@ golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4 h1:5/PjkGUjvEU5Gl6BxmvKRPpqo2uNMv4rcHBMwzk/st8= golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/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 h1:nxC68pudNYkKU6jWhgrqdreuFiOQWj1Fs7T3VrH4Pjw= @@ -609,7 +598,6 @@ golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fq golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -647,13 +635,11 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200616195046-dc31b401abb5 h1:UaoXseXAWUJUcuJ2E2oczJdLxAJXL0lOmVaBl7kuk+I= golang.org/x/tools v0.0.0-20200616195046-dc31b401abb5/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e h1:Z2uDrs8MyXUWJbwGc4V+nGjV4Ygo+oubBbWSVQw21/I= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -680,6 +666,7 @@ google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98 google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= @@ -687,8 +674,11 @@ google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ij google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= 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.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= +google.golang.org/grpc v1.35.0 h1:TwIQcH3es+MojMVojxxfQ3l3OF2KzlRxML2xZq0kRo8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= 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= @@ -697,22 +687,20 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0 h1:UhZDfRO8JRQru4/+LlLE0BRKGF8L+PICnvYZmx/fEGA= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= 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-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b h1:QRR6H1YWRnHb4Y/HeNFCTJLFVxaq6wH4YuVdsUOr75U= gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 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 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= 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.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.57.0 h1:9unxIsFcTt4I55uWluz+UmL95q4kdJ0buvQ1ZIqVQww= gopkg.in/ini.v1 v1.57.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= @@ -726,7 +714,6 @@ gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -775,15 +762,12 @@ k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.2.0 h1:XRvcwJozkgZ1UQJmfMGpvRthQHOvihEhYtDfAaxMz/A= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.4.0 h1:7+X0fUguPyrKEC4WjH8iGDg3laWgMo5tMnRTIGTTxGQ= k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= 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-20200805222855-6aeccd4b50c6 h1:+WnxoVtG8TMiudHBSEtrVL1egv36TkkJm+bA8AxicmQ= k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= -k8s.io/kube-openapi v0.0.0-20200923155610-8b5066479488 h1:mNpvQf4lkIHNOXCoM+Veu/UXwA56Yx1J7hY1Tvcs/oM= k8s.io/kube-openapi v0.0.0-20200923155610-8b5066479488/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd h1:sOHNzJIkytDF6qadMNKhhDRpc6ODik8lVC6nOur7B2c= k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= @@ -794,15 +778,16 @@ k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/ rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.9/go.mod h1:dzAXnQbTRyDlZPJX2SUPEqvnB+j7AJjtlox7PEwigU0= -sigs.k8s.io/container-object-storage-interface-api v0.0.0-20210225042325-7c26b4fc1ed9 h1:ZjGviVPvDVxOhCF7+dsbAk5GPfUpEnM0DtR5yH7S6ww= -sigs.k8s.io/container-object-storage-interface-api v0.0.0-20210225042325-7c26b4fc1ed9/go.mod h1:4V9ty4CWneFEQJbr+yQPjkCdUH3EKfjXM4AQXLY4Sa8= +sigs.k8s.io/container-object-storage-interface-api v0.0.0-20210315005104-5e1814a6aedd h1:29yp8kNmIAvmVrk49H+CWBa7Yf4fipVLcTyong15tbs= +sigs.k8s.io/container-object-storage-interface-api v0.0.0-20210315005104-5e1814a6aedd/go.mod h1:yMgeGQDROJIdY1jymECN2ptefmQ4+e3EQB/S8gyIE0o= +sigs.k8s.io/container-object-storage-interface-spec v0.0.0-20210224211525-dfa3af562c18 h1:TIx7kV6/3ZSQ5BETBx1QG1Va28zv1LZAvqRjs28n8ss= +sigs.k8s.io/container-object-storage-interface-spec v0.0.0-20210224211525-dfa3af562c18/go.mod h1:kafkL5l/lTUrZXhVi/9p1GzpEE/ts29BkWkL3Ao33WU= sigs.k8s.io/controller-runtime v0.6.3 h1:SBbr+inLPEKhvlJtrvDcwIpm+uhDvp63Bl72xYJtoOE= sigs.k8s.io/controller-runtime v0.6.3/go.mod h1:WlZNXcM0++oyaQt4B7C2lEE5JYRs8vJUzRP4N4JpdAY= sigs.k8s.io/controller-tools v0.4.1 h1:VkuV0MxlRPmRu5iTgBZU4UxUX2LiR99n3sdQGRxZF4w= sigs.k8s.io/controller-tools v0.4.1/go.mod h1:G9rHdZMVlBDocIxGkK3jHLWqcTMNvveypYJwrvYKjWU= 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.1 h1:YXTMot5Qz/X1iBRJhAt+vI+HVttY0WkSqqhKxQ0xVbA= sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.0.2 h1:YHQV7Dajm86OuqnIR6zAelnDWBRjo+YhYV9PmGrh1s8= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= diff --git a/pkg/bucketaccessrequest/bucketaccessrequest.go b/pkg/bucketaccessrequest/bucketaccessrequest.go index b07d1917..860cbec9 100644 --- a/pkg/bucketaccessrequest/bucketaccessrequest.go +++ b/pkg/bucketaccessrequest/bucketaccessrequest.go @@ -14,7 +14,7 @@ import ( bucketclientset "sigs.k8s.io/container-object-storage-interface-api/clientset" bucketcontroller "sigs.k8s.io/container-object-storage-interface-api/controller" - "github.com/golang/glog" + "k8s.io/klog/v2" ) type bucketAccessRequestListener struct { @@ -35,7 +35,7 @@ func (b *bucketAccessRequestListener) InitializeBucketClient(bc bucketclientset. } func (b *bucketAccessRequestListener) Add(ctx context.Context, obj *v1alpha1.BucketAccessRequest) error { - glog.V(1).Infof("Add called for BucketAccessRequest %s", obj.Name) + klog.V(1).Infof("Add called for BucketAccessRequest %s", obj.Name) bucketAccessRequest := obj err := b.provisionBucketAccess(ctx, bucketAccessRequest) @@ -43,25 +43,25 @@ func (b *bucketAccessRequestListener) Add(ctx context.Context, obj *v1alpha1.Buc // Provisioning is 100% finished / not in progress. switch err { case util.ErrBucketAccessAlreadyExists: - glog.V(1).Infof("BucketAccess already exist for this BucketAccessRequest %v.", bucketAccessRequest.Name) + klog.V(1).Infof("BucketAccess already exist for this BucketAccessRequest %v.", bucketAccessRequest.Name) err = nil default: - glog.V(1).Infof("Error occurred processing BucketAccessRequest %v: %v", bucketAccessRequest.Name, err) + klog.V(1).Infof("Error occurred processing BucketAccessRequest %v: %v", bucketAccessRequest.Name, err) } return err } - glog.V(1).Infof("BucketAccessRequest %v is successfully processed.", bucketAccessRequest.Name) + klog.V(1).Infof("BucketAccessRequest %v is successfully processed.", bucketAccessRequest.Name) return nil } func (b *bucketAccessRequestListener) Update(ctx context.Context, old, new *v1alpha1.BucketAccessRequest) error { - glog.V(1).Infof("Update called for BucketAccessRequest %v", old.Name) + klog.V(1).Infof("Update called for BucketAccessRequest %v", old.Name) return nil } func (b *bucketAccessRequestListener) Delete(ctx context.Context, obj *v1alpha1.BucketAccessRequest) error { - glog.V(1).Infof("Delete called for BucketAccessRequest %v", obj.Name) + klog.V(1).Infof("Delete called for BucketAccessRequest %v", obj.Name) return nil } @@ -82,7 +82,7 @@ func (b *bucketAccessRequestListener) provisionBucketAccess(ctx context.Context, if err != nil { // anything other than 404 if !errors.IsNotFound(err) { - glog.Errorf("error fetching bucketaccess: %v", err) + klog.Errorf("error fetching bucketaccess: %v", err) return err } } else { // if bucket found @@ -93,7 +93,7 @@ func (b *bucketAccessRequestListener) provisionBucketAccess(ctx context.Context, bucketAccessClass, err := bacClient.Get(ctx, bucketAccessClassName, metav1.GetOptions{}) if err != nil { // bucket access class is invalid or not specified, cannot continue with provisioning. - glog.Errorf("error fetching bucketaccessclass [%v]: %v", bucketAccessClassName, err) + klog.Errorf("error fetching bucketaccessclass [%v]: %v", bucketAccessClassName, err) return util.ErrInvalidBucketAccessClass } @@ -104,7 +104,7 @@ func (b *bucketAccessRequestListener) provisionBucketAccess(ctx context.Context, } bucketRequest, err := brClient(bucketAccessRequest.Namespace).Get(ctx, brName, metav1.GetOptions{}) if err != nil { - glog.Errorf("error fetching bucket request [%v]: %v", brName, err) + klog.Errorf("error fetching bucket request [%v]: %v", brName, err) return err } @@ -163,7 +163,7 @@ func (b *bucketAccessRequestListener) provisionBucketAccess(ctx context.Context, if err != nil { return err } - glog.Infof("Finished creating BucketAccess %v", bucketaccess.Name) + klog.Infof("Finished creating BucketAccess %v", bucketaccess.Name) return nil } diff --git a/pkg/bucketrequest/bucketrequest.go b/pkg/bucketrequest/bucketrequest.go index 0403024f..f6d63d8c 100644 --- a/pkg/bucketrequest/bucketrequest.go +++ b/pkg/bucketrequest/bucketrequest.go @@ -2,7 +2,6 @@ package bucketrequest import ( "context" - "strings" v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" @@ -13,76 +12,86 @@ import ( kubeclientset "k8s.io/client-go/kubernetes" "sigs.k8s.io/container-object-storage-interface-api/apis/objectstorage.k8s.io/v1alpha1" bucketclientset "sigs.k8s.io/container-object-storage-interface-api/clientset" - bucketcontroller "sigs.k8s.io/container-object-storage-interface-api/controller" + objectstoragev1alpha1 "sigs.k8s.io/container-object-storage-interface-api/clientset/typed/objectstorage.k8s.io/v1alpha1" - "github.com/golang/glog" + "k8s.io/klog/v2" ) +// bucketRequestListener is a resource handler for bucket requests objects type bucketRequestListener struct { kubeClient kubeclientset.Interface bucketClient bucketclientset.Interface } -func NewListener() bucketcontroller.BucketRequestListener { +func NewBucketRequestListener() *bucketRequestListener { return &bucketRequestListener{} } -func (b *bucketRequestListener) InitializeKubeClient(k kubeclientset.Interface) { - b.kubeClient = k -} - -func (b *bucketRequestListener) InitializeBucketClient(bc bucketclientset.Interface) { - b.bucketClient = bc -} - // Add creates a bucket in response to a bucketrequest -func (b *bucketRequestListener) Add(ctx context.Context, obj *v1alpha1.BucketRequest) error { - glog.V(3).Infof("Add called for BucketRequest %s", obj.Name) - bucketRequest := obj +func (b *bucketRequestListener) Add(ctx context.Context, bucketRequest *v1alpha1.BucketRequest) error { + klog.V(3).InfoS("Add BucketRequest", + "name", bucketRequest.Name, + "ns", bucketRequest.Namespace, + "bucketClass", bucketRequest.Spec.BucketClassName, + "bucketPrefix", bucketRequest.Spec.BucketPrefix, + ) + err := b.provisionBucketRequestOperation(ctx, bucketRequest) if err != nil { - // Provisioning is 100% finished / not in progress. switch err { case util.ErrInvalidBucketClass: - glog.V(1).Infof("BucketClass specified does not exist while processing BucketRequest %v.", bucketRequest.Name) - err = nil + klog.ErrorS(util.ErrInvalidBucketClass, + "bucketRequest", bucketRequest.Name, + "ns", bucketRequest.Namespace, + "bucketClassName", bucketRequest.Spec.BucketClassName) case util.ErrBucketAlreadyExists: - glog.V(1).Infof("Bucket already exist for this bucket request %v.", bucketRequest.Name) - err = nil + klog.V(3).InfoS("Bucket already exists", + "bucketRequest", bucketRequest.Name, + "ns", bucketRequest.Namespace, + ) + return nil default: - glog.V(1).Infof("Error occurred processing BucketRequest %v: %v", bucketRequest.Name, err) + klog.ErrorS(err, + "name", bucketRequest.Name, + "ns", bucketRequest.Namespace, + "err", err) } return err } - glog.V(1).Infof("BucketRequest %v is successfully processed.", bucketRequest.Name) + klog.V(3).InfoS("Add BucketRequest success", + "name", bucketRequest.Name, + "ns", bucketRequest.Namespace) return nil } // update processes any updates made to the bucket request func (b *bucketRequestListener) Update(ctx context.Context, old, new *v1alpha1.BucketRequest) error { - glog.V(3).Infof("Update called for BucketRequest %v", old.Name) + klog.V(3).InfoS("Update BucketRequest", + "name", old.Name, + "ns", old.Namespace) return nil } // Delete processes a bucket for which bucket request is deleted -func (b *bucketRequestListener) Delete(ctx context.Context, obj *v1alpha1.BucketRequest) error { - glog.V(3).Infof("Delete called for BucketRequest %v", obj.Name) +func (b *bucketRequestListener) Delete(ctx context.Context, bucketRequest *v1alpha1.BucketRequest) error { + klog.V(3).Infof("Delete BucketRequest %v", + "name", bucketRequest.Name, + "ns", bucketRequest.Namespace) return nil } -// provisionBucketRequestOperation attempts to provision a bucket for the given bucketRequest. -// Returns nil error only when the bucket was provisioned, an error it set appropriately if not. -// Returns a normal error when the bucket was not provisioned and provisioning should be retried (requeue the bucketRequest), -// or the special error errBucketAlreadyExists, errInvalidBucketClass, when provisioning was impossible and -// no further attempts to provision should be tried. +// provisionBucketRequestOperation attempts to provision a bucket for a given bucketRequest. +// Return values +// nil - BucketRequest successfully processed +// ErrInvalidBucketClass - BucketClass does not exist [requeue'd with exponential backoff] +// ErrBucketAlreadyExists - BucketRequest already processed +// non-nil err - Internal error [requeue'd with exponential backoff] func (b *bucketRequestListener) provisionBucketRequestOperation(ctx context.Context, bucketRequest *v1alpha1.BucketRequest) error { - // Most code here is identical to that found in controller.go of kube's controller... - bucketClassName := b.GetBucketClass(bucketRequest) - - bucketClass, err := b.bucketClient.ObjectstorageV1alpha1().BucketClasses().Get(ctx, bucketClassName, metav1.GetOptions{}) + bucketClassName := b.getBucketClass(bucketRequest) + bucketClass, err := b.BucketClasses().Get(ctx, bucketClassName, metav1.GetOptions{}) if err != nil { - glog.Errorf("error getting bucketclass: [%v] %v", bucketClassName, err) + klog.ErrorS(err, "Get Bucketclass Error", "name", bucketClassName) return util.ErrInvalidBucketClass } @@ -92,15 +101,12 @@ func (b *bucketRequestListener) provisionBucketRequestOperation(ctx context.Cont } name = name + string(bucketRequest.GetUID()) - bucket, err := b.bucketClient.ObjectstorageV1alpha1().Buckets().Get(context.Background(), name, metav1.GetOptions{}) - if err != nil { - // anything other than 404 - if !errors.IsNotFound(err) { - glog.Errorf("error fetching bucket: %v", err) - return err - } - } else { // if bucket found - return nil + bucket, err := b.Buckets().Get(ctx, name, metav1.GetOptions{}) + if err == nil { + return util.ErrBucketAlreadyExists + } else if !errors.IsNotFound(err) { // anything other than bucket not found error is an internal error + klog.ErrorS(err, "name", name) + return err } // create bucket @@ -114,39 +120,36 @@ func (b *bucketRequestListener) provisionBucketRequestOperation(ctx context.Cont bucket.Spec.BucketRequest = &v1.ObjectReference{ Name: bucketRequest.Name, Namespace: bucketRequest.Namespace, - UID: bucketRequest.ObjectMeta.UID} + UID: bucketRequest.ObjectMeta.UID, + } bucket.Spec.AllowedNamespaces = util.CopyStrings(bucketClass.AllowedNamespaces) bucket.Spec.Protocol = *bucketClass.Protocol.DeepCopy() bucket.Spec.Parameters = util.CopySS(bucketClass.Parameters) - bucket, err = b.bucketClient.ObjectstorageV1alpha1().Buckets().Create(context.Background(), bucket, metav1.CreateOptions{}) + bucket, err = b.Buckets().Create(ctx, bucket, metav1.CreateOptions{}) if err != nil { if errors.IsAlreadyExists(err) { - return nil + return util.ErrBucketAlreadyExists } - glog.V(5).Infof("Error occurred when creating Bucket %v", err) + klog.ErrorS(err, "name", bucket.Name) return err } - err = retry.RetryOnConflict(retry.DefaultRetry, func() error { + updateBucketRequest := func() error { bucketRequest.Spec.BucketInstanceName = bucket.Name - _, err := b.bucketClient.ObjectstorageV1alpha1().BucketRequests(bucketRequest.Namespace).Update(ctx, bucketRequest, metav1.UpdateOptions{}) + _, err := b.BucketRequests(bucketRequest.Namespace).Update(ctx, bucketRequest, metav1.UpdateOptions{}) if err != nil { return err } return nil - }) - if err != nil { - return err } - glog.Infof("Finished creating Bucket %v", bucket.Name) - return nil + + return retry.RetryOnConflict(retry.DefaultRetry, updateBucketRequest) } -// GetBucketClass returns BucketClassName. If no bucket class was in the request it returns empty +// getBucketClass returns BucketClassName. If no bucket class was in the request it returns empty // TODO this methods can be more sophisticate to address bucketClass overrides using annotations just like SC. -func (b *bucketRequestListener) GetBucketClass(bucketRequest *v1alpha1.BucketRequest) string { - +func (b *bucketRequestListener) getBucketClass(bucketRequest *v1alpha1.BucketRequest) string { if bucketRequest.Spec.BucketClassName != "" { return bucketRequest.Spec.BucketClassName } @@ -154,27 +157,37 @@ func (b *bucketRequestListener) GetBucketClass(bucketRequest *v1alpha1.BucketReq return "" } -func (b *bucketRequestListener) FindBucket(ctx context.Context, br *v1alpha1.BucketRequest) *v1alpha1.Bucket { - bucketList, err := b.bucketClient.ObjectstorageV1alpha1().Buckets().List(ctx, metav1.ListOptions{}) - if err != nil { - return nil +// cloneTheBucket clones a bucket to a different namespace when a BR is for brownfield. +func (b *bucketRequestListener) cloneTheBucket(bucketRequest *v1alpha1.BucketRequest) error { + klog.InfoS("Cloning Bucket", "name", bucketRequest.Spec.BucketInstanceName) + return util.ErrNotImplemented +} + +func (b *bucketRequestListener) InitializeKubeClient(k kubeclientset.Interface) { + b.kubeClient = k +} + +func (b *bucketRequestListener) InitializeBucketClient(bc bucketclientset.Interface) { + b.bucketClient = bc +} + +func (b *bucketRequestListener) Buckets() objectstoragev1alpha1.BucketInterface { + if b.bucketClient != nil { + return b.bucketClient.ObjectstorageV1alpha1().Buckets() } - if len(bucketList.Items) > 0 { - for _, bucket := range bucketList.Items { - if strings.HasPrefix(bucket.Name, br.Spec.BucketPrefix) && - bucket.Spec.BucketClassName == br.Spec.BucketClassName && - bucket.Spec.BucketRequest.Name == br.Name && - bucket.Spec.BucketRequest.Namespace == br.Namespace && - bucket.Spec.BucketRequest.UID == br.ObjectMeta.UID { - return &bucket - } - } + panic("uninitialized listener") +} + +func (b *bucketRequestListener) BucketClasses() objectstoragev1alpha1.BucketClassInterface { + if b.bucketClient != nil { + return b.bucketClient.ObjectstorageV1alpha1().BucketClasses() } - return nil + panic("uninitialized listener") } -// cloneTheBucket clones a bucket to a different namespace when a BR is for brownfield. -func (b *bucketRequestListener) cloneTheBucket(bucketRequest *v1alpha1.BucketRequest) error { - glog.V(1).Infof("Clone called for Bucket %s", bucketRequest.Spec.BucketInstanceName) - return util.ErrNotImplemented +func (b *bucketRequestListener) BucketRequests(namespace string) objectstoragev1alpha1.BucketRequestInterface { + if b.bucketClient != nil { + return b.bucketClient.ObjectstorageV1alpha1().BucketRequests(namespace) + } + panic("uninitialized listener") } diff --git a/pkg/bucketrequest/bucketrequest_test.go b/pkg/bucketrequest/bucketrequest_test.go index c4fae686..342bb3a5 100644 --- a/pkg/bucketrequest/bucketrequest_test.go +++ b/pkg/bucketrequest/bucketrequest_test.go @@ -86,7 +86,7 @@ func runCreateBucket(t *testing.T, name string) { client := bucketclientset.NewSimpleClientset() kubeClient := fake.NewSimpleClientset() - listener := NewListener() + listener := NewBucketRequestListener() listener.InitializeKubeClient(kubeClient) listener.InitializeBucketClient(client) @@ -129,7 +129,7 @@ func runCreateBucketWithMultipleBR(t *testing.T, name string) { client := bucketclientset.NewSimpleClientset() kubeClient := fake.NewSimpleClientset() - listener := NewListener() + listener := NewBucketRequestListener() listener.InitializeKubeClient(kubeClient) listener.InitializeBucketClient(client) @@ -183,7 +183,7 @@ func runCreateBucketIdempotency(t *testing.T, name string) { client := bucketclientset.NewSimpleClientset() kubeClient := fake.NewSimpleClientset() - listener := NewListener() + listener := NewBucketRequestListener() listener.InitializeKubeClient(kubeClient) listener.InitializeBucketClient(client) diff --git a/pkg/util/util.go b/pkg/util/util.go index 2645d9a7..a3a4e1f6 100644 --- a/pkg/util/util.go +++ b/pkg/util/util.go @@ -32,7 +32,7 @@ import ( "sigs.k8s.io/controller-tools/pkg/loader" "sigs.k8s.io/controller-tools/pkg/markers" - "github.com/golang/glog" + "k8s.io/klog/v2" ) var ( @@ -105,26 +105,26 @@ func SetupTest(ctx context.Context) (bucketclientset.Interface, kubeclientset.In return rest.InClusterConfig() }() if err != nil { - glog.Fatalf("Failed to create clients: %v", err) + klog.Fatalf("Failed to create clients: %v", err) } kubeClient, err := kubeclientset.NewForConfig(config) if err != nil { - glog.Fatalf("Failed to create Kubernetes client: %v", err) + klog.Fatalf("Failed to create Kubernetes client: %v", err) } client, err := bucketclientset.NewForConfig(config) if err != nil { - glog.Fatalf("Failed to create ObjectStorage client: %v", err) + klog.Fatalf("Failed to create ObjectStorage client: %v", err) } crdClientset, err := apiextensions.NewForConfig(config) if err != nil { - glog.Fatalf("Failed to create CRD client: %v", err) + klog.Fatalf("Failed to create CRD client: %v", err) } err = RegisterCRDs(ctx, crdClientset.CustomResourceDefinitions()) if err != nil { - glog.Fatalf("Failed to register CRDs: %v", err) + klog.Fatalf("Failed to register CRDs: %v", err) } rateLimit := workqueue.NewMaxOfRateLimiter( @@ -133,7 +133,7 @@ func SetupTest(ctx context.Context) (bucketclientset.Interface, kubeclientset.In ) ctrl, err := controller.NewObjectStorageControllerWithClientset("controller-manager", "leader-lock", 40, rateLimit, kubeClient, client) if err != nil { - glog.Fatalf("Failed to create ObjectStorage Controller: %v", err) + klog.Fatalf("Failed to create ObjectStorage Controller: %v", err) } go ctrl.Run(ctx) @@ -153,7 +153,7 @@ func GetBuckets(ctx context.Context, client bucketclientset.Interface, numExpect if len(bucketList.Items) >= numExpected { return bucketList } else { - glog.Errorf("Failed to fetch the bucket created %v", err) + klog.Errorf("Failed to fetch the bucket created %v", err) } numtimes++ <-time.After(time.Duration(numtimes) * time.Second) @@ -239,7 +239,7 @@ func DeleteObjects(ctx context.Context, client bucketclientset.Interface, objs . DeleteObjects(ctx, client, a) } default: - glog.Errorf("Unknown Obj of type %v", t) + klog.Errorf("Unknown Obj of type %v", t) } } } @@ -318,7 +318,7 @@ func getCRDClient() (apiextensions.CustomResourceDefinitionInterface, error) { crdClientset, err := apiextensions.NewForConfig(config) if err != nil { - glog.Fatalf("could not initialize crd client: %v", err) + klog.Fatalf("could not initialize crd client: %v", err) return nil, err } return crdClientset.CustomResourceDefinitions(), err @@ -386,7 +386,7 @@ func RegisterCRDs(ctx context.Context, client apiextensions.CustomResourceDefini return &i }()) crdRaw := parser.CustomResourceDefinitions[groupKind] - glog.Infof("creating CRD: %v", groupKind) + klog.Infof("creating CRD: %v", groupKind) if crdRaw.ObjectMeta.Annotations == nil { crdRaw.ObjectMeta.Annotations = map[string]string{} } From 2869aa0c9914b21768eefc404680902dcda1b86a Mon Sep 17 00:00:00 2001 From: Tejas Parikh Date: Wed, 24 Mar 2021 15:06:02 -0400 Subject: [PATCH 155/242] added cloudbuiild.yaml --- Makefile | 5 ++++- cloudbuild.yaml | 9 +++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 cloudbuild.yaml diff --git a/Makefile b/Makefile index 6c19baab..5a49dfd1 100644 --- a/Makefile +++ b/Makefile @@ -20,9 +20,12 @@ release-tools/build.make: $(eval TMP := $(shell mktemp -d)) $(shell cd ${TMP} && git clone https://github.com/kubernetes-sigs/container-object-storage-interface-spec) $(shell cp -r ${TMP}/container-object-storage-interface-spec/release-tools ${CURDIR}/) - $(shell rm -rf ${TMP}) + $(shell rm -rf ${TMP}) ln -s release-tools/travis.yml travis.yml CMDS=controller-manager include release-tools/build.make + +IMAGE_NAME=quay.io/containerobjectstorage/objectstorage-controller +IMAGE_TAGS=canary diff --git a/cloudbuild.yaml b/cloudbuild.yaml new file mode 100644 index 00000000..87af11a6 --- /dev/null +++ b/cloudbuild.yaml @@ -0,0 +1,9 @@ +# See https://cloud.google.com/cloud-build/docs/build-config +timeout: 3000s +options: + substitution_option: ALLOW_LOOSE +steps: +- name: "gcr.io/k8s-testimages/gcb-docker-gcloud:v20200824-5d057db" + entrypoint: make + args: + - build From 308a696a7ec874c1ee4d89b517d3bcc14cda822f Mon Sep 17 00:00:00 2001 From: wlan0 Date: Wed, 17 Mar 2021 11:51:45 -0700 Subject: [PATCH 156/242] API updates - Use BucketID returned from ProvisionerCreateBucket as the handle for subsequent bucket related gRPC calls - Remove Name and Version from Protocol --- cosi.pb.go | 546 +++++++++++++++++++++++++---------------------------- cosi.proto | 71 +++---- spec.md | 82 ++++---- 3 files changed, 329 insertions(+), 370 deletions(-) diff --git a/cosi.pb.go b/cosi.pb.go index 9f23fcb7..5947cd58 100644 --- a/cosi.pb.go +++ b/cosi.pb.go @@ -410,10 +410,6 @@ type Protocol struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // ProtocolName is the name of the protocol - Name ProtocolName `protobuf:"varint,1,opt,name=name,proto3,enum=cosi.v1alpha1.ProtocolName" json:"name,omitempty"` - // version is the name of the protocol version - Version string `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"` // Types that are assignable to Type: // *Protocol_S3 // *Protocol_AzureBlob @@ -453,20 +449,6 @@ func (*Protocol) Descriptor() ([]byte, []int) { return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{3} } -func (x *Protocol) GetName() ProtocolName { - if x != nil { - return x.Name - } - return ProtocolName_UnknownProtocol -} - -func (x *Protocol) GetVersion() string { - if x != nil { - return x.Version - } - return "" -} - func (m *Protocol) GetType() isProtocol_Type { if m != nil { return m.Type @@ -500,15 +482,15 @@ type isProtocol_Type interface { } type Protocol_S3 struct { - S3 *S3Parameters `protobuf:"bytes,3,opt,name=s3,proto3,oneof"` + S3 *S3Parameters `protobuf:"bytes,1,opt,name=s3,proto3,oneof"` } type Protocol_AzureBlob struct { - AzureBlob *AzureBlobParameters `protobuf:"bytes,4,opt,name=azureBlob,proto3,oneof"` + AzureBlob *AzureBlobParameters `protobuf:"bytes,2,opt,name=azureBlob,proto3,oneof"` } type Protocol_Gcs struct { - Gcs *GCSParameters `protobuf:"bytes,5,opt,name=gcs,proto3,oneof"` + Gcs *GCSParameters `protobuf:"bytes,3,opt,name=gcs,proto3,oneof"` } func (*Protocol_S3) isProtocol_Type() {} @@ -615,16 +597,16 @@ type ProvisionerCreateBucketRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + // This field is REQUIRED + // name specifies the name of the bucket that should be created. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // This field is REQUIRED // Protocol specific information required by the call is passed in as key,value pairs. - Protocol *Protocol `protobuf:"bytes,1,opt,name=protocol,proto3" json:"protocol,omitempty"` + Protocol *Protocol `protobuf:"bytes,2,opt,name=protocol,proto3" json:"protocol,omitempty"` // This field is OPTIONAL // The caller should treat the values in parameters as opaque. // The receiver is responsible for parsing and validating the values. - Parameters map[string]string `protobuf:"bytes,2,rep,name=parameters,proto3" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - // This field is OPTIONAL - // Allow uncredentialed access to bucket. - AnonymousBucketAccessMode AnonymousBucketAccessMode `protobuf:"varint,3,opt,name=anonymous_bucket_access_mode,json=anonymousBucketAccessMode,proto3,enum=cosi.v1alpha1.AnonymousBucketAccessMode" json:"anonymous_bucket_access_mode,omitempty"` + Parameters map[string]string `protobuf:"bytes,3,rep,name=parameters,proto3" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *ProvisionerCreateBucketRequest) Reset() { @@ -659,6 +641,13 @@ func (*ProvisionerCreateBucketRequest) Descriptor() ([]byte, []int) { return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{6} } +func (x *ProvisionerCreateBucketRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + func (x *ProvisionerCreateBucketRequest) GetProtocol() *Protocol { if x != nil { return x.Protocol @@ -673,21 +662,14 @@ func (x *ProvisionerCreateBucketRequest) GetParameters() map[string]string { return nil } -func (x *ProvisionerCreateBucketRequest) GetAnonymousBucketAccessMode() AnonymousBucketAccessMode { - if x != nil { - return x.AnonymousBucketAccessMode - } - return AnonymousBucketAccessMode_UnknownBucketAccessMode -} - type ProvisionerCreateBucketResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // BucketName returned here is expected to be the globally unique + // bucketID returned here is expected to be the globally unique // identifier for the bucket in the object storage provider - BucketName string `protobuf:"bytes,1,opt,name=BucketName,proto3" json:"BucketName,omitempty"` + BucketID string `protobuf:"bytes,1,opt,name=bucketID,proto3" json:"bucketID,omitempty"` } func (x *ProvisionerCreateBucketResponse) Reset() { @@ -722,9 +704,9 @@ func (*ProvisionerCreateBucketResponse) Descriptor() ([]byte, []int) { return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{7} } -func (x *ProvisionerCreateBucketResponse) GetBucketName() string { +func (x *ProvisionerCreateBucketResponse) GetBucketID() string { if x != nil { - return x.BucketName + return x.BucketID } return "" } @@ -735,8 +717,9 @@ type ProvisionerDeleteBucketRequest struct { unknownFields protoimpl.UnknownFields // This field is REQUIRED - // Protocol specific information required by the call is passed in as key,value pairs. - Protocol *Protocol `protobuf:"bytes,1,opt,name=protocol,proto3" json:"protocol,omitempty"` + // bucketID is a globally unique identifier for the bucket + // in the object storage provider + BucketID string `protobuf:"bytes,1,opt,name=bucketID,proto3" json:"bucketID,omitempty"` } func (x *ProvisionerDeleteBucketRequest) Reset() { @@ -771,11 +754,11 @@ func (*ProvisionerDeleteBucketRequest) Descriptor() ([]byte, []int) { return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{8} } -func (x *ProvisionerDeleteBucketRequest) GetProtocol() *Protocol { +func (x *ProvisionerDeleteBucketRequest) GetBucketID() string { if x != nil { - return x.Protocol + return x.BucketID } - return nil + return "" } type ProvisionerDeleteBucketResponse struct { @@ -822,17 +805,21 @@ type ProvisionerGrantBucketAccessRequest struct { unknownFields protoimpl.UnknownFields // This field is REQUIRED - // Protocol specific information required by the call is passed in as key,value pairs. - Protocol *Protocol `protobuf:"bytes,1,opt,name=protocol,proto3" json:"protocol,omitempty"` - // This field is OPTIONAL - // Protocol specific information required by the call is passed in as key,value pairs. - Parameters map[string]string `protobuf:"bytes,2,rep,name=parameters,proto3" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - // This field is OPTIONAL - // Principal for which access is requested - Principal string `protobuf:"bytes,3,opt,name=principal,proto3" json:"principal,omitempty"` + // BucketID is a globally unique identifier for the bucket + // in the object storage provider + BucketID string `protobuf:"bytes,1,opt,name=bucketID,proto3" json:"bucketID,omitempty"` + // This field is REQUIRED + // accountName is a identifier for object storage provider + // to ensure that multiple requests for the same account + // result in only one access token being created + AccountName string `protobuf:"bytes,2,opt,name=accountName,proto3" json:"accountName,omitempty"` // This field is REQUIRED // Requested Access policy, ex: {"Effect":"Allow","Action":"s3:PutObject","Resource":"arn:aws:s3:::profilepics/*"} - AccessPolicy string `protobuf:"bytes,4,opt,name=access_policy,json=accessPolicy,proto3" json:"access_policy,omitempty"` + AccessPolicy string `protobuf:"bytes,3,opt,name=access_policy,json=accessPolicy,proto3" json:"access_policy,omitempty"` + // This field is OPTIONAL + // The caller should treat the values in parameters as opaque. + // The receiver is responsible for parsing and validating the values. + Parameters map[string]string `protobuf:"bytes,4,rep,name=parameters,proto3" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *ProvisionerGrantBucketAccessRequest) Reset() { @@ -867,32 +854,32 @@ func (*ProvisionerGrantBucketAccessRequest) Descriptor() ([]byte, []int) { return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{10} } -func (x *ProvisionerGrantBucketAccessRequest) GetProtocol() *Protocol { +func (x *ProvisionerGrantBucketAccessRequest) GetBucketID() string { if x != nil { - return x.Protocol + return x.BucketID } - return nil + return "" } -func (x *ProvisionerGrantBucketAccessRequest) GetParameters() map[string]string { +func (x *ProvisionerGrantBucketAccessRequest) GetAccountName() string { if x != nil { - return x.Parameters + return x.AccountName } - return nil + return "" } -func (x *ProvisionerGrantBucketAccessRequest) GetPrincipal() string { +func (x *ProvisionerGrantBucketAccessRequest) GetAccessPolicy() string { if x != nil { - return x.Principal + return x.AccessPolicy } return "" } -func (x *ProvisionerGrantBucketAccessRequest) GetAccessPolicy() string { +func (x *ProvisionerGrantBucketAccessRequest) GetParameters() map[string]string { if x != nil { - return x.AccessPolicy + return x.Parameters } - return "" + return nil } type ProvisionerGrantBucketAccessResponse struct { @@ -901,9 +888,9 @@ type ProvisionerGrantBucketAccessResponse struct { unknownFields protoimpl.UnknownFields // This field is OPTIONAL - // This is the account that is being provided access. This will + // This is the accountID that is being provided access. This will // be required later to revoke access. - Principal string `protobuf:"bytes,1,opt,name=principal,proto3" json:"principal,omitempty"` + AccountID string `protobuf:"bytes,1,opt,name=accountID,proto3" json:"accountID,omitempty"` // This field is OPTIONAL // Contents of the credential file, ex: aws access key id and secret, etc. CredentialsFileContents string `protobuf:"bytes,2,opt,name=credentials_file_contents,json=credentialsFileContents,proto3" json:"credentials_file_contents,omitempty"` @@ -944,9 +931,9 @@ func (*ProvisionerGrantBucketAccessResponse) Descriptor() ([]byte, []int) { return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{11} } -func (x *ProvisionerGrantBucketAccessResponse) GetPrincipal() string { +func (x *ProvisionerGrantBucketAccessResponse) GetAccountID() string { if x != nil { - return x.Principal + return x.AccountID } return "" } @@ -971,11 +958,12 @@ type ProvisionerRevokeBucketAccessRequest struct { unknownFields protoimpl.UnknownFields // This field is REQUIRED - // Protocol specific information required by the call is passed in as key,value pairs. - Protocol *Protocol `protobuf:"bytes,1,opt,name=protocol,proto3" json:"protocol,omitempty"` + // BucketName is a globally unique identifier for the bucket + // in the object storage provider. + BucketID string `protobuf:"bytes,1,opt,name=bucketID,proto3" json:"bucketID,omitempty"` // This field is REQUIRED - // This is the account that is being revoked access. - Principal string `protobuf:"bytes,2,opt,name=principal,proto3" json:"principal,omitempty"` + // This is the accountID that is having its access revoked. + AccountID string `protobuf:"bytes,2,opt,name=accountID,proto3" json:"accountID,omitempty"` } func (x *ProvisionerRevokeBucketAccessRequest) Reset() { @@ -1010,16 +998,16 @@ func (*ProvisionerRevokeBucketAccessRequest) Descriptor() ([]byte, []int) { return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{12} } -func (x *ProvisionerRevokeBucketAccessRequest) GetProtocol() *Protocol { +func (x *ProvisionerRevokeBucketAccessRequest) GetBucketID() string { if x != nil { - return x.Protocol + return x.BucketID } - return nil + return "" } -func (x *ProvisionerRevokeBucketAccessRequest) GetPrincipal() string { +func (x *ProvisionerRevokeBucketAccessRequest) GetAccountID() string { if x != nil { - return x.Principal + return x.AccountID } return "" } @@ -1224,195 +1212,180 @@ var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDesc 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x22, 0x82, 0x02, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x12, 0x2f, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, - 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x02, 0x73, - 0x33, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x33, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, - 0x74, 0x65, 0x72, 0x73, 0x48, 0x00, 0x52, 0x02, 0x73, 0x33, 0x12, 0x42, 0x0a, 0x09, 0x61, 0x7a, - 0x75, 0x72, 0x65, 0x42, 0x6c, 0x6f, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, - 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x7a, - 0x75, 0x72, 0x65, 0x42, 0x6c, 0x6f, 0x62, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, - 0x73, 0x48, 0x00, 0x52, 0x09, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x42, 0x6c, 0x6f, 0x62, 0x12, 0x30, - 0x0a, 0x03, 0x67, 0x63, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6f, - 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x43, 0x53, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x48, 0x00, 0x52, 0x03, 0x67, 0x63, 0x73, - 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x1b, 0x0a, 0x19, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x30, 0x0a, 0x1a, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xde, 0x02, 0x0a, 0x1e, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, - 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x33, 0x0a, 0x08, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, + 0x75, 0x6e, 0x74, 0x22, 0xb7, 0x01, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, + 0x12, 0x2d, 0x0a, 0x02, 0x73, 0x33, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, + 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x33, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x48, 0x00, 0x52, 0x02, 0x73, 0x33, 0x12, + 0x42, 0x0a, 0x09, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x42, 0x6c, 0x6f, 0x62, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x42, 0x6c, 0x6f, 0x62, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x48, 0x00, 0x52, 0x09, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x42, + 0x6c, 0x6f, 0x62, 0x12, 0x30, 0x0a, 0x03, 0x67, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x47, 0x43, 0x53, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x48, 0x00, + 0x52, 0x03, 0x67, 0x63, 0x73, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x1b, 0x0a, + 0x19, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x30, 0x0a, 0x1a, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x87, 0x02, 0x0a, + 0x1e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x5d, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, - 0x5d, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x69, - 0x0a, 0x1c, 0x61, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x6f, 0x75, 0x73, 0x5f, 0x62, 0x75, 0x63, 0x6b, - 0x65, 0x74, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x6f, 0x75, 0x73, 0x42, 0x75, - 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x19, - 0x61, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x6f, 0x75, 0x73, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x41, 0x0a, 0x1f, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, - 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x42, - 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x55, 0x0a, 0x1e, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x33, 0x0a, - 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x22, 0x21, 0x0a, 0x1f, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, - 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc0, 0x02, 0x0a, 0x23, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, - 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x33, 0x0a, - 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x12, 0x62, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, - 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, - 0x70, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x63, - 0x69, 0x70, 0x61, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x70, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb4, 0x01, 0x0a, 0x24, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, - 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x12, - 0x3a, 0x0a, 0x19, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x5f, 0x66, - 0x69, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x17, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x46, - 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x63, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, + 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3d, 0x0a, 0x1f, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x75, 0x63, + 0x6b, 0x65, 0x74, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x75, 0x63, + 0x6b, 0x65, 0x74, 0x49, 0x44, 0x22, 0x3c, 0x0a, 0x1e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x49, 0x44, 0x22, 0x21, 0x0a, 0x1f, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xab, 0x02, 0x0a, 0x23, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, + 0x0a, 0x08, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x12, 0x62, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, + 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb4, 0x01, 0x0a, 0x24, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, + 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x44, 0x12, 0x3a, 0x0a, 0x19, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, - 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x63, 0x72, 0x65, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x22, - 0x79, 0x0a, 0x24, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, - 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x33, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x73, 0x69, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x1c, 0x0a, 0x09, - 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x22, 0x27, 0x0a, 0x25, 0x50, 0x72, - 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, - 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x2a, 0x3f, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x13, 0x0a, 0x0f, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x53, 0x33, 0x10, 0x01, - 0x12, 0x09, 0x0a, 0x05, 0x41, 0x5a, 0x55, 0x52, 0x45, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x47, - 0x43, 0x53, 0x10, 0x03, 0x2a, 0x3e, 0x0a, 0x12, 0x53, 0x33, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x10, 0x55, 0x6e, - 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x10, 0x00, - 0x12, 0x08, 0x0a, 0x04, 0x53, 0x33, 0x56, 0x32, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x33, - 0x56, 0x34, 0x10, 0x02, 0x2a, 0x71, 0x0a, 0x19, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x6f, 0x75, - 0x73, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, - 0x65, 0x12, 0x1b, 0x0a, 0x17, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x42, 0x75, 0x63, 0x6b, - 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x10, 0x00, 0x12, 0x0b, - 0x0a, 0x07, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x52, - 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x72, 0x69, - 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, - 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x04, 0x32, 0x77, 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x74, 0x79, 0x12, 0x6b, 0x0a, 0x12, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x28, 0x2e, 0x63, 0x6f, 0x73, 0x69, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, - 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x32, 0x9c, 0x04, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, - 0x12, 0x7a, 0x0a, 0x17, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x2d, 0x2e, 0x63, 0x6f, - 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, - 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x63, 0x6f, 0x73, - 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, - 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7a, 0x0a, 0x17, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x2d, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, + 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x63, 0x72, 0x65, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x22, 0x60, 0x0a, 0x24, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, + 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x44, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x44, 0x12, + 0x1c, 0x0a, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x44, 0x22, 0x27, 0x0a, + 0x25, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, + 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x3f, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x13, 0x0a, 0x0f, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, + 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x53, + 0x33, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x5a, 0x55, 0x52, 0x45, 0x10, 0x02, 0x12, 0x07, + 0x0a, 0x03, 0x47, 0x43, 0x53, 0x10, 0x03, 0x2a, 0x3e, 0x0a, 0x12, 0x53, 0x33, 0x53, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, + 0x10, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x33, 0x56, 0x32, 0x10, 0x01, 0x12, 0x08, 0x0a, + 0x04, 0x53, 0x33, 0x56, 0x34, 0x10, 0x02, 0x2a, 0x71, 0x0a, 0x19, 0x41, 0x6e, 0x6f, 0x6e, 0x79, + 0x6d, 0x6f, 0x75, 0x73, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x0a, 0x17, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x42, + 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x10, + 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x10, 0x01, 0x12, 0x0c, + 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x52, + 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x04, 0x32, 0x77, 0x0a, 0x08, 0x49, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x6b, 0x0a, 0x12, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x28, 0x2e, 0x63, + 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x87, 0x01, 0x0a, 0x1c, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, - 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x32, 0x2e, 0x63, 0x6f, 0x73, 0x69, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, - 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, + 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x32, 0x9c, 0x04, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x65, 0x72, 0x12, 0x7a, 0x0a, 0x17, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x2d, + 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, - 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, - 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x8a, 0x01, 0x0a, 0x1d, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x12, 0x33, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, - 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x63, 0x6f, 0x73, 0x69, + 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, + 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x7a, 0x0a, 0x17, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x2d, 0x2e, 0x63, 0x6f, 0x73, + 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, + 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x87, 0x01, 0x0a, 0x1c, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, + 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x32, 0x2e, 0x63, + 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, + 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x33, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, + 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8a, 0x01, 0x0a, 0x1d, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, - 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3a, - 0x3c, 0x0a, 0x0a, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x1c, 0x2e, + 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x33, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x63, + 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, + 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x3a, 0x3c, 0x0a, 0x0a, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x65, 0x6e, 0x75, 0x6d, + 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, + 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x45, 0x6e, 0x75, 0x6d, + 0x3a, 0x4c, 0x0a, 0x10, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x3f, + 0x0a, 0x0b, 0x63, 0x6f, 0x73, 0x69, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x09, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x45, 0x6e, 0x75, 0x6d, 0x3a, 0x4c, 0x0a, - 0x10, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x12, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x3f, 0x0a, 0x0b, 0x63, - 0x6f, 0x73, 0x69, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, - 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x08, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0a, 0x63, 0x6f, 0x73, 0x69, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x3a, 0x3f, 0x0a, 0x0b, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, - 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0a, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x3a, 0x45, 0x0a, - 0x0d, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, + 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x08, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0a, 0x63, 0x6f, 0x73, 0x69, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x3a, + 0x3f, 0x0a, 0x0b, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x3a, 0x42, 0x0a, 0x0c, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x6d, 0x65, - 0x74, 0x68, 0x6f, 0x64, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3a, 0x45, 0x0a, 0x0d, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, - 0x3a, 0x5a, 0x38, 0x73, 0x69, 0x67, 0x73, 0x2e, 0x6b, 0x38, 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2d, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2d, - 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, - 0x65, 0x2d, 0x73, 0x70, 0x65, 0x63, 0x3b, 0x63, 0x6f, 0x73, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x46, 0x69, 0x65, 0x6c, 0x64, + 0x3a, 0x45, 0x0a, 0x0d, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x42, 0x0a, 0x0c, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3a, 0x45, 0x0a, 0x0d, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x42, 0x3a, 0x5a, 0x38, 0x73, 0x69, 0x67, 0x73, 0x2e, 0x6b, 0x38, 0x73, 0x2e, 0x69, + 0x6f, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2d, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x2d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x66, 0x61, 0x63, 0x65, 0x2d, 0x73, 0x70, 0x65, 0x63, 0x3b, 0x63, 0x6f, 0x73, 0x69, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1458,39 +1431,34 @@ var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_goTypes } var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_depIdxs = []int32{ 1, // 0: cosi.v1alpha1.S3Parameters.signature_version:type_name -> cosi.v1alpha1.S3SignatureVersion - 0, // 1: cosi.v1alpha1.Protocol.name:type_name -> cosi.v1alpha1.ProtocolName - 3, // 2: cosi.v1alpha1.Protocol.s3:type_name -> cosi.v1alpha1.S3Parameters - 4, // 3: cosi.v1alpha1.Protocol.azureBlob:type_name -> cosi.v1alpha1.AzureBlobParameters - 5, // 4: cosi.v1alpha1.Protocol.gcs:type_name -> cosi.v1alpha1.GCSParameters - 6, // 5: cosi.v1alpha1.ProvisionerCreateBucketRequest.protocol:type_name -> cosi.v1alpha1.Protocol - 17, // 6: cosi.v1alpha1.ProvisionerCreateBucketRequest.parameters:type_name -> cosi.v1alpha1.ProvisionerCreateBucketRequest.ParametersEntry - 2, // 7: cosi.v1alpha1.ProvisionerCreateBucketRequest.anonymous_bucket_access_mode:type_name -> cosi.v1alpha1.AnonymousBucketAccessMode - 6, // 8: cosi.v1alpha1.ProvisionerDeleteBucketRequest.protocol:type_name -> cosi.v1alpha1.Protocol - 6, // 9: cosi.v1alpha1.ProvisionerGrantBucketAccessRequest.protocol:type_name -> cosi.v1alpha1.Protocol - 18, // 10: cosi.v1alpha1.ProvisionerGrantBucketAccessRequest.parameters:type_name -> cosi.v1alpha1.ProvisionerGrantBucketAccessRequest.ParametersEntry - 6, // 11: cosi.v1alpha1.ProvisionerRevokeBucketAccessRequest.protocol:type_name -> cosi.v1alpha1.Protocol - 19, // 12: cosi.v1alpha1.alpha_enum:extendee -> google.protobuf.EnumOptions - 20, // 13: cosi.v1alpha1.alpha_enum_value:extendee -> google.protobuf.EnumValueOptions - 21, // 14: cosi.v1alpha1.cosi_secret:extendee -> google.protobuf.FieldOptions - 21, // 15: cosi.v1alpha1.alpha_field:extendee -> google.protobuf.FieldOptions - 22, // 16: cosi.v1alpha1.alpha_message:extendee -> google.protobuf.MessageOptions - 23, // 17: cosi.v1alpha1.alpha_method:extendee -> google.protobuf.MethodOptions - 24, // 18: cosi.v1alpha1.alpha_service:extendee -> google.protobuf.ServiceOptions - 7, // 19: cosi.v1alpha1.Identity.ProvisionerGetInfo:input_type -> cosi.v1alpha1.ProvisionerGetInfoRequest - 9, // 20: cosi.v1alpha1.Provisioner.ProvisionerCreateBucket:input_type -> cosi.v1alpha1.ProvisionerCreateBucketRequest - 11, // 21: cosi.v1alpha1.Provisioner.ProvisionerDeleteBucket:input_type -> cosi.v1alpha1.ProvisionerDeleteBucketRequest - 13, // 22: cosi.v1alpha1.Provisioner.ProvisionerGrantBucketAccess:input_type -> cosi.v1alpha1.ProvisionerGrantBucketAccessRequest - 15, // 23: cosi.v1alpha1.Provisioner.ProvisionerRevokeBucketAccess:input_type -> cosi.v1alpha1.ProvisionerRevokeBucketAccessRequest - 8, // 24: cosi.v1alpha1.Identity.ProvisionerGetInfo:output_type -> cosi.v1alpha1.ProvisionerGetInfoResponse - 10, // 25: cosi.v1alpha1.Provisioner.ProvisionerCreateBucket:output_type -> cosi.v1alpha1.ProvisionerCreateBucketResponse - 12, // 26: cosi.v1alpha1.Provisioner.ProvisionerDeleteBucket:output_type -> cosi.v1alpha1.ProvisionerDeleteBucketResponse - 14, // 27: cosi.v1alpha1.Provisioner.ProvisionerGrantBucketAccess:output_type -> cosi.v1alpha1.ProvisionerGrantBucketAccessResponse - 16, // 28: cosi.v1alpha1.Provisioner.ProvisionerRevokeBucketAccess:output_type -> cosi.v1alpha1.ProvisionerRevokeBucketAccessResponse - 24, // [24:29] is the sub-list for method output_type - 19, // [19:24] is the sub-list for method input_type - 19, // [19:19] is the sub-list for extension type_name - 12, // [12:19] is the sub-list for extension extendee - 0, // [0:12] is the sub-list for field type_name + 3, // 1: cosi.v1alpha1.Protocol.s3:type_name -> cosi.v1alpha1.S3Parameters + 4, // 2: cosi.v1alpha1.Protocol.azureBlob:type_name -> cosi.v1alpha1.AzureBlobParameters + 5, // 3: cosi.v1alpha1.Protocol.gcs:type_name -> cosi.v1alpha1.GCSParameters + 6, // 4: cosi.v1alpha1.ProvisionerCreateBucketRequest.protocol:type_name -> cosi.v1alpha1.Protocol + 17, // 5: cosi.v1alpha1.ProvisionerCreateBucketRequest.parameters:type_name -> cosi.v1alpha1.ProvisionerCreateBucketRequest.ParametersEntry + 18, // 6: cosi.v1alpha1.ProvisionerGrantBucketAccessRequest.parameters:type_name -> cosi.v1alpha1.ProvisionerGrantBucketAccessRequest.ParametersEntry + 19, // 7: cosi.v1alpha1.alpha_enum:extendee -> google.protobuf.EnumOptions + 20, // 8: cosi.v1alpha1.alpha_enum_value:extendee -> google.protobuf.EnumValueOptions + 21, // 9: cosi.v1alpha1.cosi_secret:extendee -> google.protobuf.FieldOptions + 21, // 10: cosi.v1alpha1.alpha_field:extendee -> google.protobuf.FieldOptions + 22, // 11: cosi.v1alpha1.alpha_message:extendee -> google.protobuf.MessageOptions + 23, // 12: cosi.v1alpha1.alpha_method:extendee -> google.protobuf.MethodOptions + 24, // 13: cosi.v1alpha1.alpha_service:extendee -> google.protobuf.ServiceOptions + 7, // 14: cosi.v1alpha1.Identity.ProvisionerGetInfo:input_type -> cosi.v1alpha1.ProvisionerGetInfoRequest + 9, // 15: cosi.v1alpha1.Provisioner.ProvisionerCreateBucket:input_type -> cosi.v1alpha1.ProvisionerCreateBucketRequest + 11, // 16: cosi.v1alpha1.Provisioner.ProvisionerDeleteBucket:input_type -> cosi.v1alpha1.ProvisionerDeleteBucketRequest + 13, // 17: cosi.v1alpha1.Provisioner.ProvisionerGrantBucketAccess:input_type -> cosi.v1alpha1.ProvisionerGrantBucketAccessRequest + 15, // 18: cosi.v1alpha1.Provisioner.ProvisionerRevokeBucketAccess:input_type -> cosi.v1alpha1.ProvisionerRevokeBucketAccessRequest + 8, // 19: cosi.v1alpha1.Identity.ProvisionerGetInfo:output_type -> cosi.v1alpha1.ProvisionerGetInfoResponse + 10, // 20: cosi.v1alpha1.Provisioner.ProvisionerCreateBucket:output_type -> cosi.v1alpha1.ProvisionerCreateBucketResponse + 12, // 21: cosi.v1alpha1.Provisioner.ProvisionerDeleteBucket:output_type -> cosi.v1alpha1.ProvisionerDeleteBucketResponse + 14, // 22: cosi.v1alpha1.Provisioner.ProvisionerGrantBucketAccess:output_type -> cosi.v1alpha1.ProvisionerGrantBucketAccessResponse + 16, // 23: cosi.v1alpha1.Provisioner.ProvisionerRevokeBucketAccess:output_type -> cosi.v1alpha1.ProvisionerRevokeBucketAccessResponse + 19, // [19:24] is the sub-list for method output_type + 14, // [14:19] is the sub-list for method input_type + 14, // [14:14] is the sub-list for extension type_name + 7, // [7:14] is the sub-list for extension extendee + 0, // [0:7] is the sub-list for field type_name } func init() { file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_init() } diff --git a/cosi.proto b/cosi.proto index f604bc0e..67233cf3 100644 --- a/cosi.proto +++ b/cosi.proto @@ -138,15 +138,10 @@ message GCSParameters { } message Protocol { - // ProtocolName is the name of the protocol - ProtocolName name = 1; - // version is the name of the protocol version - string version = 2; - oneof type { - S3Parameters s3 = 3; - AzureBlobParameters azureBlob = 4; - GCSParameters gcs = 5; + S3Parameters s3 = 1; + AzureBlobParameters azureBlob = 2; + GCSParameters gcs = 3; } } @@ -168,29 +163,30 @@ message ProvisionerGetInfoResponse { message ProvisionerCreateBucketRequest { // This field is REQUIRED + // name specifies the name of the bucket that should be created. + string name = 1; + + // This field is REQUIRED // Protocol specific information required by the call is passed in as key,value pairs. - Protocol protocol = 1; + Protocol protocol = 2; // This field is OPTIONAL // The caller should treat the values in parameters as opaque. // The receiver is responsible for parsing and validating the values. - map parameters = 2; - - // This field is OPTIONAL - // Allow uncredentialed access to bucket. - AnonymousBucketAccessMode anonymous_bucket_access_mode = 3; + map parameters = 3; } message ProvisionerCreateBucketResponse { - // BucketName returned here is expected to be the globally unique + // bucketID returned here is expected to be the globally unique // identifier for the bucket in the object storage provider - string BucketName = 1; + string bucketID = 1; } message ProvisionerDeleteBucketRequest { - // This field is REQUIRED - // Protocol specific information required by the call is passed in as key,value pairs. - Protocol protocol = 1; + // This field is REQUIRED + // bucketID is a globally unique identifier for the bucket + // in the object storage provider + string bucketID = 1; } message ProvisionerDeleteBucketResponse { @@ -199,27 +195,31 @@ message ProvisionerDeleteBucketResponse { message ProvisionerGrantBucketAccessRequest { // This field is REQUIRED - // Protocol specific information required by the call is passed in as key,value pairs. - Protocol protocol = 1; + // BucketID is a globally unique identifier for the bucket + // in the object storage provider + string bucketID = 1; - // This field is OPTIONAL - // Protocol specific information required by the call is passed in as key,value pairs. - map parameters = 2; - - // This field is OPTIONAL - // Principal for which access is requested - string principal = 3; + // This field is REQUIRED + // accountName is a identifier for object storage provider + // to ensure that multiple requests for the same account + // result in only one access token being created + string accountName = 2; // This field is REQUIRED // Requested Access policy, ex: {"Effect":"Allow","Action":"s3:PutObject","Resource":"arn:aws:s3:::profilepics/*"} - string access_policy = 4; + string access_policy = 3; + + // This field is OPTIONAL + // The caller should treat the values in parameters as opaque. + // The receiver is responsible for parsing and validating the values. + map parameters = 4; } message ProvisionerGrantBucketAccessResponse { // This field is OPTIONAL - // This is the account that is being provided access. This will + // This is the accountID that is being provided access. This will // be required later to revoke access. - string principal = 1; + string accountID = 1; // This field is OPTIONAL // Contents of the credential file, ex: aws access key id and secret, etc. @@ -232,12 +232,13 @@ message ProvisionerGrantBucketAccessResponse { message ProvisionerRevokeBucketAccessRequest { // This field is REQUIRED - // Protocol specific information required by the call is passed in as key,value pairs. - Protocol protocol = 1; + // BucketName is a globally unique identifier for the bucket + // in the object storage provider. + string bucketID = 1; // This field is REQUIRED - // This is the account that is being revoked access. - string principal = 2; + // This is the accountID that is having its access revoked. + string accountID = 2; } message ProvisionerRevokeBucketAccessResponse { diff --git a/spec.md b/spec.md index 7a8750d5..f46f413a 100644 --- a/spec.md +++ b/spec.md @@ -266,15 +266,10 @@ message GCSParameters { } message Protocol { - // ProtocolName is the name of the protocol - ProtocolName name = 1; - // version is the name of the protocol version - string version = 2; - oneof type { - S3Parameters s3 = 3; - AzureBlobParameters azureBlob = 4; - GCSParameters gcs = 5; + S3Parameters s3 = 1; + AzureBlobParameters azureBlob = 2; + GCSParameters gcs = 3; } } @@ -296,29 +291,30 @@ message ProvisionerGetInfoResponse { message ProvisionerCreateBucketRequest { // This field is REQUIRED + // name specifies the name of the bucket that should be created. + string name = 1; + + // This field is REQUIRED // Protocol specific information required by the call is passed in as key,value pairs. - Protocol protocol = 1; + Protocol protocol = 2; // This field is OPTIONAL // The caller should treat the values in parameters as opaque. // The receiver is responsible for parsing and validating the values. - map parameters = 2; - - // This field is OPTIONAL - // Allow uncredentialed access to bucket. - AnonymousBucketAccessMode anonymous_bucket_access_mode = 3; + map parameters = 3; } message ProvisionerCreateBucketResponse { - // BucketName returned here is expected to be the globally unique + // bucketID returned here is expected to be the globally unique // identifier for the bucket in the object storage provider - string BucketName = 1; + string bucketID = 1; } message ProvisionerDeleteBucketRequest { - // This field is REQUIRED - // Protocol specific information required by the call is passed in as key,value pairs. - Protocol protocol = 1; + // This field is REQUIRED + // bucketID is a globally unique identifier for the bucket + // in the object storage provider + string bucketID = 1; } message ProvisionerDeleteBucketResponse { @@ -327,27 +323,31 @@ message ProvisionerDeleteBucketResponse { message ProvisionerGrantBucketAccessRequest { // This field is REQUIRED - // Protocol specific information required by the call is passed in as key,value pairs. - Protocol protocol = 1; + // BucketID is a globally unique identifier for the bucket + // in the object storage provider + string bucketID = 1; - // This field is OPTIONAL - // Protocol specific information required by the call is passed in as key,value pairs. - map parameters = 2; - - // This field is OPTIONAL - // Principal for which access is requested - string principal = 3; + // This field is REQUIRED + // accountName is a identifier for object storage provider + // to ensure that multiple requests for the same account + // result in only one access token being created + string accountName = 2; // This field is REQUIRED // Requested Access policy, ex: {"Effect":"Allow","Action":"s3:PutObject","Resource":"arn:aws:s3:::profilepics/*"} - string access_policy = 4; + string access_policy = 3; + + // This field is OPTIONAL + // The caller should treat the values in parameters as opaque. + // The receiver is responsible for parsing and validating the values. + map parameters = 4; } message ProvisionerGrantBucketAccessResponse { // This field is OPTIONAL - // This is the account that is being provided access. This will + // This is the accountID that is being provided access. This will // be required later to revoke access. - string principal = 1; + string accountID = 1; // This field is OPTIONAL // Contents of the credential file, ex: aws access key id and secret, etc. @@ -360,12 +360,13 @@ message ProvisionerGrantBucketAccessResponse { message ProvisionerRevokeBucketAccessRequest { // This field is REQUIRED - // Protocol specific information required by the call is passed in as key,value pairs. - Protocol protocol = 1; + // BucketName is a globally unique identifier for the bucket + // in the object storage provider. + string bucketID = 1; // This field is REQUIRED - // This is the account that is being revoked access. - string principal = 2; + // This is the accountID that is having its access revoked. + string accountID = 2; } message ProvisionerRevokeBucketAccessResponse { @@ -481,17 +482,6 @@ message ProvisionerCreateBucketRequest { // This field is OPTIONAL // Protocol specific information required by the call is passed in as key,value pairs. map bucket_context = 2; - - enum AnonymousBucketAccessMode { - BUCKET_PRIVATE = 0; - BUCKET_READ_ONLY = 1; - BUCKET_WRITE_ONLY = 2; - BUCKET_READ_WRITE = 3; - } - - // This field is OPTIONAL - // Allow uncredentialed access to bucket. - AnonymousBucketAccessMode anonymous_bucket_access_mode = 3; } message ProvisionerCreateBucketResponse { From d3132c2ad8cb58672f4c5b04c2f9e999ca4d7d18 Mon Sep 17 00:00:00 2001 From: wlan0 Date: Mon, 29 Mar 2021 15:38:16 -0700 Subject: [PATCH 157/242] Protocol Parameters without suffix and naming convention --- cosi.pb.go | 694 ++++++++++++++++++++++-------------------------- cosi.pb.json.go | 12 +- cosi.proto | 68 ++--- spec.md | 68 ++--- 4 files changed, 379 insertions(+), 463 deletions(-) diff --git a/cosi.pb.go b/cosi.pb.go index 5947cd58..8e162e55 100644 --- a/cosi.pb.go +++ b/cosi.pb.go @@ -32,61 +32,6 @@ const ( // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 -type ProtocolName int32 - -const ( - ProtocolName_UnknownProtocol ProtocolName = 0 - // S3, AWS S3 protocol - ProtocolName_S3 ProtocolName = 1 - // AZURE, Microsoft Azure protocol - ProtocolName_AZURE ProtocolName = 2 - // GCS, Google GCS protocol - ProtocolName_GCS ProtocolName = 3 -) - -// Enum value maps for ProtocolName. -var ( - ProtocolName_name = map[int32]string{ - 0: "UnknownProtocol", - 1: "S3", - 2: "AZURE", - 3: "GCS", - } - ProtocolName_value = map[string]int32{ - "UnknownProtocol": 0, - "S3": 1, - "AZURE": 2, - "GCS": 3, - } -) - -func (x ProtocolName) Enum() *ProtocolName { - p := new(ProtocolName) - *p = x - return p -} - -func (x ProtocolName) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (ProtocolName) Descriptor() protoreflect.EnumDescriptor { - return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_enumTypes[0].Descriptor() -} - -func (ProtocolName) Type() protoreflect.EnumType { - return &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_enumTypes[0] -} - -func (x ProtocolName) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use ProtocolName.Descriptor instead. -func (ProtocolName) EnumDescriptor() ([]byte, []int) { - return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{0} -} - // S3SignatureVersion is the version of the signing algorithm for all s3 requests type S3SignatureVersion int32 @@ -123,11 +68,11 @@ func (x S3SignatureVersion) String() string { } func (S3SignatureVersion) Descriptor() protoreflect.EnumDescriptor { - return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_enumTypes[1].Descriptor() + return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_enumTypes[0].Descriptor() } func (S3SignatureVersion) Type() protoreflect.EnumType { - return &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_enumTypes[1] + return &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_enumTypes[0] } func (x S3SignatureVersion) Number() protoreflect.EnumNumber { @@ -136,7 +81,7 @@ func (x S3SignatureVersion) Number() protoreflect.EnumNumber { // Deprecated: Use S3SignatureVersion.Descriptor instead. func (S3SignatureVersion) EnumDescriptor() ([]byte, []int) { - return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{1} + return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{0} } type AnonymousBucketAccessMode int32 @@ -182,11 +127,11 @@ func (x AnonymousBucketAccessMode) String() string { } func (AnonymousBucketAccessMode) Descriptor() protoreflect.EnumDescriptor { - return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_enumTypes[2].Descriptor() + return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_enumTypes[1].Descriptor() } func (AnonymousBucketAccessMode) Type() protoreflect.EnumType { - return &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_enumTypes[2] + return &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_enumTypes[1] } func (x AnonymousBucketAccessMode) Number() protoreflect.EnumNumber { @@ -195,10 +140,10 @@ func (x AnonymousBucketAccessMode) Number() protoreflect.EnumNumber { // Deprecated: Use AnonymousBucketAccessMode.Descriptor instead. func (AnonymousBucketAccessMode) EnumDescriptor() ([]byte, []int) { - return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{2} + return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{1} } -type S3Parameters struct { +type S3 struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -213,8 +158,8 @@ type S3Parameters struct { SignatureVersion S3SignatureVersion `protobuf:"varint,4,opt,name=signature_version,json=signatureVersion,proto3,enum=cosi.v1alpha1.S3SignatureVersion" json:"signature_version,omitempty"` } -func (x *S3Parameters) Reset() { - *x = S3Parameters{} +func (x *S3) Reset() { + *x = S3{} if protoimpl.UnsafeEnabled { mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -222,13 +167,13 @@ func (x *S3Parameters) Reset() { } } -func (x *S3Parameters) String() string { +func (x *S3) String() string { return protoimpl.X.MessageStringOf(x) } -func (*S3Parameters) ProtoMessage() {} +func (*S3) ProtoMessage() {} -func (x *S3Parameters) ProtoReflect() protoreflect.Message { +func (x *S3) ProtoReflect() protoreflect.Message { mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -240,40 +185,40 @@ func (x *S3Parameters) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use S3Parameters.ProtoReflect.Descriptor instead. -func (*S3Parameters) Descriptor() ([]byte, []int) { +// Deprecated: Use S3.ProtoReflect.Descriptor instead. +func (*S3) Descriptor() ([]byte, []int) { return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{0} } -func (x *S3Parameters) GetEndpoint() string { +func (x *S3) GetEndpoint() string { if x != nil { return x.Endpoint } return "" } -func (x *S3Parameters) GetBucketName() string { +func (x *S3) GetBucketName() string { if x != nil { return x.BucketName } return "" } -func (x *S3Parameters) GetRegion() string { +func (x *S3) GetRegion() string { if x != nil { return x.Region } return "" } -func (x *S3Parameters) GetSignatureVersion() S3SignatureVersion { +func (x *S3) GetSignatureVersion() S3SignatureVersion { if x != nil { return x.SignatureVersion } return S3SignatureVersion_UnknownSignature } -type AzureBlobParameters struct { +type AzureBlob struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -284,8 +229,8 @@ type AzureBlobParameters struct { StorageAccount string `protobuf:"bytes,2,opt,name=storage_account,json=storageAccount,proto3" json:"storage_account,omitempty"` } -func (x *AzureBlobParameters) Reset() { - *x = AzureBlobParameters{} +func (x *AzureBlob) Reset() { + *x = AzureBlob{} if protoimpl.UnsafeEnabled { mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -293,13 +238,13 @@ func (x *AzureBlobParameters) Reset() { } } -func (x *AzureBlobParameters) String() string { +func (x *AzureBlob) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AzureBlobParameters) ProtoMessage() {} +func (*AzureBlob) ProtoMessage() {} -func (x *AzureBlobParameters) ProtoReflect() protoreflect.Message { +func (x *AzureBlob) ProtoReflect() protoreflect.Message { mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -311,26 +256,26 @@ func (x *AzureBlobParameters) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use AzureBlobParameters.ProtoReflect.Descriptor instead. -func (*AzureBlobParameters) Descriptor() ([]byte, []int) { +// Deprecated: Use AzureBlob.ProtoReflect.Descriptor instead. +func (*AzureBlob) Descriptor() ([]byte, []int) { return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{1} } -func (x *AzureBlobParameters) GetContainerName() string { +func (x *AzureBlob) GetContainerName() string { if x != nil { return x.ContainerName } return "" } -func (x *AzureBlobParameters) GetStorageAccount() string { +func (x *AzureBlob) GetStorageAccount() string { if x != nil { return x.StorageAccount } return "" } -type GCSParameters struct { +type GCS struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -345,8 +290,8 @@ type GCSParameters struct { ServiceAccount string `protobuf:"bytes,4,opt,name=service_account,json=serviceAccount,proto3" json:"service_account,omitempty"` } -func (x *GCSParameters) Reset() { - *x = GCSParameters{} +func (x *GCS) Reset() { + *x = GCS{} if protoimpl.UnsafeEnabled { mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -354,13 +299,13 @@ func (x *GCSParameters) Reset() { } } -func (x *GCSParameters) String() string { +func (x *GCS) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GCSParameters) ProtoMessage() {} +func (*GCS) ProtoMessage() {} -func (x *GCSParameters) ProtoReflect() protoreflect.Message { +func (x *GCS) ProtoReflect() protoreflect.Message { mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -372,33 +317,33 @@ func (x *GCSParameters) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GCSParameters.ProtoReflect.Descriptor instead. -func (*GCSParameters) Descriptor() ([]byte, []int) { +// Deprecated: Use GCS.ProtoReflect.Descriptor instead. +func (*GCS) Descriptor() ([]byte, []int) { return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{2} } -func (x *GCSParameters) GetBucketName() string { +func (x *GCS) GetBucketName() string { if x != nil { return x.BucketName } return "" } -func (x *GCSParameters) GetPrivateKeyName() string { +func (x *GCS) GetPrivateKeyName() string { if x != nil { return x.PrivateKeyName } return "" } -func (x *GCSParameters) GetProjectId() string { +func (x *GCS) GetProjectId() string { if x != nil { return x.ProjectId } return "" } -func (x *GCSParameters) GetServiceAccount() string { +func (x *GCS) GetServiceAccount() string { if x != nil { return x.ServiceAccount } @@ -456,21 +401,21 @@ func (m *Protocol) GetType() isProtocol_Type { return nil } -func (x *Protocol) GetS3() *S3Parameters { +func (x *Protocol) GetS3() *S3 { if x, ok := x.GetType().(*Protocol_S3); ok { return x.S3 } return nil } -func (x *Protocol) GetAzureBlob() *AzureBlobParameters { +func (x *Protocol) GetAzureBlob() *AzureBlob { if x, ok := x.GetType().(*Protocol_AzureBlob); ok { return x.AzureBlob } return nil } -func (x *Protocol) GetGcs() *GCSParameters { +func (x *Protocol) GetGcs() *GCS { if x, ok := x.GetType().(*Protocol_Gcs); ok { return x.Gcs } @@ -482,15 +427,15 @@ type isProtocol_Type interface { } type Protocol_S3 struct { - S3 *S3Parameters `protobuf:"bytes,1,opt,name=s3,proto3,oneof"` + S3 *S3 `protobuf:"bytes,1,opt,name=s3,proto3,oneof"` } type Protocol_AzureBlob struct { - AzureBlob *AzureBlobParameters `protobuf:"bytes,2,opt,name=azureBlob,proto3,oneof"` + AzureBlob *AzureBlob `protobuf:"bytes,2,opt,name=azureBlob,proto3,oneof"` } type Protocol_Gcs struct { - Gcs *GCSParameters `protobuf:"bytes,3,opt,name=gcs,proto3,oneof"` + Gcs *GCS `protobuf:"bytes,3,opt,name=gcs,proto3,oneof"` } func (*Protocol_S3) isProtocol_Type() {} @@ -667,9 +612,9 @@ type ProvisionerCreateBucketResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // bucketID returned here is expected to be the globally unique + // bucket_id returned here is expected to be the globally unique // identifier for the bucket in the object storage provider - BucketID string `protobuf:"bytes,1,opt,name=bucketID,proto3" json:"bucketID,omitempty"` + BucketId string `protobuf:"bytes,1,opt,name=bucket_id,json=bucketId,proto3" json:"bucket_id,omitempty"` } func (x *ProvisionerCreateBucketResponse) Reset() { @@ -704,9 +649,9 @@ func (*ProvisionerCreateBucketResponse) Descriptor() ([]byte, []int) { return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{7} } -func (x *ProvisionerCreateBucketResponse) GetBucketID() string { +func (x *ProvisionerCreateBucketResponse) GetBucketId() string { if x != nil { - return x.BucketID + return x.BucketId } return "" } @@ -717,9 +662,9 @@ type ProvisionerDeleteBucketRequest struct { unknownFields protoimpl.UnknownFields // This field is REQUIRED - // bucketID is a globally unique identifier for the bucket + // bucket_id is a globally unique identifier for the bucket // in the object storage provider - BucketID string `protobuf:"bytes,1,opt,name=bucketID,proto3" json:"bucketID,omitempty"` + BucketId string `protobuf:"bytes,1,opt,name=bucket_id,json=bucketId,proto3" json:"bucket_id,omitempty"` } func (x *ProvisionerDeleteBucketRequest) Reset() { @@ -754,9 +699,9 @@ func (*ProvisionerDeleteBucketRequest) Descriptor() ([]byte, []int) { return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{8} } -func (x *ProvisionerDeleteBucketRequest) GetBucketID() string { +func (x *ProvisionerDeleteBucketRequest) GetBucketId() string { if x != nil { - return x.BucketID + return x.BucketId } return "" } @@ -805,14 +750,14 @@ type ProvisionerGrantBucketAccessRequest struct { unknownFields protoimpl.UnknownFields // This field is REQUIRED - // BucketID is a globally unique identifier for the bucket + // bucket_id is a globally unique identifier for the bucket // in the object storage provider - BucketID string `protobuf:"bytes,1,opt,name=bucketID,proto3" json:"bucketID,omitempty"` + BucketId string `protobuf:"bytes,1,opt,name=bucket_id,json=bucketId,proto3" json:"bucket_id,omitempty"` // This field is REQUIRED - // accountName is a identifier for object storage provider + // account_name is a identifier for object storage provider // to ensure that multiple requests for the same account // result in only one access token being created - AccountName string `protobuf:"bytes,2,opt,name=accountName,proto3" json:"accountName,omitempty"` + AccountName string `protobuf:"bytes,2,opt,name=account_name,json=accountName,proto3" json:"account_name,omitempty"` // This field is REQUIRED // Requested Access policy, ex: {"Effect":"Allow","Action":"s3:PutObject","Resource":"arn:aws:s3:::profilepics/*"} AccessPolicy string `protobuf:"bytes,3,opt,name=access_policy,json=accessPolicy,proto3" json:"access_policy,omitempty"` @@ -854,9 +799,9 @@ func (*ProvisionerGrantBucketAccessRequest) Descriptor() ([]byte, []int) { return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{10} } -func (x *ProvisionerGrantBucketAccessRequest) GetBucketID() string { +func (x *ProvisionerGrantBucketAccessRequest) GetBucketId() string { if x != nil { - return x.BucketID + return x.BucketId } return "" } @@ -888,9 +833,9 @@ type ProvisionerGrantBucketAccessResponse struct { unknownFields protoimpl.UnknownFields // This field is OPTIONAL - // This is the accountID that is being provided access. This will + // This is the account_id that is being provided access. This will // be required later to revoke access. - AccountID string `protobuf:"bytes,1,opt,name=accountID,proto3" json:"accountID,omitempty"` + AccountId string `protobuf:"bytes,1,opt,name=account_id,json=accountId,proto3" json:"account_id,omitempty"` // This field is OPTIONAL // Contents of the credential file, ex: aws access key id and secret, etc. CredentialsFileContents string `protobuf:"bytes,2,opt,name=credentials_file_contents,json=credentialsFileContents,proto3" json:"credentials_file_contents,omitempty"` @@ -931,9 +876,9 @@ func (*ProvisionerGrantBucketAccessResponse) Descriptor() ([]byte, []int) { return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{11} } -func (x *ProvisionerGrantBucketAccessResponse) GetAccountID() string { +func (x *ProvisionerGrantBucketAccessResponse) GetAccountId() string { if x != nil { - return x.AccountID + return x.AccountId } return "" } @@ -958,12 +903,12 @@ type ProvisionerRevokeBucketAccessRequest struct { unknownFields protoimpl.UnknownFields // This field is REQUIRED - // BucketName is a globally unique identifier for the bucket + // bucket_id is a globally unique identifier for the bucket // in the object storage provider. - BucketID string `protobuf:"bytes,1,opt,name=bucketID,proto3" json:"bucketID,omitempty"` + BucketId string `protobuf:"bytes,1,opt,name=bucket_id,json=bucketId,proto3" json:"bucket_id,omitempty"` // This field is REQUIRED - // This is the accountID that is having its access revoked. - AccountID string `protobuf:"bytes,2,opt,name=accountID,proto3" json:"accountID,omitempty"` + // This is the account_id that is having its access revoked. + AccountId string `protobuf:"bytes,2,opt,name=account_id,json=accountId,proto3" json:"account_id,omitempty"` } func (x *ProvisionerRevokeBucketAccessRequest) Reset() { @@ -998,16 +943,16 @@ func (*ProvisionerRevokeBucketAccessRequest) Descriptor() ([]byte, []int) { return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{12} } -func (x *ProvisionerRevokeBucketAccessRequest) GetBucketID() string { +func (x *ProvisionerRevokeBucketAccessRequest) GetBucketId() string { if x != nil { - return x.BucketID + return x.BucketId } return "" } -func (x *ProvisionerRevokeBucketAccessRequest) GetAccountID() string { +func (x *ProvisionerRevokeBucketAccessRequest) GetAccountId() string { if x != nil { - return x.AccountID + return x.AccountId } return "" } @@ -1184,208 +1129,200 @@ var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDesc 0x12, 0x0d, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x22, 0xb3, 0x01, 0x0a, 0x0c, 0x53, 0x33, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, - 0x72, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x1f, - 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x4e, 0x0a, 0x11, 0x73, 0x69, 0x67, 0x6e, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x53, 0x33, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x65, 0x0a, 0x13, 0x41, 0x7a, 0x75, 0x72, 0x65, - 0x42, 0x6c, 0x6f, 0x62, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x25, - 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, - 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xa2, - 0x01, 0x0a, 0x0d, 0x47, 0x43, 0x53, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, - 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x28, 0x0a, 0x10, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x72, 0x69, - 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x22, 0xb7, 0x01, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x12, 0x2d, 0x0a, 0x02, 0x73, 0x33, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, - 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x33, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x48, 0x00, 0x52, 0x02, 0x73, 0x33, 0x12, - 0x42, 0x0a, 0x09, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x42, 0x6c, 0x6f, 0x62, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x42, 0x6c, 0x6f, 0x62, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x48, 0x00, 0x52, 0x09, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x42, - 0x6c, 0x6f, 0x62, 0x12, 0x30, 0x0a, 0x03, 0x67, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1c, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x47, 0x43, 0x53, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x48, 0x00, - 0x52, 0x03, 0x67, 0x63, 0x73, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x1b, 0x0a, - 0x19, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x30, 0x0a, 0x1a, 0x50, 0x72, - 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x87, 0x02, 0x0a, - 0x1e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x5d, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, - 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x63, - 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, - 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x61, 0x72, - 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3d, 0x0a, 0x1f, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x75, 0x63, - 0x6b, 0x65, 0x74, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x75, 0x63, - 0x6b, 0x65, 0x74, 0x49, 0x44, 0x22, 0x3c, 0x0a, 0x1e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x75, 0x63, 0x6b, 0x65, - 0x74, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x75, 0x63, 0x6b, 0x65, - 0x74, 0x49, 0x44, 0x22, 0x21, 0x0a, 0x1f, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xab, 0x02, 0x0a, 0x23, 0x50, 0x72, 0x6f, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, - 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, - 0x0a, 0x08, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, - 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x12, 0x62, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, - 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, - 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, - 0x65, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, - 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb4, 0x01, 0x0a, 0x24, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, - 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x44, 0x12, 0x3a, 0x0a, 0x19, 0x63, - 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, - 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, - 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x63, 0x72, 0x65, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x61, 0x6c, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x22, 0x60, 0x0a, 0x24, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, - 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x44, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x44, 0x12, - 0x1c, 0x0a, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x44, 0x22, 0x27, 0x0a, - 0x25, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, - 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x3f, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x13, 0x0a, 0x0f, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, - 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x53, - 0x33, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x5a, 0x55, 0x52, 0x45, 0x10, 0x02, 0x12, 0x07, - 0x0a, 0x03, 0x47, 0x43, 0x53, 0x10, 0x03, 0x2a, 0x3e, 0x0a, 0x12, 0x53, 0x33, 0x53, 0x69, 0x67, - 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, - 0x10, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x33, 0x56, 0x32, 0x10, 0x01, 0x12, 0x08, 0x0a, - 0x04, 0x53, 0x33, 0x56, 0x34, 0x10, 0x02, 0x2a, 0x71, 0x0a, 0x19, 0x41, 0x6e, 0x6f, 0x6e, 0x79, - 0x6d, 0x6f, 0x75, 0x73, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x0a, 0x17, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x42, - 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x10, - 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x10, 0x01, 0x12, 0x0c, - 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, - 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x52, - 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x04, 0x32, 0x77, 0x0a, 0x08, 0x49, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x6b, 0x0a, 0x12, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x28, 0x2e, 0x63, - 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x32, 0x9c, 0x04, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x65, 0x72, 0x12, 0x7a, 0x0a, 0x17, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x2d, - 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, - 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, + 0x6f, 0x22, 0xa9, 0x01, 0x0a, 0x02, 0x53, 0x33, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x4e, 0x0a, + 0x11, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x33, 0x53, 0x69, 0x67, 0x6e, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x73, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x5b, 0x0a, + 0x09, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x42, 0x6c, 0x6f, 0x62, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x74, 0x6f, 0x72, + 0x61, 0x67, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x98, 0x01, 0x0a, 0x03, 0x47, + 0x43, 0x53, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x6b, + 0x65, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, + 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, + 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0f, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x99, 0x01, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6c, 0x12, 0x23, 0x0a, 0x02, 0x73, 0x33, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, + 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, + 0x33, 0x48, 0x00, 0x52, 0x02, 0x73, 0x33, 0x12, 0x38, 0x0a, 0x09, 0x61, 0x7a, 0x75, 0x72, 0x65, + 0x42, 0x6c, 0x6f, 0x62, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6f, 0x73, + 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, + 0x42, 0x6c, 0x6f, 0x62, 0x48, 0x00, 0x52, 0x09, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x42, 0x6c, 0x6f, + 0x62, 0x12, 0x26, 0x0a, 0x03, 0x67, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, + 0x43, 0x53, 0x48, 0x00, 0x52, 0x03, 0x67, 0x63, 0x73, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x1b, 0x0a, 0x19, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, + 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x30, + 0x0a, 0x1a, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x65, 0x74, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x87, 0x02, 0x0a, 0x1e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x6f, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x73, 0x69, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6c, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x5d, 0x0a, 0x0a, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x3d, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3e, 0x0a, 0x1f, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, - 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x7a, 0x0a, 0x17, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x2d, 0x2e, 0x63, 0x6f, 0x73, - 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, - 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x63, 0x6f, 0x73, 0x69, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x87, 0x01, 0x0a, 0x1c, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, - 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x32, 0x2e, 0x63, - 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, - 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x33, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, + 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, + 0x09, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x22, 0x3d, 0x0a, 0x1e, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, + 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, + 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x22, 0x21, 0x0a, 0x1f, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, + 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xad, 0x02, 0x0a, + 0x23, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, + 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x49, + 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x62, 0x0a, 0x0a, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, + 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, + 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x3d, 0x0a, + 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb5, 0x01, 0x0a, + 0x24, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8a, 0x01, 0x0a, 0x1d, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, - 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x33, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x49, 0x64, 0x12, 0x3a, 0x0a, 0x19, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x61, 0x6c, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, + 0x12, 0x32, 0x0a, 0x15, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x5f, + 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x13, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x46, 0x69, 0x6c, 0x65, + 0x50, 0x61, 0x74, 0x68, 0x22, 0x62, 0x0a, 0x24, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x63, - 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, - 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x3a, 0x3c, 0x0a, 0x0a, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x65, 0x6e, 0x75, 0x6d, - 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, - 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x45, 0x6e, 0x75, 0x6d, - 0x3a, 0x4c, 0x0a, 0x10, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x3f, - 0x0a, 0x0b, 0x63, 0x6f, 0x73, 0x69, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x1d, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x08, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0a, 0x63, 0x6f, 0x73, 0x69, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x3a, - 0x3f, 0x0a, 0x0b, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, + 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x27, 0x0a, 0x25, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, + 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x2a, 0x3e, 0x0a, 0x12, 0x53, 0x33, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x10, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, + 0x77, 0x6e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x10, 0x00, 0x12, 0x08, 0x0a, + 0x04, 0x53, 0x33, 0x56, 0x32, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x33, 0x56, 0x34, 0x10, + 0x02, 0x2a, 0x71, 0x0a, 0x19, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x6f, 0x75, 0x73, 0x42, 0x75, + 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1b, + 0x0a, 0x17, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, + 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, + 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, + 0x6e, 0x6c, 0x79, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x10, 0x04, 0x32, 0x77, 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x12, 0x6b, 0x0a, 0x12, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, + 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x28, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x29, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x32, 0x9c, 0x04, + 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x12, 0x7a, 0x0a, + 0x17, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x2d, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7a, 0x0a, 0x17, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, + 0x63, 0x6b, 0x65, 0x74, 0x12, 0x2d, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x87, 0x01, 0x0a, 0x1c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x32, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x63, 0x6f, 0x73, + 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x8a, 0x01, 0x0a, 0x1d, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, + 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x12, 0x33, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x76, + 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3a, 0x3c, 0x0a, 0x0a, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, + 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x09, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x45, 0x6e, 0x75, 0x6d, 0x3a, 0x4c, 0x0a, 0x10, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x46, 0x69, 0x65, 0x6c, 0x64, - 0x3a, 0x45, 0x0a, 0x0d, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x42, 0x0a, 0x0c, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3a, 0x45, 0x0a, 0x0d, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x42, 0x3a, 0x5a, 0x38, 0x73, 0x69, 0x67, 0x73, 0x2e, 0x6b, 0x38, 0x73, 0x2e, 0x69, - 0x6f, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2d, 0x6f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x2d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x66, 0x61, 0x63, 0x65, 0x2d, 0x73, 0x70, 0x65, 0x63, 0x3b, 0x63, 0x6f, 0x73, 0x69, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x45, + 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x3f, 0x0a, 0x0b, 0x63, 0x6f, 0x73, 0x69, + 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x63, + 0x6f, 0x73, 0x69, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x3a, 0x3f, 0x0a, 0x0b, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x3a, 0x45, 0x0a, 0x0d, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x3a, 0x42, 0x0a, 0x0c, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, + 0x64, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x4d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3a, 0x45, 0x0a, 0x0d, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, 0x3a, 0x5a, 0x38, + 0x73, 0x69, 0x67, 0x73, 0x2e, 0x6b, 0x38, 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2d, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2d, 0x73, 0x74, 0x6f, + 0x72, 0x61, 0x67, 0x65, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2d, 0x73, + 0x70, 0x65, 0x63, 0x3b, 0x63, 0x6f, 0x73, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1400,60 +1337,59 @@ func file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDesc return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescData } -var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_enumTypes = make([]protoimpl.EnumInfo, 3) +var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_enumTypes = make([]protoimpl.EnumInfo, 2) var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes = make([]protoimpl.MessageInfo, 16) var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_goTypes = []interface{}{ - (ProtocolName)(0), // 0: cosi.v1alpha1.ProtocolName - (S3SignatureVersion)(0), // 1: cosi.v1alpha1.S3SignatureVersion - (AnonymousBucketAccessMode)(0), // 2: cosi.v1alpha1.AnonymousBucketAccessMode - (*S3Parameters)(nil), // 3: cosi.v1alpha1.S3Parameters - (*AzureBlobParameters)(nil), // 4: cosi.v1alpha1.AzureBlobParameters - (*GCSParameters)(nil), // 5: cosi.v1alpha1.GCSParameters - (*Protocol)(nil), // 6: cosi.v1alpha1.Protocol - (*ProvisionerGetInfoRequest)(nil), // 7: cosi.v1alpha1.ProvisionerGetInfoRequest - (*ProvisionerGetInfoResponse)(nil), // 8: cosi.v1alpha1.ProvisionerGetInfoResponse - (*ProvisionerCreateBucketRequest)(nil), // 9: cosi.v1alpha1.ProvisionerCreateBucketRequest - (*ProvisionerCreateBucketResponse)(nil), // 10: cosi.v1alpha1.ProvisionerCreateBucketResponse - (*ProvisionerDeleteBucketRequest)(nil), // 11: cosi.v1alpha1.ProvisionerDeleteBucketRequest - (*ProvisionerDeleteBucketResponse)(nil), // 12: cosi.v1alpha1.ProvisionerDeleteBucketResponse - (*ProvisionerGrantBucketAccessRequest)(nil), // 13: cosi.v1alpha1.ProvisionerGrantBucketAccessRequest - (*ProvisionerGrantBucketAccessResponse)(nil), // 14: cosi.v1alpha1.ProvisionerGrantBucketAccessResponse - (*ProvisionerRevokeBucketAccessRequest)(nil), // 15: cosi.v1alpha1.ProvisionerRevokeBucketAccessRequest - (*ProvisionerRevokeBucketAccessResponse)(nil), // 16: cosi.v1alpha1.ProvisionerRevokeBucketAccessResponse - nil, // 17: cosi.v1alpha1.ProvisionerCreateBucketRequest.ParametersEntry - nil, // 18: cosi.v1alpha1.ProvisionerGrantBucketAccessRequest.ParametersEntry - (*descriptor.EnumOptions)(nil), // 19: google.protobuf.EnumOptions - (*descriptor.EnumValueOptions)(nil), // 20: google.protobuf.EnumValueOptions - (*descriptor.FieldOptions)(nil), // 21: google.protobuf.FieldOptions - (*descriptor.MessageOptions)(nil), // 22: google.protobuf.MessageOptions - (*descriptor.MethodOptions)(nil), // 23: google.protobuf.MethodOptions - (*descriptor.ServiceOptions)(nil), // 24: google.protobuf.ServiceOptions + (S3SignatureVersion)(0), // 0: cosi.v1alpha1.S3SignatureVersion + (AnonymousBucketAccessMode)(0), // 1: cosi.v1alpha1.AnonymousBucketAccessMode + (*S3)(nil), // 2: cosi.v1alpha1.S3 + (*AzureBlob)(nil), // 3: cosi.v1alpha1.AzureBlob + (*GCS)(nil), // 4: cosi.v1alpha1.GCS + (*Protocol)(nil), // 5: cosi.v1alpha1.Protocol + (*ProvisionerGetInfoRequest)(nil), // 6: cosi.v1alpha1.ProvisionerGetInfoRequest + (*ProvisionerGetInfoResponse)(nil), // 7: cosi.v1alpha1.ProvisionerGetInfoResponse + (*ProvisionerCreateBucketRequest)(nil), // 8: cosi.v1alpha1.ProvisionerCreateBucketRequest + (*ProvisionerCreateBucketResponse)(nil), // 9: cosi.v1alpha1.ProvisionerCreateBucketResponse + (*ProvisionerDeleteBucketRequest)(nil), // 10: cosi.v1alpha1.ProvisionerDeleteBucketRequest + (*ProvisionerDeleteBucketResponse)(nil), // 11: cosi.v1alpha1.ProvisionerDeleteBucketResponse + (*ProvisionerGrantBucketAccessRequest)(nil), // 12: cosi.v1alpha1.ProvisionerGrantBucketAccessRequest + (*ProvisionerGrantBucketAccessResponse)(nil), // 13: cosi.v1alpha1.ProvisionerGrantBucketAccessResponse + (*ProvisionerRevokeBucketAccessRequest)(nil), // 14: cosi.v1alpha1.ProvisionerRevokeBucketAccessRequest + (*ProvisionerRevokeBucketAccessResponse)(nil), // 15: cosi.v1alpha1.ProvisionerRevokeBucketAccessResponse + nil, // 16: cosi.v1alpha1.ProvisionerCreateBucketRequest.ParametersEntry + nil, // 17: cosi.v1alpha1.ProvisionerGrantBucketAccessRequest.ParametersEntry + (*descriptor.EnumOptions)(nil), // 18: google.protobuf.EnumOptions + (*descriptor.EnumValueOptions)(nil), // 19: google.protobuf.EnumValueOptions + (*descriptor.FieldOptions)(nil), // 20: google.protobuf.FieldOptions + (*descriptor.MessageOptions)(nil), // 21: google.protobuf.MessageOptions + (*descriptor.MethodOptions)(nil), // 22: google.protobuf.MethodOptions + (*descriptor.ServiceOptions)(nil), // 23: google.protobuf.ServiceOptions } var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_depIdxs = []int32{ - 1, // 0: cosi.v1alpha1.S3Parameters.signature_version:type_name -> cosi.v1alpha1.S3SignatureVersion - 3, // 1: cosi.v1alpha1.Protocol.s3:type_name -> cosi.v1alpha1.S3Parameters - 4, // 2: cosi.v1alpha1.Protocol.azureBlob:type_name -> cosi.v1alpha1.AzureBlobParameters - 5, // 3: cosi.v1alpha1.Protocol.gcs:type_name -> cosi.v1alpha1.GCSParameters - 6, // 4: cosi.v1alpha1.ProvisionerCreateBucketRequest.protocol:type_name -> cosi.v1alpha1.Protocol - 17, // 5: cosi.v1alpha1.ProvisionerCreateBucketRequest.parameters:type_name -> cosi.v1alpha1.ProvisionerCreateBucketRequest.ParametersEntry - 18, // 6: cosi.v1alpha1.ProvisionerGrantBucketAccessRequest.parameters:type_name -> cosi.v1alpha1.ProvisionerGrantBucketAccessRequest.ParametersEntry - 19, // 7: cosi.v1alpha1.alpha_enum:extendee -> google.protobuf.EnumOptions - 20, // 8: cosi.v1alpha1.alpha_enum_value:extendee -> google.protobuf.EnumValueOptions - 21, // 9: cosi.v1alpha1.cosi_secret:extendee -> google.protobuf.FieldOptions - 21, // 10: cosi.v1alpha1.alpha_field:extendee -> google.protobuf.FieldOptions - 22, // 11: cosi.v1alpha1.alpha_message:extendee -> google.protobuf.MessageOptions - 23, // 12: cosi.v1alpha1.alpha_method:extendee -> google.protobuf.MethodOptions - 24, // 13: cosi.v1alpha1.alpha_service:extendee -> google.protobuf.ServiceOptions - 7, // 14: cosi.v1alpha1.Identity.ProvisionerGetInfo:input_type -> cosi.v1alpha1.ProvisionerGetInfoRequest - 9, // 15: cosi.v1alpha1.Provisioner.ProvisionerCreateBucket:input_type -> cosi.v1alpha1.ProvisionerCreateBucketRequest - 11, // 16: cosi.v1alpha1.Provisioner.ProvisionerDeleteBucket:input_type -> cosi.v1alpha1.ProvisionerDeleteBucketRequest - 13, // 17: cosi.v1alpha1.Provisioner.ProvisionerGrantBucketAccess:input_type -> cosi.v1alpha1.ProvisionerGrantBucketAccessRequest - 15, // 18: cosi.v1alpha1.Provisioner.ProvisionerRevokeBucketAccess:input_type -> cosi.v1alpha1.ProvisionerRevokeBucketAccessRequest - 8, // 19: cosi.v1alpha1.Identity.ProvisionerGetInfo:output_type -> cosi.v1alpha1.ProvisionerGetInfoResponse - 10, // 20: cosi.v1alpha1.Provisioner.ProvisionerCreateBucket:output_type -> cosi.v1alpha1.ProvisionerCreateBucketResponse - 12, // 21: cosi.v1alpha1.Provisioner.ProvisionerDeleteBucket:output_type -> cosi.v1alpha1.ProvisionerDeleteBucketResponse - 14, // 22: cosi.v1alpha1.Provisioner.ProvisionerGrantBucketAccess:output_type -> cosi.v1alpha1.ProvisionerGrantBucketAccessResponse - 16, // 23: cosi.v1alpha1.Provisioner.ProvisionerRevokeBucketAccess:output_type -> cosi.v1alpha1.ProvisionerRevokeBucketAccessResponse + 0, // 0: cosi.v1alpha1.S3.signature_version:type_name -> cosi.v1alpha1.S3SignatureVersion + 2, // 1: cosi.v1alpha1.Protocol.s3:type_name -> cosi.v1alpha1.S3 + 3, // 2: cosi.v1alpha1.Protocol.azureBlob:type_name -> cosi.v1alpha1.AzureBlob + 4, // 3: cosi.v1alpha1.Protocol.gcs:type_name -> cosi.v1alpha1.GCS + 5, // 4: cosi.v1alpha1.ProvisionerCreateBucketRequest.protocol:type_name -> cosi.v1alpha1.Protocol + 16, // 5: cosi.v1alpha1.ProvisionerCreateBucketRequest.parameters:type_name -> cosi.v1alpha1.ProvisionerCreateBucketRequest.ParametersEntry + 17, // 6: cosi.v1alpha1.ProvisionerGrantBucketAccessRequest.parameters:type_name -> cosi.v1alpha1.ProvisionerGrantBucketAccessRequest.ParametersEntry + 18, // 7: cosi.v1alpha1.alpha_enum:extendee -> google.protobuf.EnumOptions + 19, // 8: cosi.v1alpha1.alpha_enum_value:extendee -> google.protobuf.EnumValueOptions + 20, // 9: cosi.v1alpha1.cosi_secret:extendee -> google.protobuf.FieldOptions + 20, // 10: cosi.v1alpha1.alpha_field:extendee -> google.protobuf.FieldOptions + 21, // 11: cosi.v1alpha1.alpha_message:extendee -> google.protobuf.MessageOptions + 22, // 12: cosi.v1alpha1.alpha_method:extendee -> google.protobuf.MethodOptions + 23, // 13: cosi.v1alpha1.alpha_service:extendee -> google.protobuf.ServiceOptions + 6, // 14: cosi.v1alpha1.Identity.ProvisionerGetInfo:input_type -> cosi.v1alpha1.ProvisionerGetInfoRequest + 8, // 15: cosi.v1alpha1.Provisioner.ProvisionerCreateBucket:input_type -> cosi.v1alpha1.ProvisionerCreateBucketRequest + 10, // 16: cosi.v1alpha1.Provisioner.ProvisionerDeleteBucket:input_type -> cosi.v1alpha1.ProvisionerDeleteBucketRequest + 12, // 17: cosi.v1alpha1.Provisioner.ProvisionerGrantBucketAccess:input_type -> cosi.v1alpha1.ProvisionerGrantBucketAccessRequest + 14, // 18: cosi.v1alpha1.Provisioner.ProvisionerRevokeBucketAccess:input_type -> cosi.v1alpha1.ProvisionerRevokeBucketAccessRequest + 7, // 19: cosi.v1alpha1.Identity.ProvisionerGetInfo:output_type -> cosi.v1alpha1.ProvisionerGetInfoResponse + 9, // 20: cosi.v1alpha1.Provisioner.ProvisionerCreateBucket:output_type -> cosi.v1alpha1.ProvisionerCreateBucketResponse + 11, // 21: cosi.v1alpha1.Provisioner.ProvisionerDeleteBucket:output_type -> cosi.v1alpha1.ProvisionerDeleteBucketResponse + 13, // 22: cosi.v1alpha1.Provisioner.ProvisionerGrantBucketAccess:output_type -> cosi.v1alpha1.ProvisionerGrantBucketAccessResponse + 15, // 23: cosi.v1alpha1.Provisioner.ProvisionerRevokeBucketAccess:output_type -> cosi.v1alpha1.ProvisionerRevokeBucketAccessResponse 19, // [19:24] is the sub-list for method output_type 14, // [14:19] is the sub-list for method input_type 14, // [14:14] is the sub-list for extension type_name @@ -1468,7 +1404,7 @@ func file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_init() } if !protoimpl.UnsafeEnabled { file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*S3Parameters); i { + switch v := v.(*S3); i { case 0: return &v.state case 1: @@ -1480,7 +1416,7 @@ func file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_init() } } file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AzureBlobParameters); i { + switch v := v.(*AzureBlob); i { case 0: return &v.state case 1: @@ -1492,7 +1428,7 @@ func file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_init() } } file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GCSParameters); i { + switch v := v.(*GCS); i { case 0: return &v.state case 1: @@ -1646,7 +1582,7 @@ func file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_init() File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDesc, - NumEnums: 3, + NumEnums: 2, NumMessages: 16, NumExtensions: 7, NumServices: 2, diff --git a/cosi.pb.json.go b/cosi.pb.json.go index 0a4fc693..57bd9cfe 100644 --- a/cosi.pb.json.go +++ b/cosi.pb.json.go @@ -10,7 +10,7 @@ import ( ) // MarshalJSON implements json.Marshaler -func (msg *S3Parameters) MarshalJSON() ([]byte, error) { +func (msg *S3) MarshalJSON() ([]byte, error) { var buf bytes.Buffer err := (&jsonpb.Marshaler{ EnumsAsInts: false, @@ -21,14 +21,14 @@ func (msg *S3Parameters) MarshalJSON() ([]byte, error) { } // UnmarshalJSON implements json.Unmarshaler -func (msg *S3Parameters) UnmarshalJSON(b []byte) error { +func (msg *S3) UnmarshalJSON(b []byte) error { return (&jsonpb.Unmarshaler{ AllowUnknownFields: false, }).Unmarshal(bytes.NewReader(b), msg) } // MarshalJSON implements json.Marshaler -func (msg *AzureBlobParameters) MarshalJSON() ([]byte, error) { +func (msg *AzureBlob) MarshalJSON() ([]byte, error) { var buf bytes.Buffer err := (&jsonpb.Marshaler{ EnumsAsInts: false, @@ -39,14 +39,14 @@ func (msg *AzureBlobParameters) MarshalJSON() ([]byte, error) { } // UnmarshalJSON implements json.Unmarshaler -func (msg *AzureBlobParameters) UnmarshalJSON(b []byte) error { +func (msg *AzureBlob) UnmarshalJSON(b []byte) error { return (&jsonpb.Unmarshaler{ AllowUnknownFields: false, }).Unmarshal(bytes.NewReader(b), msg) } // MarshalJSON implements json.Marshaler -func (msg *GCSParameters) MarshalJSON() ([]byte, error) { +func (msg *GCS) MarshalJSON() ([]byte, error) { var buf bytes.Buffer err := (&jsonpb.Marshaler{ EnumsAsInts: false, @@ -57,7 +57,7 @@ func (msg *GCSParameters) MarshalJSON() ([]byte, error) { } // UnmarshalJSON implements json.Unmarshaler -func (msg *GCSParameters) UnmarshalJSON(b []byte) error { +func (msg *GCS) UnmarshalJSON(b []byte) error { return (&jsonpb.Unmarshaler{ AllowUnknownFields: false, }).Unmarshal(bytes.NewReader(b), msg) diff --git a/cosi.proto b/cosi.proto index 67233cf3..a0e8c202 100644 --- a/cosi.proto +++ b/cosi.proto @@ -77,16 +77,6 @@ service Provisioner { rpc ProvisionerRevokeBucketAccess (ProvisionerRevokeBucketAccessRequest) returns (ProvisionerRevokeBucketAccessResponse); } -enum ProtocolName { - UnknownProtocol = 0; - // S3, AWS S3 protocol - S3 = 1; - // AZURE, Microsoft Azure protocol - AZURE = 2; - // GCS, Google GCS protocol - GCS = 3; -} - // S3SignatureVersion is the version of the signing algorithm for all s3 requests enum S3SignatureVersion { UnknownSignature = 0; @@ -108,7 +98,7 @@ enum AnonymousBucketAccessMode { ReadWrite = 4; } -message S3Parameters { +message S3 { // endpoint denotes the URL of the S3 server string endpoint = 1; // bucket_name denotes the name of the bucket in the storage backend @@ -119,14 +109,14 @@ message S3Parameters { S3SignatureVersion signature_version = 4; } -message AzureBlobParameters { +message AzureBlob { // container_name is the name of the azure container string container_name = 1; // storage_account is the id of the azure storage account string storage_account = 2; } -message GCSParameters { +message GCS { // bucket_name denotes the name of the bucket in the storage backend string bucket_name = 1; // private_key_name denotes the name of the private key in the storage backend @@ -139,9 +129,9 @@ message GCSParameters { message Protocol { oneof type { - S3Parameters s3 = 1; - AzureBlobParameters azureBlob = 2; - GCSParameters gcs = 3; + S3 s3 = 1; + AzureBlob azureBlob = 2; + GCS gcs = 3; } } @@ -166,7 +156,7 @@ message ProvisionerCreateBucketRequest { // name specifies the name of the bucket that should be created. string name = 1; - // This field is REQUIRED + // This field is REQUIRED // Protocol specific information required by the call is passed in as key,value pairs. Protocol protocol = 2; @@ -177,16 +167,16 @@ message ProvisionerCreateBucketRequest { } message ProvisionerCreateBucketResponse { - // bucketID returned here is expected to be the globally unique - // identifier for the bucket in the object storage provider - string bucketID = 1; + // bucket_id returned here is expected to be the globally unique + // identifier for the bucket in the object storage provider + string bucket_id = 1; } message ProvisionerDeleteBucketRequest { - // This field is REQUIRED - // bucketID is a globally unique identifier for the bucket - // in the object storage provider - string bucketID = 1; + // This field is REQUIRED + // bucket_id is a globally unique identifier for the bucket + // in the object storage provider + string bucket_id = 1; } message ProvisionerDeleteBucketResponse { @@ -195,15 +185,15 @@ message ProvisionerDeleteBucketResponse { message ProvisionerGrantBucketAccessRequest { // This field is REQUIRED - // BucketID is a globally unique identifier for the bucket - // in the object storage provider - string bucketID = 1; + // bucket_id is a globally unique identifier for the bucket + // in the object storage provider + string bucket_id = 1; - // This field is REQUIRED - // accountName is a identifier for object storage provider - // to ensure that multiple requests for the same account - // result in only one access token being created - string accountName = 2; + // This field is REQUIRED + // account_name is a identifier for object storage provider + // to ensure that multiple requests for the same account + // result in only one access token being created + string account_name = 2; // This field is REQUIRED // Requested Access policy, ex: {"Effect":"Allow","Action":"s3:PutObject","Resource":"arn:aws:s3:::profilepics/*"} @@ -217,9 +207,9 @@ message ProvisionerGrantBucketAccessRequest { message ProvisionerGrantBucketAccessResponse { // This field is OPTIONAL - // This is the accountID that is being provided access. This will + // This is the account_id that is being provided access. This will // be required later to revoke access. - string accountID = 1; + string account_id = 1; // This field is OPTIONAL // Contents of the credential file, ex: aws access key id and secret, etc. @@ -232,13 +222,13 @@ message ProvisionerGrantBucketAccessResponse { message ProvisionerRevokeBucketAccessRequest { // This field is REQUIRED - // BucketName is a globally unique identifier for the bucket - // in the object storage provider. - string bucketID = 1; + // bucket_id is a globally unique identifier for the bucket + // in the object storage provider. + string bucket_id = 1; // This field is REQUIRED - // This is the accountID that is having its access revoked. - string accountID = 2; + // This is the account_id that is having its access revoked. + string account_id = 2; } message ProvisionerRevokeBucketAccessResponse { diff --git a/spec.md b/spec.md index f46f413a..5a4e3491 100644 --- a/spec.md +++ b/spec.md @@ -205,16 +205,6 @@ service Provisioner { rpc ProvisionerRevokeBucketAccess (ProvisionerRevokeBucketAccessRequest) returns (ProvisionerRevokeBucketAccessResponse); } -enum ProtocolName { - UnknownProtocol = 0; - // S3, AWS S3 protocol - S3 = 1; - // AZURE, Microsoft Azure protocol - AZURE = 2; - // GCS, Google GCS protocol - GCS = 3; -} - // S3SignatureVersion is the version of the signing algorithm for all s3 requests enum S3SignatureVersion { UnknownSignature = 0; @@ -236,7 +226,7 @@ enum AnonymousBucketAccessMode { ReadWrite = 4; } -message S3Parameters { +message S3 { // endpoint denotes the URL of the S3 server string endpoint = 1; // bucket_name denotes the name of the bucket in the storage backend @@ -247,14 +237,14 @@ message S3Parameters { S3SignatureVersion signature_version = 4; } -message AzureBlobParameters { +message AzureBlob { // container_name is the name of the azure container string container_name = 1; // storage_account is the id of the azure storage account string storage_account = 2; } -message GCSParameters { +message GCS { // bucket_name denotes the name of the bucket in the storage backend string bucket_name = 1; // private_key_name denotes the name of the private key in the storage backend @@ -267,9 +257,9 @@ message GCSParameters { message Protocol { oneof type { - S3Parameters s3 = 1; - AzureBlobParameters azureBlob = 2; - GCSParameters gcs = 3; + S3 s3 = 1; + AzureBlob azureBlob = 2; + GCS gcs = 3; } } @@ -294,7 +284,7 @@ message ProvisionerCreateBucketRequest { // name specifies the name of the bucket that should be created. string name = 1; - // This field is REQUIRED + // This field is REQUIRED // Protocol specific information required by the call is passed in as key,value pairs. Protocol protocol = 2; @@ -305,16 +295,16 @@ message ProvisionerCreateBucketRequest { } message ProvisionerCreateBucketResponse { - // bucketID returned here is expected to be the globally unique - // identifier for the bucket in the object storage provider - string bucketID = 1; + // bucket_id returned here is expected to be the globally unique + // identifier for the bucket in the object storage provider + string bucket_id = 1; } message ProvisionerDeleteBucketRequest { - // This field is REQUIRED - // bucketID is a globally unique identifier for the bucket - // in the object storage provider - string bucketID = 1; + // This field is REQUIRED + // bucket_id is a globally unique identifier for the bucket + // in the object storage provider + string bucket_id = 1; } message ProvisionerDeleteBucketResponse { @@ -323,15 +313,15 @@ message ProvisionerDeleteBucketResponse { message ProvisionerGrantBucketAccessRequest { // This field is REQUIRED - // BucketID is a globally unique identifier for the bucket - // in the object storage provider - string bucketID = 1; + // bucket_id is a globally unique identifier for the bucket + // in the object storage provider + string bucket_id = 1; - // This field is REQUIRED - // accountName is a identifier for object storage provider - // to ensure that multiple requests for the same account - // result in only one access token being created - string accountName = 2; + // This field is REQUIRED + // account_name is a identifier for object storage provider + // to ensure that multiple requests for the same account + // result in only one access token being created + string account_name = 2; // This field is REQUIRED // Requested Access policy, ex: {"Effect":"Allow","Action":"s3:PutObject","Resource":"arn:aws:s3:::profilepics/*"} @@ -345,9 +335,9 @@ message ProvisionerGrantBucketAccessRequest { message ProvisionerGrantBucketAccessResponse { // This field is OPTIONAL - // This is the accountID that is being provided access. This will + // This is the account_id that is being provided access. This will // be required later to revoke access. - string accountID = 1; + string account_id = 1; // This field is OPTIONAL // Contents of the credential file, ex: aws access key id and secret, etc. @@ -360,13 +350,13 @@ message ProvisionerGrantBucketAccessResponse { message ProvisionerRevokeBucketAccessRequest { // This field is REQUIRED - // BucketName is a globally unique identifier for the bucket - // in the object storage provider. - string bucketID = 1; + // bucket_id is a globally unique identifier for the bucket + // in the object storage provider. + string bucket_id = 1; // This field is REQUIRED - // This is the accountID that is having its access revoked. - string accountID = 2; + // This is the account_id that is having its access revoked. + string account_id = 2; } message ProvisionerRevokeBucketAccessResponse { From 3782c3f4729bd093be00c0e73b68fda3d0731c25 Mon Sep 17 00:00:00 2001 From: wlan0 Date: Mon, 29 Mar 2021 17:33:44 -0700 Subject: [PATCH 158/242] fix formatting --- spec.md | 1 - 1 file changed, 1 deletion(-) diff --git a/spec.md b/spec.md index 5a4e3491..4a04559f 100644 --- a/spec.md +++ b/spec.md @@ -109,7 +109,6 @@ Figure 2: Kubernetes implementation - Interaction of COSI components ``` Figure 3: The lifecycle of a dynamically provisioned bucket, from creation to deletion. -``` The above diagrams illustrate a general expectation with respect to how a COSI system MAY manage the lifecycle of a bucket via the API presented in this specification. Plugins SHOULD expose all RPCs for an interface: Controller plugins SHOULD implement all RPCs for the service. From 62cab445d76c92ccd02f23abd40c3d31c4e52de9 Mon Sep 17 00:00:00 2001 From: wlan0 Date: Mon, 29 Mar 2021 17:35:38 -0700 Subject: [PATCH 159/242] add links to author profiles --- spec.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spec.md b/spec.md index 4a04559f..0f3819f9 100644 --- a/spec.md +++ b/spec.md @@ -2,9 +2,9 @@ Authors: -* Sidharth Mani << @wlan0 -* Jeff Vance << @jeffvance -* Srini Brahmaroutu << @brahmaroutu +* Sidharth Mani [@wlan0](https://github.com/wlan0) +* Jeff Vance [@jeffvance](https://github.com/jeffvance) +* Srini Brahmaroutu [@brahmaroutu](https://github.com/brahmaroutu) ## Notational Conventions From b3d45eeffd3a0e82962373efd7ea000d5d01458c Mon Sep 17 00:00:00 2001 From: Srini Brahmaroutu Date: Fri, 9 Apr 2021 20:38:12 -0700 Subject: [PATCH 160/242] Code refactoring to make sure Buckets abd BucketAccess Add works correctly --- .../bucketaccessrequest.go | 43 +++---------------- pkg/bucketrequest/bucketrequest.go | 28 ++++-------- 2 files changed, 14 insertions(+), 57 deletions(-) diff --git a/pkg/bucketaccessrequest/bucketaccessrequest.go b/pkg/bucketaccessrequest/bucketaccessrequest.go index 860cbec9..ac668fe0 100644 --- a/pkg/bucketaccessrequest/bucketaccessrequest.go +++ b/pkg/bucketaccessrequest/bucketaccessrequest.go @@ -7,7 +7,6 @@ import ( "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" kubeclientset "k8s.io/client-go/kubernetes" - "k8s.io/client-go/util/retry" "github.com/kubernetes-sigs/container-object-storage-interface-controller/pkg/util" "sigs.k8s.io/container-object-storage-interface-api/apis/objectstorage.k8s.io/v1alpha1" @@ -78,15 +77,9 @@ func (b *bucketAccessRequestListener) provisionBucketAccess(ctx context.Context, coreClient := b.kubeClient.CoreV1() name := string(bucketAccessRequest.GetUID()) - _, err := baClient.Get(ctx, name, metav1.GetOptions{}) - if err != nil { - // anything other than 404 - if !errors.IsNotFound(err) { - klog.Errorf("error fetching bucketaccess: %v", err) - return err - } - } else { // if bucket found - return nil + + if bucketAccessRequest.Spec.BucketAccessName != "" { + return util.ErrBucketAccessAlreadyExists } bucketAccessClassName := bucketAccessRequest.Spec.BucketAccessClassName @@ -145,39 +138,15 @@ func (b *bucketAccessRequestListener) provisionBucketAccess(ctx context.Context, bucketaccess.Spec.Parameters = util.CopySS(bucketAccessClass.Parameters) bucketaccess, err = baClient.Create(context.Background(), bucketaccess, metav1.CreateOptions{}) - if err != nil { - if errors.IsAlreadyExists(err) { - return nil - } + if err != nil && !errors.IsAlreadyExists(err) { return err } - err = retry.RetryOnConflict(retry.DefaultRetry, func() error { - bucketAccessRequest.Spec.BucketAccessName = bucketaccess.Name - _, err := barClient(bucketAccessRequest.Namespace).Update(ctx, bucketAccessRequest, metav1.UpdateOptions{}) - if err != nil { - return err - } - return nil - }) + bucketAccessRequest.Spec.BucketAccessName = bucketaccess.Name + _, err = barClient(bucketAccessRequest.Namespace).Update(ctx, bucketAccessRequest, metav1.UpdateOptions{}) if err != nil { return err } klog.Infof("Finished creating BucketAccess %v", bucketaccess.Name) return nil } - -func (b *bucketAccessRequestListener) FindBucketAccess(ctx context.Context, bar *v1alpha1.BucketAccessRequest) *v1alpha1.BucketAccess { - bucketAccessList, err := b.bucketClient.ObjectstorageV1alpha1().BucketAccesses().List(ctx, metav1.ListOptions{}) - if err != nil || len(bucketAccessList.Items) <= 0 { - return nil - } - for _, bucketaccess := range bucketAccessList.Items { - if bucketaccess.Spec.BucketAccessRequest.Name == bar.Name && - bucketaccess.Spec.BucketAccessRequest.Namespace == bar.Namespace && - bucketaccess.Spec.BucketAccessRequest.UID == bar.UID { - return &bucketaccess - } - } - return nil -} diff --git a/pkg/bucketrequest/bucketrequest.go b/pkg/bucketrequest/bucketrequest.go index f6d63d8c..6c3c3641 100644 --- a/pkg/bucketrequest/bucketrequest.go +++ b/pkg/bucketrequest/bucketrequest.go @@ -6,7 +6,6 @@ import ( v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/client-go/util/retry" "github.com/kubernetes-sigs/container-object-storage-interface-controller/pkg/util" kubeclientset "k8s.io/client-go/kubernetes" @@ -101,16 +100,12 @@ func (b *bucketRequestListener) provisionBucketRequestOperation(ctx context.Cont } name = name + string(bucketRequest.GetUID()) - bucket, err := b.Buckets().Get(ctx, name, metav1.GetOptions{}) - if err == nil { + if bucketRequest.Spec.BucketInstanceName != "" { return util.ErrBucketAlreadyExists - } else if !errors.IsNotFound(err) { // anything other than bucket not found error is an internal error - klog.ErrorS(err, "name", name) - return err } // create bucket - bucket = &v1alpha1.Bucket{} + bucket := &v1alpha1.Bucket{} bucket.Name = name bucket.Spec.Provisioner = bucketClass.Provisioner @@ -127,24 +122,17 @@ func (b *bucketRequestListener) provisionBucketRequestOperation(ctx context.Cont bucket.Spec.Parameters = util.CopySS(bucketClass.Parameters) bucket, err = b.Buckets().Create(ctx, bucket, metav1.CreateOptions{}) - if err != nil { - if errors.IsAlreadyExists(err) { - return util.ErrBucketAlreadyExists - } + if err != nil && !errors.IsAlreadyExists(err) { klog.ErrorS(err, "name", bucket.Name) return err } - updateBucketRequest := func() error { - bucketRequest.Spec.BucketInstanceName = bucket.Name - _, err := b.BucketRequests(bucketRequest.Namespace).Update(ctx, bucketRequest, metav1.UpdateOptions{}) - if err != nil { - return err - } - return nil + bucketRequest.Spec.BucketInstanceName = bucket.Name + _, err = b.BucketRequests(bucketRequest.Namespace).Update(ctx, bucketRequest, metav1.UpdateOptions{}) + if err != nil { + return err } - - return retry.RetryOnConflict(retry.DefaultRetry, updateBucketRequest) + return nil } // getBucketClass returns BucketClassName. If no bucket class was in the request it returns empty From 69024a62f52529256fca10b872fd23b660b66a0e Mon Sep 17 00:00:00 2001 From: Krish Chowdhary Date: Wed, 14 Apr 2021 15:34:56 -0400 Subject: [PATCH 161/242] update api version --- .gitignore | 2 ++ go.mod | 2 +- go.sum | 13 ++++++++---- .../bucketaccessrequest.go | 21 +++++++++++++------ .../bucketaccessrequest_test.go | 10 +++++---- pkg/bucketrequest/bucketrequest.go | 21 +++++++++++++------ pkg/bucketrequest/bucketrequest_test.go | 13 +++++++++--- pkg/util/util.go | 12 +++++------ resources/deployment.yaml | 3 ++- resources/rbac.yaml | 2 +- 10 files changed, 66 insertions(+), 33 deletions(-) diff --git a/.gitignore b/.gitignore index c5f97758..faa1c3ef 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,5 @@ travis.yml release-tools bin +vendor/ +.idea/ \ No newline at end of file diff --git a/go.mod b/go.mod index 65a358ad..48c3e486 100644 --- a/go.mod +++ b/go.mod @@ -28,6 +28,6 @@ require ( k8s.io/client-go v0.19.4 k8s.io/klog/v2 v2.4.0 k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd // indirect - sigs.k8s.io/container-object-storage-interface-api v0.0.0-20210315005104-5e1814a6aedd + sigs.k8s.io/container-object-storage-interface-api v0.0.0-20210330175159-2cdabb1a5dc7 sigs.k8s.io/controller-tools v0.4.1 ) diff --git a/go.sum b/go.sum index 824260f5..563f80e6 100644 --- a/go.sum +++ b/go.sum @@ -200,6 +200,7 @@ github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrU github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= @@ -221,6 +222,7 @@ github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OI github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -269,6 +271,7 @@ github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2p 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/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imdario/mergo v0.3.5 h1:JboBksRwiiAJWvIYJVo46AfV+IAIKZpfrSzVKj42R4Q= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.9 h1:UauaLniWCFHWd+Jp9oCEkTBj8VO/9DKg3PV3VCNMDIg= github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= @@ -687,6 +690,7 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0 h1:UhZDfRO8JRQru4/+LlLE0BRKGF8L+PICnvYZmx/fEGA= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= @@ -714,6 +718,7 @@ gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -778,10 +783,10 @@ k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/ rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.9/go.mod h1:dzAXnQbTRyDlZPJX2SUPEqvnB+j7AJjtlox7PEwigU0= -sigs.k8s.io/container-object-storage-interface-api v0.0.0-20210315005104-5e1814a6aedd h1:29yp8kNmIAvmVrk49H+CWBa7Yf4fipVLcTyong15tbs= -sigs.k8s.io/container-object-storage-interface-api v0.0.0-20210315005104-5e1814a6aedd/go.mod h1:yMgeGQDROJIdY1jymECN2ptefmQ4+e3EQB/S8gyIE0o= -sigs.k8s.io/container-object-storage-interface-spec v0.0.0-20210224211525-dfa3af562c18 h1:TIx7kV6/3ZSQ5BETBx1QG1Va28zv1LZAvqRjs28n8ss= -sigs.k8s.io/container-object-storage-interface-spec v0.0.0-20210224211525-dfa3af562c18/go.mod h1:kafkL5l/lTUrZXhVi/9p1GzpEE/ts29BkWkL3Ao33WU= +sigs.k8s.io/container-object-storage-interface-api v0.0.0-20210330175159-2cdabb1a5dc7 h1:M2ZMhWdq9Az8TFj8G6ZffFUpR4XG7Qy8h8ZGsZhi9Xg= +sigs.k8s.io/container-object-storage-interface-api v0.0.0-20210330175159-2cdabb1a5dc7/go.mod h1:5n4lNKN4uOMW2NTqJ9r8qRAiqh5dZRZB7CNOkFihLfM= +sigs.k8s.io/container-object-storage-interface-spec v0.0.0-20210329232956-3bbacbbc9c19 h1:LrLrBCBqO7O/VjJtTrDSj3/f7hLSQaCIouLZFnHGxFg= +sigs.k8s.io/container-object-storage-interface-spec v0.0.0-20210329232956-3bbacbbc9c19/go.mod h1:kafkL5l/lTUrZXhVi/9p1GzpEE/ts29BkWkL3Ao33WU= sigs.k8s.io/controller-runtime v0.6.3 h1:SBbr+inLPEKhvlJtrvDcwIpm+uhDvp63Bl72xYJtoOE= sigs.k8s.io/controller-runtime v0.6.3/go.mod h1:WlZNXcM0++oyaQt4B7C2lEE5JYRs8vJUzRP4N4JpdAY= sigs.k8s.io/controller-tools v0.4.1 h1:VkuV0MxlRPmRu5iTgBZU4UxUX2LiR99n3sdQGRxZF4w= diff --git a/pkg/bucketaccessrequest/bucketaccessrequest.go b/pkg/bucketaccessrequest/bucketaccessrequest.go index ac668fe0..f667fb0a 100644 --- a/pkg/bucketaccessrequest/bucketaccessrequest.go +++ b/pkg/bucketaccessrequest/bucketaccessrequest.go @@ -7,6 +7,7 @@ import ( "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" kubeclientset "k8s.io/client-go/kubernetes" + "k8s.io/client-go/util/retry" "github.com/kubernetes-sigs/container-object-storage-interface-controller/pkg/util" "sigs.k8s.io/container-object-storage-interface-api/apis/objectstorage.k8s.io/v1alpha1" @@ -78,7 +79,7 @@ func (b *bucketAccessRequestListener) provisionBucketAccess(ctx context.Context, name := string(bucketAccessRequest.GetUID()) - if bucketAccessRequest.Spec.BucketAccessName != "" { + if bucketAccessRequest.Status.BucketAccessName != "" { return util.ErrBucketAccessAlreadyExists } @@ -101,7 +102,7 @@ func (b *bucketAccessRequestListener) provisionBucketAccess(ctx context.Context, return err } - if bucketRequest.Spec.BucketInstanceName == "" { + if bucketRequest.Status.BucketName == "" || !bucketRequest.Status.BucketAvailable { return util.ErrWaitForBucketProvisioning } @@ -117,7 +118,8 @@ func (b *bucketAccessRequestListener) provisionBucketAccess(ctx context.Context, bucketaccess := &v1alpha1.BucketAccess{} bucketaccess.Name = name - bucketaccess.Spec.BucketInstanceName = bucketRequest.Spec.BucketInstanceName + bucketaccess.Spec.BucketName = bucketRequest.Status.BucketName + bucketaccess.Spec.BucketAccessRequest = &v1.ObjectReference{ Name: bucketAccessRequest.Name, Namespace: bucketAccessRequest.Namespace, @@ -134,7 +136,7 @@ func (b *bucketAccessRequestListener) provisionBucketAccess(ctx context.Context, return err } // bucketaccess.Spec.Principal - set by the driver - bucketaccess.Spec.Provisioner = bucketAccessClass.Provisioner + bucketaccess.Spec.Parameters = util.CopySS(bucketAccessClass.Parameters) bucketaccess, err = baClient.Create(context.Background(), bucketaccess, metav1.CreateOptions{}) @@ -142,8 +144,15 @@ func (b *bucketAccessRequestListener) provisionBucketAccess(ctx context.Context, return err } - bucketAccessRequest.Spec.BucketAccessName = bucketaccess.Name - _, err = barClient(bucketAccessRequest.Namespace).Update(ctx, bucketAccessRequest, metav1.UpdateOptions{}) + err = retry.RetryOnConflict(retry.DefaultRetry, func() error { + bucketAccessRequest.Status.BucketAccessName = bucketaccess.Name + bucketAccessRequest.Status.AccessGranted = true + _, err := barClient(bucketAccessRequest.Namespace).UpdateStatus(ctx, bucketAccessRequest, metav1.UpdateOptions{}) + if err != nil { + return err + } + return nil + }) if err != nil { return err } diff --git a/pkg/bucketaccessrequest/bucketaccessrequest_test.go b/pkg/bucketaccessrequest/bucketaccessrequest_test.go index 212041bd..9a7b05d9 100644 --- a/pkg/bucketaccessrequest/bucketaccessrequest_test.go +++ b/pkg/bucketaccessrequest/bucketaccessrequest_test.go @@ -55,7 +55,6 @@ var goldAccessClass = types.BucketAccessClass{ ObjectMeta: metav1.ObjectMeta{ Name: "classaccessgold", }, - Provisioner: "provisioner1", PolicyActionsConfigMap: &v1.ObjectReference{Name: "testconfigmap", Namespace: "default"}, Parameters: classGoldAccessParameters, } @@ -71,9 +70,12 @@ var bucketRequest1 = types.BucketRequest{ UID: "br-12345", }, Spec: types.BucketRequestSpec{ - BucketPrefix: "cosi", - BucketClassName: "classgold", - BucketInstanceName: "cosi1234567890", + BucketPrefix: "cosi", + BucketClassName: "classgold", + }, + Status: types.BucketRequestStatus{ + BucketName: "cosi1234567890", + BucketAvailable: true, }, } diff --git a/pkg/bucketrequest/bucketrequest.go b/pkg/bucketrequest/bucketrequest.go index 6c3c3641..a9ccb77a 100644 --- a/pkg/bucketrequest/bucketrequest.go +++ b/pkg/bucketrequest/bucketrequest.go @@ -6,6 +6,7 @@ import ( v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/util/retry" "github.com/kubernetes-sigs/container-object-storage-interface-controller/pkg/util" kubeclientset "k8s.io/client-go/kubernetes" @@ -100,7 +101,7 @@ func (b *bucketRequestListener) provisionBucketRequestOperation(ctx context.Cont } name = name + string(bucketRequest.GetUID()) - if bucketRequest.Spec.BucketInstanceName != "" { + if bucketRequest.Status.BucketName != "" { return util.ErrBucketAlreadyExists } @@ -108,10 +109,10 @@ func (b *bucketRequestListener) provisionBucketRequestOperation(ctx context.Cont bucket := &v1alpha1.Bucket{} bucket.Name = name + bucket.Spec.BucketID = name bucket.Spec.Provisioner = bucketClass.Provisioner - bucket.Spec.RetentionPolicy = bucketClass.RetentionPolicy - bucket.Spec.AnonymousAccessMode = bucketClass.AnonymousAccessMode bucket.Spec.BucketClassName = bucketClass.Name + bucket.Spec.DeletionPolicy = bucketClass.DeletionPolicy bucket.Spec.BucketRequest = &v1.ObjectReference{ Name: bucketRequest.Name, Namespace: bucketRequest.Namespace, @@ -127,11 +128,19 @@ func (b *bucketRequestListener) provisionBucketRequestOperation(ctx context.Cont return err } - bucketRequest.Spec.BucketInstanceName = bucket.Name - _, err = b.BucketRequests(bucketRequest.Namespace).Update(ctx, bucketRequest, metav1.UpdateOptions{}) + err = retry.RetryOnConflict(retry.DefaultRetry, func() error { + bucketRequest.Status.BucketName = bucket.Name + bucketRequest.Status.BucketAvailable = true + _, err := b.BucketRequests(bucketRequest.Namespace).UpdateStatus(ctx, bucketRequest, metav1.UpdateOptions{}) + if err != nil { + return err + } + return nil + }) if err != nil { return err } + klog.Infof("Finished creating Bucket %v", bucket.Name) return nil } @@ -147,7 +156,7 @@ func (b *bucketRequestListener) getBucketClass(bucketRequest *v1alpha1.BucketReq // cloneTheBucket clones a bucket to a different namespace when a BR is for brownfield. func (b *bucketRequestListener) cloneTheBucket(bucketRequest *v1alpha1.BucketRequest) error { - klog.InfoS("Cloning Bucket", "name", bucketRequest.Spec.BucketInstanceName) + klog.InfoS("Cloning Bucket", "name", bucketRequest.Status.BucketName) return util.ErrNotImplemented } diff --git a/pkg/bucketrequest/bucketrequest_test.go b/pkg/bucketrequest/bucketrequest_test.go index 342bb3a5..c07fea21 100644 --- a/pkg/bucketrequest/bucketrequest_test.go +++ b/pkg/bucketrequest/bucketrequest_test.go @@ -26,9 +26,16 @@ var goldClass = types.BucketClass{ ObjectMeta: metav1.ObjectMeta{ Name: "classgold", }, - AllowedNamespaces: []string{"default", "cosins"}, - Parameters: classGoldParameters, - Protocol: types.Protocol{Name: "s3"}, + AllowedNamespaces: []string{"default", "cosins"}, + Parameters: classGoldParameters, + Protocol: types.Protocol{ + S3: &types.S3Protocol{ + Endpoint: "endpoint", + BucketName: "cosibucket", + Region: "us-east-1", + SignatureVersion: "S3V4", + }, + }, IsDefaultBucketClass: false, } diff --git a/pkg/util/util.go b/pkg/util/util.go index a3a4e1f6..1d14d359 100644 --- a/pkg/util/util.go +++ b/pkg/util/util.go @@ -165,7 +165,7 @@ func GetBuckets(ctx context.Context, client bucketclientset.Interface, numExpect // This is used by bucket request unit tests func ValidateBucket(bucket types.Bucket, bucketrequest types.BucketRequest, bucketclass types.BucketClass) bool { if strings.HasPrefix(bucket.Name, bucketrequest.Spec.BucketPrefix) && - bucketrequest.Spec.BucketInstanceName == bucket.Name && + bucketrequest.Status.BucketName == bucket.Name && bucket.Spec.BucketClassName == bucketrequest.Spec.BucketClassName && bucket.Spec.BucketRequest.Name == bucketrequest.Name && bucket.Spec.BucketRequest.Namespace == bucketrequest.Namespace && @@ -173,8 +173,7 @@ func ValidateBucket(bucket types.Bucket, bucketrequest types.BucketRequest, buck bucket.Spec.BucketClassName == bucketclass.Name && reflect.DeepEqual(bucket.Spec.Parameters, bucketclass.Parameters) && bucket.Spec.Provisioner == bucketclass.Provisioner && - bucket.Spec.RetentionPolicy == bucketclass.RetentionPolicy && - bucket.Spec.AnonymousAccessMode == bucketclass.AnonymousAccessMode { + bucket.Spec.DeletionPolicy == bucketclass.DeletionPolicy { return true } return false @@ -202,12 +201,11 @@ func GetBucketAccesses(ctx context.Context, client bucketclientset.Interface, nu // Validates the content of the bucket access against bucket access request and backet access class // This is used by bucket access request unit tests func ValidateBucketAccess(bucketaccess types.BucketAccess, bucketaccessrequest types.BucketAccessRequest, bucketaccessclass types.BucketAccessClass) bool { - if bucketaccess.Spec.BucketInstanceName != "" && - bucketaccessrequest.Spec.BucketAccessName == bucketaccess.Name && + if bucketaccess.Spec.BucketName != "" && + bucketaccessrequest.Status.BucketAccessName == bucketaccess.Name && bucketaccess.Spec.BucketAccessRequest.UID == bucketaccessrequest.UID && bucketaccess.Spec.ServiceAccount.Name == bucketaccessrequest.Spec.ServiceAccountName && - bucketaccess.Spec.PolicyActionsConfigMapData != "" && - bucketaccess.Spec.Provisioner == bucketaccessclass.Provisioner { + bucketaccess.Spec.PolicyActionsConfigMapData != "" { return true } return false diff --git a/resources/deployment.yaml b/resources/deployment.yaml index c48e7487..452ec018 100644 --- a/resources/deployment.yaml +++ b/resources/deployment.yaml @@ -31,6 +31,7 @@ spec: serviceAccountName: objectstorage-controller-sa containers: - name: objectstorage-controller - image: quay.io/containerobjectstorage/objectstorage-controller:latest + image: quay.io/containerobjectstorage/objectstorage-controller:canary + imagePullPolicy: Always args: - "--v=5" diff --git a/resources/rbac.yaml b/resources/rbac.yaml index 9b554c3c..1005c358 100644 --- a/resources/rbac.yaml +++ b/resources/rbac.yaml @@ -11,7 +11,7 @@ metadata: app.kubernetes.io/name: container-object-storage-interface-controller rules: - apiGroups: ["objectstorage.k8s.io"] - resources: ["bucketrequests", "bucketaccessrequests"] + resources: ["bucketrequests", "bucketaccessrequests", "bucketrequests/status", "bucketaccessrequests/status"] verbs: ["get", "list", "watch", "update"] - apiGroups: ["objectstorage.k8s.io"] resources: ["buckets", "bucketaccesses"] From 23f68336946c0f23075179a3d1ecad18817efde1 Mon Sep 17 00:00:00 2001 From: Krish Chowdhary Date: Mon, 19 Apr 2021 10:45:03 -0400 Subject: [PATCH 162/242] move to sigs.k8s.io, remove retry logic in cosi-controller --- cmd/controller-manager/controller-manager.go | 4 ++-- go.mod | 4 ++-- go.sum | 4 ++-- .../bucketaccessrequest.go | 17 +++++--------- .../bucketaccessrequest_test.go | 6 ++--- pkg/bucketrequest/bucketrequest.go | 22 +++++++------------ pkg/bucketrequest/bucketrequest_test.go | 6 ++--- 7 files changed, 25 insertions(+), 38 deletions(-) diff --git a/cmd/controller-manager/controller-manager.go b/cmd/controller-manager/controller-manager.go index 7d9dc866..026d7022 100644 --- a/cmd/controller-manager/controller-manager.go +++ b/cmd/controller-manager/controller-manager.go @@ -10,9 +10,9 @@ import ( "github.com/spf13/cobra" "github.com/spf13/viper" - "github.com/kubernetes-sigs/container-object-storage-interface-controller/pkg/bucketaccessrequest" - "github.com/kubernetes-sigs/container-object-storage-interface-controller/pkg/bucketrequest" bucketcontroller "sigs.k8s.io/container-object-storage-interface-api/controller" + "sigs.k8s.io/container-object-storage-interface-controller/pkg/bucketaccessrequest" + "sigs.k8s.io/container-object-storage-interface-controller/pkg/bucketrequest" "k8s.io/klog/v2" ) diff --git a/go.mod b/go.mod index 48c3e486..c9616b89 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/kubernetes-sigs/container-object-storage-interface-controller +module sigs.k8s.io/container-object-storage-interface-controller go 1.15 @@ -28,6 +28,6 @@ require ( k8s.io/client-go v0.19.4 k8s.io/klog/v2 v2.4.0 k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd // indirect - sigs.k8s.io/container-object-storage-interface-api v0.0.0-20210330175159-2cdabb1a5dc7 + sigs.k8s.io/container-object-storage-interface-api v0.0.0-20210416205422-83cd0d53ce7f sigs.k8s.io/controller-tools v0.4.1 ) diff --git a/go.sum b/go.sum index 563f80e6..b8cccccf 100644 --- a/go.sum +++ b/go.sum @@ -783,8 +783,8 @@ k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/ rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.9/go.mod h1:dzAXnQbTRyDlZPJX2SUPEqvnB+j7AJjtlox7PEwigU0= -sigs.k8s.io/container-object-storage-interface-api v0.0.0-20210330175159-2cdabb1a5dc7 h1:M2ZMhWdq9Az8TFj8G6ZffFUpR4XG7Qy8h8ZGsZhi9Xg= -sigs.k8s.io/container-object-storage-interface-api v0.0.0-20210330175159-2cdabb1a5dc7/go.mod h1:5n4lNKN4uOMW2NTqJ9r8qRAiqh5dZRZB7CNOkFihLfM= +sigs.k8s.io/container-object-storage-interface-api v0.0.0-20210416205422-83cd0d53ce7f h1:LtkVxN0N+qKHLuYE/N5qxSkJv/3bWkr3+9ZBVwiq1tw= +sigs.k8s.io/container-object-storage-interface-api v0.0.0-20210416205422-83cd0d53ce7f/go.mod h1:WTzZGS4Q6MdQqDihJdMh2kCvqMx9Amhx0KIainA4lXQ= sigs.k8s.io/container-object-storage-interface-spec v0.0.0-20210329232956-3bbacbbc9c19 h1:LrLrBCBqO7O/VjJtTrDSj3/f7hLSQaCIouLZFnHGxFg= sigs.k8s.io/container-object-storage-interface-spec v0.0.0-20210329232956-3bbacbbc9c19/go.mod h1:kafkL5l/lTUrZXhVi/9p1GzpEE/ts29BkWkL3Ao33WU= sigs.k8s.io/controller-runtime v0.6.3 h1:SBbr+inLPEKhvlJtrvDcwIpm+uhDvp63Bl72xYJtoOE= diff --git a/pkg/bucketaccessrequest/bucketaccessrequest.go b/pkg/bucketaccessrequest/bucketaccessrequest.go index f667fb0a..68836a64 100644 --- a/pkg/bucketaccessrequest/bucketaccessrequest.go +++ b/pkg/bucketaccessrequest/bucketaccessrequest.go @@ -7,14 +7,13 @@ import ( "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" kubeclientset "k8s.io/client-go/kubernetes" - "k8s.io/client-go/util/retry" + "k8s.io/klog/v2" - "github.com/kubernetes-sigs/container-object-storage-interface-controller/pkg/util" "sigs.k8s.io/container-object-storage-interface-api/apis/objectstorage.k8s.io/v1alpha1" bucketclientset "sigs.k8s.io/container-object-storage-interface-api/clientset" bucketcontroller "sigs.k8s.io/container-object-storage-interface-api/controller" - "k8s.io/klog/v2" + "sigs.k8s.io/container-object-storage-interface-controller/pkg/util" ) type bucketAccessRequestListener struct { @@ -144,15 +143,9 @@ func (b *bucketAccessRequestListener) provisionBucketAccess(ctx context.Context, return err } - err = retry.RetryOnConflict(retry.DefaultRetry, func() error { - bucketAccessRequest.Status.BucketAccessName = bucketaccess.Name - bucketAccessRequest.Status.AccessGranted = true - _, err := barClient(bucketAccessRequest.Namespace).UpdateStatus(ctx, bucketAccessRequest, metav1.UpdateOptions{}) - if err != nil { - return err - } - return nil - }) + bucketAccessRequest.Status.BucketAccessName = bucketaccess.Name + bucketAccessRequest.Status.AccessGranted = true + _, err = barClient(bucketAccessRequest.Namespace).UpdateStatus(ctx, bucketAccessRequest, metav1.UpdateOptions{}) if err != nil { return err } diff --git a/pkg/bucketaccessrequest/bucketaccessrequest_test.go b/pkg/bucketaccessrequest/bucketaccessrequest_test.go index 9a7b05d9..fb729da0 100644 --- a/pkg/bucketaccessrequest/bucketaccessrequest_test.go +++ b/pkg/bucketaccessrequest/bucketaccessrequest_test.go @@ -6,12 +6,12 @@ import ( v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/client-go/kubernetes/fake" - bucketclientset "sigs.k8s.io/container-object-storage-interface-api/clientset/fake" - "github.com/kubernetes-sigs/container-object-storage-interface-controller/pkg/util" types "sigs.k8s.io/container-object-storage-interface-api/apis/objectstorage.k8s.io/v1alpha1" + bucketclientset "sigs.k8s.io/container-object-storage-interface-api/clientset/fake" + + "sigs.k8s.io/container-object-storage-interface-controller/pkg/util" ) var sa1 = v1.ServiceAccount{ diff --git a/pkg/bucketrequest/bucketrequest.go b/pkg/bucketrequest/bucketrequest.go index a9ccb77a..e7fdaaf3 100644 --- a/pkg/bucketrequest/bucketrequest.go +++ b/pkg/bucketrequest/bucketrequest.go @@ -6,15 +6,14 @@ import ( v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/client-go/util/retry" - - "github.com/kubernetes-sigs/container-object-storage-interface-controller/pkg/util" kubeclientset "k8s.io/client-go/kubernetes" + "k8s.io/klog/v2" + "sigs.k8s.io/container-object-storage-interface-api/apis/objectstorage.k8s.io/v1alpha1" bucketclientset "sigs.k8s.io/container-object-storage-interface-api/clientset" objectstoragev1alpha1 "sigs.k8s.io/container-object-storage-interface-api/clientset/typed/objectstorage.k8s.io/v1alpha1" - "k8s.io/klog/v2" + "sigs.k8s.io/container-object-storage-interface-controller/pkg/util" ) // bucketRequestListener is a resource handler for bucket requests objects @@ -109,7 +108,7 @@ func (b *bucketRequestListener) provisionBucketRequestOperation(ctx context.Cont bucket := &v1alpha1.Bucket{} bucket.Name = name - bucket.Spec.BucketID = name + bucket.Status.BucketID = name bucket.Spec.Provisioner = bucketClass.Provisioner bucket.Spec.BucketClassName = bucketClass.Name bucket.Spec.DeletionPolicy = bucketClass.DeletionPolicy @@ -128,18 +127,13 @@ func (b *bucketRequestListener) provisionBucketRequestOperation(ctx context.Cont return err } - err = retry.RetryOnConflict(retry.DefaultRetry, func() error { - bucketRequest.Status.BucketName = bucket.Name - bucketRequest.Status.BucketAvailable = true - _, err := b.BucketRequests(bucketRequest.Namespace).UpdateStatus(ctx, bucketRequest, metav1.UpdateOptions{}) - if err != nil { - return err - } - return nil - }) + bucketRequest.Status.BucketName = bucket.Name + bucketRequest.Status.BucketAvailable = true + _, err = b.BucketRequests(bucketRequest.Namespace).UpdateStatus(ctx, bucketRequest, metav1.UpdateOptions{}) if err != nil { return err } + klog.Infof("Finished creating Bucket %v", bucket.Name) return nil } diff --git a/pkg/bucketrequest/bucketrequest_test.go b/pkg/bucketrequest/bucketrequest_test.go index c07fea21..eb13aeb8 100644 --- a/pkg/bucketrequest/bucketrequest_test.go +++ b/pkg/bucketrequest/bucketrequest_test.go @@ -5,12 +5,12 @@ import ( "testing" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/client-go/kubernetes/fake" - bucketclientset "sigs.k8s.io/container-object-storage-interface-api/clientset/fake" - "github.com/kubernetes-sigs/container-object-storage-interface-controller/pkg/util" types "sigs.k8s.io/container-object-storage-interface-api/apis/objectstorage.k8s.io/v1alpha1" + bucketclientset "sigs.k8s.io/container-object-storage-interface-api/clientset/fake" + + "sigs.k8s.io/container-object-storage-interface-controller/pkg/util" ) var classGoldParameters = map[string]string{ From 392ee587932b2c764d9600854b049897f0979b4e Mon Sep 17 00:00:00 2001 From: Krish Chowdhary Date: Tue, 4 May 2021 16:39:29 -0400 Subject: [PATCH 163/242] removes endpoint, bucketName fields from protocol structs --- cosi.pb.go | 441 +++++++++++++++++++++++------------------------------ cosi.proto | 36 ++--- spec.md | 36 ++--- 3 files changed, 211 insertions(+), 302 deletions(-) diff --git a/cosi.pb.go b/cosi.pb.go index 8e162e55..29c8c0fc 100644 --- a/cosi.pb.go +++ b/cosi.pb.go @@ -148,14 +148,10 @@ type S3 struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // endpoint denotes the URL of the S3 server - Endpoint string `protobuf:"bytes,1,opt,name=endpoint,proto3" json:"endpoint,omitempty"` - // bucket_name denotes the name of the bucket in the storage backend - BucketName string `protobuf:"bytes,2,opt,name=bucket_name,json=bucketName,proto3" json:"bucket_name,omitempty"` // region denotes the geographical region where the S3 server is running - Region string `protobuf:"bytes,3,opt,name=region,proto3" json:"region,omitempty"` + Region string `protobuf:"bytes,1,opt,name=region,proto3" json:"region,omitempty"` // signature_version denotes the signature version for signing all s3 requests - SignatureVersion S3SignatureVersion `protobuf:"varint,4,opt,name=signature_version,json=signatureVersion,proto3,enum=cosi.v1alpha1.S3SignatureVersion" json:"signature_version,omitempty"` + SignatureVersion S3SignatureVersion `protobuf:"varint,2,opt,name=signature_version,json=signatureVersion,proto3,enum=cosi.v1alpha1.S3SignatureVersion" json:"signature_version,omitempty"` } func (x *S3) Reset() { @@ -190,20 +186,6 @@ func (*S3) Descriptor() ([]byte, []int) { return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{0} } -func (x *S3) GetEndpoint() string { - if x != nil { - return x.Endpoint - } - return "" -} - -func (x *S3) GetBucketName() string { - if x != nil { - return x.BucketName - } - return "" -} - func (x *S3) GetRegion() string { if x != nil { return x.Region @@ -223,10 +205,8 @@ type AzureBlob struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // container_name is the name of the azure container - ContainerName string `protobuf:"bytes,1,opt,name=container_name,json=containerName,proto3" json:"container_name,omitempty"` // storage_account is the id of the azure storage account - StorageAccount string `protobuf:"bytes,2,opt,name=storage_account,json=storageAccount,proto3" json:"storage_account,omitempty"` + StorageAccount string `protobuf:"bytes,1,opt,name=storage_account,json=storageAccount,proto3" json:"storage_account,omitempty"` } func (x *AzureBlob) Reset() { @@ -261,13 +241,6 @@ func (*AzureBlob) Descriptor() ([]byte, []int) { return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{1} } -func (x *AzureBlob) GetContainerName() string { - if x != nil { - return x.ContainerName - } - return "" -} - func (x *AzureBlob) GetStorageAccount() string { if x != nil { return x.StorageAccount @@ -280,14 +253,12 @@ type GCS struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // bucket_name denotes the name of the bucket in the storage backend - BucketName string `protobuf:"bytes,1,opt,name=bucket_name,json=bucketName,proto3" json:"bucket_name,omitempty"` // private_key_name denotes the name of the private key in the storage backend - PrivateKeyName string `protobuf:"bytes,2,opt,name=private_key_name,json=privateKeyName,proto3" json:"private_key_name,omitempty"` + PrivateKeyName string `protobuf:"bytes,1,opt,name=private_key_name,json=privateKeyName,proto3" json:"private_key_name,omitempty"` // project_id denotes the name of the project id in the storage backend - ProjectId string `protobuf:"bytes,3,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` + ProjectId string `protobuf:"bytes,2,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` // service_account denotes the name of the service account in the storage backend - ServiceAccount string `protobuf:"bytes,4,opt,name=service_account,json=serviceAccount,proto3" json:"service_account,omitempty"` + ServiceAccount string `protobuf:"bytes,3,opt,name=service_account,json=serviceAccount,proto3" json:"service_account,omitempty"` } func (x *GCS) Reset() { @@ -322,13 +293,6 @@ func (*GCS) Descriptor() ([]byte, []int) { return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{2} } -func (x *GCS) GetBucketName() string { - if x != nil { - return x.BucketName - } - return "" -} - func (x *GCS) GetPrivateKeyName() string { if x != nil { return x.PrivateKeyName @@ -837,11 +801,8 @@ type ProvisionerGrantBucketAccessResponse struct { // be required later to revoke access. AccountId string `protobuf:"bytes,1,opt,name=account_id,json=accountId,proto3" json:"account_id,omitempty"` // This field is OPTIONAL - // Contents of the credential file, ex: aws access key id and secret, etc. - CredentialsFileContents string `protobuf:"bytes,2,opt,name=credentials_file_contents,json=credentialsFileContents,proto3" json:"credentials_file_contents,omitempty"` - // This field is OPTIONAL - // Path where the credential file will be mounted. - CredentialsFilePath string `protobuf:"bytes,3,opt,name=credentials_file_path,json=credentialsFilePath,proto3" json:"credentials_file_path,omitempty"` + // Credentials supplied for accessing the bucket ex: aws access key id and secret, etc. + Credentials string `protobuf:"bytes,2,opt,name=credentials,proto3" json:"credentials,omitempty"` } func (x *ProvisionerGrantBucketAccessResponse) Reset() { @@ -883,16 +844,9 @@ func (x *ProvisionerGrantBucketAccessResponse) GetAccountId() string { return "" } -func (x *ProvisionerGrantBucketAccessResponse) GetCredentialsFileContents() string { - if x != nil { - return x.CredentialsFileContents - } - return "" -} - -func (x *ProvisionerGrantBucketAccessResponse) GetCredentialsFilePath() string { +func (x *ProvisionerGrantBucketAccessResponse) GetCredentials() string { if x != nil { - return x.CredentialsFilePath + return x.Credentials } return "" } @@ -1129,200 +1083,187 @@ var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDesc 0x12, 0x0d, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x22, 0xa9, 0x01, 0x0a, 0x02, 0x53, 0x33, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, - 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x4e, 0x0a, - 0x11, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x33, 0x53, 0x69, 0x67, 0x6e, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x73, 0x69, 0x67, - 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x5b, 0x0a, - 0x09, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x42, 0x6c, 0x6f, 0x62, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x61, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x74, 0x6f, 0x72, - 0x61, 0x67, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x98, 0x01, 0x0a, 0x03, 0x47, - 0x43, 0x53, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x6b, - 0x65, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, - 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, - 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0f, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x99, 0x01, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x12, 0x23, 0x0a, 0x02, 0x73, 0x33, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, - 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, - 0x33, 0x48, 0x00, 0x52, 0x02, 0x73, 0x33, 0x12, 0x38, 0x0a, 0x09, 0x61, 0x7a, 0x75, 0x72, 0x65, - 0x42, 0x6c, 0x6f, 0x62, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6f, 0x73, - 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, - 0x42, 0x6c, 0x6f, 0x62, 0x48, 0x00, 0x52, 0x09, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x42, 0x6c, 0x6f, - 0x62, 0x12, 0x26, 0x0a, 0x03, 0x67, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, - 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, - 0x43, 0x53, 0x48, 0x00, 0x52, 0x03, 0x67, 0x63, 0x73, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x22, 0x1b, 0x0a, 0x19, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, - 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x30, - 0x0a, 0x1a, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x65, 0x74, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x22, 0x87, 0x02, 0x0a, 0x1e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x73, 0x69, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x5d, 0x0a, 0x0a, - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x3d, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3e, 0x0a, 0x1f, 0x50, 0x72, + 0x6f, 0x22, 0x6c, 0x0a, 0x02, 0x53, 0x33, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, + 0x4e, 0x0a, 0x11, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x63, 0x6f, 0x73, + 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x33, 0x53, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x73, + 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x34, 0x0a, 0x09, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x42, 0x6c, 0x6f, 0x62, 0x12, 0x27, 0x0a, 0x0f, + 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x41, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x77, 0x0a, 0x03, 0x47, 0x43, 0x53, 0x12, 0x28, 0x0a, 0x10, + 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, + 0x65, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x99, + 0x01, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x23, 0x0a, 0x02, 0x73, + 0x33, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x33, 0x48, 0x00, 0x52, 0x02, 0x73, 0x33, + 0x12, 0x38, 0x0a, 0x09, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x42, 0x6c, 0x6f, 0x62, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x42, 0x6c, 0x6f, 0x62, 0x48, 0x00, 0x52, + 0x09, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x42, 0x6c, 0x6f, 0x62, 0x12, 0x26, 0x0a, 0x03, 0x67, 0x63, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x43, 0x53, 0x48, 0x00, 0x52, 0x03, 0x67, + 0x63, 0x73, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x1b, 0x0a, 0x19, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x30, 0x0a, 0x1a, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x87, 0x02, 0x0a, 0x1e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, - 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, - 0x09, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x22, 0x3d, 0x0a, 0x1e, 0x50, 0x72, - 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, - 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, - 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x22, 0x21, 0x0a, 0x1f, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, - 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xad, 0x02, 0x0a, - 0x23, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, - 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x49, - 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x70, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x62, 0x0a, 0x0a, 0x70, 0x61, 0x72, - 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, - 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, - 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, - 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x3d, 0x0a, - 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb5, 0x01, 0x0a, - 0x24, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, - 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x49, 0x64, 0x12, 0x3a, 0x0a, 0x19, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x61, 0x6c, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x61, 0x6c, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, - 0x12, 0x32, 0x0a, 0x15, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x5f, - 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x13, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x46, 0x69, 0x6c, 0x65, - 0x50, 0x61, 0x74, 0x68, 0x22, 0x62, 0x0a, 0x24, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, - 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x27, 0x0a, 0x25, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, - 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x2a, 0x3e, 0x0a, 0x12, 0x53, 0x33, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x10, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, - 0x77, 0x6e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x10, 0x00, 0x12, 0x08, 0x0a, - 0x04, 0x53, 0x33, 0x56, 0x32, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x33, 0x56, 0x34, 0x10, - 0x02, 0x2a, 0x71, 0x0a, 0x19, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x6f, 0x75, 0x73, 0x42, 0x75, - 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1b, - 0x0a, 0x17, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, - 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, - 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, - 0x6e, 0x6c, 0x79, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, - 0x74, 0x65, 0x10, 0x04, 0x32, 0x77, 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, - 0x12, 0x6b, 0x0a, 0x12, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, - 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x28, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x29, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x32, 0x9c, 0x04, - 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x12, 0x7a, 0x0a, - 0x17, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x2d, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7a, 0x0a, 0x17, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, - 0x63, 0x6b, 0x65, 0x74, 0x12, 0x2d, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x87, 0x01, 0x0a, 0x1c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, + 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x33, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x5d, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x63, 0x6f, 0x73, 0x69, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0x3e, 0x0a, 0x1f, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x49, 0x64, 0x22, 0x3d, 0x0a, 0x1e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, + 0x49, 0x64, 0x22, 0x21, 0x0a, 0x1f, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, + 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xad, 0x02, 0x0a, 0x23, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, - 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x32, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, + 0x09, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, + 0x0d, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x12, 0x62, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x63, 0x6f, 0x73, - 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, - 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x8a, 0x01, 0x0a, 0x1d, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, - 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x12, 0x33, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x76, + 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x67, 0x0a, 0x24, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, + 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, + 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x22, 0x62, + 0x0a, 0x24, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3a, 0x3c, 0x0a, 0x0a, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, - 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x09, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x45, 0x6e, 0x75, 0x6d, 0x3a, 0x4c, 0x0a, 0x10, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x45, - 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x3f, 0x0a, 0x0b, 0x63, 0x6f, 0x73, 0x69, - 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa3, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x63, - 0x6f, 0x73, 0x69, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x3a, 0x3f, 0x0a, 0x0b, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x3a, 0x45, 0x0a, 0x0d, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x49, 0x64, 0x22, 0x27, 0x0a, 0x25, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, + 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x3e, 0x0a, 0x12, 0x53, + 0x33, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x14, 0x0a, 0x10, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x69, 0x67, 0x6e, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x33, 0x56, 0x32, 0x10, + 0x01, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x33, 0x56, 0x34, 0x10, 0x02, 0x2a, 0x71, 0x0a, 0x19, 0x41, + 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x6f, 0x75, 0x73, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x0a, 0x17, 0x55, 0x6e, 0x6b, 0x6e, + 0x6f, 0x77, 0x6e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, + 0x6f, 0x64, 0x65, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, + 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x02, + 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x03, 0x12, + 0x0d, 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x04, 0x32, 0x77, + 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x6b, 0x0a, 0x12, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x28, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x6f, 0x73, + 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x32, 0x9c, 0x04, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x12, 0x7a, 0x0a, 0x17, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, + 0x65, 0x74, 0x12, 0x2d, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2e, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x7a, 0x0a, 0x17, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x2d, + 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, + 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, + 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x87, 0x01, 0x0a, 0x1c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, + 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x12, 0x32, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, + 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, + 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8a, 0x01, 0x0a, 0x1d, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, + 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x33, 0x2e, 0x63, 0x6f, + 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, + 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x34, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, + 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3a, 0x3c, 0x0a, 0x0a, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, + 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x45, 0x6e, 0x75, 0x6d, 0x3a, 0x4c, 0x0a, 0x10, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x65, 0x6e, + 0x75, 0x6d, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0e, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x3f, 0x0a, 0x0b, 0x63, 0x6f, 0x73, 0x69, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, + 0x74, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0xa3, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x63, 0x6f, 0x73, 0x69, 0x53, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x3a, 0x3f, 0x0a, 0x0b, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x46, + 0x69, 0x65, 0x6c, 0x64, 0x3a, 0x45, 0x0a, 0x0d, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x42, 0x0a, 0x0c, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x3a, 0x42, 0x0a, 0x0c, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, - 0x64, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x4d, - 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3a, 0x45, 0x0a, 0x0d, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, 0x3a, 0x5a, 0x38, - 0x73, 0x69, 0x67, 0x73, 0x2e, 0x6b, 0x38, 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2d, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2d, 0x73, 0x74, 0x6f, - 0x72, 0x61, 0x67, 0x65, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2d, 0x73, - 0x70, 0x65, 0x63, 0x3b, 0x63, 0x6f, 0x73, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3a, + 0x45, 0x0a, 0x0d, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, 0x3a, 0x5a, 0x38, 0x73, 0x69, 0x67, 0x73, 0x2e, 0x6b, + 0x38, 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2d, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2d, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2d, 0x73, 0x70, 0x65, 0x63, 0x3b, 0x63, 0x6f, + 0x73, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1695,10 +1636,8 @@ type ProvisionerClient interface { // This call is made to delete the bucket in the backend. // If the bucket has already been deleted, then no error should be returned. ProvisionerDeleteBucket(ctx context.Context, in *ProvisionerDeleteBucketRequest, opts ...grpc.CallOption) (*ProvisionerDeleteBucketResponse, error) - // This call grants access to a particular principal. The principal is the account for which this access should be granted. - // If the principal is set, then it should be used as the username of the created credentials. - // If the principal is empty, then a new service account should be created in the backend that satisfies the requested access_policy. - // The principal returned in the response will be used as the unique identifier for deleting this access by calling ProvisionerRevokeBucketAccess. + // This call grants access to an account. The account_name in the request shall be used as a unique identifier to create credentials. + // The account_id returned in the response will be used as the unique identifier for deleting this access when calling ProvisionerRevokeBucketAccess. ProvisionerGrantBucketAccess(ctx context.Context, in *ProvisionerGrantBucketAccessRequest, opts ...grpc.CallOption) (*ProvisionerGrantBucketAccessResponse, error) // This call revokes all access to a particular bucket from a principal. ProvisionerRevokeBucketAccess(ctx context.Context, in *ProvisionerRevokeBucketAccessRequest, opts ...grpc.CallOption) (*ProvisionerRevokeBucketAccessResponse, error) @@ -1758,10 +1697,8 @@ type ProvisionerServer interface { // This call is made to delete the bucket in the backend. // If the bucket has already been deleted, then no error should be returned. ProvisionerDeleteBucket(context.Context, *ProvisionerDeleteBucketRequest) (*ProvisionerDeleteBucketResponse, error) - // This call grants access to a particular principal. The principal is the account for which this access should be granted. - // If the principal is set, then it should be used as the username of the created credentials. - // If the principal is empty, then a new service account should be created in the backend that satisfies the requested access_policy. - // The principal returned in the response will be used as the unique identifier for deleting this access by calling ProvisionerRevokeBucketAccess. + // This call grants access to an account. The account_name in the request shall be used as a unique identifier to create credentials. + // The account_id returned in the response will be used as the unique identifier for deleting this access when calling ProvisionerRevokeBucketAccess. ProvisionerGrantBucketAccess(context.Context, *ProvisionerGrantBucketAccessRequest) (*ProvisionerGrantBucketAccessResponse, error) // This call revokes all access to a particular bucket from a principal. ProvisionerRevokeBucketAccess(context.Context, *ProvisionerRevokeBucketAccessRequest) (*ProvisionerRevokeBucketAccessResponse, error) diff --git a/cosi.proto b/cosi.proto index a0e8c202..344f998a 100644 --- a/cosi.proto +++ b/cosi.proto @@ -68,10 +68,8 @@ service Provisioner { // If the bucket has already been deleted, then no error should be returned. rpc ProvisionerDeleteBucket (ProvisionerDeleteBucketRequest) returns (ProvisionerDeleteBucketResponse) {} - // This call grants access to a particular principal. The principal is the account for which this access should be granted. - // If the principal is set, then it should be used as the username of the created credentials. - // If the principal is empty, then a new service account should be created in the backend that satisfies the requested access_policy. - // The principal returned in the response will be used as the unique identifier for deleting this access by calling ProvisionerRevokeBucketAccess. + // This call grants access to an account. The account_name in the request shall be used as a unique identifier to create credentials. + // The account_id returned in the response will be used as the unique identifier for deleting this access when calling ProvisionerRevokeBucketAccess. rpc ProvisionerGrantBucketAccess (ProvisionerGrantBucketAccessRequest) returns (ProvisionerGrantBucketAccessResponse); // This call revokes all access to a particular bucket from a principal. rpc ProvisionerRevokeBucketAccess (ProvisionerRevokeBucketAccessRequest) returns (ProvisionerRevokeBucketAccessResponse); @@ -99,32 +97,24 @@ enum AnonymousBucketAccessMode { } message S3 { - // endpoint denotes the URL of the S3 server - string endpoint = 1; - // bucket_name denotes the name of the bucket in the storage backend - string bucket_name = 2; // region denotes the geographical region where the S3 server is running - string region = 3; + string region = 1; // signature_version denotes the signature version for signing all s3 requests - S3SignatureVersion signature_version = 4; + S3SignatureVersion signature_version = 2; } message AzureBlob { - // container_name is the name of the azure container - string container_name = 1; // storage_account is the id of the azure storage account - string storage_account = 2; + string storage_account = 1; } message GCS { - // bucket_name denotes the name of the bucket in the storage backend - string bucket_name = 1; // private_key_name denotes the name of the private key in the storage backend - string private_key_name = 2; + string private_key_name = 1; // project_id denotes the name of the project id in the storage backend - string project_id = 3; + string project_id = 2; // service_account denotes the name of the service account in the storage backend - string service_account = 4; + string service_account = 3; } message Protocol { @@ -212,14 +202,10 @@ message ProvisionerGrantBucketAccessResponse { string account_id = 1; // This field is OPTIONAL - // Contents of the credential file, ex: aws access key id and secret, etc. - string credentials_file_contents = 2; + // Credentials supplied for accessing the bucket ex: aws access key id and secret, etc. + string credentials = 2; +} - // This field is OPTIONAL - // Path where the credential file will be mounted. - string credentials_file_path = 3; -} - message ProvisionerRevokeBucketAccessRequest { // This field is REQUIRED // bucket_id is a globally unique identifier for the bucket diff --git a/spec.md b/spec.md index 0f3819f9..a5576094 100644 --- a/spec.md +++ b/spec.md @@ -195,10 +195,8 @@ service Provisioner { // If the bucket has already been deleted, then no error should be returned. rpc ProvisionerDeleteBucket (ProvisionerDeleteBucketRequest) returns (ProvisionerDeleteBucketResponse) {} - // This call grants access to a particular principal. The principal is the account for which this access should be granted. - // If the principal is set, then it should be used as the username of the created credentials. - // If the principal is empty, then a new service account should be created in the backend that satisfies the requested access_policy. - // The principal returned in the response will be used as the unique identifier for deleting this access by calling ProvisionerRevokeBucketAccess. + // This call grants access to an account. The account_name in the request shall be used as a unique identifier to create credentials. + // The account_id returned in the response will be used as the unique identifier for deleting this access when calling ProvisionerRevokeBucketAccess. rpc ProvisionerGrantBucketAccess (ProvisionerGrantBucketAccessRequest) returns (ProvisionerGrantBucketAccessResponse); // This call revokes all access to a particular bucket from a principal. rpc ProvisionerRevokeBucketAccess (ProvisionerRevokeBucketAccessRequest) returns (ProvisionerRevokeBucketAccessResponse); @@ -226,32 +224,24 @@ enum AnonymousBucketAccessMode { } message S3 { - // endpoint denotes the URL of the S3 server - string endpoint = 1; - // bucket_name denotes the name of the bucket in the storage backend - string bucket_name = 2; // region denotes the geographical region where the S3 server is running - string region = 3; + string region = 1; // signature_version denotes the signature version for signing all s3 requests - S3SignatureVersion signature_version = 4; + S3SignatureVersion signature_version = 2; } message AzureBlob { - // container_name is the name of the azure container - string container_name = 1; // storage_account is the id of the azure storage account - string storage_account = 2; + string storage_account = 1; } message GCS { - // bucket_name denotes the name of the bucket in the storage backend - string bucket_name = 1; // private_key_name denotes the name of the private key in the storage backend - string private_key_name = 2; + string private_key_name = 1; // project_id denotes the name of the project id in the storage backend - string project_id = 3; + string project_id = 2; // service_account denotes the name of the service account in the storage backend - string service_account = 4; + string service_account = 3; } message Protocol { @@ -339,14 +329,10 @@ message ProvisionerGrantBucketAccessResponse { string account_id = 1; // This field is OPTIONAL - // Contents of the credential file, ex: aws access key id and secret, etc. - string credentials_file_contents = 2; + // Credentials supplied for accessing the bucket ex: aws access key id and secret, etc. + string credentials = 2; +} - // This field is OPTIONAL - // Path where the credential file will be mounted. - string credentials_file_path = 3; -} - message ProvisionerRevokeBucketAccessRequest { // This field is REQUIRED // bucket_id is a globally unique identifier for the bucket From f1ac3296003ad2faf5ac0a163bb01bc92af17ff2 Mon Sep 17 00:00:00 2001 From: Krish Chowdhary Date: Tue, 11 May 2021 13:04:30 -0400 Subject: [PATCH 164/242] updated api/controller, adds bar/br finalizer logic --- go.mod | 3 ++- go.sum | 17 +++++++++++++++-- pkg/bucketaccessrequest/bucketaccessrequest.go | 15 +++++++++++++-- pkg/bucketrequest/bucketrequest.go | 11 +++++++++++ pkg/bucketrequest/bucketrequest_test.go | 2 -- 5 files changed, 41 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index c9616b89..b73dc9e3 100644 --- a/go.mod +++ b/go.mod @@ -28,6 +28,7 @@ require ( k8s.io/client-go v0.19.4 k8s.io/klog/v2 v2.4.0 k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd // indirect - sigs.k8s.io/container-object-storage-interface-api v0.0.0-20210416205422-83cd0d53ce7f + sigs.k8s.io/container-object-storage-interface-api v0.0.0-20210507174303-fac7c5076c3d + sigs.k8s.io/controller-runtime v0.6.3 sigs.k8s.io/controller-tools v0.4.1 ) diff --git a/go.sum b/go.sum index b8cccccf..b42a8434 100644 --- a/go.sum +++ b/go.sum @@ -50,12 +50,15 @@ github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:l github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= 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/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= 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= @@ -121,6 +124,7 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v0.2.0 h1:QvGt2nLcHH0WK9orKa+ppBPAxREcH364nPUedEpK0TY= github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-logr/zapr v0.1.0 h1:h+WVe9j6HAA01niTJPA/kKH0i7e0rLZBCwauQFcRE54= github.com/go-logr/zapr v0.1.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= 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= @@ -321,6 +325,7 @@ github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNx github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= 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 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= @@ -378,19 +383,23 @@ github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prY github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= 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.7.1 h1:NTGy1Ja9pByO+xAeH/qiWnLrKtr3hJPNjaVUwnjpdpA= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/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 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= 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.10.0 h1:RyRA7RzGXQZiW+tGMr7sxa85G1z0yOpM1qq5c8lNawc= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/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.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.1.3 h1:F0+tqvhOksq22sc6iCHF5WGlWjdwj92p0udFh1VFBS8= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= @@ -467,8 +476,11 @@ 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.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -646,6 +658,7 @@ golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gomodules.xyz/jsonpatch/v2 v2.0.1 h1:xyiBuvkD2g5n7cYzx6u2sxQvsAy4QJsZFCzGVdzOXZ0= gomodules.xyz/jsonpatch/v2 v2.0.1/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= @@ -783,8 +796,8 @@ k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/ rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.9/go.mod h1:dzAXnQbTRyDlZPJX2SUPEqvnB+j7AJjtlox7PEwigU0= -sigs.k8s.io/container-object-storage-interface-api v0.0.0-20210416205422-83cd0d53ce7f h1:LtkVxN0N+qKHLuYE/N5qxSkJv/3bWkr3+9ZBVwiq1tw= -sigs.k8s.io/container-object-storage-interface-api v0.0.0-20210416205422-83cd0d53ce7f/go.mod h1:WTzZGS4Q6MdQqDihJdMh2kCvqMx9Amhx0KIainA4lXQ= +sigs.k8s.io/container-object-storage-interface-api v0.0.0-20210507174303-fac7c5076c3d h1:4UhPuhdrRuoGmjbrpSBWPP+kT83zj9yBu66mXQLyuQA= +sigs.k8s.io/container-object-storage-interface-api v0.0.0-20210507174303-fac7c5076c3d/go.mod h1:WTzZGS4Q6MdQqDihJdMh2kCvqMx9Amhx0KIainA4lXQ= sigs.k8s.io/container-object-storage-interface-spec v0.0.0-20210329232956-3bbacbbc9c19 h1:LrLrBCBqO7O/VjJtTrDSj3/f7hLSQaCIouLZFnHGxFg= sigs.k8s.io/container-object-storage-interface-spec v0.0.0-20210329232956-3bbacbbc9c19/go.mod h1:kafkL5l/lTUrZXhVi/9p1GzpEE/ts29BkWkL3Ao33WU= sigs.k8s.io/controller-runtime v0.6.3 h1:SBbr+inLPEKhvlJtrvDcwIpm+uhDvp63Bl72xYJtoOE= diff --git a/pkg/bucketaccessrequest/bucketaccessrequest.go b/pkg/bucketaccessrequest/bucketaccessrequest.go index 68836a64..ab6e7957 100644 --- a/pkg/bucketaccessrequest/bucketaccessrequest.go +++ b/pkg/bucketaccessrequest/bucketaccessrequest.go @@ -8,6 +8,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" kubeclientset "k8s.io/client-go/kubernetes" "k8s.io/klog/v2" + "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" "sigs.k8s.io/container-object-storage-interface-api/apis/objectstorage.k8s.io/v1alpha1" bucketclientset "sigs.k8s.io/container-object-storage-interface-api/clientset" @@ -16,6 +17,10 @@ import ( "sigs.k8s.io/container-object-storage-interface-controller/pkg/util" ) +const ( + finalizer = "cosi.objectstorage.k8s.io/bucketaccessrequest-protection" +) + type bucketAccessRequestListener struct { kubeClient kubeclientset.Interface bucketClient bucketclientset.Interface @@ -59,8 +64,9 @@ func (b *bucketAccessRequestListener) Update(ctx context.Context, old, new *v1al return nil } -func (b *bucketAccessRequestListener) Delete(ctx context.Context, obj *v1alpha1.BucketAccessRequest) error { - klog.V(1).Infof("Delete called for BucketAccessRequest %v", obj.Name) +func (b *bucketAccessRequestListener) Delete(ctx context.Context, bucketAccessRequest *v1alpha1.BucketAccessRequest) error { + klog.V(1).Infof("Delete called for BucketAccessRequest %v", bucketAccessRequest.Name) + return nil } @@ -143,6 +149,11 @@ func (b *bucketAccessRequestListener) provisionBucketAccess(ctx context.Context, return err } + controllerutil.AddFinalizer(bucketAccessRequest, finalizer) + if _, err := b.bucketClient.ObjectstorageV1alpha1().BucketAccessRequests(bucketAccessRequest.Namespace).Update(ctx, bucketAccessRequest, metav1.UpdateOptions{}); err != nil { + return err + } + bucketAccessRequest.Status.BucketAccessName = bucketaccess.Name bucketAccessRequest.Status.AccessGranted = true _, err = barClient(bucketAccessRequest.Namespace).UpdateStatus(ctx, bucketAccessRequest, metav1.UpdateOptions{}) diff --git a/pkg/bucketrequest/bucketrequest.go b/pkg/bucketrequest/bucketrequest.go index e7fdaaf3..8488d76f 100644 --- a/pkg/bucketrequest/bucketrequest.go +++ b/pkg/bucketrequest/bucketrequest.go @@ -8,6 +8,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" kubeclientset "k8s.io/client-go/kubernetes" "k8s.io/klog/v2" + "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" "sigs.k8s.io/container-object-storage-interface-api/apis/objectstorage.k8s.io/v1alpha1" bucketclientset "sigs.k8s.io/container-object-storage-interface-api/clientset" @@ -16,6 +17,10 @@ import ( "sigs.k8s.io/container-object-storage-interface-controller/pkg/util" ) +const ( + finalizer = "cosi.objectstorage.k8s.io/bucketrequest-protection" +) + // bucketRequestListener is a resource handler for bucket requests objects type bucketRequestListener struct { kubeClient kubeclientset.Interface @@ -77,6 +82,7 @@ func (b *bucketRequestListener) Delete(ctx context.Context, bucketRequest *v1alp klog.V(3).Infof("Delete BucketRequest %v", "name", bucketRequest.Name, "ns", bucketRequest.Namespace) + return nil } @@ -127,6 +133,11 @@ func (b *bucketRequestListener) provisionBucketRequestOperation(ctx context.Cont return err } + controllerutil.AddFinalizer(bucketRequest, finalizer) + if _, err := b.bucketClient.ObjectstorageV1alpha1().BucketRequests(bucketRequest.Namespace).Update(ctx, bucketRequest, metav1.UpdateOptions{}); err != nil { + return err + } + bucketRequest.Status.BucketName = bucket.Name bucketRequest.Status.BucketAvailable = true _, err = b.BucketRequests(bucketRequest.Namespace).UpdateStatus(ctx, bucketRequest, metav1.UpdateOptions{}) diff --git a/pkg/bucketrequest/bucketrequest_test.go b/pkg/bucketrequest/bucketrequest_test.go index eb13aeb8..3a83ebf8 100644 --- a/pkg/bucketrequest/bucketrequest_test.go +++ b/pkg/bucketrequest/bucketrequest_test.go @@ -30,8 +30,6 @@ var goldClass = types.BucketClass{ Parameters: classGoldParameters, Protocol: types.Protocol{ S3: &types.S3Protocol{ - Endpoint: "endpoint", - BucketName: "cosibucket", Region: "us-east-1", SignatureVersion: "S3V4", }, From 5c2742df8c8a87435837787d144c72bff79d9e88 Mon Sep 17 00:00:00 2001 From: Tejas Parikh Date: Tue, 25 May 2021 18:01:58 -0400 Subject: [PATCH 165/242] updated README.md --- README.md | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 70b61855..1ca66051 100644 --- a/README.md +++ b/README.md @@ -37,20 +37,16 @@ make test ## References -- [Documentation](https://github.com/kubernetes-sigs/container-object-storage-interface-api/tree/master/docs/index.md) -- [Deployment Guide](https://github.com/kubernetes-sigs/container-object-storage-interface-api/tree/master/docs/deployment-guide.md) -- [Weekly Meetings](https://github.com/kubernetes-sigs/container-object-storage-interface-api/tree/master/docs/meetings.md) -- [Roadmap](https://github.com/orgs/kubernetes-sigs/projects/8) - + - [Documentation](https://container-object-storage-interface.github.io/) + - [Deployment Guide](https://container-object-storage-interface.github.io/docs/deployment-guide) + - [Weekly Meetings](https://container-object-storage-interface.github.io/docs/community/weekly-meetings) + - [Roadmap](https://github.com/orgs/kubernetes-sigs/projects/8) ## Community, discussion, contribution, and support -Learn how to engage with the Kubernetes community on the [community page](http://kubernetes.io/community/). - You can reach the maintainers of this project at: -- [Slack](https://kubernetes.slack.com/messages/sig-storage-cosi) -- [Mailing List](https://groups.google.com/forum/#!forum/kubernetes-sig-storage) - + - [#sig-storage-cosi](https://kubernetes.slack.com/messages/sig-storage-cosi) slack channel + - [container-object-storage-interface](https://groups.google.com/g/container-object-storage-interface-wg?pli=1) mailing list ### Code of conduct Participation in the Kubernetes community is governed by the [Kubernetes Code of Conduct](code-of-conduct.md). From 96d23f566f2ee4ca099a5a29fba50b9f8d0950bd Mon Sep 17 00:00:00 2001 From: Tejas Parikh Date: Tue, 25 May 2021 18:06:16 -0400 Subject: [PATCH 166/242] updated README.md --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index fa97ce95..05431081 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Kubernetes abstracts file/block storage via the CSI standard. The primitives for - Unit of provisioned storage - Bucket instead of filesystem mount or block device. - Access is over the network instead of local POSIX calls. - - No common protocol for consumption across various implementations of object storage. + - No common protocol for consumption across various implementations of object storage. - Management policies and primitives - for instance, mounting and unmounting do not apply to object storage. The existing primitives in CSI do not apply to objectstorage. Thus the need for a new standard to automate the management of objectstorage. @@ -53,17 +53,17 @@ make all ## References - - [Documentation](https://github.com/kubernetes-sigs/container-object-storage-interface-api/tree/master/docs/index.md) - - [Deployment Guide](https://github.com/kubernetes-sigs/container-object-storage-interface-api/tree/master/docs/deployment-guide.md) - - [Weekly Meetings](https://github.com/kubernetes-sigs/container-object-storage-interface-api/tree/master/docs/meetings.md) - - [Roadmap](https://github.com/orgs/kubernetes-sigs/projects/8) +- [Documentation](https://container-object-storage-interface.github.io/) +- [Deployment Guide](https://container-object-storage-interface.github.io/docs/deployment-guide) +- [Weekly Meetings](https://container-object-storage-interface.github.io/docs/community/weekly-meetings) +- [Roadmap](https://github.com/orgs/kubernetes-sigs/projects/8) ## Community, discussion, contribution, and support You can reach the maintainers of this project at: - - [#sig-storage-cosi](https://kubernetes.slack.com/messages/sig-storage-cosi) slack channel - - [container-object-storage-interface](https://groups.google.com/g/container-object-storage-interface-wg?pli=1) mailing list +- [#sig-storage-cosi](https://kubernetes.slack.com/messages/sig-storage-cosi) slack channel +- [container-object-storage-interface](https://groups.google.com/g/container-object-storage-interface-wg?pli=1) mailing list ### Code of conduct From 302316ce72d187ef20d95023ec04f51183d130c2 Mon Sep 17 00:00:00 2001 From: Krish Chowdhary Date: Thu, 3 Jun 2021 15:45:44 -0400 Subject: [PATCH 167/242] bug 54: finalizer update fix --- pkg/bucketaccessrequest/bucketaccessrequest.go | 3 --- pkg/bucketrequest/bucketrequest.go | 3 --- 2 files changed, 6 deletions(-) diff --git a/pkg/bucketaccessrequest/bucketaccessrequest.go b/pkg/bucketaccessrequest/bucketaccessrequest.go index ab6e7957..0cb9db81 100644 --- a/pkg/bucketaccessrequest/bucketaccessrequest.go +++ b/pkg/bucketaccessrequest/bucketaccessrequest.go @@ -150,9 +150,6 @@ func (b *bucketAccessRequestListener) provisionBucketAccess(ctx context.Context, } controllerutil.AddFinalizer(bucketAccessRequest, finalizer) - if _, err := b.bucketClient.ObjectstorageV1alpha1().BucketAccessRequests(bucketAccessRequest.Namespace).Update(ctx, bucketAccessRequest, metav1.UpdateOptions{}); err != nil { - return err - } bucketAccessRequest.Status.BucketAccessName = bucketaccess.Name bucketAccessRequest.Status.AccessGranted = true diff --git a/pkg/bucketrequest/bucketrequest.go b/pkg/bucketrequest/bucketrequest.go index 8488d76f..fdcd4f6c 100644 --- a/pkg/bucketrequest/bucketrequest.go +++ b/pkg/bucketrequest/bucketrequest.go @@ -134,9 +134,6 @@ func (b *bucketRequestListener) provisionBucketRequestOperation(ctx context.Cont } controllerutil.AddFinalizer(bucketRequest, finalizer) - if _, err := b.bucketClient.ObjectstorageV1alpha1().BucketRequests(bucketRequest.Namespace).Update(ctx, bucketRequest, metav1.UpdateOptions{}); err != nil { - return err - } bucketRequest.Status.BucketName = bucket.Name bucketRequest.Status.BucketAvailable = true From 4ae6b7341257b43e29725dc9e6c5dcdbffdf386f Mon Sep 17 00:00:00 2001 From: Yibo Cai Date: Fri, 16 Jul 2021 02:45:43 +0000 Subject: [PATCH 168/242] release-tools: support arm64 --- release-tools/build.make | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/release-tools/build.make b/release-tools/build.make index 3b1f9a87..1880b002 100644 --- a/release-tools/build.make +++ b/release-tools/build.make @@ -68,9 +68,10 @@ ARCH := $(if $(GOARCH),$(GOARCH),$(shell go env GOARCH)) build-%: check-go-version-go mkdir -p bin CGO_ENABLED=0 GOOS=linux go build $(GOFLAGS_VENDOR) -a -ldflags '-X main.version=$(REV) -extldflags "-static"' -o ./bin/$* ./cmd/$* - if [ "$$ARCH" = "amd64" ]; then \ + if [ "$(ARCH)" = "amd64" ]; then \ CGO_ENABLED=0 GOOS=windows go build $(GOFLAGS_VENDOR) -a -ldflags '-X main.version=$(REV) -extldflags "-static"' -o ./bin/$*.exe ./cmd/$* ; \ CGO_ENABLED=0 GOOS=linux GOARCH=ppc64le go build $(GOFLAGS_VENDOR) -a -ldflags '-X main.version=$(REV) -extldflags "-static"' -o ./bin/$*-ppc64le ./cmd/$* ; \ + CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build $(GOFLAGS_VENDOR) -a -ldflags '-X main.version=$(REV) -extldflags "-static"' -o ./bin/$*-arm64 ./cmd/$* ; \ fi container-%: build-% From 7bb54001f11abc2c83848989a98d7213e0e400b5 Mon Sep 17 00:00:00 2001 From: Yibo Cai Date: Thu, 19 Aug 2021 03:26:50 +0000 Subject: [PATCH 169/242] README: Fix document link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fa97ce95..b4df4c25 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ This repository hosts the gRPC API for the Container Object Storage Interface (COSI) standard. The interfaces defined in the [gRPC specification](cosi.proto) are meant to be the common interface for object storage provisioning and management across various object storage vendors. -For more information about the COSI effort, visit our [documentation](https://github.com/kubernetes-sigs/container-object-storage-interface-api/tree/master/docs/index.md). +For more information about the COSI effort, visit our [documentation](https://container-object-storage-interface.github.io/docs). ## Why another standard? From f18e067c7e06a4d75cc801ada2b78b57fc2ca000 Mon Sep 17 00:00:00 2001 From: Grant Griffiths Date: Thu, 10 Feb 2022 12:55:48 -0800 Subject: [PATCH 170/242] Use reserved extension numbers from protobuf https://github.com/protocolbuffers/protobuf/issues/8553 Signed-off-by: Grant Griffiths --- cosi.pb.go | 56 +++++++++++++++++++++++++++--------------------------- cosi.proto | 14 +++++++------- spec.md | 14 +++++++------- 3 files changed, 42 insertions(+), 42 deletions(-) diff --git a/cosi.pb.go b/cosi.pb.go index 29c8c0fc..ec330855 100644 --- a/cosi.pb.go +++ b/cosi.pb.go @@ -953,57 +953,57 @@ var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_extTypes { ExtendedType: (*descriptor.EnumOptions)(nil), ExtensionType: (*bool)(nil), - Field: 1060, + Field: 1116, Name: "cosi.v1alpha1.alpha_enum", - Tag: "varint,1060,opt,name=alpha_enum", + Tag: "varint,1116,opt,name=alpha_enum", Filename: "sigs.k8s.io/container-object-storage-interface-spec/cosi.proto", }, { ExtendedType: (*descriptor.EnumValueOptions)(nil), ExtensionType: (*bool)(nil), - Field: 1060, + Field: 1116, Name: "cosi.v1alpha1.alpha_enum_value", - Tag: "varint,1060,opt,name=alpha_enum_value", + Tag: "varint,1116,opt,name=alpha_enum_value", Filename: "sigs.k8s.io/container-object-storage-interface-spec/cosi.proto", }, { ExtendedType: (*descriptor.FieldOptions)(nil), ExtensionType: (*bool)(nil), - Field: 1059, + Field: 1115, Name: "cosi.v1alpha1.cosi_secret", - Tag: "varint,1059,opt,name=cosi_secret", + Tag: "varint,1115,opt,name=cosi_secret", Filename: "sigs.k8s.io/container-object-storage-interface-spec/cosi.proto", }, { ExtendedType: (*descriptor.FieldOptions)(nil), ExtensionType: (*bool)(nil), - Field: 1060, + Field: 1116, Name: "cosi.v1alpha1.alpha_field", - Tag: "varint,1060,opt,name=alpha_field", + Tag: "varint,1116,opt,name=alpha_field", Filename: "sigs.k8s.io/container-object-storage-interface-spec/cosi.proto", }, { ExtendedType: (*descriptor.MessageOptions)(nil), ExtensionType: (*bool)(nil), - Field: 1060, + Field: 1116, Name: "cosi.v1alpha1.alpha_message", - Tag: "varint,1060,opt,name=alpha_message", + Tag: "varint,1116,opt,name=alpha_message", Filename: "sigs.k8s.io/container-object-storage-interface-spec/cosi.proto", }, { ExtendedType: (*descriptor.MethodOptions)(nil), ExtensionType: (*bool)(nil), - Field: 1060, + Field: 1116, Name: "cosi.v1alpha1.alpha_method", - Tag: "varint,1060,opt,name=alpha_method", + Tag: "varint,1116,opt,name=alpha_method", Filename: "sigs.k8s.io/container-object-storage-interface-spec/cosi.proto", }, { ExtendedType: (*descriptor.ServiceOptions)(nil), ExtensionType: (*bool)(nil), - Field: 1060, + Field: 1116, Name: "cosi.v1alpha1.alpha_service", - Tag: "varint,1060,opt,name=alpha_service", + Tag: "varint,1116,opt,name=alpha_service", Filename: "sigs.k8s.io/container-object-storage-interface-spec/cosi.proto", }, } @@ -1014,7 +1014,7 @@ var ( // API that may be deprecated and eventually removed between minor // releases. // - // optional bool alpha_enum = 1060; + // optional bool alpha_enum = 1116; E_AlphaEnum = &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_extTypes[0] ) @@ -1024,7 +1024,7 @@ var ( // experimental API that may be deprecated and eventually removed // between minor releases. // - // optional bool alpha_enum_value = 1060; + // optional bool alpha_enum_value = 1116; E_AlphaEnumValue = &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_extTypes[1] ) @@ -1033,13 +1033,13 @@ var ( // Indicates that a field MAY contain information that is sensitive // and MUST be treated as such (e.g. not logged). // - // optional bool cosi_secret = 1059; + // optional bool cosi_secret = 1115; E_CosiSecret = &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_extTypes[2] // Indicates that this field is OPTIONAL and part of an experimental // API that may be deprecated and eventually removed between minor // releases. // - // optional bool alpha_field = 1060; + // optional bool alpha_field = 1116; E_AlphaField = &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_extTypes[3] ) @@ -1049,7 +1049,7 @@ var ( // API that may be deprecated and eventually removed between minor // releases. // - // optional bool alpha_message = 1060; + // optional bool alpha_message = 1116; E_AlphaMessage = &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_extTypes[4] ) @@ -1059,7 +1059,7 @@ var ( // API that may be deprecated and eventually removed between minor // releases. // - // optional bool alpha_method = 1060; + // optional bool alpha_method = 1116; E_AlphaMethod = &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_extTypes[5] ) @@ -1069,7 +1069,7 @@ var ( // API that may be deprecated and eventually removed between minor // releases. // - // optional bool alpha_service = 1060; + // optional bool alpha_service = 1116; E_AlphaService = &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_extTypes[6] ) @@ -1232,33 +1232,33 @@ var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDesc 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3a, 0x3c, 0x0a, 0x0a, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x6e, 0x73, 0x18, 0xdc, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x45, 0x6e, 0x75, 0x6d, 0x3a, 0x4c, 0x0a, 0x10, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, + 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xdc, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x3f, 0x0a, 0x0b, 0x63, 0x6f, 0x73, 0x69, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0xa3, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x63, 0x6f, 0x73, 0x69, 0x53, 0x65, 0x63, + 0x18, 0xdb, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x63, 0x6f, 0x73, 0x69, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x3a, 0x3f, 0x0a, 0x0b, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x46, + 0x73, 0x18, 0xdc, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x3a, 0x45, 0x0a, 0x0d, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xdc, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x42, 0x0a, 0x0c, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, - 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, + 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xdc, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3a, 0x45, 0x0a, 0x0d, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0xa4, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x53, + 0x73, 0x18, 0xdc, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, 0x3a, 0x5a, 0x38, 0x73, 0x69, 0x67, 0x73, 0x2e, 0x6b, 0x38, 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2d, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2d, 0x69, diff --git a/cosi.proto b/cosi.proto index 344f998a..29455ec6 100644 --- a/cosi.proto +++ b/cosi.proto @@ -10,46 +10,46 @@ extend google.protobuf.EnumOptions { // Indicates that this enum is OPTIONAL and part of an experimental // API that may be deprecated and eventually removed between minor // releases. - bool alpha_enum = 1060; + bool alpha_enum = 1116; } extend google.protobuf.EnumValueOptions { // Indicates that this enum value is OPTIONAL and part of an // experimental API that may be deprecated and eventually removed // between minor releases. - bool alpha_enum_value = 1060; + bool alpha_enum_value = 1116; } extend google.protobuf.FieldOptions { // Indicates that a field MAY contain information that is sensitive // and MUST be treated as such (e.g. not logged). - bool cosi_secret = 1059; + bool cosi_secret = 1115; // Indicates that this field is OPTIONAL and part of an experimental // API that may be deprecated and eventually removed between minor // releases. - bool alpha_field = 1060; + bool alpha_field = 1116; } extend google.protobuf.MessageOptions { // Indicates that this message is OPTIONAL and part of an experimental // API that may be deprecated and eventually removed between minor // releases. - bool alpha_message = 1060; + bool alpha_message = 1116; } extend google.protobuf.MethodOptions { // Indicates that this method is OPTIONAL and part of an experimental // API that may be deprecated and eventually removed between minor // releases. - bool alpha_method = 1060; + bool alpha_method = 1116; } extend google.protobuf.ServiceOptions { // Indicates that this service is OPTIONAL and part of an experimental // API that may be deprecated and eventually removed between minor // releases. - bool alpha_service = 1060; + bool alpha_service = 1116; } service Identity { diff --git a/spec.md b/spec.md index a5576094..8f3e5489 100644 --- a/spec.md +++ b/spec.md @@ -137,46 +137,46 @@ extend google.protobuf.EnumOptions { // Indicates that this enum is OPTIONAL and part of an experimental // API that may be deprecated and eventually removed between minor // releases. - bool alpha_enum = 1060; + bool alpha_enum = 1116; } extend google.protobuf.EnumValueOptions { // Indicates that this enum value is OPTIONAL and part of an // experimental API that may be deprecated and eventually removed // between minor releases. - bool alpha_enum_value = 1060; + bool alpha_enum_value = 1116; } extend google.protobuf.FieldOptions { // Indicates that a field MAY contain information that is sensitive // and MUST be treated as such (e.g. not logged). - bool cosi_secret = 1059; + bool cosi_secret = 1115; // Indicates that this field is OPTIONAL and part of an experimental // API that may be deprecated and eventually removed between minor // releases. - bool alpha_field = 1060; + bool alpha_field = 1116; } extend google.protobuf.MessageOptions { // Indicates that this message is OPTIONAL and part of an experimental // API that may be deprecated and eventually removed between minor // releases. - bool alpha_message = 1060; + bool alpha_message = 1116; } extend google.protobuf.MethodOptions { // Indicates that this method is OPTIONAL and part of an experimental // API that may be deprecated and eventually removed between minor // releases. - bool alpha_method = 1060; + bool alpha_method = 1116; } extend google.protobuf.ServiceOptions { // Indicates that this service is OPTIONAL and part of an experimental // API that may be deprecated and eventually removed between minor // releases. - bool alpha_service = 1060; + bool alpha_service = 1116; } service Identity { From c67d6caacce3bf1130ec21c5c1778b054730501c Mon Sep 17 00:00:00 2001 From: Akash Mukhopadhyay Date: Tue, 12 Jul 2022 14:47:48 -0700 Subject: [PATCH 171/242] Fixing Makefile with latest changes to protoc-gen-go-json and protoc --- Makefile | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 5d044cf8..d34cf5df 100644 --- a/Makefile +++ b/Makefile @@ -21,7 +21,7 @@ export GOPATH # Only set PROTOC_VER if it has an empty value. ifeq (,$(strip $(PROTOC_VER))) -PROTOC_VER := 3.9.1 +PROTOC_VER := 3.14.0 endif PROTOC_OS := $(shell uname -s) @@ -36,14 +36,16 @@ endif PROTOC := ./protoc PROTOC_ZIP := protoc-$(PROTOC_VER)-$(PROTOC_OS)-$(PROTOC_ARCH).zip -PROTOC_URL := https://github.com/google/protobuf/releases/download/v$(PROTOC_VER)/$(PROTOC_ZIP) +PROTOC_URL := https://github.com/protocolbuffers/protobuf/releases/download/v$(PROTOC_VER)/$(PROTOC_ZIP) PROTOC_TMP_DIR := .protoc PROTOC_TMP_BIN := $(PROTOC_TMP_DIR)/bin/protoc +PROTOC_TMP_INC := $(PROTOC_TMP_DIR)/include $(PROTOC): -mkdir -p "$(PROTOC_TMP_DIR)" && \ curl -L $(PROTOC_URL) -o "$(PROTOC_TMP_DIR)/$(PROTOC_ZIP)" && \ - unzip "$(PROTOC_TMP_DIR)/$(PROTOC_ZIP)" -d "$(PROTOC_TMP_DIR)" && \ + unzip -o "$(PROTOC_TMP_DIR)/$(PROTOC_ZIP)" -d "$(PROTOC_TMP_DIR)" && \ + unzip -o "$(PROTOC_TMP_DIR)/$(PROTOC_ZIP)" -d "$(PROTOC_TMP_INC)/*" && \ chmod 0755 "$(PROTOC_TMP_BIN)" && \ cp -f "$(PROTOC_TMP_BIN)" "$@" stat "$@" > /dev/null 2>&1 @@ -77,7 +79,7 @@ $(PROTOC_GEN_GO): # for protoc-gen-go PROTOC_GEN_GO_JSON_PKG := github.com/mitchellh/protoc-gen-go-json PROTOC_GEN_GO_JSON := protoc-gen-go-json -$(PROTOC_GEN_GO_JSON): PROTOC_GEN_GO_JSON_VERSION := v1.0.0 +$(PROTOC_GEN_GO_JSON): PROTOC_GEN_GO_JSON_VERSION := v1.1.0 $(PROTOC_GEN_GO_JSON): mkdir -p $(dir $(GOPATH)/src/$(PROTOC_GEN_GO_JSON_PKG)) test -d $(GOPATH)/src/$(PROTOC_GEN_GO_JSON_PKG)/.git || git clone https://$(PROTOC_GEN_GO_JSON_PKG) $(GOPATH)/src/$(PROTOC_GEN_GO_JSON_PKG) @@ -170,7 +172,7 @@ $(COSI_GO_TMP): GO_OUT := plugins=grpc $(COSI_GO_TMP): GO_OUT := $(GO_OUT),Mgoogle/protobuf/descriptor.proto=github.com/golang/protobuf/protoc-gen-go/descriptor $(COSI_GO_TMP): GO_OUT := $(GO_OUT),Mgoogle/protobuf/wrappers.proto=$(PTYPES_PKG)/wrappers $(COSI_GO_TMP): GO_OUT := $(GO_OUT):"$(HERE)/$(COSI_BUILD)" -$(COSI_GO_TMP): GO_JSON_OUT := emit_defaults +$(COSI_GO_TMP): GO_JSON_OUT := emit_defaults=true $(COSI_GO_TMP): GO_JSON_OUT := $(GO_JSON_OUT):"$(HERE)/$(COSI_BUILD)" $(COSI_GO_TMP): GO_FAKE_OUT := emit_defaults $(COSI_GO_TMP): GO_FAKE_OUT := $(GO_FAKE_OUT),packagePath=sigs.k8s.io/container-object-storage-interface-spec From dc260730a958664a1e37cabb9d49757b976466c3 Mon Sep 17 00:00:00 2001 From: Akash Mukhopadhyay Date: Tue, 12 Jul 2022 14:51:24 -0700 Subject: [PATCH 172/242] Updating the spec document --- spec.md | 76 +++++++++++++++++++++++++++++---------------------------- 1 file changed, 39 insertions(+), 37 deletions(-) diff --git a/spec.md b/spec.md index 8f3e5489..743b4247 100644 --- a/spec.md +++ b/spec.md @@ -182,7 +182,7 @@ extend google.protobuf.ServiceOptions { service Identity { // This call is meant to retrieve the unique provisioner Identity. // This identity will have to be set in BucketRequest.Provisioner field in order to invoke this specific provisioner. - rpc ProvisionerGetInfo (ProvisionerGetInfoRequest) returns (ProvisionerGetInfoResponse) {} + rpc DriverGetInfo (DriverGetInfoRequest) returns (DriverGetInfoResponse) {} } service Provisioner { @@ -190,16 +190,16 @@ service Provisioner { // This call is idempotent // 1. If a bucket that matches both name and parameters already exists, then OK (success) must be returned. // 2. If a bucket by same name, but different parameters is provided, then the appropriate error code ALREADY_EXISTS must be returned. - rpc ProvisionerCreateBucket (ProvisionerCreateBucketRequest) returns (ProvisionerCreateBucketResponse) {} + rpc DriverCreateBucket (DriverCreateBucketRequest) returns (DriverCreateBucketResponse) {} // This call is made to delete the bucket in the backend. // If the bucket has already been deleted, then no error should be returned. - rpc ProvisionerDeleteBucket (ProvisionerDeleteBucketRequest) returns (ProvisionerDeleteBucketResponse) {} + rpc DriverDeleteBucket (DriverDeleteBucketRequest) returns (DriverDeleteBucketResponse) {} // This call grants access to an account. The account_name in the request shall be used as a unique identifier to create credentials. - // The account_id returned in the response will be used as the unique identifier for deleting this access when calling ProvisionerRevokeBucketAccess. - rpc ProvisionerGrantBucketAccess (ProvisionerGrantBucketAccessRequest) returns (ProvisionerGrantBucketAccessResponse); + // The account_id returned in the response will be used as the unique identifier for deleting this access when calling DriverRevokeBucketAccess. + rpc DriverGrantBucketAccess (DriverGrantBucketAccessRequest) returns (DriverGrantBucketAccessResponse); // This call revokes all access to a particular bucket from a principal. - rpc ProvisionerRevokeBucketAccess (ProvisionerRevokeBucketAccessRequest) returns (ProvisionerRevokeBucketAccessResponse); + rpc DriverRevokeBucketAccess (DriverRevokeBucketAccessRequest) returns (DriverRevokeBucketAccessResponse); } // S3SignatureVersion is the version of the signing algorithm for all s3 requests @@ -223,6 +223,14 @@ enum AnonymousBucketAccessMode { ReadWrite = 4; } +enum AuthenticationType { + UnknownAuthenticationType = 0; + // Default, KEY based authentication. + Key = 1; + // Storageaccount based authentication. + IAM = 2; +} + message S3 { // region denotes the geographical region where the S3 server is running string region = 1; @@ -252,11 +260,11 @@ message Protocol { } } -message ProvisionerGetInfoRequest { +message DriverGetInfoRequest { // Intentionally left blank } -message ProvisionerGetInfoResponse { +message DriverGetInfoResponse { // This field is REQUIRED // The name MUST follow domain name notation format // (https://tools.ietf.org/html/rfc1035#section-2.3.1). It SHOULD @@ -268,53 +276,52 @@ message ProvisionerGetInfoResponse { string name = 1; } -message ProvisionerCreateBucketRequest { +message DriverCreateBucketRequest { // This field is REQUIRED // name specifies the name of the bucket that should be created. string name = 1; - // This field is REQUIRED - // Protocol specific information required by the call is passed in as key,value pairs. - Protocol protocol = 2; - // This field is OPTIONAL // The caller should treat the values in parameters as opaque. // The receiver is responsible for parsing and validating the values. - map parameters = 3; + map parameters = 2; } -message ProvisionerCreateBucketResponse { +message DriverCreateBucketResponse { // bucket_id returned here is expected to be the globally unique - // identifier for the bucket in the object storage provider + // identifier for the bucket in the object storage provider. string bucket_id = 1; + + // bucket_info returned here stores the data specific to the + // bucket required by the object storage provider to connect to the bucket. + Protocol bucket_info = 2; } -message ProvisionerDeleteBucketRequest { +message DriverDeleteBucketRequest { // This field is REQUIRED // bucket_id is a globally unique identifier for the bucket // in the object storage provider string bucket_id = 1; } -message ProvisionerDeleteBucketResponse { +message DriverDeleteBucketResponse { // Intentionally left blank } -message ProvisionerGrantBucketAccessRequest { +message DriverGrantBucketAccessRequest { // This field is REQUIRED // bucket_id is a globally unique identifier for the bucket // in the object storage provider string bucket_id = 1; // This field is REQUIRED - // account_name is a identifier for object storage provider - // to ensure that multiple requests for the same account - // result in only one access token being created - string account_name = 2; + // name field is used to define the name of the bucket access object. + string name = 2; // This field is REQUIRED - // Requested Access policy, ex: {"Effect":"Allow","Action":"s3:PutObject","Resource":"arn:aws:s3:::profilepics/*"} - string access_policy = 3; + // Requested authentication type for the bucket access. + // Supported authentication types are KEY or IAM. + AuthenticationType authentication_type = 3; // This field is OPTIONAL // The caller should treat the values in parameters as opaque. @@ -322,18 +329,18 @@ message ProvisionerGrantBucketAccessRequest { map parameters = 4; } -message ProvisionerGrantBucketAccessResponse { - // This field is OPTIONAL +message DriverGrantBucketAccessResponse { + // This field is REQUIRED // This is the account_id that is being provided access. This will // be required later to revoke access. string account_id = 1; - // This field is OPTIONAL + // This field is REQUIRED // Credentials supplied for accessing the bucket ex: aws access key id and secret, etc. string credentials = 2; } -message ProvisionerRevokeBucketAccessRequest { +message DriverRevokeBucketAccessRequest { // This field is REQUIRED // bucket_id is a globally unique identifier for the bucket // in the object storage provider. @@ -344,7 +351,7 @@ message ProvisionerRevokeBucketAccessRequest { string account_id = 2; } -message ProvisionerRevokeBucketAccessResponse { +message DriverRevokeBucketAccessResponse { // Intentionally left blank } @@ -423,19 +430,14 @@ The general flow of the success case MAY be as follows (protos illustrated in YA request: response: name: org.foo.whizbang.super-plugin - version: blue-green - manifest: - baz: qaz ``` ``` -message ProvisionerGetInfoRequest { +message DriverGetInfoRequest { // Intentionally left blank } -message ProvisionerGetInfoResponse { +message DriverGetInfoResponse { string name = 1; - string version = 2; - map manifest = 3; } ``` From 20d555c9b584aa4bc116cb475232fc0d2cc6fafe Mon Sep 17 00:00:00 2001 From: Akash Mukhopadhyay Date: Tue, 12 Jul 2022 15:09:21 -0700 Subject: [PATCH 173/242] Updating the go version and the go.mod and go.sum file --- go.mod | 12 ++++++++++-- go.sum | 3 +++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 98403634..ad3d5439 100644 --- a/go.mod +++ b/go.mod @@ -1,11 +1,19 @@ module sigs.k8s.io/container-object-storage-interface-spec -go 1.15 +go 1.18 require ( github.com/dave/jennifer v1.4.1 github.com/golang/protobuf v1.4.3 - golang.org/x/net v0.0.0-20191002035440-2ec189313ef0 // indirect google.golang.org/grpc v1.35.0 google.golang.org/protobuf v1.25.0 ) + +require ( + github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b // indirect + github.com/mitchellh/protoc-gen-go-json v1.1.0 // indirect + golang.org/x/net v0.0.0-20191002035440-2ec189313ef0 // indirect + golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a // indirect + golang.org/x/text v0.3.0 // indirect + google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 // indirect +) diff --git a/go.sum b/go.sum index ac6afbc7..7d412c5a 100644 --- a/go.sum +++ b/go.sum @@ -31,9 +31,12 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/mitchellh/protoc-gen-go-json v1.1.0 h1:lEi1xtXyYKDwA8EB5u27+UUZOTznC4JpqVOKZwCGJUo= +github.com/mitchellh/protoc-gen-go-json v1.1.0/go.mod h1:pACAKlMtBf4SMFbVswcjwNwWwlci6Vn841H5jPRcE9I= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= From abaa1521d2354319399d47b6436db29f833dfd57 Mon Sep 17 00:00:00 2001 From: Akash Mukhopadhyay Date: Tue, 12 Jul 2022 15:09:51 -0700 Subject: [PATCH 174/242] Updating the auto generated files --- cosi.pb.go | 862 +++++++++++++++++++++++-------------------- cosi.pb.json.go | 296 +++++++-------- cosi.proto | 67 ++-- fake/cosi.pb.fake.go | 30 +- 4 files changed, 641 insertions(+), 614 deletions(-) diff --git a/cosi.pb.go b/cosi.pb.go index ec330855..181819a9 100644 --- a/cosi.pb.go +++ b/cosi.pb.go @@ -3,7 +3,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.9.1 +// protoc v3.14.0 // source: sigs.k8s.io/container-object-storage-interface-spec/cosi.proto package cosi @@ -143,6 +143,57 @@ func (AnonymousBucketAccessMode) EnumDescriptor() ([]byte, []int) { return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{1} } +type AuthenticationType int32 + +const ( + AuthenticationType_UnknownAuthenticationType AuthenticationType = 0 + // Default, KEY based authentication. + AuthenticationType_Key AuthenticationType = 1 + // Storageaccount based authentication. + AuthenticationType_IAM AuthenticationType = 2 +) + +// Enum value maps for AuthenticationType. +var ( + AuthenticationType_name = map[int32]string{ + 0: "UnknownAuthenticationType", + 1: "Key", + 2: "IAM", + } + AuthenticationType_value = map[string]int32{ + "UnknownAuthenticationType": 0, + "Key": 1, + "IAM": 2, + } +) + +func (x AuthenticationType) Enum() *AuthenticationType { + p := new(AuthenticationType) + *p = x + return p +} + +func (x AuthenticationType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (AuthenticationType) Descriptor() protoreflect.EnumDescriptor { + return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_enumTypes[2].Descriptor() +} + +func (AuthenticationType) Type() protoreflect.EnumType { + return &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_enumTypes[2] +} + +func (x AuthenticationType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use AuthenticationType.Descriptor instead. +func (AuthenticationType) EnumDescriptor() ([]byte, []int) { + return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{2} +} + type S3 struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -408,14 +459,14 @@ func (*Protocol_AzureBlob) isProtocol_Type() {} func (*Protocol_Gcs) isProtocol_Type() {} -type ProvisionerGetInfoRequest struct { +type DriverGetInfoRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } -func (x *ProvisionerGetInfoRequest) Reset() { - *x = ProvisionerGetInfoRequest{} +func (x *DriverGetInfoRequest) Reset() { + *x = DriverGetInfoRequest{} if protoimpl.UnsafeEnabled { mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -423,13 +474,13 @@ func (x *ProvisionerGetInfoRequest) Reset() { } } -func (x *ProvisionerGetInfoRequest) String() string { +func (x *DriverGetInfoRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ProvisionerGetInfoRequest) ProtoMessage() {} +func (*DriverGetInfoRequest) ProtoMessage() {} -func (x *ProvisionerGetInfoRequest) ProtoReflect() protoreflect.Message { +func (x *DriverGetInfoRequest) ProtoReflect() protoreflect.Message { mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -441,12 +492,12 @@ func (x *ProvisionerGetInfoRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ProvisionerGetInfoRequest.ProtoReflect.Descriptor instead. -func (*ProvisionerGetInfoRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use DriverGetInfoRequest.ProtoReflect.Descriptor instead. +func (*DriverGetInfoRequest) Descriptor() ([]byte, []int) { return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{4} } -type ProvisionerGetInfoResponse struct { +type DriverGetInfoResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -462,8 +513,8 @@ type ProvisionerGetInfoResponse struct { Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` } -func (x *ProvisionerGetInfoResponse) Reset() { - *x = ProvisionerGetInfoResponse{} +func (x *DriverGetInfoResponse) Reset() { + *x = DriverGetInfoResponse{} if protoimpl.UnsafeEnabled { mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -471,13 +522,13 @@ func (x *ProvisionerGetInfoResponse) Reset() { } } -func (x *ProvisionerGetInfoResponse) String() string { +func (x *DriverGetInfoResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ProvisionerGetInfoResponse) ProtoMessage() {} +func (*DriverGetInfoResponse) ProtoMessage() {} -func (x *ProvisionerGetInfoResponse) ProtoReflect() protoreflect.Message { +func (x *DriverGetInfoResponse) ProtoReflect() protoreflect.Message { mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -489,19 +540,19 @@ func (x *ProvisionerGetInfoResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ProvisionerGetInfoResponse.ProtoReflect.Descriptor instead. -func (*ProvisionerGetInfoResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use DriverGetInfoResponse.ProtoReflect.Descriptor instead. +func (*DriverGetInfoResponse) Descriptor() ([]byte, []int) { return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{5} } -func (x *ProvisionerGetInfoResponse) GetName() string { +func (x *DriverGetInfoResponse) GetName() string { if x != nil { return x.Name } return "" } -type ProvisionerCreateBucketRequest struct { +type DriverCreateBucketRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -509,17 +560,14 @@ type ProvisionerCreateBucketRequest struct { // This field is REQUIRED // name specifies the name of the bucket that should be created. Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // This field is REQUIRED - // Protocol specific information required by the call is passed in as key,value pairs. - Protocol *Protocol `protobuf:"bytes,2,opt,name=protocol,proto3" json:"protocol,omitempty"` // This field is OPTIONAL // The caller should treat the values in parameters as opaque. // The receiver is responsible for parsing and validating the values. - Parameters map[string]string `protobuf:"bytes,3,rep,name=parameters,proto3" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Parameters map[string]string `protobuf:"bytes,2,rep,name=parameters,proto3" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } -func (x *ProvisionerCreateBucketRequest) Reset() { - *x = ProvisionerCreateBucketRequest{} +func (x *DriverCreateBucketRequest) Reset() { + *x = DriverCreateBucketRequest{} if protoimpl.UnsafeEnabled { mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -527,13 +575,13 @@ func (x *ProvisionerCreateBucketRequest) Reset() { } } -func (x *ProvisionerCreateBucketRequest) String() string { +func (x *DriverCreateBucketRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ProvisionerCreateBucketRequest) ProtoMessage() {} +func (*DriverCreateBucketRequest) ProtoMessage() {} -func (x *ProvisionerCreateBucketRequest) ProtoReflect() protoreflect.Message { +func (x *DriverCreateBucketRequest) ProtoReflect() protoreflect.Message { mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -545,44 +593,40 @@ func (x *ProvisionerCreateBucketRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ProvisionerCreateBucketRequest.ProtoReflect.Descriptor instead. -func (*ProvisionerCreateBucketRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use DriverCreateBucketRequest.ProtoReflect.Descriptor instead. +func (*DriverCreateBucketRequest) Descriptor() ([]byte, []int) { return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{6} } -func (x *ProvisionerCreateBucketRequest) GetName() string { +func (x *DriverCreateBucketRequest) GetName() string { if x != nil { return x.Name } return "" } -func (x *ProvisionerCreateBucketRequest) GetProtocol() *Protocol { - if x != nil { - return x.Protocol - } - return nil -} - -func (x *ProvisionerCreateBucketRequest) GetParameters() map[string]string { +func (x *DriverCreateBucketRequest) GetParameters() map[string]string { if x != nil { return x.Parameters } return nil } -type ProvisionerCreateBucketResponse struct { +type DriverCreateBucketResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // bucket_id returned here is expected to be the globally unique - // identifier for the bucket in the object storage provider + // identifier for the bucket in the object storage provider. BucketId string `protobuf:"bytes,1,opt,name=bucket_id,json=bucketId,proto3" json:"bucket_id,omitempty"` + // bucket_info returned here stores the data specific to the + // bucket required by the object storage provider to connect to the bucket. + BucketInfo *Protocol `protobuf:"bytes,2,opt,name=bucket_info,json=bucketInfo,proto3" json:"bucket_info,omitempty"` } -func (x *ProvisionerCreateBucketResponse) Reset() { - *x = ProvisionerCreateBucketResponse{} +func (x *DriverCreateBucketResponse) Reset() { + *x = DriverCreateBucketResponse{} if protoimpl.UnsafeEnabled { mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -590,13 +634,13 @@ func (x *ProvisionerCreateBucketResponse) Reset() { } } -func (x *ProvisionerCreateBucketResponse) String() string { +func (x *DriverCreateBucketResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ProvisionerCreateBucketResponse) ProtoMessage() {} +func (*DriverCreateBucketResponse) ProtoMessage() {} -func (x *ProvisionerCreateBucketResponse) ProtoReflect() protoreflect.Message { +func (x *DriverCreateBucketResponse) ProtoReflect() protoreflect.Message { mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -608,19 +652,26 @@ func (x *ProvisionerCreateBucketResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ProvisionerCreateBucketResponse.ProtoReflect.Descriptor instead. -func (*ProvisionerCreateBucketResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use DriverCreateBucketResponse.ProtoReflect.Descriptor instead. +func (*DriverCreateBucketResponse) Descriptor() ([]byte, []int) { return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{7} } -func (x *ProvisionerCreateBucketResponse) GetBucketId() string { +func (x *DriverCreateBucketResponse) GetBucketId() string { if x != nil { return x.BucketId } return "" } -type ProvisionerDeleteBucketRequest struct { +func (x *DriverCreateBucketResponse) GetBucketInfo() *Protocol { + if x != nil { + return x.BucketInfo + } + return nil +} + +type DriverDeleteBucketRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -631,8 +682,8 @@ type ProvisionerDeleteBucketRequest struct { BucketId string `protobuf:"bytes,1,opt,name=bucket_id,json=bucketId,proto3" json:"bucket_id,omitempty"` } -func (x *ProvisionerDeleteBucketRequest) Reset() { - *x = ProvisionerDeleteBucketRequest{} +func (x *DriverDeleteBucketRequest) Reset() { + *x = DriverDeleteBucketRequest{} if protoimpl.UnsafeEnabled { mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -640,13 +691,13 @@ func (x *ProvisionerDeleteBucketRequest) Reset() { } } -func (x *ProvisionerDeleteBucketRequest) String() string { +func (x *DriverDeleteBucketRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ProvisionerDeleteBucketRequest) ProtoMessage() {} +func (*DriverDeleteBucketRequest) ProtoMessage() {} -func (x *ProvisionerDeleteBucketRequest) ProtoReflect() protoreflect.Message { +func (x *DriverDeleteBucketRequest) ProtoReflect() protoreflect.Message { mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -658,26 +709,26 @@ func (x *ProvisionerDeleteBucketRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ProvisionerDeleteBucketRequest.ProtoReflect.Descriptor instead. -func (*ProvisionerDeleteBucketRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use DriverDeleteBucketRequest.ProtoReflect.Descriptor instead. +func (*DriverDeleteBucketRequest) Descriptor() ([]byte, []int) { return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{8} } -func (x *ProvisionerDeleteBucketRequest) GetBucketId() string { +func (x *DriverDeleteBucketRequest) GetBucketId() string { if x != nil { return x.BucketId } return "" } -type ProvisionerDeleteBucketResponse struct { +type DriverDeleteBucketResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } -func (x *ProvisionerDeleteBucketResponse) Reset() { - *x = ProvisionerDeleteBucketResponse{} +func (x *DriverDeleteBucketResponse) Reset() { + *x = DriverDeleteBucketResponse{} if protoimpl.UnsafeEnabled { mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -685,13 +736,13 @@ func (x *ProvisionerDeleteBucketResponse) Reset() { } } -func (x *ProvisionerDeleteBucketResponse) String() string { +func (x *DriverDeleteBucketResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ProvisionerDeleteBucketResponse) ProtoMessage() {} +func (*DriverDeleteBucketResponse) ProtoMessage() {} -func (x *ProvisionerDeleteBucketResponse) ProtoReflect() protoreflect.Message { +func (x *DriverDeleteBucketResponse) ProtoReflect() protoreflect.Message { mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -703,12 +754,12 @@ func (x *ProvisionerDeleteBucketResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ProvisionerDeleteBucketResponse.ProtoReflect.Descriptor instead. -func (*ProvisionerDeleteBucketResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use DriverDeleteBucketResponse.ProtoReflect.Descriptor instead. +func (*DriverDeleteBucketResponse) Descriptor() ([]byte, []int) { return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{9} } -type ProvisionerGrantBucketAccessRequest struct { +type DriverGrantBucketAccessRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -718,21 +769,20 @@ type ProvisionerGrantBucketAccessRequest struct { // in the object storage provider BucketId string `protobuf:"bytes,1,opt,name=bucket_id,json=bucketId,proto3" json:"bucket_id,omitempty"` // This field is REQUIRED - // account_name is a identifier for object storage provider - // to ensure that multiple requests for the same account - // result in only one access token being created - AccountName string `protobuf:"bytes,2,opt,name=account_name,json=accountName,proto3" json:"account_name,omitempty"` + // name field is used to define the name of the bucket access object. + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` // This field is REQUIRED - // Requested Access policy, ex: {"Effect":"Allow","Action":"s3:PutObject","Resource":"arn:aws:s3:::profilepics/*"} - AccessPolicy string `protobuf:"bytes,3,opt,name=access_policy,json=accessPolicy,proto3" json:"access_policy,omitempty"` + // Requested authentication type for the bucket access. + // Supported authentication types are KEY or IAM. + AuthenticationType AuthenticationType `protobuf:"varint,3,opt,name=authentication_type,json=authenticationType,proto3,enum=cosi.v1alpha1.AuthenticationType" json:"authentication_type,omitempty"` // This field is OPTIONAL // The caller should treat the values in parameters as opaque. // The receiver is responsible for parsing and validating the values. Parameters map[string]string `protobuf:"bytes,4,rep,name=parameters,proto3" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } -func (x *ProvisionerGrantBucketAccessRequest) Reset() { - *x = ProvisionerGrantBucketAccessRequest{} +func (x *DriverGrantBucketAccessRequest) Reset() { + *x = DriverGrantBucketAccessRequest{} if protoimpl.UnsafeEnabled { mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -740,13 +790,13 @@ func (x *ProvisionerGrantBucketAccessRequest) Reset() { } } -func (x *ProvisionerGrantBucketAccessRequest) String() string { +func (x *DriverGrantBucketAccessRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ProvisionerGrantBucketAccessRequest) ProtoMessage() {} +func (*DriverGrantBucketAccessRequest) ProtoMessage() {} -func (x *ProvisionerGrantBucketAccessRequest) ProtoReflect() protoreflect.Message { +func (x *DriverGrantBucketAccessRequest) ProtoReflect() protoreflect.Message { mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -758,55 +808,55 @@ func (x *ProvisionerGrantBucketAccessRequest) ProtoReflect() protoreflect.Messag return mi.MessageOf(x) } -// Deprecated: Use ProvisionerGrantBucketAccessRequest.ProtoReflect.Descriptor instead. -func (*ProvisionerGrantBucketAccessRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use DriverGrantBucketAccessRequest.ProtoReflect.Descriptor instead. +func (*DriverGrantBucketAccessRequest) Descriptor() ([]byte, []int) { return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{10} } -func (x *ProvisionerGrantBucketAccessRequest) GetBucketId() string { +func (x *DriverGrantBucketAccessRequest) GetBucketId() string { if x != nil { return x.BucketId } return "" } -func (x *ProvisionerGrantBucketAccessRequest) GetAccountName() string { +func (x *DriverGrantBucketAccessRequest) GetName() string { if x != nil { - return x.AccountName + return x.Name } return "" } -func (x *ProvisionerGrantBucketAccessRequest) GetAccessPolicy() string { +func (x *DriverGrantBucketAccessRequest) GetAuthenticationType() AuthenticationType { if x != nil { - return x.AccessPolicy + return x.AuthenticationType } - return "" + return AuthenticationType_UnknownAuthenticationType } -func (x *ProvisionerGrantBucketAccessRequest) GetParameters() map[string]string { +func (x *DriverGrantBucketAccessRequest) GetParameters() map[string]string { if x != nil { return x.Parameters } return nil } -type ProvisionerGrantBucketAccessResponse struct { +type DriverGrantBucketAccessResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // This field is OPTIONAL + // This field is REQUIRED // This is the account_id that is being provided access. This will // be required later to revoke access. AccountId string `protobuf:"bytes,1,opt,name=account_id,json=accountId,proto3" json:"account_id,omitempty"` - // This field is OPTIONAL + // This field is REQUIRED // Credentials supplied for accessing the bucket ex: aws access key id and secret, etc. Credentials string `protobuf:"bytes,2,opt,name=credentials,proto3" json:"credentials,omitempty"` } -func (x *ProvisionerGrantBucketAccessResponse) Reset() { - *x = ProvisionerGrantBucketAccessResponse{} +func (x *DriverGrantBucketAccessResponse) Reset() { + *x = DriverGrantBucketAccessResponse{} if protoimpl.UnsafeEnabled { mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -814,13 +864,13 @@ func (x *ProvisionerGrantBucketAccessResponse) Reset() { } } -func (x *ProvisionerGrantBucketAccessResponse) String() string { +func (x *DriverGrantBucketAccessResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ProvisionerGrantBucketAccessResponse) ProtoMessage() {} +func (*DriverGrantBucketAccessResponse) ProtoMessage() {} -func (x *ProvisionerGrantBucketAccessResponse) ProtoReflect() protoreflect.Message { +func (x *DriverGrantBucketAccessResponse) ProtoReflect() protoreflect.Message { mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -832,26 +882,26 @@ func (x *ProvisionerGrantBucketAccessResponse) ProtoReflect() protoreflect.Messa return mi.MessageOf(x) } -// Deprecated: Use ProvisionerGrantBucketAccessResponse.ProtoReflect.Descriptor instead. -func (*ProvisionerGrantBucketAccessResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use DriverGrantBucketAccessResponse.ProtoReflect.Descriptor instead. +func (*DriverGrantBucketAccessResponse) Descriptor() ([]byte, []int) { return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{11} } -func (x *ProvisionerGrantBucketAccessResponse) GetAccountId() string { +func (x *DriverGrantBucketAccessResponse) GetAccountId() string { if x != nil { return x.AccountId } return "" } -func (x *ProvisionerGrantBucketAccessResponse) GetCredentials() string { +func (x *DriverGrantBucketAccessResponse) GetCredentials() string { if x != nil { return x.Credentials } return "" } -type ProvisionerRevokeBucketAccessRequest struct { +type DriverRevokeBucketAccessRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -865,8 +915,8 @@ type ProvisionerRevokeBucketAccessRequest struct { AccountId string `protobuf:"bytes,2,opt,name=account_id,json=accountId,proto3" json:"account_id,omitempty"` } -func (x *ProvisionerRevokeBucketAccessRequest) Reset() { - *x = ProvisionerRevokeBucketAccessRequest{} +func (x *DriverRevokeBucketAccessRequest) Reset() { + *x = DriverRevokeBucketAccessRequest{} if protoimpl.UnsafeEnabled { mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -874,13 +924,13 @@ func (x *ProvisionerRevokeBucketAccessRequest) Reset() { } } -func (x *ProvisionerRevokeBucketAccessRequest) String() string { +func (x *DriverRevokeBucketAccessRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ProvisionerRevokeBucketAccessRequest) ProtoMessage() {} +func (*DriverRevokeBucketAccessRequest) ProtoMessage() {} -func (x *ProvisionerRevokeBucketAccessRequest) ProtoReflect() protoreflect.Message { +func (x *DriverRevokeBucketAccessRequest) ProtoReflect() protoreflect.Message { mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -892,33 +942,33 @@ func (x *ProvisionerRevokeBucketAccessRequest) ProtoReflect() protoreflect.Messa return mi.MessageOf(x) } -// Deprecated: Use ProvisionerRevokeBucketAccessRequest.ProtoReflect.Descriptor instead. -func (*ProvisionerRevokeBucketAccessRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use DriverRevokeBucketAccessRequest.ProtoReflect.Descriptor instead. +func (*DriverRevokeBucketAccessRequest) Descriptor() ([]byte, []int) { return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{12} } -func (x *ProvisionerRevokeBucketAccessRequest) GetBucketId() string { +func (x *DriverRevokeBucketAccessRequest) GetBucketId() string { if x != nil { return x.BucketId } return "" } -func (x *ProvisionerRevokeBucketAccessRequest) GetAccountId() string { +func (x *DriverRevokeBucketAccessRequest) GetAccountId() string { if x != nil { return x.AccountId } return "" } -type ProvisionerRevokeBucketAccessResponse struct { +type DriverRevokeBucketAccessResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } -func (x *ProvisionerRevokeBucketAccessResponse) Reset() { - *x = ProvisionerRevokeBucketAccessResponse{} +func (x *DriverRevokeBucketAccessResponse) Reset() { + *x = DriverRevokeBucketAccessResponse{} if protoimpl.UnsafeEnabled { mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -926,13 +976,13 @@ func (x *ProvisionerRevokeBucketAccessResponse) Reset() { } } -func (x *ProvisionerRevokeBucketAccessResponse) String() string { +func (x *DriverRevokeBucketAccessResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ProvisionerRevokeBucketAccessResponse) ProtoMessage() {} +func (*DriverRevokeBucketAccessResponse) ProtoMessage() {} -func (x *ProvisionerRevokeBucketAccessResponse) ProtoReflect() protoreflect.Message { +func (x *DriverRevokeBucketAccessResponse) ProtoReflect() protoreflect.Message { mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -944,8 +994,8 @@ func (x *ProvisionerRevokeBucketAccessResponse) ProtoReflect() protoreflect.Mess return mi.MessageOf(x) } -// Deprecated: Use ProvisionerRevokeBucketAccessResponse.ProtoReflect.Descriptor instead. -func (*ProvisionerRevokeBucketAccessResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use DriverRevokeBucketAccessResponse.ProtoReflect.Descriptor instead. +func (*DriverRevokeBucketAccessResponse) Descriptor() ([]byte, []int) { return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{13} } @@ -1110,160 +1160,158 @@ var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDesc 0x09, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x42, 0x6c, 0x6f, 0x62, 0x12, 0x26, 0x0a, 0x03, 0x67, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x43, 0x53, 0x48, 0x00, 0x52, 0x03, 0x67, - 0x63, 0x73, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x1b, 0x0a, 0x19, 0x50, 0x72, - 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x30, 0x0a, 0x1a, 0x50, 0x72, 0x6f, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x87, 0x02, 0x0a, 0x1e, 0x50, 0x72, - 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, - 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x33, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x5d, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, - 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x63, 0x6f, 0x73, 0x69, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, - 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, - 0x74, 0x65, 0x72, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, - 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0x3e, 0x0a, 0x1f, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x75, 0x63, 0x6b, 0x65, - 0x74, 0x49, 0x64, 0x22, 0x3d, 0x0a, 0x1e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, - 0x49, 0x64, 0x22, 0x21, 0x0a, 0x1f, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, - 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xad, 0x02, 0x0a, 0x23, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, - 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, - 0x09, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, - 0x0d, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x12, 0x62, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x63, 0x73, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x16, 0x0a, 0x14, 0x44, 0x72, + 0x69, 0x76, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x22, 0x2b, 0x0a, 0x15, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0xc8, 0x01, 0x0a, 0x19, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x73, 0x0a, 0x1a, 0x44, 0x72, + 0x69, 0x76, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x75, 0x63, 0x6b, + 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x75, 0x63, + 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, + 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x73, + 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x6f, 0x6c, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, + 0x38, 0x0a, 0x19, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, + 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, + 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x22, 0x1c, 0x0a, 0x1a, 0x44, 0x72, 0x69, + 0x76, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc3, 0x02, 0x0a, 0x1e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, - 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, - 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x67, 0x0a, 0x24, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, - 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, - 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x22, 0x62, - 0x0a, 0x24, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x76, - 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x75, 0x63, 0x6b, 0x65, - 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x49, 0x64, 0x22, 0x27, 0x0a, 0x25, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, - 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x3e, 0x0a, 0x12, 0x53, - 0x33, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x14, 0x0a, 0x10, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x69, 0x67, 0x6e, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x33, 0x56, 0x32, 0x10, - 0x01, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x33, 0x56, 0x34, 0x10, 0x02, 0x2a, 0x71, 0x0a, 0x19, 0x41, - 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x6f, 0x75, 0x73, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x0a, 0x17, 0x55, 0x6e, 0x6b, 0x6e, - 0x6f, 0x77, 0x6e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, - 0x6f, 0x64, 0x65, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, - 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x02, - 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x03, 0x12, - 0x0d, 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x04, 0x32, 0x77, - 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x6b, 0x0a, 0x12, 0x50, 0x72, - 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x28, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x6f, 0x73, - 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x32, 0x9c, 0x04, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x12, 0x7a, 0x0a, 0x17, 0x50, 0x72, 0x6f, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, - 0x65, 0x74, 0x12, 0x2d, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2e, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x7a, 0x0a, 0x17, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x2d, - 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, - 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, - 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, - 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x87, 0x01, 0x0a, 0x1c, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, - 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x12, 0x32, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, - 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, - 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8a, 0x01, 0x0a, 0x1d, 0x50, 0x72, - 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, - 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x33, 0x2e, 0x63, 0x6f, - 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, - 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x34, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, - 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3a, 0x3c, 0x0a, 0x0a, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, - 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0xdc, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x45, 0x6e, 0x75, 0x6d, 0x3a, 0x4c, 0x0a, 0x10, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x65, 0x6e, - 0x75, 0x6d, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xdc, 0x08, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0e, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x3f, 0x0a, 0x0b, 0x63, 0x6f, 0x73, 0x69, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, - 0x74, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0xdb, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x63, 0x6f, 0x73, 0x69, 0x53, 0x65, 0x63, - 0x72, 0x65, 0x74, 0x3a, 0x3f, 0x0a, 0x0b, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x66, 0x69, 0x65, - 0x6c, 0x64, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0xdc, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x46, - 0x69, 0x65, 0x6c, 0x64, 0x3a, 0x45, 0x0a, 0x0d, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xdc, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x42, 0x0a, 0x0c, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x1e, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, - 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xdc, 0x08, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3a, - 0x45, 0x0a, 0x0d, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0xdc, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, 0x3a, 0x5a, 0x38, 0x73, 0x69, 0x67, 0x73, 0x2e, 0x6b, - 0x38, 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2d, - 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2d, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2d, 0x73, 0x70, 0x65, 0x63, 0x3b, 0x63, 0x6f, - 0x73, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x75, + 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, + 0x75, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x52, 0x0a, 0x13, 0x61, + 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x12, 0x61, 0x75, 0x74, + 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x5d, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, + 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x3d, + 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x62, 0x0a, + 0x1f, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, + 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, + 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, + 0x73, 0x22, 0x5d, 0x0a, 0x1f, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, + 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x49, + 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, + 0x22, 0x22, 0x0a, 0x20, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, + 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x3e, 0x0a, 0x12, 0x53, 0x33, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x10, 0x55, 0x6e, + 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x10, 0x00, + 0x12, 0x08, 0x0a, 0x04, 0x53, 0x33, 0x56, 0x32, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x33, + 0x56, 0x34, 0x10, 0x02, 0x2a, 0x71, 0x0a, 0x19, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x6f, 0x75, + 0x73, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, + 0x65, 0x12, 0x1b, 0x0a, 0x17, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x42, 0x75, 0x63, 0x6b, + 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x10, 0x00, 0x12, 0x0b, + 0x0a, 0x07, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x52, + 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x04, 0x2a, 0x45, 0x0a, 0x12, 0x41, 0x75, 0x74, 0x68, 0x65, + 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, + 0x19, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, + 0x4b, 0x65, 0x79, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x49, 0x41, 0x4d, 0x10, 0x02, 0x32, 0x68, + 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x5c, 0x0a, 0x0d, 0x44, 0x72, + 0x69, 0x76, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x23, 0x2e, 0x63, 0x6f, + 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, + 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x24, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x32, 0xde, 0x03, 0x0a, 0x0b, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x12, 0x6b, 0x0a, 0x12, 0x44, 0x72, 0x69, 0x76, + 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x28, + 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, + 0x72, 0x69, 0x76, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6b, 0x0a, 0x12, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x28, 0x2e, 0x63, 0x6f, + 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, + 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x78, 0x0a, 0x17, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, + 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x2d, 0x2e, + 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, + 0x69, 0x76, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x63, + 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, + 0x76, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7b, 0x0a, 0x18, + 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, + 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x2e, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x52, + 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x52, + 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3a, 0x3c, 0x0a, 0x0a, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xdc, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x45, 0x6e, 0x75, 0x6d, 0x3a, 0x4c, 0x0a, 0x10, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, + 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xdc, + 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x45, 0x6e, 0x75, 0x6d, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x3f, 0x0a, 0x0b, 0x63, 0x6f, 0x73, 0x69, 0x5f, 0x73, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0xdb, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x63, 0x6f, 0x73, 0x69, + 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x3a, 0x3f, 0x0a, 0x0b, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xdc, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x3a, 0x45, 0x0a, 0x0d, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xdc, 0x08, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0c, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x42, + 0x0a, 0x0c, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x1e, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xdc, + 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x4d, 0x65, 0x74, 0x68, + 0x6f, 0x64, 0x3a, 0x45, 0x0a, 0x0d, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xdc, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, 0x3a, 0x5a, 0x38, 0x73, 0x69, 0x67, + 0x73, 0x2e, 0x6b, 0x38, 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x2d, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, + 0x65, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2d, 0x73, 0x70, 0x65, 0x63, + 0x3b, 0x63, 0x6f, 0x73, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1278,64 +1326,66 @@ func file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDesc return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescData } -var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_enumTypes = make([]protoimpl.EnumInfo, 2) +var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_enumTypes = make([]protoimpl.EnumInfo, 3) var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes = make([]protoimpl.MessageInfo, 16) var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_goTypes = []interface{}{ - (S3SignatureVersion)(0), // 0: cosi.v1alpha1.S3SignatureVersion - (AnonymousBucketAccessMode)(0), // 1: cosi.v1alpha1.AnonymousBucketAccessMode - (*S3)(nil), // 2: cosi.v1alpha1.S3 - (*AzureBlob)(nil), // 3: cosi.v1alpha1.AzureBlob - (*GCS)(nil), // 4: cosi.v1alpha1.GCS - (*Protocol)(nil), // 5: cosi.v1alpha1.Protocol - (*ProvisionerGetInfoRequest)(nil), // 6: cosi.v1alpha1.ProvisionerGetInfoRequest - (*ProvisionerGetInfoResponse)(nil), // 7: cosi.v1alpha1.ProvisionerGetInfoResponse - (*ProvisionerCreateBucketRequest)(nil), // 8: cosi.v1alpha1.ProvisionerCreateBucketRequest - (*ProvisionerCreateBucketResponse)(nil), // 9: cosi.v1alpha1.ProvisionerCreateBucketResponse - (*ProvisionerDeleteBucketRequest)(nil), // 10: cosi.v1alpha1.ProvisionerDeleteBucketRequest - (*ProvisionerDeleteBucketResponse)(nil), // 11: cosi.v1alpha1.ProvisionerDeleteBucketResponse - (*ProvisionerGrantBucketAccessRequest)(nil), // 12: cosi.v1alpha1.ProvisionerGrantBucketAccessRequest - (*ProvisionerGrantBucketAccessResponse)(nil), // 13: cosi.v1alpha1.ProvisionerGrantBucketAccessResponse - (*ProvisionerRevokeBucketAccessRequest)(nil), // 14: cosi.v1alpha1.ProvisionerRevokeBucketAccessRequest - (*ProvisionerRevokeBucketAccessResponse)(nil), // 15: cosi.v1alpha1.ProvisionerRevokeBucketAccessResponse - nil, // 16: cosi.v1alpha1.ProvisionerCreateBucketRequest.ParametersEntry - nil, // 17: cosi.v1alpha1.ProvisionerGrantBucketAccessRequest.ParametersEntry - (*descriptor.EnumOptions)(nil), // 18: google.protobuf.EnumOptions - (*descriptor.EnumValueOptions)(nil), // 19: google.protobuf.EnumValueOptions - (*descriptor.FieldOptions)(nil), // 20: google.protobuf.FieldOptions - (*descriptor.MessageOptions)(nil), // 21: google.protobuf.MessageOptions - (*descriptor.MethodOptions)(nil), // 22: google.protobuf.MethodOptions - (*descriptor.ServiceOptions)(nil), // 23: google.protobuf.ServiceOptions + (S3SignatureVersion)(0), // 0: cosi.v1alpha1.S3SignatureVersion + (AnonymousBucketAccessMode)(0), // 1: cosi.v1alpha1.AnonymousBucketAccessMode + (AuthenticationType)(0), // 2: cosi.v1alpha1.AuthenticationType + (*S3)(nil), // 3: cosi.v1alpha1.S3 + (*AzureBlob)(nil), // 4: cosi.v1alpha1.AzureBlob + (*GCS)(nil), // 5: cosi.v1alpha1.GCS + (*Protocol)(nil), // 6: cosi.v1alpha1.Protocol + (*DriverGetInfoRequest)(nil), // 7: cosi.v1alpha1.DriverGetInfoRequest + (*DriverGetInfoResponse)(nil), // 8: cosi.v1alpha1.DriverGetInfoResponse + (*DriverCreateBucketRequest)(nil), // 9: cosi.v1alpha1.DriverCreateBucketRequest + (*DriverCreateBucketResponse)(nil), // 10: cosi.v1alpha1.DriverCreateBucketResponse + (*DriverDeleteBucketRequest)(nil), // 11: cosi.v1alpha1.DriverDeleteBucketRequest + (*DriverDeleteBucketResponse)(nil), // 12: cosi.v1alpha1.DriverDeleteBucketResponse + (*DriverGrantBucketAccessRequest)(nil), // 13: cosi.v1alpha1.DriverGrantBucketAccessRequest + (*DriverGrantBucketAccessResponse)(nil), // 14: cosi.v1alpha1.DriverGrantBucketAccessResponse + (*DriverRevokeBucketAccessRequest)(nil), // 15: cosi.v1alpha1.DriverRevokeBucketAccessRequest + (*DriverRevokeBucketAccessResponse)(nil), // 16: cosi.v1alpha1.DriverRevokeBucketAccessResponse + nil, // 17: cosi.v1alpha1.DriverCreateBucketRequest.ParametersEntry + nil, // 18: cosi.v1alpha1.DriverGrantBucketAccessRequest.ParametersEntry + (*descriptor.EnumOptions)(nil), // 19: google.protobuf.EnumOptions + (*descriptor.EnumValueOptions)(nil), // 20: google.protobuf.EnumValueOptions + (*descriptor.FieldOptions)(nil), // 21: google.protobuf.FieldOptions + (*descriptor.MessageOptions)(nil), // 22: google.protobuf.MessageOptions + (*descriptor.MethodOptions)(nil), // 23: google.protobuf.MethodOptions + (*descriptor.ServiceOptions)(nil), // 24: google.protobuf.ServiceOptions } var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_depIdxs = []int32{ 0, // 0: cosi.v1alpha1.S3.signature_version:type_name -> cosi.v1alpha1.S3SignatureVersion - 2, // 1: cosi.v1alpha1.Protocol.s3:type_name -> cosi.v1alpha1.S3 - 3, // 2: cosi.v1alpha1.Protocol.azureBlob:type_name -> cosi.v1alpha1.AzureBlob - 4, // 3: cosi.v1alpha1.Protocol.gcs:type_name -> cosi.v1alpha1.GCS - 5, // 4: cosi.v1alpha1.ProvisionerCreateBucketRequest.protocol:type_name -> cosi.v1alpha1.Protocol - 16, // 5: cosi.v1alpha1.ProvisionerCreateBucketRequest.parameters:type_name -> cosi.v1alpha1.ProvisionerCreateBucketRequest.ParametersEntry - 17, // 6: cosi.v1alpha1.ProvisionerGrantBucketAccessRequest.parameters:type_name -> cosi.v1alpha1.ProvisionerGrantBucketAccessRequest.ParametersEntry - 18, // 7: cosi.v1alpha1.alpha_enum:extendee -> google.protobuf.EnumOptions - 19, // 8: cosi.v1alpha1.alpha_enum_value:extendee -> google.protobuf.EnumValueOptions - 20, // 9: cosi.v1alpha1.cosi_secret:extendee -> google.protobuf.FieldOptions - 20, // 10: cosi.v1alpha1.alpha_field:extendee -> google.protobuf.FieldOptions - 21, // 11: cosi.v1alpha1.alpha_message:extendee -> google.protobuf.MessageOptions - 22, // 12: cosi.v1alpha1.alpha_method:extendee -> google.protobuf.MethodOptions - 23, // 13: cosi.v1alpha1.alpha_service:extendee -> google.protobuf.ServiceOptions - 6, // 14: cosi.v1alpha1.Identity.ProvisionerGetInfo:input_type -> cosi.v1alpha1.ProvisionerGetInfoRequest - 8, // 15: cosi.v1alpha1.Provisioner.ProvisionerCreateBucket:input_type -> cosi.v1alpha1.ProvisionerCreateBucketRequest - 10, // 16: cosi.v1alpha1.Provisioner.ProvisionerDeleteBucket:input_type -> cosi.v1alpha1.ProvisionerDeleteBucketRequest - 12, // 17: cosi.v1alpha1.Provisioner.ProvisionerGrantBucketAccess:input_type -> cosi.v1alpha1.ProvisionerGrantBucketAccessRequest - 14, // 18: cosi.v1alpha1.Provisioner.ProvisionerRevokeBucketAccess:input_type -> cosi.v1alpha1.ProvisionerRevokeBucketAccessRequest - 7, // 19: cosi.v1alpha1.Identity.ProvisionerGetInfo:output_type -> cosi.v1alpha1.ProvisionerGetInfoResponse - 9, // 20: cosi.v1alpha1.Provisioner.ProvisionerCreateBucket:output_type -> cosi.v1alpha1.ProvisionerCreateBucketResponse - 11, // 21: cosi.v1alpha1.Provisioner.ProvisionerDeleteBucket:output_type -> cosi.v1alpha1.ProvisionerDeleteBucketResponse - 13, // 22: cosi.v1alpha1.Provisioner.ProvisionerGrantBucketAccess:output_type -> cosi.v1alpha1.ProvisionerGrantBucketAccessResponse - 15, // 23: cosi.v1alpha1.Provisioner.ProvisionerRevokeBucketAccess:output_type -> cosi.v1alpha1.ProvisionerRevokeBucketAccessResponse - 19, // [19:24] is the sub-list for method output_type - 14, // [14:19] is the sub-list for method input_type - 14, // [14:14] is the sub-list for extension type_name - 7, // [7:14] is the sub-list for extension extendee - 0, // [0:7] is the sub-list for field type_name + 3, // 1: cosi.v1alpha1.Protocol.s3:type_name -> cosi.v1alpha1.S3 + 4, // 2: cosi.v1alpha1.Protocol.azureBlob:type_name -> cosi.v1alpha1.AzureBlob + 5, // 3: cosi.v1alpha1.Protocol.gcs:type_name -> cosi.v1alpha1.GCS + 17, // 4: cosi.v1alpha1.DriverCreateBucketRequest.parameters:type_name -> cosi.v1alpha1.DriverCreateBucketRequest.ParametersEntry + 6, // 5: cosi.v1alpha1.DriverCreateBucketResponse.bucket_info:type_name -> cosi.v1alpha1.Protocol + 2, // 6: cosi.v1alpha1.DriverGrantBucketAccessRequest.authentication_type:type_name -> cosi.v1alpha1.AuthenticationType + 18, // 7: cosi.v1alpha1.DriverGrantBucketAccessRequest.parameters:type_name -> cosi.v1alpha1.DriverGrantBucketAccessRequest.ParametersEntry + 19, // 8: cosi.v1alpha1.alpha_enum:extendee -> google.protobuf.EnumOptions + 20, // 9: cosi.v1alpha1.alpha_enum_value:extendee -> google.protobuf.EnumValueOptions + 21, // 10: cosi.v1alpha1.cosi_secret:extendee -> google.protobuf.FieldOptions + 21, // 11: cosi.v1alpha1.alpha_field:extendee -> google.protobuf.FieldOptions + 22, // 12: cosi.v1alpha1.alpha_message:extendee -> google.protobuf.MessageOptions + 23, // 13: cosi.v1alpha1.alpha_method:extendee -> google.protobuf.MethodOptions + 24, // 14: cosi.v1alpha1.alpha_service:extendee -> google.protobuf.ServiceOptions + 7, // 15: cosi.v1alpha1.Identity.DriverGetInfo:input_type -> cosi.v1alpha1.DriverGetInfoRequest + 9, // 16: cosi.v1alpha1.Provisioner.DriverCreateBucket:input_type -> cosi.v1alpha1.DriverCreateBucketRequest + 11, // 17: cosi.v1alpha1.Provisioner.DriverDeleteBucket:input_type -> cosi.v1alpha1.DriverDeleteBucketRequest + 13, // 18: cosi.v1alpha1.Provisioner.DriverGrantBucketAccess:input_type -> cosi.v1alpha1.DriverGrantBucketAccessRequest + 15, // 19: cosi.v1alpha1.Provisioner.DriverRevokeBucketAccess:input_type -> cosi.v1alpha1.DriverRevokeBucketAccessRequest + 8, // 20: cosi.v1alpha1.Identity.DriverGetInfo:output_type -> cosi.v1alpha1.DriverGetInfoResponse + 10, // 21: cosi.v1alpha1.Provisioner.DriverCreateBucket:output_type -> cosi.v1alpha1.DriverCreateBucketResponse + 12, // 22: cosi.v1alpha1.Provisioner.DriverDeleteBucket:output_type -> cosi.v1alpha1.DriverDeleteBucketResponse + 14, // 23: cosi.v1alpha1.Provisioner.DriverGrantBucketAccess:output_type -> cosi.v1alpha1.DriverGrantBucketAccessResponse + 16, // 24: cosi.v1alpha1.Provisioner.DriverRevokeBucketAccess:output_type -> cosi.v1alpha1.DriverRevokeBucketAccessResponse + 20, // [20:25] is the sub-list for method output_type + 15, // [15:20] is the sub-list for method input_type + 15, // [15:15] is the sub-list for extension type_name + 8, // [8:15] is the sub-list for extension extendee + 0, // [0:8] is the sub-list for field type_name } func init() { file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_init() } @@ -1393,7 +1443,7 @@ func file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_init() } } file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProvisionerGetInfoRequest); i { + switch v := v.(*DriverGetInfoRequest); i { case 0: return &v.state case 1: @@ -1405,7 +1455,7 @@ func file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_init() } } file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProvisionerGetInfoResponse); i { + switch v := v.(*DriverGetInfoResponse); i { case 0: return &v.state case 1: @@ -1417,7 +1467,7 @@ func file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_init() } } file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProvisionerCreateBucketRequest); i { + switch v := v.(*DriverCreateBucketRequest); i { case 0: return &v.state case 1: @@ -1429,7 +1479,7 @@ func file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_init() } } file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProvisionerCreateBucketResponse); i { + switch v := v.(*DriverCreateBucketResponse); i { case 0: return &v.state case 1: @@ -1441,7 +1491,7 @@ func file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_init() } } file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProvisionerDeleteBucketRequest); i { + switch v := v.(*DriverDeleteBucketRequest); i { case 0: return &v.state case 1: @@ -1453,7 +1503,7 @@ func file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_init() } } file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProvisionerDeleteBucketResponse); i { + switch v := v.(*DriverDeleteBucketResponse); i { case 0: return &v.state case 1: @@ -1465,7 +1515,7 @@ func file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_init() } } file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProvisionerGrantBucketAccessRequest); i { + switch v := v.(*DriverGrantBucketAccessRequest); i { case 0: return &v.state case 1: @@ -1477,7 +1527,7 @@ func file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_init() } } file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProvisionerGrantBucketAccessResponse); i { + switch v := v.(*DriverGrantBucketAccessResponse); i { case 0: return &v.state case 1: @@ -1489,7 +1539,7 @@ func file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_init() } } file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProvisionerRevokeBucketAccessRequest); i { + switch v := v.(*DriverRevokeBucketAccessRequest); i { case 0: return &v.state case 1: @@ -1501,7 +1551,7 @@ func file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_init() } } file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProvisionerRevokeBucketAccessResponse); i { + switch v := v.(*DriverRevokeBucketAccessResponse); i { case 0: return &v.state case 1: @@ -1523,7 +1573,7 @@ func file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_init() File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDesc, - NumEnums: 2, + NumEnums: 3, NumMessages: 16, NumExtensions: 7, NumServices: 2, @@ -1554,7 +1604,7 @@ const _ = grpc.SupportPackageIsVersion6 type IdentityClient interface { // This call is meant to retrieve the unique provisioner Identity. // This identity will have to be set in BucketRequest.Provisioner field in order to invoke this specific provisioner. - ProvisionerGetInfo(ctx context.Context, in *ProvisionerGetInfoRequest, opts ...grpc.CallOption) (*ProvisionerGetInfoResponse, error) + DriverGetInfo(ctx context.Context, in *DriverGetInfoRequest, opts ...grpc.CallOption) (*DriverGetInfoResponse, error) } type identityClient struct { @@ -1565,9 +1615,9 @@ func NewIdentityClient(cc grpc.ClientConnInterface) IdentityClient { return &identityClient{cc} } -func (c *identityClient) ProvisionerGetInfo(ctx context.Context, in *ProvisionerGetInfoRequest, opts ...grpc.CallOption) (*ProvisionerGetInfoResponse, error) { - out := new(ProvisionerGetInfoResponse) - err := c.cc.Invoke(ctx, "/cosi.v1alpha1.Identity/ProvisionerGetInfo", in, out, opts...) +func (c *identityClient) DriverGetInfo(ctx context.Context, in *DriverGetInfoRequest, opts ...grpc.CallOption) (*DriverGetInfoResponse, error) { + out := new(DriverGetInfoResponse) + err := c.cc.Invoke(ctx, "/cosi.v1alpha1.Identity/DriverGetInfo", in, out, opts...) if err != nil { return nil, err } @@ -1578,35 +1628,35 @@ func (c *identityClient) ProvisionerGetInfo(ctx context.Context, in *Provisioner type IdentityServer interface { // This call is meant to retrieve the unique provisioner Identity. // This identity will have to be set in BucketRequest.Provisioner field in order to invoke this specific provisioner. - ProvisionerGetInfo(context.Context, *ProvisionerGetInfoRequest) (*ProvisionerGetInfoResponse, error) + DriverGetInfo(context.Context, *DriverGetInfoRequest) (*DriverGetInfoResponse, error) } // UnimplementedIdentityServer can be embedded to have forward compatible implementations. type UnimplementedIdentityServer struct { } -func (*UnimplementedIdentityServer) ProvisionerGetInfo(context.Context, *ProvisionerGetInfoRequest) (*ProvisionerGetInfoResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ProvisionerGetInfo not implemented") +func (*UnimplementedIdentityServer) DriverGetInfo(context.Context, *DriverGetInfoRequest) (*DriverGetInfoResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DriverGetInfo not implemented") } func RegisterIdentityServer(s *grpc.Server, srv IdentityServer) { s.RegisterService(&_Identity_serviceDesc, srv) } -func _Identity_ProvisionerGetInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ProvisionerGetInfoRequest) +func _Identity_DriverGetInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DriverGetInfoRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(IdentityServer).ProvisionerGetInfo(ctx, in) + return srv.(IdentityServer).DriverGetInfo(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/cosi.v1alpha1.Identity/ProvisionerGetInfo", + FullMethod: "/cosi.v1alpha1.Identity/DriverGetInfo", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(IdentityServer).ProvisionerGetInfo(ctx, req.(*ProvisionerGetInfoRequest)) + return srv.(IdentityServer).DriverGetInfo(ctx, req.(*DriverGetInfoRequest)) } return interceptor(ctx, in, info, handler) } @@ -1616,8 +1666,8 @@ var _Identity_serviceDesc = grpc.ServiceDesc{ HandlerType: (*IdentityServer)(nil), Methods: []grpc.MethodDesc{ { - MethodName: "ProvisionerGetInfo", - Handler: _Identity_ProvisionerGetInfo_Handler, + MethodName: "DriverGetInfo", + Handler: _Identity_DriverGetInfo_Handler, }, }, Streams: []grpc.StreamDesc{}, @@ -1632,15 +1682,15 @@ type ProvisionerClient interface { // This call is idempotent // 1. If a bucket that matches both name and parameters already exists, then OK (success) must be returned. // 2. If a bucket by same name, but different parameters is provided, then the appropriate error code ALREADY_EXISTS must be returned. - ProvisionerCreateBucket(ctx context.Context, in *ProvisionerCreateBucketRequest, opts ...grpc.CallOption) (*ProvisionerCreateBucketResponse, error) + DriverCreateBucket(ctx context.Context, in *DriverCreateBucketRequest, opts ...grpc.CallOption) (*DriverCreateBucketResponse, error) // This call is made to delete the bucket in the backend. // If the bucket has already been deleted, then no error should be returned. - ProvisionerDeleteBucket(ctx context.Context, in *ProvisionerDeleteBucketRequest, opts ...grpc.CallOption) (*ProvisionerDeleteBucketResponse, error) + DriverDeleteBucket(ctx context.Context, in *DriverDeleteBucketRequest, opts ...grpc.CallOption) (*DriverDeleteBucketResponse, error) // This call grants access to an account. The account_name in the request shall be used as a unique identifier to create credentials. - // The account_id returned in the response will be used as the unique identifier for deleting this access when calling ProvisionerRevokeBucketAccess. - ProvisionerGrantBucketAccess(ctx context.Context, in *ProvisionerGrantBucketAccessRequest, opts ...grpc.CallOption) (*ProvisionerGrantBucketAccessResponse, error) + // The account_id returned in the response will be used as the unique identifier for deleting this access when calling DriverRevokeBucketAccess. + DriverGrantBucketAccess(ctx context.Context, in *DriverGrantBucketAccessRequest, opts ...grpc.CallOption) (*DriverGrantBucketAccessResponse, error) // This call revokes all access to a particular bucket from a principal. - ProvisionerRevokeBucketAccess(ctx context.Context, in *ProvisionerRevokeBucketAccessRequest, opts ...grpc.CallOption) (*ProvisionerRevokeBucketAccessResponse, error) + DriverRevokeBucketAccess(ctx context.Context, in *DriverRevokeBucketAccessRequest, opts ...grpc.CallOption) (*DriverRevokeBucketAccessResponse, error) } type provisionerClient struct { @@ -1651,36 +1701,36 @@ func NewProvisionerClient(cc grpc.ClientConnInterface) ProvisionerClient { return &provisionerClient{cc} } -func (c *provisionerClient) ProvisionerCreateBucket(ctx context.Context, in *ProvisionerCreateBucketRequest, opts ...grpc.CallOption) (*ProvisionerCreateBucketResponse, error) { - out := new(ProvisionerCreateBucketResponse) - err := c.cc.Invoke(ctx, "/cosi.v1alpha1.Provisioner/ProvisionerCreateBucket", in, out, opts...) +func (c *provisionerClient) DriverCreateBucket(ctx context.Context, in *DriverCreateBucketRequest, opts ...grpc.CallOption) (*DriverCreateBucketResponse, error) { + out := new(DriverCreateBucketResponse) + err := c.cc.Invoke(ctx, "/cosi.v1alpha1.Provisioner/DriverCreateBucket", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *provisionerClient) ProvisionerDeleteBucket(ctx context.Context, in *ProvisionerDeleteBucketRequest, opts ...grpc.CallOption) (*ProvisionerDeleteBucketResponse, error) { - out := new(ProvisionerDeleteBucketResponse) - err := c.cc.Invoke(ctx, "/cosi.v1alpha1.Provisioner/ProvisionerDeleteBucket", in, out, opts...) +func (c *provisionerClient) DriverDeleteBucket(ctx context.Context, in *DriverDeleteBucketRequest, opts ...grpc.CallOption) (*DriverDeleteBucketResponse, error) { + out := new(DriverDeleteBucketResponse) + err := c.cc.Invoke(ctx, "/cosi.v1alpha1.Provisioner/DriverDeleteBucket", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *provisionerClient) ProvisionerGrantBucketAccess(ctx context.Context, in *ProvisionerGrantBucketAccessRequest, opts ...grpc.CallOption) (*ProvisionerGrantBucketAccessResponse, error) { - out := new(ProvisionerGrantBucketAccessResponse) - err := c.cc.Invoke(ctx, "/cosi.v1alpha1.Provisioner/ProvisionerGrantBucketAccess", in, out, opts...) +func (c *provisionerClient) DriverGrantBucketAccess(ctx context.Context, in *DriverGrantBucketAccessRequest, opts ...grpc.CallOption) (*DriverGrantBucketAccessResponse, error) { + out := new(DriverGrantBucketAccessResponse) + err := c.cc.Invoke(ctx, "/cosi.v1alpha1.Provisioner/DriverGrantBucketAccess", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *provisionerClient) ProvisionerRevokeBucketAccess(ctx context.Context, in *ProvisionerRevokeBucketAccessRequest, opts ...grpc.CallOption) (*ProvisionerRevokeBucketAccessResponse, error) { - out := new(ProvisionerRevokeBucketAccessResponse) - err := c.cc.Invoke(ctx, "/cosi.v1alpha1.Provisioner/ProvisionerRevokeBucketAccess", in, out, opts...) +func (c *provisionerClient) DriverRevokeBucketAccess(ctx context.Context, in *DriverRevokeBucketAccessRequest, opts ...grpc.CallOption) (*DriverRevokeBucketAccessResponse, error) { + out := new(DriverRevokeBucketAccessResponse) + err := c.cc.Invoke(ctx, "/cosi.v1alpha1.Provisioner/DriverRevokeBucketAccess", in, out, opts...) if err != nil { return nil, err } @@ -1693,106 +1743,106 @@ type ProvisionerServer interface { // This call is idempotent // 1. If a bucket that matches both name and parameters already exists, then OK (success) must be returned. // 2. If a bucket by same name, but different parameters is provided, then the appropriate error code ALREADY_EXISTS must be returned. - ProvisionerCreateBucket(context.Context, *ProvisionerCreateBucketRequest) (*ProvisionerCreateBucketResponse, error) + DriverCreateBucket(context.Context, *DriverCreateBucketRequest) (*DriverCreateBucketResponse, error) // This call is made to delete the bucket in the backend. // If the bucket has already been deleted, then no error should be returned. - ProvisionerDeleteBucket(context.Context, *ProvisionerDeleteBucketRequest) (*ProvisionerDeleteBucketResponse, error) + DriverDeleteBucket(context.Context, *DriverDeleteBucketRequest) (*DriverDeleteBucketResponse, error) // This call grants access to an account. The account_name in the request shall be used as a unique identifier to create credentials. - // The account_id returned in the response will be used as the unique identifier for deleting this access when calling ProvisionerRevokeBucketAccess. - ProvisionerGrantBucketAccess(context.Context, *ProvisionerGrantBucketAccessRequest) (*ProvisionerGrantBucketAccessResponse, error) + // The account_id returned in the response will be used as the unique identifier for deleting this access when calling DriverRevokeBucketAccess. + DriverGrantBucketAccess(context.Context, *DriverGrantBucketAccessRequest) (*DriverGrantBucketAccessResponse, error) // This call revokes all access to a particular bucket from a principal. - ProvisionerRevokeBucketAccess(context.Context, *ProvisionerRevokeBucketAccessRequest) (*ProvisionerRevokeBucketAccessResponse, error) + DriverRevokeBucketAccess(context.Context, *DriverRevokeBucketAccessRequest) (*DriverRevokeBucketAccessResponse, error) } // UnimplementedProvisionerServer can be embedded to have forward compatible implementations. type UnimplementedProvisionerServer struct { } -func (*UnimplementedProvisionerServer) ProvisionerCreateBucket(context.Context, *ProvisionerCreateBucketRequest) (*ProvisionerCreateBucketResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ProvisionerCreateBucket not implemented") +func (*UnimplementedProvisionerServer) DriverCreateBucket(context.Context, *DriverCreateBucketRequest) (*DriverCreateBucketResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DriverCreateBucket not implemented") } -func (*UnimplementedProvisionerServer) ProvisionerDeleteBucket(context.Context, *ProvisionerDeleteBucketRequest) (*ProvisionerDeleteBucketResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ProvisionerDeleteBucket not implemented") +func (*UnimplementedProvisionerServer) DriverDeleteBucket(context.Context, *DriverDeleteBucketRequest) (*DriverDeleteBucketResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DriverDeleteBucket not implemented") } -func (*UnimplementedProvisionerServer) ProvisionerGrantBucketAccess(context.Context, *ProvisionerGrantBucketAccessRequest) (*ProvisionerGrantBucketAccessResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ProvisionerGrantBucketAccess not implemented") +func (*UnimplementedProvisionerServer) DriverGrantBucketAccess(context.Context, *DriverGrantBucketAccessRequest) (*DriverGrantBucketAccessResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DriverGrantBucketAccess not implemented") } -func (*UnimplementedProvisionerServer) ProvisionerRevokeBucketAccess(context.Context, *ProvisionerRevokeBucketAccessRequest) (*ProvisionerRevokeBucketAccessResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ProvisionerRevokeBucketAccess not implemented") +func (*UnimplementedProvisionerServer) DriverRevokeBucketAccess(context.Context, *DriverRevokeBucketAccessRequest) (*DriverRevokeBucketAccessResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DriverRevokeBucketAccess not implemented") } func RegisterProvisionerServer(s *grpc.Server, srv ProvisionerServer) { s.RegisterService(&_Provisioner_serviceDesc, srv) } -func _Provisioner_ProvisionerCreateBucket_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ProvisionerCreateBucketRequest) +func _Provisioner_DriverCreateBucket_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DriverCreateBucketRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ProvisionerServer).ProvisionerCreateBucket(ctx, in) + return srv.(ProvisionerServer).DriverCreateBucket(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/cosi.v1alpha1.Provisioner/ProvisionerCreateBucket", + FullMethod: "/cosi.v1alpha1.Provisioner/DriverCreateBucket", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ProvisionerServer).ProvisionerCreateBucket(ctx, req.(*ProvisionerCreateBucketRequest)) + return srv.(ProvisionerServer).DriverCreateBucket(ctx, req.(*DriverCreateBucketRequest)) } return interceptor(ctx, in, info, handler) } -func _Provisioner_ProvisionerDeleteBucket_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ProvisionerDeleteBucketRequest) +func _Provisioner_DriverDeleteBucket_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DriverDeleteBucketRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ProvisionerServer).ProvisionerDeleteBucket(ctx, in) + return srv.(ProvisionerServer).DriverDeleteBucket(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/cosi.v1alpha1.Provisioner/ProvisionerDeleteBucket", + FullMethod: "/cosi.v1alpha1.Provisioner/DriverDeleteBucket", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ProvisionerServer).ProvisionerDeleteBucket(ctx, req.(*ProvisionerDeleteBucketRequest)) + return srv.(ProvisionerServer).DriverDeleteBucket(ctx, req.(*DriverDeleteBucketRequest)) } return interceptor(ctx, in, info, handler) } -func _Provisioner_ProvisionerGrantBucketAccess_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ProvisionerGrantBucketAccessRequest) +func _Provisioner_DriverGrantBucketAccess_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DriverGrantBucketAccessRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ProvisionerServer).ProvisionerGrantBucketAccess(ctx, in) + return srv.(ProvisionerServer).DriverGrantBucketAccess(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/cosi.v1alpha1.Provisioner/ProvisionerGrantBucketAccess", + FullMethod: "/cosi.v1alpha1.Provisioner/DriverGrantBucketAccess", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ProvisionerServer).ProvisionerGrantBucketAccess(ctx, req.(*ProvisionerGrantBucketAccessRequest)) + return srv.(ProvisionerServer).DriverGrantBucketAccess(ctx, req.(*DriverGrantBucketAccessRequest)) } return interceptor(ctx, in, info, handler) } -func _Provisioner_ProvisionerRevokeBucketAccess_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ProvisionerRevokeBucketAccessRequest) +func _Provisioner_DriverRevokeBucketAccess_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DriverRevokeBucketAccessRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ProvisionerServer).ProvisionerRevokeBucketAccess(ctx, in) + return srv.(ProvisionerServer).DriverRevokeBucketAccess(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/cosi.v1alpha1.Provisioner/ProvisionerRevokeBucketAccess", + FullMethod: "/cosi.v1alpha1.Provisioner/DriverRevokeBucketAccess", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ProvisionerServer).ProvisionerRevokeBucketAccess(ctx, req.(*ProvisionerRevokeBucketAccessRequest)) + return srv.(ProvisionerServer).DriverRevokeBucketAccess(ctx, req.(*DriverRevokeBucketAccessRequest)) } return interceptor(ctx, in, info, handler) } @@ -1802,20 +1852,20 @@ var _Provisioner_serviceDesc = grpc.ServiceDesc{ HandlerType: (*ProvisionerServer)(nil), Methods: []grpc.MethodDesc{ { - MethodName: "ProvisionerCreateBucket", - Handler: _Provisioner_ProvisionerCreateBucket_Handler, + MethodName: "DriverCreateBucket", + Handler: _Provisioner_DriverCreateBucket_Handler, }, { - MethodName: "ProvisionerDeleteBucket", - Handler: _Provisioner_ProvisionerDeleteBucket_Handler, + MethodName: "DriverDeleteBucket", + Handler: _Provisioner_DriverDeleteBucket_Handler, }, { - MethodName: "ProvisionerGrantBucketAccess", - Handler: _Provisioner_ProvisionerGrantBucketAccess_Handler, + MethodName: "DriverGrantBucketAccess", + Handler: _Provisioner_DriverGrantBucketAccess_Handler, }, { - MethodName: "ProvisionerRevokeBucketAccess", - Handler: _Provisioner_ProvisionerRevokeBucketAccess_Handler, + MethodName: "DriverRevokeBucketAccess", + Handler: _Provisioner_DriverRevokeBucketAccess_Handler, }, }, Streams: []grpc.StreamDesc{}, diff --git a/cosi.pb.json.go b/cosi.pb.json.go index 57bd9cfe..4d6e0c76 100644 --- a/cosi.pb.json.go +++ b/cosi.pb.json.go @@ -4,259 +4,229 @@ package cosi import ( - "bytes" - - "github.com/golang/protobuf/jsonpb" + "google.golang.org/protobuf/encoding/protojson" ) // MarshalJSON implements json.Marshaler func (msg *S3) MarshalJSON() ([]byte, error) { - var buf bytes.Buffer - err := (&jsonpb.Marshaler{ - EnumsAsInts: false, - EmitDefaults: true, - OrigName: false, - }).Marshal(&buf, msg) - return buf.Bytes(), err + return protojson.MarshalOptions{ + UseEnumNumbers: false, + EmitUnpopulated: true, + UseProtoNames: false, + }.Marshal(msg) } // UnmarshalJSON implements json.Unmarshaler func (msg *S3) UnmarshalJSON(b []byte) error { - return (&jsonpb.Unmarshaler{ - AllowUnknownFields: false, - }).Unmarshal(bytes.NewReader(b), msg) + return protojson.UnmarshalOptions{ + DiscardUnknown: false, + }.Unmarshal(b, msg) } // MarshalJSON implements json.Marshaler func (msg *AzureBlob) MarshalJSON() ([]byte, error) { - var buf bytes.Buffer - err := (&jsonpb.Marshaler{ - EnumsAsInts: false, - EmitDefaults: true, - OrigName: false, - }).Marshal(&buf, msg) - return buf.Bytes(), err + return protojson.MarshalOptions{ + UseEnumNumbers: false, + EmitUnpopulated: true, + UseProtoNames: false, + }.Marshal(msg) } // UnmarshalJSON implements json.Unmarshaler func (msg *AzureBlob) UnmarshalJSON(b []byte) error { - return (&jsonpb.Unmarshaler{ - AllowUnknownFields: false, - }).Unmarshal(bytes.NewReader(b), msg) + return protojson.UnmarshalOptions{ + DiscardUnknown: false, + }.Unmarshal(b, msg) } // MarshalJSON implements json.Marshaler func (msg *GCS) MarshalJSON() ([]byte, error) { - var buf bytes.Buffer - err := (&jsonpb.Marshaler{ - EnumsAsInts: false, - EmitDefaults: true, - OrigName: false, - }).Marshal(&buf, msg) - return buf.Bytes(), err + return protojson.MarshalOptions{ + UseEnumNumbers: false, + EmitUnpopulated: true, + UseProtoNames: false, + }.Marshal(msg) } // UnmarshalJSON implements json.Unmarshaler func (msg *GCS) UnmarshalJSON(b []byte) error { - return (&jsonpb.Unmarshaler{ - AllowUnknownFields: false, - }).Unmarshal(bytes.NewReader(b), msg) + return protojson.UnmarshalOptions{ + DiscardUnknown: false, + }.Unmarshal(b, msg) } // MarshalJSON implements json.Marshaler func (msg *Protocol) MarshalJSON() ([]byte, error) { - var buf bytes.Buffer - err := (&jsonpb.Marshaler{ - EnumsAsInts: false, - EmitDefaults: true, - OrigName: false, - }).Marshal(&buf, msg) - return buf.Bytes(), err + return protojson.MarshalOptions{ + UseEnumNumbers: false, + EmitUnpopulated: true, + UseProtoNames: false, + }.Marshal(msg) } // UnmarshalJSON implements json.Unmarshaler func (msg *Protocol) UnmarshalJSON(b []byte) error { - return (&jsonpb.Unmarshaler{ - AllowUnknownFields: false, - }).Unmarshal(bytes.NewReader(b), msg) + return protojson.UnmarshalOptions{ + DiscardUnknown: false, + }.Unmarshal(b, msg) } // MarshalJSON implements json.Marshaler -func (msg *ProvisionerGetInfoRequest) MarshalJSON() ([]byte, error) { - var buf bytes.Buffer - err := (&jsonpb.Marshaler{ - EnumsAsInts: false, - EmitDefaults: true, - OrigName: false, - }).Marshal(&buf, msg) - return buf.Bytes(), err +func (msg *DriverGetInfoRequest) MarshalJSON() ([]byte, error) { + return protojson.MarshalOptions{ + UseEnumNumbers: false, + EmitUnpopulated: true, + UseProtoNames: false, + }.Marshal(msg) } // UnmarshalJSON implements json.Unmarshaler -func (msg *ProvisionerGetInfoRequest) UnmarshalJSON(b []byte) error { - return (&jsonpb.Unmarshaler{ - AllowUnknownFields: false, - }).Unmarshal(bytes.NewReader(b), msg) +func (msg *DriverGetInfoRequest) UnmarshalJSON(b []byte) error { + return protojson.UnmarshalOptions{ + DiscardUnknown: false, + }.Unmarshal(b, msg) } // MarshalJSON implements json.Marshaler -func (msg *ProvisionerGetInfoResponse) MarshalJSON() ([]byte, error) { - var buf bytes.Buffer - err := (&jsonpb.Marshaler{ - EnumsAsInts: false, - EmitDefaults: true, - OrigName: false, - }).Marshal(&buf, msg) - return buf.Bytes(), err +func (msg *DriverGetInfoResponse) MarshalJSON() ([]byte, error) { + return protojson.MarshalOptions{ + UseEnumNumbers: false, + EmitUnpopulated: true, + UseProtoNames: false, + }.Marshal(msg) } // UnmarshalJSON implements json.Unmarshaler -func (msg *ProvisionerGetInfoResponse) UnmarshalJSON(b []byte) error { - return (&jsonpb.Unmarshaler{ - AllowUnknownFields: false, - }).Unmarshal(bytes.NewReader(b), msg) +func (msg *DriverGetInfoResponse) UnmarshalJSON(b []byte) error { + return protojson.UnmarshalOptions{ + DiscardUnknown: false, + }.Unmarshal(b, msg) } // MarshalJSON implements json.Marshaler -func (msg *ProvisionerCreateBucketRequest) MarshalJSON() ([]byte, error) { - var buf bytes.Buffer - err := (&jsonpb.Marshaler{ - EnumsAsInts: false, - EmitDefaults: true, - OrigName: false, - }).Marshal(&buf, msg) - return buf.Bytes(), err +func (msg *DriverCreateBucketRequest) MarshalJSON() ([]byte, error) { + return protojson.MarshalOptions{ + UseEnumNumbers: false, + EmitUnpopulated: true, + UseProtoNames: false, + }.Marshal(msg) } // UnmarshalJSON implements json.Unmarshaler -func (msg *ProvisionerCreateBucketRequest) UnmarshalJSON(b []byte) error { - return (&jsonpb.Unmarshaler{ - AllowUnknownFields: false, - }).Unmarshal(bytes.NewReader(b), msg) +func (msg *DriverCreateBucketRequest) UnmarshalJSON(b []byte) error { + return protojson.UnmarshalOptions{ + DiscardUnknown: false, + }.Unmarshal(b, msg) } // MarshalJSON implements json.Marshaler -func (msg *ProvisionerCreateBucketResponse) MarshalJSON() ([]byte, error) { - var buf bytes.Buffer - err := (&jsonpb.Marshaler{ - EnumsAsInts: false, - EmitDefaults: true, - OrigName: false, - }).Marshal(&buf, msg) - return buf.Bytes(), err +func (msg *DriverCreateBucketResponse) MarshalJSON() ([]byte, error) { + return protojson.MarshalOptions{ + UseEnumNumbers: false, + EmitUnpopulated: true, + UseProtoNames: false, + }.Marshal(msg) } // UnmarshalJSON implements json.Unmarshaler -func (msg *ProvisionerCreateBucketResponse) UnmarshalJSON(b []byte) error { - return (&jsonpb.Unmarshaler{ - AllowUnknownFields: false, - }).Unmarshal(bytes.NewReader(b), msg) +func (msg *DriverCreateBucketResponse) UnmarshalJSON(b []byte) error { + return protojson.UnmarshalOptions{ + DiscardUnknown: false, + }.Unmarshal(b, msg) } // MarshalJSON implements json.Marshaler -func (msg *ProvisionerDeleteBucketRequest) MarshalJSON() ([]byte, error) { - var buf bytes.Buffer - err := (&jsonpb.Marshaler{ - EnumsAsInts: false, - EmitDefaults: true, - OrigName: false, - }).Marshal(&buf, msg) - return buf.Bytes(), err +func (msg *DriverDeleteBucketRequest) MarshalJSON() ([]byte, error) { + return protojson.MarshalOptions{ + UseEnumNumbers: false, + EmitUnpopulated: true, + UseProtoNames: false, + }.Marshal(msg) } // UnmarshalJSON implements json.Unmarshaler -func (msg *ProvisionerDeleteBucketRequest) UnmarshalJSON(b []byte) error { - return (&jsonpb.Unmarshaler{ - AllowUnknownFields: false, - }).Unmarshal(bytes.NewReader(b), msg) +func (msg *DriverDeleteBucketRequest) UnmarshalJSON(b []byte) error { + return protojson.UnmarshalOptions{ + DiscardUnknown: false, + }.Unmarshal(b, msg) } // MarshalJSON implements json.Marshaler -func (msg *ProvisionerDeleteBucketResponse) MarshalJSON() ([]byte, error) { - var buf bytes.Buffer - err := (&jsonpb.Marshaler{ - EnumsAsInts: false, - EmitDefaults: true, - OrigName: false, - }).Marshal(&buf, msg) - return buf.Bytes(), err +func (msg *DriverDeleteBucketResponse) MarshalJSON() ([]byte, error) { + return protojson.MarshalOptions{ + UseEnumNumbers: false, + EmitUnpopulated: true, + UseProtoNames: false, + }.Marshal(msg) } // UnmarshalJSON implements json.Unmarshaler -func (msg *ProvisionerDeleteBucketResponse) UnmarshalJSON(b []byte) error { - return (&jsonpb.Unmarshaler{ - AllowUnknownFields: false, - }).Unmarshal(bytes.NewReader(b), msg) +func (msg *DriverDeleteBucketResponse) UnmarshalJSON(b []byte) error { + return protojson.UnmarshalOptions{ + DiscardUnknown: false, + }.Unmarshal(b, msg) } // MarshalJSON implements json.Marshaler -func (msg *ProvisionerGrantBucketAccessRequest) MarshalJSON() ([]byte, error) { - var buf bytes.Buffer - err := (&jsonpb.Marshaler{ - EnumsAsInts: false, - EmitDefaults: true, - OrigName: false, - }).Marshal(&buf, msg) - return buf.Bytes(), err +func (msg *DriverGrantBucketAccessRequest) MarshalJSON() ([]byte, error) { + return protojson.MarshalOptions{ + UseEnumNumbers: false, + EmitUnpopulated: true, + UseProtoNames: false, + }.Marshal(msg) } // UnmarshalJSON implements json.Unmarshaler -func (msg *ProvisionerGrantBucketAccessRequest) UnmarshalJSON(b []byte) error { - return (&jsonpb.Unmarshaler{ - AllowUnknownFields: false, - }).Unmarshal(bytes.NewReader(b), msg) +func (msg *DriverGrantBucketAccessRequest) UnmarshalJSON(b []byte) error { + return protojson.UnmarshalOptions{ + DiscardUnknown: false, + }.Unmarshal(b, msg) } // MarshalJSON implements json.Marshaler -func (msg *ProvisionerGrantBucketAccessResponse) MarshalJSON() ([]byte, error) { - var buf bytes.Buffer - err := (&jsonpb.Marshaler{ - EnumsAsInts: false, - EmitDefaults: true, - OrigName: false, - }).Marshal(&buf, msg) - return buf.Bytes(), err +func (msg *DriverGrantBucketAccessResponse) MarshalJSON() ([]byte, error) { + return protojson.MarshalOptions{ + UseEnumNumbers: false, + EmitUnpopulated: true, + UseProtoNames: false, + }.Marshal(msg) } // UnmarshalJSON implements json.Unmarshaler -func (msg *ProvisionerGrantBucketAccessResponse) UnmarshalJSON(b []byte) error { - return (&jsonpb.Unmarshaler{ - AllowUnknownFields: false, - }).Unmarshal(bytes.NewReader(b), msg) +func (msg *DriverGrantBucketAccessResponse) UnmarshalJSON(b []byte) error { + return protojson.UnmarshalOptions{ + DiscardUnknown: false, + }.Unmarshal(b, msg) } // MarshalJSON implements json.Marshaler -func (msg *ProvisionerRevokeBucketAccessRequest) MarshalJSON() ([]byte, error) { - var buf bytes.Buffer - err := (&jsonpb.Marshaler{ - EnumsAsInts: false, - EmitDefaults: true, - OrigName: false, - }).Marshal(&buf, msg) - return buf.Bytes(), err +func (msg *DriverRevokeBucketAccessRequest) MarshalJSON() ([]byte, error) { + return protojson.MarshalOptions{ + UseEnumNumbers: false, + EmitUnpopulated: true, + UseProtoNames: false, + }.Marshal(msg) } // UnmarshalJSON implements json.Unmarshaler -func (msg *ProvisionerRevokeBucketAccessRequest) UnmarshalJSON(b []byte) error { - return (&jsonpb.Unmarshaler{ - AllowUnknownFields: false, - }).Unmarshal(bytes.NewReader(b), msg) +func (msg *DriverRevokeBucketAccessRequest) UnmarshalJSON(b []byte) error { + return protojson.UnmarshalOptions{ + DiscardUnknown: false, + }.Unmarshal(b, msg) } // MarshalJSON implements json.Marshaler -func (msg *ProvisionerRevokeBucketAccessResponse) MarshalJSON() ([]byte, error) { - var buf bytes.Buffer - err := (&jsonpb.Marshaler{ - EnumsAsInts: false, - EmitDefaults: true, - OrigName: false, - }).Marshal(&buf, msg) - return buf.Bytes(), err +func (msg *DriverRevokeBucketAccessResponse) MarshalJSON() ([]byte, error) { + return protojson.MarshalOptions{ + UseEnumNumbers: false, + EmitUnpopulated: true, + UseProtoNames: false, + }.Marshal(msg) } // UnmarshalJSON implements json.Unmarshaler -func (msg *ProvisionerRevokeBucketAccessResponse) UnmarshalJSON(b []byte) error { - return (&jsonpb.Unmarshaler{ - AllowUnknownFields: false, - }).Unmarshal(bytes.NewReader(b), msg) +func (msg *DriverRevokeBucketAccessResponse) UnmarshalJSON(b []byte) error { + return protojson.UnmarshalOptions{ + DiscardUnknown: false, + }.Unmarshal(b, msg) } diff --git a/cosi.proto b/cosi.proto index 29455ec6..45e15911 100644 --- a/cosi.proto +++ b/cosi.proto @@ -55,7 +55,7 @@ extend google.protobuf.ServiceOptions { service Identity { // This call is meant to retrieve the unique provisioner Identity. // This identity will have to be set in BucketRequest.Provisioner field in order to invoke this specific provisioner. - rpc ProvisionerGetInfo (ProvisionerGetInfoRequest) returns (ProvisionerGetInfoResponse) {} + rpc DriverGetInfo (DriverGetInfoRequest) returns (DriverGetInfoResponse) {} } service Provisioner { @@ -63,16 +63,16 @@ service Provisioner { // This call is idempotent // 1. If a bucket that matches both name and parameters already exists, then OK (success) must be returned. // 2. If a bucket by same name, but different parameters is provided, then the appropriate error code ALREADY_EXISTS must be returned. - rpc ProvisionerCreateBucket (ProvisionerCreateBucketRequest) returns (ProvisionerCreateBucketResponse) {} + rpc DriverCreateBucket (DriverCreateBucketRequest) returns (DriverCreateBucketResponse) {} // This call is made to delete the bucket in the backend. // If the bucket has already been deleted, then no error should be returned. - rpc ProvisionerDeleteBucket (ProvisionerDeleteBucketRequest) returns (ProvisionerDeleteBucketResponse) {} + rpc DriverDeleteBucket (DriverDeleteBucketRequest) returns (DriverDeleteBucketResponse) {} // This call grants access to an account. The account_name in the request shall be used as a unique identifier to create credentials. - // The account_id returned in the response will be used as the unique identifier for deleting this access when calling ProvisionerRevokeBucketAccess. - rpc ProvisionerGrantBucketAccess (ProvisionerGrantBucketAccessRequest) returns (ProvisionerGrantBucketAccessResponse); + // The account_id returned in the response will be used as the unique identifier for deleting this access when calling DriverRevokeBucketAccess. + rpc DriverGrantBucketAccess (DriverGrantBucketAccessRequest) returns (DriverGrantBucketAccessResponse); // This call revokes all access to a particular bucket from a principal. - rpc ProvisionerRevokeBucketAccess (ProvisionerRevokeBucketAccessRequest) returns (ProvisionerRevokeBucketAccessResponse); + rpc DriverRevokeBucketAccess (DriverRevokeBucketAccessRequest) returns (DriverRevokeBucketAccessResponse); } // S3SignatureVersion is the version of the signing algorithm for all s3 requests @@ -96,6 +96,14 @@ enum AnonymousBucketAccessMode { ReadWrite = 4; } +enum AuthenticationType { + UnknownAuthenticationType = 0; + // Default, KEY based authentication. + Key = 1; + // Storageaccount based authentication. + IAM = 2; +} + message S3 { // region denotes the geographical region where the S3 server is running string region = 1; @@ -125,11 +133,11 @@ message Protocol { } } -message ProvisionerGetInfoRequest { +message DriverGetInfoRequest { // Intentionally left blank } -message ProvisionerGetInfoResponse { +message DriverGetInfoResponse { // This field is REQUIRED // The name MUST follow domain name notation format // (https://tools.ietf.org/html/rfc1035#section-2.3.1). It SHOULD @@ -141,53 +149,52 @@ message ProvisionerGetInfoResponse { string name = 1; } -message ProvisionerCreateBucketRequest { +message DriverCreateBucketRequest { // This field is REQUIRED // name specifies the name of the bucket that should be created. string name = 1; - // This field is REQUIRED - // Protocol specific information required by the call is passed in as key,value pairs. - Protocol protocol = 2; - // This field is OPTIONAL // The caller should treat the values in parameters as opaque. // The receiver is responsible for parsing and validating the values. - map parameters = 3; + map parameters = 2; } -message ProvisionerCreateBucketResponse { +message DriverCreateBucketResponse { // bucket_id returned here is expected to be the globally unique - // identifier for the bucket in the object storage provider + // identifier for the bucket in the object storage provider. string bucket_id = 1; + + // bucket_info returned here stores the data specific to the + // bucket required by the object storage provider to connect to the bucket. + Protocol bucket_info = 2; } -message ProvisionerDeleteBucketRequest { +message DriverDeleteBucketRequest { // This field is REQUIRED // bucket_id is a globally unique identifier for the bucket // in the object storage provider string bucket_id = 1; } -message ProvisionerDeleteBucketResponse { +message DriverDeleteBucketResponse { // Intentionally left blank } -message ProvisionerGrantBucketAccessRequest { +message DriverGrantBucketAccessRequest { // This field is REQUIRED // bucket_id is a globally unique identifier for the bucket // in the object storage provider string bucket_id = 1; // This field is REQUIRED - // account_name is a identifier for object storage provider - // to ensure that multiple requests for the same account - // result in only one access token being created - string account_name = 2; + // name field is used to define the name of the bucket access object. + string name = 2; // This field is REQUIRED - // Requested Access policy, ex: {"Effect":"Allow","Action":"s3:PutObject","Resource":"arn:aws:s3:::profilepics/*"} - string access_policy = 3; + // Requested authentication type for the bucket access. + // Supported authentication types are KEY or IAM. + AuthenticationType authentication_type = 3; // This field is OPTIONAL // The caller should treat the values in parameters as opaque. @@ -195,18 +202,18 @@ message ProvisionerGrantBucketAccessRequest { map parameters = 4; } -message ProvisionerGrantBucketAccessResponse { - // This field is OPTIONAL +message DriverGrantBucketAccessResponse { + // This field is REQUIRED // This is the account_id that is being provided access. This will // be required later to revoke access. string account_id = 1; - // This field is OPTIONAL + // This field is REQUIRED // Credentials supplied for accessing the bucket ex: aws access key id and secret, etc. string credentials = 2; } -message ProvisionerRevokeBucketAccessRequest { +message DriverRevokeBucketAccessRequest { // This field is REQUIRED // bucket_id is a globally unique identifier for the bucket // in the object storage provider. @@ -217,7 +224,7 @@ message ProvisionerRevokeBucketAccessRequest { string account_id = 2; } -message ProvisionerRevokeBucketAccessResponse { +message DriverRevokeBucketAccessResponse { // Intentionally left blank } diff --git a/fake/cosi.pb.fake.go b/fake/cosi.pb.fake.go index 3e142479..170bedbb 100644 --- a/fake/cosi.pb.fake.go +++ b/fake/cosi.pb.fake.go @@ -7,29 +7,29 @@ import ( ) type FakeIdentityClient struct { - FakeProvisionerGetInfo func(ctx context.Context, in *containerobjectstorageinterfacespec.ProvisionerGetInfoRequest, opts ...grpc.CallOption) (*containerobjectstorageinterfacespec.ProvisionerGetInfoResponse, error) + FakeDriverGetInfo func(ctx context.Context, in *containerobjectstorageinterfacespec.DriverGetInfoRequest, opts ...grpc.CallOption) (*containerobjectstorageinterfacespec.DriverGetInfoResponse, error) } -func (f *FakeIdentityClient) ProvisionerGetInfo(ctx context.Context, in *containerobjectstorageinterfacespec.ProvisionerGetInfoRequest, opts ...grpc.CallOption) (*containerobjectstorageinterfacespec.ProvisionerGetInfoResponse, error) { - return f.FakeProvisionerGetInfo(ctx, in, opts...) +func (f *FakeIdentityClient) DriverGetInfo(ctx context.Context, in *containerobjectstorageinterfacespec.DriverGetInfoRequest, opts ...grpc.CallOption) (*containerobjectstorageinterfacespec.DriverGetInfoResponse, error) { + return f.FakeDriverGetInfo(ctx, in, opts...) } type FakeProvisionerClient struct { - FakeProvisionerCreateBucket func(ctx context.Context, in *containerobjectstorageinterfacespec.ProvisionerCreateBucketRequest, opts ...grpc.CallOption) (*containerobjectstorageinterfacespec.ProvisionerCreateBucketResponse, error) - FakeProvisionerDeleteBucket func(ctx context.Context, in *containerobjectstorageinterfacespec.ProvisionerDeleteBucketRequest, opts ...grpc.CallOption) (*containerobjectstorageinterfacespec.ProvisionerDeleteBucketResponse, error) - FakeProvisionerGrantBucketAccess func(ctx context.Context, in *containerobjectstorageinterfacespec.ProvisionerGrantBucketAccessRequest, opts ...grpc.CallOption) (*containerobjectstorageinterfacespec.ProvisionerGrantBucketAccessResponse, error) - FakeProvisionerRevokeBucketAccess func(ctx context.Context, in *containerobjectstorageinterfacespec.ProvisionerRevokeBucketAccessRequest, opts ...grpc.CallOption) (*containerobjectstorageinterfacespec.ProvisionerRevokeBucketAccessResponse, error) + FakeDriverCreateBucket func(ctx context.Context, in *containerobjectstorageinterfacespec.DriverCreateBucketRequest, opts ...grpc.CallOption) (*containerobjectstorageinterfacespec.DriverCreateBucketResponse, error) + FakeDriverDeleteBucket func(ctx context.Context, in *containerobjectstorageinterfacespec.DriverDeleteBucketRequest, opts ...grpc.CallOption) (*containerobjectstorageinterfacespec.DriverDeleteBucketResponse, error) + FakeDriverGrantBucketAccess func(ctx context.Context, in *containerobjectstorageinterfacespec.DriverGrantBucketAccessRequest, opts ...grpc.CallOption) (*containerobjectstorageinterfacespec.DriverGrantBucketAccessResponse, error) + FakeDriverRevokeBucketAccess func(ctx context.Context, in *containerobjectstorageinterfacespec.DriverRevokeBucketAccessRequest, opts ...grpc.CallOption) (*containerobjectstorageinterfacespec.DriverRevokeBucketAccessResponse, error) } -func (f *FakeProvisionerClient) ProvisionerCreateBucket(ctx context.Context, in *containerobjectstorageinterfacespec.ProvisionerCreateBucketRequest, opts ...grpc.CallOption) (*containerobjectstorageinterfacespec.ProvisionerCreateBucketResponse, error) { - return f.FakeProvisionerCreateBucket(ctx, in, opts...) +func (f *FakeProvisionerClient) DriverCreateBucket(ctx context.Context, in *containerobjectstorageinterfacespec.DriverCreateBucketRequest, opts ...grpc.CallOption) (*containerobjectstorageinterfacespec.DriverCreateBucketResponse, error) { + return f.FakeDriverCreateBucket(ctx, in, opts...) } -func (f *FakeProvisionerClient) ProvisionerDeleteBucket(ctx context.Context, in *containerobjectstorageinterfacespec.ProvisionerDeleteBucketRequest, opts ...grpc.CallOption) (*containerobjectstorageinterfacespec.ProvisionerDeleteBucketResponse, error) { - return f.FakeProvisionerDeleteBucket(ctx, in, opts...) +func (f *FakeProvisionerClient) DriverDeleteBucket(ctx context.Context, in *containerobjectstorageinterfacespec.DriverDeleteBucketRequest, opts ...grpc.CallOption) (*containerobjectstorageinterfacespec.DriverDeleteBucketResponse, error) { + return f.FakeDriverDeleteBucket(ctx, in, opts...) } -func (f *FakeProvisionerClient) ProvisionerGrantBucketAccess(ctx context.Context, in *containerobjectstorageinterfacespec.ProvisionerGrantBucketAccessRequest, opts ...grpc.CallOption) (*containerobjectstorageinterfacespec.ProvisionerGrantBucketAccessResponse, error) { - return f.FakeProvisionerGrantBucketAccess(ctx, in, opts...) +func (f *FakeProvisionerClient) DriverGrantBucketAccess(ctx context.Context, in *containerobjectstorageinterfacespec.DriverGrantBucketAccessRequest, opts ...grpc.CallOption) (*containerobjectstorageinterfacespec.DriverGrantBucketAccessResponse, error) { + return f.FakeDriverGrantBucketAccess(ctx, in, opts...) } -func (f *FakeProvisionerClient) ProvisionerRevokeBucketAccess(ctx context.Context, in *containerobjectstorageinterfacespec.ProvisionerRevokeBucketAccessRequest, opts ...grpc.CallOption) (*containerobjectstorageinterfacespec.ProvisionerRevokeBucketAccessResponse, error) { - return f.FakeProvisionerRevokeBucketAccess(ctx, in, opts...) +func (f *FakeProvisionerClient) DriverRevokeBucketAccess(ctx context.Context, in *containerobjectstorageinterfacespec.DriverRevokeBucketAccessRequest, opts ...grpc.CallOption) (*containerobjectstorageinterfacespec.DriverRevokeBucketAccessResponse, error) { + return f.FakeDriverRevokeBucketAccess(ctx, in, opts...) } From cec5d74780c47f1d9227ee7c54f4c265c1ca6dd9 Mon Sep 17 00:00:00 2001 From: Akash Mukhopadhyay Date: Fri, 15 Jul 2022 00:03:09 -0700 Subject: [PATCH 175/242] Added credential details map for grant access response --- cosi.pb.go | 554 ++++++++++++++++++++++++++++-------------------- cosi.pb.json.go | 16 ++ cosi.proto | 7 +- spec.md | 7 +- 4 files changed, 348 insertions(+), 236 deletions(-) diff --git a/cosi.pb.go b/cosi.pb.go index 181819a9..25338709 100644 --- a/cosi.pb.go +++ b/cosi.pb.go @@ -459,6 +459,54 @@ func (*Protocol_AzureBlob) isProtocol_Type() {} func (*Protocol_Gcs) isProtocol_Type() {} +type CredentialDetails struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // map of the details in the secrets for the protocol string + Secrets map[string]string `protobuf:"bytes,1,rep,name=secrets,proto3" json:"secrets,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *CredentialDetails) Reset() { + *x = CredentialDetails{} + if protoimpl.UnsafeEnabled { + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CredentialDetails) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CredentialDetails) ProtoMessage() {} + +func (x *CredentialDetails) ProtoReflect() protoreflect.Message { + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CredentialDetails.ProtoReflect.Descriptor instead. +func (*CredentialDetails) Descriptor() ([]byte, []int) { + return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{4} +} + +func (x *CredentialDetails) GetSecrets() map[string]string { + if x != nil { + return x.Secrets + } + return nil +} + type DriverGetInfoRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -468,7 +516,7 @@ type DriverGetInfoRequest struct { func (x *DriverGetInfoRequest) Reset() { *x = DriverGetInfoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[4] + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -481,7 +529,7 @@ func (x *DriverGetInfoRequest) String() string { func (*DriverGetInfoRequest) ProtoMessage() {} func (x *DriverGetInfoRequest) ProtoReflect() protoreflect.Message { - mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[4] + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -494,7 +542,7 @@ func (x *DriverGetInfoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DriverGetInfoRequest.ProtoReflect.Descriptor instead. func (*DriverGetInfoRequest) Descriptor() ([]byte, []int) { - return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{4} + return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{5} } type DriverGetInfoResponse struct { @@ -516,7 +564,7 @@ type DriverGetInfoResponse struct { func (x *DriverGetInfoResponse) Reset() { *x = DriverGetInfoResponse{} if protoimpl.UnsafeEnabled { - mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[5] + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -529,7 +577,7 @@ func (x *DriverGetInfoResponse) String() string { func (*DriverGetInfoResponse) ProtoMessage() {} func (x *DriverGetInfoResponse) ProtoReflect() protoreflect.Message { - mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[5] + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -542,7 +590,7 @@ func (x *DriverGetInfoResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DriverGetInfoResponse.ProtoReflect.Descriptor instead. func (*DriverGetInfoResponse) Descriptor() ([]byte, []int) { - return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{5} + return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{6} } func (x *DriverGetInfoResponse) GetName() string { @@ -569,7 +617,7 @@ type DriverCreateBucketRequest struct { func (x *DriverCreateBucketRequest) Reset() { *x = DriverCreateBucketRequest{} if protoimpl.UnsafeEnabled { - mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[6] + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -582,7 +630,7 @@ func (x *DriverCreateBucketRequest) String() string { func (*DriverCreateBucketRequest) ProtoMessage() {} func (x *DriverCreateBucketRequest) ProtoReflect() protoreflect.Message { - mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[6] + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -595,7 +643,7 @@ func (x *DriverCreateBucketRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DriverCreateBucketRequest.ProtoReflect.Descriptor instead. func (*DriverCreateBucketRequest) Descriptor() ([]byte, []int) { - return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{6} + return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{7} } func (x *DriverCreateBucketRequest) GetName() string { @@ -628,7 +676,7 @@ type DriverCreateBucketResponse struct { func (x *DriverCreateBucketResponse) Reset() { *x = DriverCreateBucketResponse{} if protoimpl.UnsafeEnabled { - mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[7] + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -641,7 +689,7 @@ func (x *DriverCreateBucketResponse) String() string { func (*DriverCreateBucketResponse) ProtoMessage() {} func (x *DriverCreateBucketResponse) ProtoReflect() protoreflect.Message { - mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[7] + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -654,7 +702,7 @@ func (x *DriverCreateBucketResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DriverCreateBucketResponse.ProtoReflect.Descriptor instead. func (*DriverCreateBucketResponse) Descriptor() ([]byte, []int) { - return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{7} + return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{8} } func (x *DriverCreateBucketResponse) GetBucketId() string { @@ -685,7 +733,7 @@ type DriverDeleteBucketRequest struct { func (x *DriverDeleteBucketRequest) Reset() { *x = DriverDeleteBucketRequest{} if protoimpl.UnsafeEnabled { - mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[8] + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -698,7 +746,7 @@ func (x *DriverDeleteBucketRequest) String() string { func (*DriverDeleteBucketRequest) ProtoMessage() {} func (x *DriverDeleteBucketRequest) ProtoReflect() protoreflect.Message { - mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[8] + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -711,7 +759,7 @@ func (x *DriverDeleteBucketRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DriverDeleteBucketRequest.ProtoReflect.Descriptor instead. func (*DriverDeleteBucketRequest) Descriptor() ([]byte, []int) { - return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{8} + return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{9} } func (x *DriverDeleteBucketRequest) GetBucketId() string { @@ -730,7 +778,7 @@ type DriverDeleteBucketResponse struct { func (x *DriverDeleteBucketResponse) Reset() { *x = DriverDeleteBucketResponse{} if protoimpl.UnsafeEnabled { - mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[9] + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -743,7 +791,7 @@ func (x *DriverDeleteBucketResponse) String() string { func (*DriverDeleteBucketResponse) ProtoMessage() {} func (x *DriverDeleteBucketResponse) ProtoReflect() protoreflect.Message { - mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[9] + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -756,7 +804,7 @@ func (x *DriverDeleteBucketResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DriverDeleteBucketResponse.ProtoReflect.Descriptor instead. func (*DriverDeleteBucketResponse) Descriptor() ([]byte, []int) { - return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{9} + return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{10} } type DriverGrantBucketAccessRequest struct { @@ -784,7 +832,7 @@ type DriverGrantBucketAccessRequest struct { func (x *DriverGrantBucketAccessRequest) Reset() { *x = DriverGrantBucketAccessRequest{} if protoimpl.UnsafeEnabled { - mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[10] + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -797,7 +845,7 @@ func (x *DriverGrantBucketAccessRequest) String() string { func (*DriverGrantBucketAccessRequest) ProtoMessage() {} func (x *DriverGrantBucketAccessRequest) ProtoReflect() protoreflect.Message { - mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[10] + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -810,7 +858,7 @@ func (x *DriverGrantBucketAccessRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DriverGrantBucketAccessRequest.ProtoReflect.Descriptor instead. func (*DriverGrantBucketAccessRequest) Descriptor() ([]byte, []int) { - return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{10} + return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{11} } func (x *DriverGrantBucketAccessRequest) GetBucketId() string { @@ -852,13 +900,13 @@ type DriverGrantBucketAccessResponse struct { AccountId string `protobuf:"bytes,1,opt,name=account_id,json=accountId,proto3" json:"account_id,omitempty"` // This field is REQUIRED // Credentials supplied for accessing the bucket ex: aws access key id and secret, etc. - Credentials string `protobuf:"bytes,2,opt,name=credentials,proto3" json:"credentials,omitempty"` + Credentials map[string]*CredentialDetails `protobuf:"bytes,2,rep,name=credentials,proto3" json:"credentials,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *DriverGrantBucketAccessResponse) Reset() { *x = DriverGrantBucketAccessResponse{} if protoimpl.UnsafeEnabled { - mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[11] + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -871,7 +919,7 @@ func (x *DriverGrantBucketAccessResponse) String() string { func (*DriverGrantBucketAccessResponse) ProtoMessage() {} func (x *DriverGrantBucketAccessResponse) ProtoReflect() protoreflect.Message { - mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[11] + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -884,7 +932,7 @@ func (x *DriverGrantBucketAccessResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DriverGrantBucketAccessResponse.ProtoReflect.Descriptor instead. func (*DriverGrantBucketAccessResponse) Descriptor() ([]byte, []int) { - return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{11} + return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{12} } func (x *DriverGrantBucketAccessResponse) GetAccountId() string { @@ -894,11 +942,11 @@ func (x *DriverGrantBucketAccessResponse) GetAccountId() string { return "" } -func (x *DriverGrantBucketAccessResponse) GetCredentials() string { +func (x *DriverGrantBucketAccessResponse) GetCredentials() map[string]*CredentialDetails { if x != nil { return x.Credentials } - return "" + return nil } type DriverRevokeBucketAccessRequest struct { @@ -918,7 +966,7 @@ type DriverRevokeBucketAccessRequest struct { func (x *DriverRevokeBucketAccessRequest) Reset() { *x = DriverRevokeBucketAccessRequest{} if protoimpl.UnsafeEnabled { - mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[12] + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -931,7 +979,7 @@ func (x *DriverRevokeBucketAccessRequest) String() string { func (*DriverRevokeBucketAccessRequest) ProtoMessage() {} func (x *DriverRevokeBucketAccessRequest) ProtoReflect() protoreflect.Message { - mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[12] + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -944,7 +992,7 @@ func (x *DriverRevokeBucketAccessRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DriverRevokeBucketAccessRequest.ProtoReflect.Descriptor instead. func (*DriverRevokeBucketAccessRequest) Descriptor() ([]byte, []int) { - return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{12} + return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{13} } func (x *DriverRevokeBucketAccessRequest) GetBucketId() string { @@ -970,7 +1018,7 @@ type DriverRevokeBucketAccessResponse struct { func (x *DriverRevokeBucketAccessResponse) Reset() { *x = DriverRevokeBucketAccessResponse{} if protoimpl.UnsafeEnabled { - mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[13] + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -983,7 +1031,7 @@ func (x *DriverRevokeBucketAccessResponse) String() string { func (*DriverRevokeBucketAccessResponse) ProtoMessage() {} func (x *DriverRevokeBucketAccessResponse) ProtoReflect() protoreflect.Message { - mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[13] + mi := &file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -996,7 +1044,7 @@ func (x *DriverRevokeBucketAccessResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DriverRevokeBucketAccessResponse.ProtoReflect.Descriptor instead. func (*DriverRevokeBucketAccessResponse) Descriptor() ([]byte, []int) { - return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{13} + return file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDescGZIP(), []int{14} } var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_extTypes = []protoimpl.ExtensionInfo{ @@ -1160,158 +1208,178 @@ var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDesc 0x09, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x42, 0x6c, 0x6f, 0x62, 0x12, 0x26, 0x0a, 0x03, 0x67, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x43, 0x53, 0x48, 0x00, 0x52, 0x03, 0x67, - 0x63, 0x73, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x16, 0x0a, 0x14, 0x44, 0x72, - 0x69, 0x76, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x22, 0x2b, 0x0a, 0x15, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, - 0xc8, 0x01, 0x0a, 0x19, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x73, 0x0a, 0x1a, 0x44, 0x72, - 0x69, 0x76, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x75, 0x63, 0x6b, - 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x75, 0x63, - 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, - 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x73, - 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, - 0x38, 0x0a, 0x19, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, - 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, - 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x22, 0x1c, 0x0a, 0x1a, 0x44, 0x72, 0x69, - 0x76, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc3, 0x02, 0x0a, 0x1e, 0x44, 0x72, 0x69, 0x76, - 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x75, - 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, - 0x75, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x52, 0x0a, 0x13, 0x61, - 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x12, 0x61, 0x75, 0x74, - 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x5d, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, - 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x3d, - 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x62, 0x0a, - 0x1f, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, - 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, - 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, - 0x73, 0x22, 0x5d, 0x0a, 0x1f, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, - 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x49, - 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, - 0x22, 0x22, 0x0a, 0x20, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, - 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x3e, 0x0a, 0x12, 0x53, 0x33, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x10, 0x55, 0x6e, - 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x10, 0x00, - 0x12, 0x08, 0x0a, 0x04, 0x53, 0x33, 0x56, 0x32, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x33, - 0x56, 0x34, 0x10, 0x02, 0x2a, 0x71, 0x0a, 0x19, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x6f, 0x75, - 0x73, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, - 0x65, 0x12, 0x1b, 0x0a, 0x17, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x42, 0x75, 0x63, 0x6b, - 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x10, 0x00, 0x12, 0x0b, - 0x0a, 0x07, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x52, - 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x72, 0x69, - 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, - 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x04, 0x2a, 0x45, 0x0a, 0x12, 0x41, 0x75, 0x74, 0x68, 0x65, - 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, - 0x19, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, - 0x4b, 0x65, 0x79, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x49, 0x41, 0x4d, 0x10, 0x02, 0x32, 0x68, - 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x5c, 0x0a, 0x0d, 0x44, 0x72, - 0x69, 0x76, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x23, 0x2e, 0x63, 0x6f, - 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, - 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x24, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x32, 0xde, 0x03, 0x0a, 0x0b, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x12, 0x6b, 0x0a, 0x12, 0x44, 0x72, 0x69, 0x76, - 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x28, - 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, + 0x63, 0x73, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x98, 0x01, 0x0a, 0x11, 0x43, + 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x12, 0x47, 0x0a, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x2d, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x44, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x1a, 0x3a, 0x0a, 0x0c, 0x53, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x16, 0x0a, 0x14, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x47, + 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x2b, 0x0a, + 0x15, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xc8, 0x01, 0x0a, 0x19, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x43, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x58, 0x0a, 0x0a, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x38, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, + 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x73, 0x0a, 0x1a, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6b, 0x0a, 0x12, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x28, 0x2e, 0x63, 0x6f, - 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, - 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x78, 0x0a, 0x17, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, - 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x2d, 0x2e, + 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x64, + 0x12, 0x38, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x0a, + 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x38, 0x0a, 0x19, 0x44, 0x72, + 0x69, 0x76, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x75, 0x63, 0x6b, + 0x65, 0x74, 0x49, 0x64, 0x22, 0x1c, 0x0a, 0x1a, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0xc3, 0x02, 0x0a, 0x1e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x47, 0x72, 0x61, + 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, + 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x52, 0x0a, 0x13, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, + 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x12, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x5d, 0x0a, 0x0a, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, + 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, + 0x72, 0x69, 0x76, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x85, 0x02, 0x0a, 0x1f, 0x44, 0x72, 0x69, + 0x76, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x61, 0x0a, 0x0b, 0x63, + 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x3f, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, + 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x1a, 0x60, + 0x0a, 0x10, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x44, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x5d, 0x0a, 0x1f, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, + 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x64, + 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x22, + 0x22, 0x0a, 0x20, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, + 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x2a, 0x3e, 0x0a, 0x12, 0x53, 0x33, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x10, 0x55, 0x6e, 0x6b, + 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x10, 0x00, 0x12, + 0x08, 0x0a, 0x04, 0x53, 0x33, 0x56, 0x32, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x33, 0x56, + 0x34, 0x10, 0x02, 0x2a, 0x71, 0x0a, 0x19, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x6f, 0x75, 0x73, + 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, + 0x12, 0x1b, 0x0a, 0x17, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x42, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x10, 0x00, 0x12, 0x0b, 0x0a, + 0x07, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, + 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x72, 0x69, 0x74, + 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x10, 0x04, 0x2a, 0x45, 0x0a, 0x12, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, + 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x19, + 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x4b, + 0x65, 0x79, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x49, 0x41, 0x4d, 0x10, 0x02, 0x32, 0x68, 0x0a, + 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x5c, 0x0a, 0x0d, 0x44, 0x72, 0x69, + 0x76, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x23, 0x2e, 0x63, 0x6f, 0x73, + 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, + 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x24, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x32, 0xde, 0x03, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x12, 0x6b, 0x0a, 0x12, 0x44, 0x72, 0x69, 0x76, 0x65, + 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x28, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, - 0x69, 0x76, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x63, + 0x69, 0x76, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x6b, 0x0a, 0x12, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x28, 0x2e, 0x63, 0x6f, 0x73, + 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, + 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x78, 0x0a, 0x17, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, + 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x2d, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7b, 0x0a, 0x18, - 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, - 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x2e, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x52, - 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x52, - 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3a, 0x3c, 0x0a, 0x0a, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xdc, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x45, 0x6e, 0x75, 0x6d, 0x3a, 0x4c, 0x0a, 0x10, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, - 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xdc, - 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x45, 0x6e, 0x75, 0x6d, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x3f, 0x0a, 0x0b, 0x63, 0x6f, 0x73, 0x69, 0x5f, 0x73, 0x65, - 0x63, 0x72, 0x65, 0x74, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x63, 0x6f, + 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, + 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7b, 0x0a, 0x18, 0x44, + 0x72, 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x2e, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, + 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, + 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3a, 0x3c, 0x0a, 0x0a, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xdc, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x45, 0x6e, 0x75, 0x6d, 0x3a, 0x4c, 0x0a, 0x10, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, + 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, + 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xdc, 0x08, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x45, 0x6e, 0x75, 0x6d, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x3f, 0x0a, 0x0b, 0x63, 0x6f, 0x73, 0x69, 0x5f, 0x73, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0xdb, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x63, 0x6f, 0x73, 0x69, 0x53, + 0x65, 0x63, 0x72, 0x65, 0x74, 0x3a, 0x3f, 0x0a, 0x0b, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0xdb, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x63, 0x6f, 0x73, 0x69, - 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x3a, 0x3f, 0x0a, 0x0b, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, - 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xdc, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x3a, 0x45, 0x0a, 0x0d, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xdc, 0x08, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0c, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x42, - 0x0a, 0x0c, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x1e, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xdc, - 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x4d, 0x65, 0x74, 0x68, - 0x6f, 0x64, 0x3a, 0x45, 0x0a, 0x0d, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xdc, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, 0x3a, 0x5a, 0x38, 0x73, 0x69, 0x67, - 0x73, 0x2e, 0x6b, 0x38, 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x2d, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, - 0x65, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2d, 0x73, 0x70, 0x65, 0x63, - 0x3b, 0x63, 0x6f, 0x73, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6f, 0x6e, 0x73, 0x18, 0xdc, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x3a, 0x45, 0x0a, 0x0d, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xdc, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0c, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x42, 0x0a, + 0x0c, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x1e, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xdc, 0x08, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x4d, 0x65, 0x74, 0x68, 0x6f, + 0x64, 0x3a, 0x45, 0x0a, 0x0d, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0xdc, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, 0x3a, 0x5a, 0x38, 0x73, 0x69, 0x67, 0x73, + 0x2e, 0x6b, 0x38, 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x2d, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2d, 0x73, 0x70, 0x65, 0x63, 0x3b, + 0x63, 0x6f, 0x73, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1327,7 +1395,7 @@ func file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDesc } var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes = make([]protoimpl.MessageInfo, 16) +var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes = make([]protoimpl.MessageInfo, 19) var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_goTypes = []interface{}{ (S3SignatureVersion)(0), // 0: cosi.v1alpha1.S3SignatureVersion (AnonymousBucketAccessMode)(0), // 1: cosi.v1alpha1.AnonymousBucketAccessMode @@ -1336,56 +1404,62 @@ var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_goTypes (*AzureBlob)(nil), // 4: cosi.v1alpha1.AzureBlob (*GCS)(nil), // 5: cosi.v1alpha1.GCS (*Protocol)(nil), // 6: cosi.v1alpha1.Protocol - (*DriverGetInfoRequest)(nil), // 7: cosi.v1alpha1.DriverGetInfoRequest - (*DriverGetInfoResponse)(nil), // 8: cosi.v1alpha1.DriverGetInfoResponse - (*DriverCreateBucketRequest)(nil), // 9: cosi.v1alpha1.DriverCreateBucketRequest - (*DriverCreateBucketResponse)(nil), // 10: cosi.v1alpha1.DriverCreateBucketResponse - (*DriverDeleteBucketRequest)(nil), // 11: cosi.v1alpha1.DriverDeleteBucketRequest - (*DriverDeleteBucketResponse)(nil), // 12: cosi.v1alpha1.DriverDeleteBucketResponse - (*DriverGrantBucketAccessRequest)(nil), // 13: cosi.v1alpha1.DriverGrantBucketAccessRequest - (*DriverGrantBucketAccessResponse)(nil), // 14: cosi.v1alpha1.DriverGrantBucketAccessResponse - (*DriverRevokeBucketAccessRequest)(nil), // 15: cosi.v1alpha1.DriverRevokeBucketAccessRequest - (*DriverRevokeBucketAccessResponse)(nil), // 16: cosi.v1alpha1.DriverRevokeBucketAccessResponse - nil, // 17: cosi.v1alpha1.DriverCreateBucketRequest.ParametersEntry - nil, // 18: cosi.v1alpha1.DriverGrantBucketAccessRequest.ParametersEntry - (*descriptor.EnumOptions)(nil), // 19: google.protobuf.EnumOptions - (*descriptor.EnumValueOptions)(nil), // 20: google.protobuf.EnumValueOptions - (*descriptor.FieldOptions)(nil), // 21: google.protobuf.FieldOptions - (*descriptor.MessageOptions)(nil), // 22: google.protobuf.MessageOptions - (*descriptor.MethodOptions)(nil), // 23: google.protobuf.MethodOptions - (*descriptor.ServiceOptions)(nil), // 24: google.protobuf.ServiceOptions + (*CredentialDetails)(nil), // 7: cosi.v1alpha1.CredentialDetails + (*DriverGetInfoRequest)(nil), // 8: cosi.v1alpha1.DriverGetInfoRequest + (*DriverGetInfoResponse)(nil), // 9: cosi.v1alpha1.DriverGetInfoResponse + (*DriverCreateBucketRequest)(nil), // 10: cosi.v1alpha1.DriverCreateBucketRequest + (*DriverCreateBucketResponse)(nil), // 11: cosi.v1alpha1.DriverCreateBucketResponse + (*DriverDeleteBucketRequest)(nil), // 12: cosi.v1alpha1.DriverDeleteBucketRequest + (*DriverDeleteBucketResponse)(nil), // 13: cosi.v1alpha1.DriverDeleteBucketResponse + (*DriverGrantBucketAccessRequest)(nil), // 14: cosi.v1alpha1.DriverGrantBucketAccessRequest + (*DriverGrantBucketAccessResponse)(nil), // 15: cosi.v1alpha1.DriverGrantBucketAccessResponse + (*DriverRevokeBucketAccessRequest)(nil), // 16: cosi.v1alpha1.DriverRevokeBucketAccessRequest + (*DriverRevokeBucketAccessResponse)(nil), // 17: cosi.v1alpha1.DriverRevokeBucketAccessResponse + nil, // 18: cosi.v1alpha1.CredentialDetails.SecretsEntry + nil, // 19: cosi.v1alpha1.DriverCreateBucketRequest.ParametersEntry + nil, // 20: cosi.v1alpha1.DriverGrantBucketAccessRequest.ParametersEntry + nil, // 21: cosi.v1alpha1.DriverGrantBucketAccessResponse.CredentialsEntry + (*descriptor.EnumOptions)(nil), // 22: google.protobuf.EnumOptions + (*descriptor.EnumValueOptions)(nil), // 23: google.protobuf.EnumValueOptions + (*descriptor.FieldOptions)(nil), // 24: google.protobuf.FieldOptions + (*descriptor.MessageOptions)(nil), // 25: google.protobuf.MessageOptions + (*descriptor.MethodOptions)(nil), // 26: google.protobuf.MethodOptions + (*descriptor.ServiceOptions)(nil), // 27: google.protobuf.ServiceOptions } var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_depIdxs = []int32{ 0, // 0: cosi.v1alpha1.S3.signature_version:type_name -> cosi.v1alpha1.S3SignatureVersion 3, // 1: cosi.v1alpha1.Protocol.s3:type_name -> cosi.v1alpha1.S3 4, // 2: cosi.v1alpha1.Protocol.azureBlob:type_name -> cosi.v1alpha1.AzureBlob 5, // 3: cosi.v1alpha1.Protocol.gcs:type_name -> cosi.v1alpha1.GCS - 17, // 4: cosi.v1alpha1.DriverCreateBucketRequest.parameters:type_name -> cosi.v1alpha1.DriverCreateBucketRequest.ParametersEntry - 6, // 5: cosi.v1alpha1.DriverCreateBucketResponse.bucket_info:type_name -> cosi.v1alpha1.Protocol - 2, // 6: cosi.v1alpha1.DriverGrantBucketAccessRequest.authentication_type:type_name -> cosi.v1alpha1.AuthenticationType - 18, // 7: cosi.v1alpha1.DriverGrantBucketAccessRequest.parameters:type_name -> cosi.v1alpha1.DriverGrantBucketAccessRequest.ParametersEntry - 19, // 8: cosi.v1alpha1.alpha_enum:extendee -> google.protobuf.EnumOptions - 20, // 9: cosi.v1alpha1.alpha_enum_value:extendee -> google.protobuf.EnumValueOptions - 21, // 10: cosi.v1alpha1.cosi_secret:extendee -> google.protobuf.FieldOptions - 21, // 11: cosi.v1alpha1.alpha_field:extendee -> google.protobuf.FieldOptions - 22, // 12: cosi.v1alpha1.alpha_message:extendee -> google.protobuf.MessageOptions - 23, // 13: cosi.v1alpha1.alpha_method:extendee -> google.protobuf.MethodOptions - 24, // 14: cosi.v1alpha1.alpha_service:extendee -> google.protobuf.ServiceOptions - 7, // 15: cosi.v1alpha1.Identity.DriverGetInfo:input_type -> cosi.v1alpha1.DriverGetInfoRequest - 9, // 16: cosi.v1alpha1.Provisioner.DriverCreateBucket:input_type -> cosi.v1alpha1.DriverCreateBucketRequest - 11, // 17: cosi.v1alpha1.Provisioner.DriverDeleteBucket:input_type -> cosi.v1alpha1.DriverDeleteBucketRequest - 13, // 18: cosi.v1alpha1.Provisioner.DriverGrantBucketAccess:input_type -> cosi.v1alpha1.DriverGrantBucketAccessRequest - 15, // 19: cosi.v1alpha1.Provisioner.DriverRevokeBucketAccess:input_type -> cosi.v1alpha1.DriverRevokeBucketAccessRequest - 8, // 20: cosi.v1alpha1.Identity.DriverGetInfo:output_type -> cosi.v1alpha1.DriverGetInfoResponse - 10, // 21: cosi.v1alpha1.Provisioner.DriverCreateBucket:output_type -> cosi.v1alpha1.DriverCreateBucketResponse - 12, // 22: cosi.v1alpha1.Provisioner.DriverDeleteBucket:output_type -> cosi.v1alpha1.DriverDeleteBucketResponse - 14, // 23: cosi.v1alpha1.Provisioner.DriverGrantBucketAccess:output_type -> cosi.v1alpha1.DriverGrantBucketAccessResponse - 16, // 24: cosi.v1alpha1.Provisioner.DriverRevokeBucketAccess:output_type -> cosi.v1alpha1.DriverRevokeBucketAccessResponse - 20, // [20:25] is the sub-list for method output_type - 15, // [15:20] is the sub-list for method input_type - 15, // [15:15] is the sub-list for extension type_name - 8, // [8:15] is the sub-list for extension extendee - 0, // [0:8] is the sub-list for field type_name + 18, // 4: cosi.v1alpha1.CredentialDetails.secrets:type_name -> cosi.v1alpha1.CredentialDetails.SecretsEntry + 19, // 5: cosi.v1alpha1.DriverCreateBucketRequest.parameters:type_name -> cosi.v1alpha1.DriverCreateBucketRequest.ParametersEntry + 6, // 6: cosi.v1alpha1.DriverCreateBucketResponse.bucket_info:type_name -> cosi.v1alpha1.Protocol + 2, // 7: cosi.v1alpha1.DriverGrantBucketAccessRequest.authentication_type:type_name -> cosi.v1alpha1.AuthenticationType + 20, // 8: cosi.v1alpha1.DriverGrantBucketAccessRequest.parameters:type_name -> cosi.v1alpha1.DriverGrantBucketAccessRequest.ParametersEntry + 21, // 9: cosi.v1alpha1.DriverGrantBucketAccessResponse.credentials:type_name -> cosi.v1alpha1.DriverGrantBucketAccessResponse.CredentialsEntry + 7, // 10: cosi.v1alpha1.DriverGrantBucketAccessResponse.CredentialsEntry.value:type_name -> cosi.v1alpha1.CredentialDetails + 22, // 11: cosi.v1alpha1.alpha_enum:extendee -> google.protobuf.EnumOptions + 23, // 12: cosi.v1alpha1.alpha_enum_value:extendee -> google.protobuf.EnumValueOptions + 24, // 13: cosi.v1alpha1.cosi_secret:extendee -> google.protobuf.FieldOptions + 24, // 14: cosi.v1alpha1.alpha_field:extendee -> google.protobuf.FieldOptions + 25, // 15: cosi.v1alpha1.alpha_message:extendee -> google.protobuf.MessageOptions + 26, // 16: cosi.v1alpha1.alpha_method:extendee -> google.protobuf.MethodOptions + 27, // 17: cosi.v1alpha1.alpha_service:extendee -> google.protobuf.ServiceOptions + 8, // 18: cosi.v1alpha1.Identity.DriverGetInfo:input_type -> cosi.v1alpha1.DriverGetInfoRequest + 10, // 19: cosi.v1alpha1.Provisioner.DriverCreateBucket:input_type -> cosi.v1alpha1.DriverCreateBucketRequest + 12, // 20: cosi.v1alpha1.Provisioner.DriverDeleteBucket:input_type -> cosi.v1alpha1.DriverDeleteBucketRequest + 14, // 21: cosi.v1alpha1.Provisioner.DriverGrantBucketAccess:input_type -> cosi.v1alpha1.DriverGrantBucketAccessRequest + 16, // 22: cosi.v1alpha1.Provisioner.DriverRevokeBucketAccess:input_type -> cosi.v1alpha1.DriverRevokeBucketAccessRequest + 9, // 23: cosi.v1alpha1.Identity.DriverGetInfo:output_type -> cosi.v1alpha1.DriverGetInfoResponse + 11, // 24: cosi.v1alpha1.Provisioner.DriverCreateBucket:output_type -> cosi.v1alpha1.DriverCreateBucketResponse + 13, // 25: cosi.v1alpha1.Provisioner.DriverDeleteBucket:output_type -> cosi.v1alpha1.DriverDeleteBucketResponse + 15, // 26: cosi.v1alpha1.Provisioner.DriverGrantBucketAccess:output_type -> cosi.v1alpha1.DriverGrantBucketAccessResponse + 17, // 27: cosi.v1alpha1.Provisioner.DriverRevokeBucketAccess:output_type -> cosi.v1alpha1.DriverRevokeBucketAccessResponse + 23, // [23:28] is the sub-list for method output_type + 18, // [18:23] is the sub-list for method input_type + 18, // [18:18] is the sub-list for extension type_name + 11, // [11:18] is the sub-list for extension extendee + 0, // [0:11] is the sub-list for field type_name } func init() { file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_init() } @@ -1443,7 +1517,7 @@ func file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_init() } } file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DriverGetInfoRequest); i { + switch v := v.(*CredentialDetails); i { case 0: return &v.state case 1: @@ -1455,7 +1529,7 @@ func file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_init() } } file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DriverGetInfoResponse); i { + switch v := v.(*DriverGetInfoRequest); i { case 0: return &v.state case 1: @@ -1467,7 +1541,7 @@ func file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_init() } } file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DriverCreateBucketRequest); i { + switch v := v.(*DriverGetInfoResponse); i { case 0: return &v.state case 1: @@ -1479,7 +1553,7 @@ func file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_init() } } file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DriverCreateBucketResponse); i { + switch v := v.(*DriverCreateBucketRequest); i { case 0: return &v.state case 1: @@ -1491,7 +1565,7 @@ func file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_init() } } file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DriverDeleteBucketRequest); i { + switch v := v.(*DriverCreateBucketResponse); i { case 0: return &v.state case 1: @@ -1503,7 +1577,7 @@ func file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_init() } } file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DriverDeleteBucketResponse); i { + switch v := v.(*DriverDeleteBucketRequest); i { case 0: return &v.state case 1: @@ -1515,7 +1589,7 @@ func file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_init() } } file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DriverGrantBucketAccessRequest); i { + switch v := v.(*DriverDeleteBucketResponse); i { case 0: return &v.state case 1: @@ -1527,7 +1601,7 @@ func file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_init() } } file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DriverGrantBucketAccessResponse); i { + switch v := v.(*DriverGrantBucketAccessRequest); i { case 0: return &v.state case 1: @@ -1539,7 +1613,7 @@ func file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_init() } } file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DriverRevokeBucketAccessRequest); i { + switch v := v.(*DriverGrantBucketAccessResponse); i { case 0: return &v.state case 1: @@ -1551,6 +1625,18 @@ func file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_init() } } file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DriverRevokeBucketAccessRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DriverRevokeBucketAccessResponse); i { case 0: return &v.state @@ -1574,7 +1660,7 @@ func file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_init() GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDesc, NumEnums: 3, - NumMessages: 16, + NumMessages: 19, NumExtensions: 7, NumServices: 2, }, diff --git a/cosi.pb.json.go b/cosi.pb.json.go index 4d6e0c76..8d30f4fc 100644 --- a/cosi.pb.json.go +++ b/cosi.pb.json.go @@ -71,6 +71,22 @@ func (msg *Protocol) UnmarshalJSON(b []byte) error { }.Unmarshal(b, msg) } +// MarshalJSON implements json.Marshaler +func (msg *CredentialDetails) MarshalJSON() ([]byte, error) { + return protojson.MarshalOptions{ + UseEnumNumbers: false, + EmitUnpopulated: true, + UseProtoNames: false, + }.Marshal(msg) +} + +// UnmarshalJSON implements json.Unmarshaler +func (msg *CredentialDetails) UnmarshalJSON(b []byte) error { + return protojson.UnmarshalOptions{ + DiscardUnknown: false, + }.Unmarshal(b, msg) +} + // MarshalJSON implements json.Marshaler func (msg *DriverGetInfoRequest) MarshalJSON() ([]byte, error) { return protojson.MarshalOptions{ diff --git a/cosi.proto b/cosi.proto index 45e15911..3d1956bb 100644 --- a/cosi.proto +++ b/cosi.proto @@ -133,6 +133,11 @@ message Protocol { } } +message CredentialDetails { + // map of the details in the secrets for the protocol string + map secrets = 1; +} + message DriverGetInfoRequest { // Intentionally left blank } @@ -210,7 +215,7 @@ message DriverGrantBucketAccessResponse { // This field is REQUIRED // Credentials supplied for accessing the bucket ex: aws access key id and secret, etc. - string credentials = 2; + map credentials = 2; } message DriverRevokeBucketAccessRequest { diff --git a/spec.md b/spec.md index 743b4247..bce0919d 100644 --- a/spec.md +++ b/spec.md @@ -260,6 +260,11 @@ message Protocol { } } +message CredentialDetails { + // map of the details in the secrets for the protocol string + map secrets = 1; +} + message DriverGetInfoRequest { // Intentionally left blank } @@ -337,7 +342,7 @@ message DriverGrantBucketAccessResponse { // This field is REQUIRED // Credentials supplied for accessing the bucket ex: aws access key id and secret, etc. - string credentials = 2; + map credentials = 2; } message DriverRevokeBucketAccessRequest { From cdbc10e1c5c8ab5d128689dc680f4bfbe96e6c7b Mon Sep 17 00:00:00 2001 From: Akash Mukhopadhyay Date: Tue, 26 Jul 2022 01:02:32 -0700 Subject: [PATCH 176/242] Adding the bucket creation flow --- cmd/controller-manager/controller-manager.go | 4 +- pkg/bucketclaim/bucketclaim.go | 187 +++++++++++++++++ .../bucketclaim_test.go} | 86 ++++---- pkg/bucketrequest/bucketrequest.go | 192 ------------------ pkg/util/const.go | 19 ++ 5 files changed, 251 insertions(+), 237 deletions(-) create mode 100644 pkg/bucketclaim/bucketclaim.go rename pkg/{bucketrequest/bucketrequest_test.go => bucketclaim/bucketclaim_test.go} (60%) delete mode 100644 pkg/bucketrequest/bucketrequest.go create mode 100644 pkg/util/const.go diff --git a/cmd/controller-manager/controller-manager.go b/cmd/controller-manager/controller-manager.go index 026d7022..8c89ccdf 100644 --- a/cmd/controller-manager/controller-manager.go +++ b/cmd/controller-manager/controller-manager.go @@ -12,7 +12,7 @@ import ( bucketcontroller "sigs.k8s.io/container-object-storage-interface-api/controller" "sigs.k8s.io/container-object-storage-interface-controller/pkg/bucketaccessrequest" - "sigs.k8s.io/container-object-storage-interface-controller/pkg/bucketrequest" + "sigs.k8s.io/container-object-storage-interface-controller/pkg/bucketclaim" "k8s.io/klog/v2" ) @@ -67,7 +67,7 @@ func run(ctx context.Context, args []string) error { if err != nil { return err } - ctrl.AddBucketRequestListener(bucketrequest.NewBucketRequestListener()) + ctrl.AddBucketClaimListener(bucketclaim.NewBucketClaimListener()) ctrl.AddBucketAccessRequestListener(bucketaccessrequest.NewListener()) return ctrl.Run(ctx) } diff --git a/pkg/bucketclaim/bucketclaim.go b/pkg/bucketclaim/bucketclaim.go new file mode 100644 index 00000000..601a5cca --- /dev/null +++ b/pkg/bucketclaim/bucketclaim.go @@ -0,0 +1,187 @@ +package bucketclaim + +import ( + "context" + + "github.com/google/uuid" + v1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + kubeclientset "k8s.io/client-go/kubernetes" + "k8s.io/klog/v2" + "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" + + "sigs.k8s.io/container-object-storage-interface-api/apis/objectstorage.k8s.io/v1alpha1" + bucketclientset "sigs.k8s.io/container-object-storage-interface-api/clientset" + objectstoragev1alpha1 "sigs.k8s.io/container-object-storage-interface-api/clientset/typed/objectstorage.k8s.io/v1alpha1" + + "sigs.k8s.io/container-object-storage-interface-controller/pkg/util" +) + +const ( + finalizer = "cosi.objectstorage.k8s.io/bucketclaim-protection" +) + +// bucketClaimListener is a resource handler for bucket requests objects +type bucketClaimListener struct { + kubeClient kubeclientset.Interface + bucketClient bucketclientset.Interface +} + +func NewBucketClaimListener() *bucketClaimListener { + return &bucketClaimListener{} +} + +// Add creates a bucket in response to a bucketClaim +func (b *bucketClaimListener) Add(ctx context.Context, bucketClaim *v1alpha1.BucketClaim) error { + klog.V(3).InfoS("Add BucketClaim", + "name", bucketClaim.Name, + "ns", bucketClaim.Namespace, + "bucketClass", bucketClaim.Spec.BucketClassName, + "bucketPrefix", bucketClaim.Spec.BucketPrefix, + ) + + err := b.provisionBucketClaimOperation(ctx, bucketClaim) + if err != nil { + switch err { + case util.ErrInvalidBucketClass: + klog.ErrorS(util.ErrInvalidBucketClass, + "bucketClaim", bucketClaim.Name, + "ns", bucketClaim.Namespace, + "bucketClassName", bucketClaim.Spec.BucketClassName) + case util.ErrBucketAlreadyExists: + klog.V(3).InfoS("Bucket already exists", + "bucketClaim", bucketClaim.Name, + "ns", bucketClaim.Namespace, + ) + return nil + default: + klog.ErrorS(err, + "name", bucketClaim.Name, + "ns", bucketClaim.Namespace, + "err", err) + } + return err + } + + klog.V(3).InfoS("Add BucketClaim success", + "name", bucketClaim.Name, + "ns", bucketClaim.Namespace) + return nil +} + +// update processes any updates made to the bucket request +func (b *bucketClaimListener) Update(ctx context.Context, old, new *v1alpha1.BucketClaim) error { + klog.V(3).InfoS("Update BucketClaim", + "name", old.Name, + "ns", old.Namespace) + return nil +} + +// Delete processes a bucket for which bucket request is deleted +func (b *bucketClaimListener) Delete(ctx context.Context, bucketClaim *v1alpha1.BucketClaim) error { + klog.V(3).Infof("Delete BucketClaim %v", + "name", bucketClaim.Name, + "ns", bucketClaim.Namespace) + + return nil +} + +// provisionBucketClaimOperation attempts to provision a bucket for a given bucketClaim. +// Return values +// nil - BucketClaim successfully processed +// ErrInvalidBucketClass - BucketClass does not exist [requeue'd with exponential backoff] +// ErrBucketAlreadyExists - BucketClaim already processed +// non-nil err - Internal error [requeue'd with exponential backoff] +func (b *bucketClaimListener) provisionBucketClaimOperation(ctx context.Context, bucketClaim *v1alpha1.BucketClaim) error { + bucketClassName := b.getBucketClass(bucketClaim) + bucketClass, err := b.BucketClasses().Get(ctx, bucketClassName, metav1.GetOptions{}) + if err != nil { + klog.ErrorS(err, "Get Bucketclass Error", "name", bucketClassName) + return util.ErrInvalidBucketClass + } + + if bucketClaim.Status.BucketReady { + return util.ErrBucketAlreadyExists + } + + name = bucketClassName + string(bucketClaim.GetUID()) + + // create bucket + bucket := &v1alpha1.Bucket{} + bucket.Name = name + bucket.Status.BucketReady = false + bucket.Spec.DriverName = bucketClass.DriverName + bucket.Spec.BucketClassName = bucketClassName + bucket.Spec.DeletionPolicy = bucketClass.DeletionPolicy + bucket.Spec.BucketClaim = &v1.ObjectReference{ + Name: bucketClaim.Name, + Namespace: bucketClaim.Namespace, + UID: bucketClaim.ObjectMeta.UID, + } + bucket.Spec.Protocols = *bucketClass.Protocol.DeepCopy() + bucket.Spec.Parameters = util.CopySS(bucketClass.Parameters) + + bucket, err = b.Buckets().Create(ctx, bucket, metav1.CreateOptions{}) + if err != nil && !errors.IsAlreadyExists(err) { + klog.ErrorS(err, "name", bucket.Name) + return err + } + + controllerutil.AddFinalizer(bucketClaim, finalizer) + + bucketClaim.Status.BucketName = bucket.Name + bucketClaim.Status.BucketAvailable = true + _, err = b.BucketClaims(bucketClaim.Namespace).UpdateStatus(ctx, bucketClaim, metav1.UpdateOptions{}) + if err != nil { + return err + } + + klog.Infof("Finished creating Bucket %v", bucket.Name) + return nil +} + +// getBucketClass returns BucketClassName. If no bucket class was in the request it returns empty +// TODO this methods can be more sophisticate to address bucketClass overrides using annotations just like SC. +func (b *bucketClaimListener) getBucketClass(bucketClaim *v1alpha1.BucketClaim) string { + if bucketClaim.Spec.BucketClassName != "" { + return bucketClaim.Spec.BucketClassName + } + + return "" +} + +// cloneTheBucket clones a bucket to a different namespace when a BR is for brownfield. +func (b *bucketClaimListener) cloneTheBucket(bucketClaim *v1alpha1.BucketClaim) error { + klog.InfoS("Cloning Bucket", "name", bucketClaim.Status.BucketName) + return util.ErrNotImplemented +} + +func (b *bucketClaimListener) InitializeKubeClient(k kubeclientset.Interface) { + b.kubeClient = k +} + +func (b *bucketClaimListener) InitializeBucketClient(bc bucketclientset.Interface) { + b.bucketClient = bc +} + +func (b *bucketClaimListener) Buckets() objectstoragev1alpha1.BucketInterface { + if b.bucketClient != nil { + return b.bucketClient.ObjectstorageV1alpha1().Buckets() + } + panic("uninitialized listener") +} + +func (b *bucketClaimListener) BucketClasses() objectstoragev1alpha1.BucketClassInterface { + if b.bucketClient != nil { + return b.bucketClient.ObjectstorageV1alpha1().BucketClasses() + } + panic("uninitialized listener") +} + +func (b *bucketClaimListener) BucketClaims(namespace string) objectstoragev1alpha1.BucketClaimInterface { + if b.bucketClient != nil { + return b.bucketClient.ObjectstorageV1alpha1().BucketClaims(namespace) + } + panic("uninitialized listener") +} diff --git a/pkg/bucketrequest/bucketrequest_test.go b/pkg/bucketclaim/bucketclaim_test.go similarity index 60% rename from pkg/bucketrequest/bucketrequest_test.go rename to pkg/bucketclaim/bucketclaim_test.go index 3a83ebf8..27084b7c 100644 --- a/pkg/bucketrequest/bucketrequest_test.go +++ b/pkg/bucketclaim/bucketclaim_test.go @@ -1,4 +1,4 @@ -package bucketrequest +package bucketclaim import ( "context" @@ -37,33 +37,33 @@ var goldClass = types.BucketClass{ IsDefaultBucketClass: false, } -var bucketRequest1 = types.BucketRequest{ +var bucketClaim1 = types.BucketClaim{ TypeMeta: metav1.TypeMeta{ APIVersion: "objectstorage.k8s.io/v1alpha1", - Kind: "BucketRequest", + Kind: "BucketClaim", }, ObjectMeta: metav1.ObjectMeta{ - Name: "bucketrequest1", + Name: "bucketclaim1", Namespace: "default", UID: "12345-67890", }, - Spec: types.BucketRequestSpec{ + Spec: types.BucketClaimSpec{ BucketPrefix: "cosi", BucketClassName: "classgold", }, } -var bucketRequest2 = types.BucketRequest{ +var bucketClaim2 = types.BucketClaim{ TypeMeta: metav1.TypeMeta{ APIVersion: "objectstorage.k8s.io/v1alpha1", - Kind: "BucketRequest", + Kind: "BucketClaim", }, ObjectMeta: metav1.ObjectMeta{ - Name: "bucketrequest2", + Name: "bucketclaim2", Namespace: "default", UID: "abcde-fghijk", }, - Spec: types.BucketRequestSpec{ + Spec: types.BucketClaimSpec{ BucketPrefix: "cosi", BucketClassName: "classgold", }, @@ -91,7 +91,7 @@ func runCreateBucket(t *testing.T, name string) { client := bucketclientset.NewSimpleClientset() kubeClient := fake.NewSimpleClientset() - listener := NewBucketRequestListener() + listener := NewBucketClaimListener() listener.InitializeKubeClient(kubeClient) listener.InitializeBucketClient(client) @@ -100,30 +100,30 @@ func runCreateBucket(t *testing.T, name string) { t.Fatalf("Error occurred when creating BucketClass: %v", err) } - bucketrequest, err := util.CreateBucketRequest(ctx, client, &bucketRequest1) + bucketClaim, err := util.CreateBucketClaim(ctx, client, &bucketClaim1) if err != nil { - t.Fatalf("Error occurred when creating BucketRequest: %v", err) + t.Fatalf("Error occurred when creating BucketClaim: %v", err) } - listener.Add(ctx, bucketrequest) + listener.Add(ctx, bucketClaim) bucketList := util.GetBuckets(ctx, client, 1) - defer util.DeleteObjects(ctx, client, *bucketrequest, *bucketclass, bucketList.Items) + defer util.DeleteObjects(ctx, client, *bucketClaim, *bucketclass, bucketList.Items) if len(bucketList.Items) != 1 { t.Fatalf("Expecting a single Bucket created but found %v", len(bucketList.Items)) } bucket := bucketList.Items[0] - bucketrequest, err = client.ObjectstorageV1alpha1().BucketRequests(bucketrequest.Namespace).Get(ctx, bucketrequest.Name, metav1.GetOptions{}) + bucketClaim, err = client.ObjectstorageV1alpha1().BucketClaims(bucketClaim.Namespace).Get(ctx, bucketClaim.Name, metav1.GetOptions{}) if err != nil { - t.Fatalf("Error occurred when reading BucketRequest: %v", err) + t.Fatalf("Error occurred when reading BucketClaim: %v", err) } - if util.ValidateBucket(bucket, *bucketrequest, *bucketclass) { + if util.ValidateBucket(bucket, *bucketClaim, *bucketclass) { return } else { - t.Fatalf("Failed to compare the resulting Bucket with the BucketRequest %v and BucketClass %v", bucketrequest, bucketclass) + t.Fatalf("Failed to compare the resulting Bucket with the BucketClaim %v and BucketClass %v", bucketClaim, bucketclass) } } @@ -134,7 +134,7 @@ func runCreateBucketWithMultipleBR(t *testing.T, name string) { client := bucketclientset.NewSimpleClientset() kubeClient := fake.NewSimpleClientset() - listener := NewBucketRequestListener() + listener := NewBucketClaimListener() listener.InitializeKubeClient(kubeClient) listener.InitializeBucketClient(client) @@ -143,41 +143,41 @@ func runCreateBucketWithMultipleBR(t *testing.T, name string) { t.Fatalf("Error occurred when creating BucketClass: %v", err) } - bucketrequest, err := util.CreateBucketRequest(ctx, client, &bucketRequest1) + bucketClaim, err := util.CreateBucketClaim(ctx, client, &bucketClaim1) if err != nil { - t.Fatalf("Error occurred when creating BucketRequest: %v", err) + t.Fatalf("Error occurred when creating BucketClaim: %v", err) } - bucketrequest2, err := util.CreateBucketRequest(ctx, client, &bucketRequest2) + bucketClaim2, err := util.CreateBucketClaim(ctx, client, &bucketClaim2) if err != nil { - t.Fatalf("Error occurred when creating BucketRequest: %v", err) + t.Fatalf("Error occurred when creating BucketClaim: %v", err) } - listener.Add(ctx, bucketrequest) - listener.Add(ctx, bucketrequest2) + listener.Add(ctx, bucketClaim) + listener.Add(ctx, bucketClaim2) bucketList := util.GetBuckets(ctx, client, 2) - defer util.DeleteObjects(ctx, client, *bucketrequest, *bucketrequest2, *bucketclass, bucketList.Items) + defer util.DeleteObjects(ctx, client, *bucketClaim, *bucketClaim2, *bucketclass, bucketList.Items) if len(bucketList.Items) != 2 { t.Fatalf("Expecting two Buckets created but found %v", len(bucketList.Items)) } bucket := bucketList.Items[0] bucket2 := bucketList.Items[1] - bucketrequest, err = client.ObjectstorageV1alpha1().BucketRequests(bucketrequest.Namespace).Get(ctx, bucketrequest.Name, metav1.GetOptions{}) + bucketClaim, err = client.ObjectstorageV1alpha1().BucketClaims(bucketClaim.Namespace).Get(ctx, bucketClaim.Name, metav1.GetOptions{}) if err != nil { - t.Fatalf("Error occurred when reading BucketRequest: %v", err) + t.Fatalf("Error occurred when reading BucketClaim: %v", err) } - bucketrequest2, err = client.ObjectstorageV1alpha1().BucketRequests(bucketrequest2.Namespace).Get(ctx, bucketrequest2.Name, metav1.GetOptions{}) + bucketClaim2, err = client.ObjectstorageV1alpha1().BucketClaims(bucketClaim2.Namespace).Get(ctx, bucketClaim2.Name, metav1.GetOptions{}) if err != nil { - t.Fatalf("Error occurred when reading BucketRequest: %v", err) + t.Fatalf("Error occurred when reading BucketClaim: %v", err) } - if (util.ValidateBucket(bucket, *bucketrequest, *bucketclass) && util.ValidateBucket(bucket2, *bucketrequest2, *bucketclass)) || - (util.ValidateBucket(bucket2, *bucketrequest, *bucketclass) && util.ValidateBucket(bucket, *bucketrequest2, *bucketclass)) { + if (util.ValidateBucket(bucket, *bucketClaim, *bucketclass) && util.ValidateBucket(bucket2, *bucketClaim2, *bucketclass)) || + (util.ValidateBucket(bucket2, *bucketClaim, *bucketclass) && util.ValidateBucket(bucket, *bucketClaim2, *bucketclass)) { return } else { - t.Fatalf("Failed to compare the resulting Bucket with the BucketRequest %v and BucketClass %v", bucketrequest, bucketclass) + t.Fatalf("Failed to compare the resulting Bucket with the BucketClaim %v and BucketClass %v", bucketClaim, bucketclass) } } @@ -188,7 +188,7 @@ func runCreateBucketIdempotency(t *testing.T, name string) { client := bucketclientset.NewSimpleClientset() kubeClient := fake.NewSimpleClientset() - listener := NewBucketRequestListener() + listener := NewBucketClaimListener() listener.InitializeKubeClient(kubeClient) listener.InitializeBucketClient(client) @@ -197,34 +197,34 @@ func runCreateBucketIdempotency(t *testing.T, name string) { t.Fatalf("Error occurred when creating BucketClass: %v", err) } - bucketrequest, err := util.CreateBucketRequest(ctx, client, &bucketRequest1) + bucketClaim, err := util.CreateBucketClaim(ctx, client, &bucketClaim1) if err != nil { - t.Fatalf("Error occurred when creating BucketRequest: %v", err) + t.Fatalf("Error occurred when creating BucketClaim: %v", err) } - listener.Add(ctx, bucketrequest) + listener.Add(ctx, bucketClaim) bucketList := util.GetBuckets(ctx, client, 1) - defer util.DeleteObjects(ctx, client, *bucketrequest, *bucketclass, bucketList.Items) + defer util.DeleteObjects(ctx, client, *bucketClaim, *bucketclass, bucketList.Items) if len(bucketList.Items) != 1 { t.Errorf("Expecting a single Bucket created but found %v", len(bucketList.Items)) } bucket := bucketList.Items[0] - bucketrequest, err = client.ObjectstorageV1alpha1().BucketRequests(bucketrequest.Namespace).Get(ctx, bucketrequest.Name, metav1.GetOptions{}) + bucketClaim, err = client.ObjectstorageV1alpha1().BucketClaims(bucketClaim.Namespace).Get(ctx, bucketClaim.Name, metav1.GetOptions{}) if err != nil { - t.Fatalf("Error occurred when reading BucketRequest: %v", err) + t.Fatalf("Error occurred when reading BucketClaim: %v", err) } - if util.ValidateBucket(bucket, *bucketrequest, *bucketclass) { + if util.ValidateBucket(bucket, *bucketClaim, *bucketclass) { return } else { - t.Fatalf("Failed to compare the resulting Bucket with the BucketRequest %v and BucketClass %v", bucketrequest, bucketclass) + t.Fatalf("Failed to compare the resulting Bucket with the BucketClaim %v and BucketClass %v", bucketClaim, bucketclass) // call the add directly the second time } - listener.Add(ctx, bucketrequest) + listener.Add(ctx, bucketClaim) bucketList = util.GetBuckets(ctx, client, 1) if len(bucketList.Items) != 1 { diff --git a/pkg/bucketrequest/bucketrequest.go b/pkg/bucketrequest/bucketrequest.go deleted file mode 100644 index fdcd4f6c..00000000 --- a/pkg/bucketrequest/bucketrequest.go +++ /dev/null @@ -1,192 +0,0 @@ -package bucketrequest - -import ( - "context" - - v1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - kubeclientset "k8s.io/client-go/kubernetes" - "k8s.io/klog/v2" - "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - - "sigs.k8s.io/container-object-storage-interface-api/apis/objectstorage.k8s.io/v1alpha1" - bucketclientset "sigs.k8s.io/container-object-storage-interface-api/clientset" - objectstoragev1alpha1 "sigs.k8s.io/container-object-storage-interface-api/clientset/typed/objectstorage.k8s.io/v1alpha1" - - "sigs.k8s.io/container-object-storage-interface-controller/pkg/util" -) - -const ( - finalizer = "cosi.objectstorage.k8s.io/bucketrequest-protection" -) - -// bucketRequestListener is a resource handler for bucket requests objects -type bucketRequestListener struct { - kubeClient kubeclientset.Interface - bucketClient bucketclientset.Interface -} - -func NewBucketRequestListener() *bucketRequestListener { - return &bucketRequestListener{} -} - -// Add creates a bucket in response to a bucketrequest -func (b *bucketRequestListener) Add(ctx context.Context, bucketRequest *v1alpha1.BucketRequest) error { - klog.V(3).InfoS("Add BucketRequest", - "name", bucketRequest.Name, - "ns", bucketRequest.Namespace, - "bucketClass", bucketRequest.Spec.BucketClassName, - "bucketPrefix", bucketRequest.Spec.BucketPrefix, - ) - - err := b.provisionBucketRequestOperation(ctx, bucketRequest) - if err != nil { - switch err { - case util.ErrInvalidBucketClass: - klog.ErrorS(util.ErrInvalidBucketClass, - "bucketRequest", bucketRequest.Name, - "ns", bucketRequest.Namespace, - "bucketClassName", bucketRequest.Spec.BucketClassName) - case util.ErrBucketAlreadyExists: - klog.V(3).InfoS("Bucket already exists", - "bucketRequest", bucketRequest.Name, - "ns", bucketRequest.Namespace, - ) - return nil - default: - klog.ErrorS(err, - "name", bucketRequest.Name, - "ns", bucketRequest.Namespace, - "err", err) - } - return err - } - - klog.V(3).InfoS("Add BucketRequest success", - "name", bucketRequest.Name, - "ns", bucketRequest.Namespace) - return nil -} - -// update processes any updates made to the bucket request -func (b *bucketRequestListener) Update(ctx context.Context, old, new *v1alpha1.BucketRequest) error { - klog.V(3).InfoS("Update BucketRequest", - "name", old.Name, - "ns", old.Namespace) - return nil -} - -// Delete processes a bucket for which bucket request is deleted -func (b *bucketRequestListener) Delete(ctx context.Context, bucketRequest *v1alpha1.BucketRequest) error { - klog.V(3).Infof("Delete BucketRequest %v", - "name", bucketRequest.Name, - "ns", bucketRequest.Namespace) - - return nil -} - -// provisionBucketRequestOperation attempts to provision a bucket for a given bucketRequest. -// Return values -// nil - BucketRequest successfully processed -// ErrInvalidBucketClass - BucketClass does not exist [requeue'd with exponential backoff] -// ErrBucketAlreadyExists - BucketRequest already processed -// non-nil err - Internal error [requeue'd with exponential backoff] -func (b *bucketRequestListener) provisionBucketRequestOperation(ctx context.Context, bucketRequest *v1alpha1.BucketRequest) error { - bucketClassName := b.getBucketClass(bucketRequest) - bucketClass, err := b.BucketClasses().Get(ctx, bucketClassName, metav1.GetOptions{}) - if err != nil { - klog.ErrorS(err, "Get Bucketclass Error", "name", bucketClassName) - return util.ErrInvalidBucketClass - } - - name := bucketRequest.Spec.BucketPrefix - if name != "" { - name = name + "-" - } - name = name + string(bucketRequest.GetUID()) - - if bucketRequest.Status.BucketName != "" { - return util.ErrBucketAlreadyExists - } - - // create bucket - bucket := &v1alpha1.Bucket{} - - bucket.Name = name - bucket.Status.BucketID = name - bucket.Spec.Provisioner = bucketClass.Provisioner - bucket.Spec.BucketClassName = bucketClass.Name - bucket.Spec.DeletionPolicy = bucketClass.DeletionPolicy - bucket.Spec.BucketRequest = &v1.ObjectReference{ - Name: bucketRequest.Name, - Namespace: bucketRequest.Namespace, - UID: bucketRequest.ObjectMeta.UID, - } - bucket.Spec.AllowedNamespaces = util.CopyStrings(bucketClass.AllowedNamespaces) - bucket.Spec.Protocol = *bucketClass.Protocol.DeepCopy() - bucket.Spec.Parameters = util.CopySS(bucketClass.Parameters) - - bucket, err = b.Buckets().Create(ctx, bucket, metav1.CreateOptions{}) - if err != nil && !errors.IsAlreadyExists(err) { - klog.ErrorS(err, "name", bucket.Name) - return err - } - - controllerutil.AddFinalizer(bucketRequest, finalizer) - - bucketRequest.Status.BucketName = bucket.Name - bucketRequest.Status.BucketAvailable = true - _, err = b.BucketRequests(bucketRequest.Namespace).UpdateStatus(ctx, bucketRequest, metav1.UpdateOptions{}) - if err != nil { - return err - } - - klog.Infof("Finished creating Bucket %v", bucket.Name) - return nil -} - -// getBucketClass returns BucketClassName. If no bucket class was in the request it returns empty -// TODO this methods can be more sophisticate to address bucketClass overrides using annotations just like SC. -func (b *bucketRequestListener) getBucketClass(bucketRequest *v1alpha1.BucketRequest) string { - if bucketRequest.Spec.BucketClassName != "" { - return bucketRequest.Spec.BucketClassName - } - - return "" -} - -// cloneTheBucket clones a bucket to a different namespace when a BR is for brownfield. -func (b *bucketRequestListener) cloneTheBucket(bucketRequest *v1alpha1.BucketRequest) error { - klog.InfoS("Cloning Bucket", "name", bucketRequest.Status.BucketName) - return util.ErrNotImplemented -} - -func (b *bucketRequestListener) InitializeKubeClient(k kubeclientset.Interface) { - b.kubeClient = k -} - -func (b *bucketRequestListener) InitializeBucketClient(bc bucketclientset.Interface) { - b.bucketClient = bc -} - -func (b *bucketRequestListener) Buckets() objectstoragev1alpha1.BucketInterface { - if b.bucketClient != nil { - return b.bucketClient.ObjectstorageV1alpha1().Buckets() - } - panic("uninitialized listener") -} - -func (b *bucketRequestListener) BucketClasses() objectstoragev1alpha1.BucketClassInterface { - if b.bucketClient != nil { - return b.bucketClient.ObjectstorageV1alpha1().BucketClasses() - } - panic("uninitialized listener") -} - -func (b *bucketRequestListener) BucketRequests(namespace string) objectstoragev1alpha1.BucketRequestInterface { - if b.bucketClient != nil { - return b.bucketClient.ObjectstorageV1alpha1().BucketRequests(namespace) - } - panic("uninitialized listener") -} diff --git a/pkg/util/const.go b/pkg/util/const.go new file mode 100644 index 00000000..d4a1e535 --- /dev/null +++ b/pkg/util/const.go @@ -0,0 +1,19 @@ +package util + +import ( + "errors" +) + +var ( + // Error codes that the central controller will return + ErrBucketAlreadyExists = errors.New("A bucket already existing that matches the bucket request") + ErrInvalidBucketClass = errors.New("Cannot find bucket class with the name specified in the bucket request") + ErrBucketAccessAlreadyExists = errors.New("A bucket access already existing that matches the bucket access request") + ErrInvalidBucketAccessClass = errors.New("Cannot find bucket access class with the name specified in the bucket access request") + ErrInvalidBucketRequest = errors.New("Invalid bucket request specified in the bucket access request") + ErrInvalidBucketAccessRequest = errors.New("Invalid bucket access request specified") + ErrWaitForBucketProvisioning = errors.New("Bucket instance specified in the bucket request is not available to provision bucket access") + ErrBCUnavailable = errors.New("BucketClass is not available") + ErrNotImplemented = errors.New("Operation Not Implemented") + ErrNilConfigMap = errors.New("ConfigMap cannot be nil") +) \ No newline at end of file From 620b96b9553eaad6419849de16a651f663195187 Mon Sep 17 00:00:00 2001 From: Akash Mukhopadhyay Date: Tue, 26 Jul 2022 00:50:09 -0700 Subject: [PATCH 177/242] Some fixes in the spec --- cosi.pb.go | 4 ++-- cosi.proto | 4 ++-- spec.md | 14 +++++++------- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/cosi.pb.go b/cosi.pb.go index 25338709..d25d1b2c 100644 --- a/cosi.pb.go +++ b/cosi.pb.go @@ -1689,7 +1689,7 @@ const _ = grpc.SupportPackageIsVersion6 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. type IdentityClient interface { // This call is meant to retrieve the unique provisioner Identity. - // This identity will have to be set in BucketRequest.Provisioner field in order to invoke this specific provisioner. + // This identity will have to be set in BucketClaim.DriverName field in order to invoke this specific provisioner. DriverGetInfo(ctx context.Context, in *DriverGetInfoRequest, opts ...grpc.CallOption) (*DriverGetInfoResponse, error) } @@ -1713,7 +1713,7 @@ func (c *identityClient) DriverGetInfo(ctx context.Context, in *DriverGetInfoReq // IdentityServer is the server API for Identity service. type IdentityServer interface { // This call is meant to retrieve the unique provisioner Identity. - // This identity will have to be set in BucketRequest.Provisioner field in order to invoke this specific provisioner. + // This identity will have to be set in BucketClaim.DriverName field in order to invoke this specific provisioner. DriverGetInfo(context.Context, *DriverGetInfoRequest) (*DriverGetInfoResponse, error) } diff --git a/cosi.proto b/cosi.proto index 3d1956bb..c9e0a3fc 100644 --- a/cosi.proto +++ b/cosi.proto @@ -54,7 +54,7 @@ extend google.protobuf.ServiceOptions { service Identity { // This call is meant to retrieve the unique provisioner Identity. - // This identity will have to be set in BucketRequest.Provisioner field in order to invoke this specific provisioner. + // This identity will have to be set in BucketClaim.DriverName field in order to invoke this specific provisioner. rpc DriverGetInfo (DriverGetInfoRequest) returns (DriverGetInfoResponse) {} } @@ -154,7 +154,7 @@ message DriverGetInfoResponse { string name = 1; } -message DriverCreateBucketRequest { +message DriverCreateBucketRequest { // This field is REQUIRED // name specifies the name of the bucket that should be created. string name = 1; diff --git a/spec.md b/spec.md index bce0919d..953eb70d 100644 --- a/spec.md +++ b/spec.md @@ -181,7 +181,7 @@ extend google.protobuf.ServiceOptions { service Identity { // This call is meant to retrieve the unique provisioner Identity. - // This identity will have to be set in BucketRequest.Provisioner field in order to invoke this specific provisioner. + // This identity will have to be set in BucketClaim.DriverName field in order to invoke this specific provisioner. rpc DriverGetInfo (DriverGetInfoRequest) returns (DriverGetInfoResponse) {} } @@ -281,7 +281,7 @@ message DriverGetInfoResponse { string name = 1; } -message DriverCreateBucketRequest { +message DriverCreateBucketRequest { // This field is REQUIRED // name specifies the name of the bucket that should be created. string name = 1; @@ -431,7 +431,7 @@ The general flow of the success case MAY be as follows (protos illustrated in YA 1. COSI system queries metadata via Identity RPC. ``` - # COSI system --(ProvisionerGetInfo)--> Plugin + # COSI system --(DriverGetInfo)--> Plugin request: response: name: org.foo.whizbang.super-plugin @@ -446,16 +446,16 @@ message DriverGetInfoResponse { } ``` -#### `ProvisionerCreateBucket` +#### `DriverCreateBucket` A Controller Plugin MUST implement this RPC call. This RPC will be called by the COSI system to provision a new bucket on behalf of a COSI user. This operation MUST be idempotent. -If a volume corresponding to the specified bucket `name` already exists, is accessible from `accessibility_requirements, and is compatible with the specified attributes of the bucket in the `ProvisionerCreateBucket`, the Plugin MUST reply `0 OK` with the corresponding `ProvisionerCreateBucketResponse`. +If a volume corresponding to the specified bucket `name` already exists, is accessible from `accessibility_requirements, and is compatible with the specified attributes of the bucket in the `DriverCreateBucket`, the Plugin MUST reply `0 OK` with the corresponding `DriverCreateBucketResponse`. ``` -message ProvisionerCreateBucketRequest { +message DriverCreateBucketRequest { // Idempotency - This name is generated by the COSI system to achieve // idempotency. // This field is REQUIRED. @@ -466,7 +466,7 @@ message ProvisionerCreateBucketRequest { map bucket_context = 2; } -message ProvisionerCreateBucketResponse { +message DriverCreateBucketResponse { // Intentionally left blank } From 126717f86976e02c42639af8f8ea5a8dfaeb0892 Mon Sep 17 00:00:00 2001 From: Akash Mukhopadhyay Date: Wed, 27 Jul 2022 23:20:41 -0700 Subject: [PATCH 178/242] Removing bucket access request --- .../bucketaccessrequest.go | 162 --------- .../bucketaccessrequest_test.go | 333 ------------------ 2 files changed, 495 deletions(-) delete mode 100644 pkg/bucketaccessrequest/bucketaccessrequest.go delete mode 100644 pkg/bucketaccessrequest/bucketaccessrequest_test.go diff --git a/pkg/bucketaccessrequest/bucketaccessrequest.go b/pkg/bucketaccessrequest/bucketaccessrequest.go deleted file mode 100644 index 0cb9db81..00000000 --- a/pkg/bucketaccessrequest/bucketaccessrequest.go +++ /dev/null @@ -1,162 +0,0 @@ -package bucketaccessrequest - -import ( - "context" - - v1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - kubeclientset "k8s.io/client-go/kubernetes" - "k8s.io/klog/v2" - "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - - "sigs.k8s.io/container-object-storage-interface-api/apis/objectstorage.k8s.io/v1alpha1" - bucketclientset "sigs.k8s.io/container-object-storage-interface-api/clientset" - bucketcontroller "sigs.k8s.io/container-object-storage-interface-api/controller" - - "sigs.k8s.io/container-object-storage-interface-controller/pkg/util" -) - -const ( - finalizer = "cosi.objectstorage.k8s.io/bucketaccessrequest-protection" -) - -type bucketAccessRequestListener struct { - kubeClient kubeclientset.Interface - bucketClient bucketclientset.Interface -} - -func NewListener() bucketcontroller.BucketAccessRequestListener { - return &bucketAccessRequestListener{} -} - -func (b *bucketAccessRequestListener) InitializeKubeClient(k kubeclientset.Interface) { - b.kubeClient = k -} - -func (b *bucketAccessRequestListener) InitializeBucketClient(bc bucketclientset.Interface) { - b.bucketClient = bc -} - -func (b *bucketAccessRequestListener) Add(ctx context.Context, obj *v1alpha1.BucketAccessRequest) error { - klog.V(1).Infof("Add called for BucketAccessRequest %s", obj.Name) - bucketAccessRequest := obj - - err := b.provisionBucketAccess(ctx, bucketAccessRequest) - if err != nil { - // Provisioning is 100% finished / not in progress. - switch err { - case util.ErrBucketAccessAlreadyExists: - klog.V(1).Infof("BucketAccess already exist for this BucketAccessRequest %v.", bucketAccessRequest.Name) - err = nil - default: - klog.V(1).Infof("Error occurred processing BucketAccessRequest %v: %v", bucketAccessRequest.Name, err) - } - return err - } - - klog.V(1).Infof("BucketAccessRequest %v is successfully processed.", bucketAccessRequest.Name) - return nil -} - -func (b *bucketAccessRequestListener) Update(ctx context.Context, old, new *v1alpha1.BucketAccessRequest) error { - klog.V(1).Infof("Update called for BucketAccessRequest %v", old.Name) - return nil -} - -func (b *bucketAccessRequestListener) Delete(ctx context.Context, bucketAccessRequest *v1alpha1.BucketAccessRequest) error { - klog.V(1).Infof("Delete called for BucketAccessRequest %v", bucketAccessRequest.Name) - - return nil -} - -// provisionBucketAccess attempts to provision a BucketAccess for the given bucketAccessRequest. -// Returns nil error only when the bucketaccess was provisioned. An error is return if we cannot create bucket access. -// A normal error is returned when bucket acess was not provisioned and provisioning should be retried (requeue the bucketAccessRequest), -// or a special error errBucketAccessAlreadyExists, errInvalidBucketAccessClass is returned when provisioning was impossible and -// no further attempts to provision should be tried. -func (b *bucketAccessRequestListener) provisionBucketAccess(ctx context.Context, bucketAccessRequest *v1alpha1.BucketAccessRequest) error { - baClient := b.bucketClient.ObjectstorageV1alpha1().BucketAccesses() - bacClient := b.bucketClient.ObjectstorageV1alpha1().BucketAccessClasses() - brClient := b.bucketClient.ObjectstorageV1alpha1().BucketRequests - barClient := b.bucketClient.ObjectstorageV1alpha1().BucketAccessRequests - coreClient := b.kubeClient.CoreV1() - - name := string(bucketAccessRequest.GetUID()) - - if bucketAccessRequest.Status.BucketAccessName != "" { - return util.ErrBucketAccessAlreadyExists - } - - bucketAccessClassName := bucketAccessRequest.Spec.BucketAccessClassName - bucketAccessClass, err := bacClient.Get(ctx, bucketAccessClassName, metav1.GetOptions{}) - if err != nil { - // bucket access class is invalid or not specified, cannot continue with provisioning. - klog.Errorf("error fetching bucketaccessclass [%v]: %v", bucketAccessClassName, err) - return util.ErrInvalidBucketAccessClass - } - - brName := bucketAccessRequest.Spec.BucketRequestName - // TODO: catch this in a admission controller - if brName == "" { - return util.ErrInvalidBucketAccessRequest - } - bucketRequest, err := brClient(bucketAccessRequest.Namespace).Get(ctx, brName, metav1.GetOptions{}) - if err != nil { - klog.Errorf("error fetching bucket request [%v]: %v", brName, err) - return err - } - - if bucketRequest.Status.BucketName == "" || !bucketRequest.Status.BucketAvailable { - return util.ErrWaitForBucketProvisioning - } - - saName := bucketAccessRequest.Spec.ServiceAccountName - sa := &v1.ServiceAccount{} - if saName != "" { - sa, err = coreClient.ServiceAccounts(bucketAccessRequest.Namespace).Get(ctx, saName, metav1.GetOptions{}) - if err != nil { - return err - } - } - - bucketaccess := &v1alpha1.BucketAccess{} - bucketaccess.Name = name - - bucketaccess.Spec.BucketName = bucketRequest.Status.BucketName - - bucketaccess.Spec.BucketAccessRequest = &v1.ObjectReference{ - Name: bucketAccessRequest.Name, - Namespace: bucketAccessRequest.Namespace, - UID: bucketAccessRequest.ObjectMeta.UID, - } - bucketaccess.Spec.ServiceAccount = &v1.ObjectReference{ - Name: sa.Name, - Namespace: sa.Namespace, - UID: sa.ObjectMeta.UID, - } - // bucketaccess.Spec.MintedSecretName - set by the driver - bucketaccess.Spec.PolicyActionsConfigMapData, err = util.ReadConfigData(b.kubeClient, bucketAccessClass.PolicyActionsConfigMap) - if err != nil { - return err - } - // bucketaccess.Spec.Principal - set by the driver - - bucketaccess.Spec.Parameters = util.CopySS(bucketAccessClass.Parameters) - - bucketaccess, err = baClient.Create(context.Background(), bucketaccess, metav1.CreateOptions{}) - if err != nil && !errors.IsAlreadyExists(err) { - return err - } - - controllerutil.AddFinalizer(bucketAccessRequest, finalizer) - - bucketAccessRequest.Status.BucketAccessName = bucketaccess.Name - bucketAccessRequest.Status.AccessGranted = true - _, err = barClient(bucketAccessRequest.Namespace).UpdateStatus(ctx, bucketAccessRequest, metav1.UpdateOptions{}) - if err != nil { - return err - } - klog.Infof("Finished creating BucketAccess %v", bucketaccess.Name) - return nil -} diff --git a/pkg/bucketaccessrequest/bucketaccessrequest_test.go b/pkg/bucketaccessrequest/bucketaccessrequest_test.go deleted file mode 100644 index fb729da0..00000000 --- a/pkg/bucketaccessrequest/bucketaccessrequest_test.go +++ /dev/null @@ -1,333 +0,0 @@ -package bucketaccessrequest - -import ( - "context" - "testing" - - v1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/client-go/kubernetes/fake" - - types "sigs.k8s.io/container-object-storage-interface-api/apis/objectstorage.k8s.io/v1alpha1" - bucketclientset "sigs.k8s.io/container-object-storage-interface-api/clientset/fake" - - "sigs.k8s.io/container-object-storage-interface-controller/pkg/util" -) - -var sa1 = v1.ServiceAccount{ - ObjectMeta: metav1.ObjectMeta{ - Name: "sa1", - Namespace: "default", - }, -} - -var sa2 = v1.ServiceAccount{ - ObjectMeta: metav1.ObjectMeta{ - Name: "sa2", - Namespace: "default", - }, -} - -var cosiConfigMap = v1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Name: "testconfigmap", - Namespace: "default", - Labels: map[string]string{ - "cosi-configmap": "test-cred1", - }, - }, - Data: map[string]string{ - "profile": "profile1", - "certfile": "cert1", - }, -} - -var classGoldAccessParameters = map[string]string{ - "param1": "value1", - "param2": "value2", -} - -var goldAccessClass = types.BucketAccessClass{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "objectstorage.k8s.io/v1alpha1", - Kind: "BucketAccessClass", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: "classaccessgold", - }, - PolicyActionsConfigMap: &v1.ObjectReference{Name: "testconfigmap", Namespace: "default"}, - Parameters: classGoldAccessParameters, -} - -var bucketRequest1 = types.BucketRequest{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "objectstorage.k8s.io/v1alpha1", - Kind: "BucketRequest", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: "bucketrequest1", - Namespace: "default", - UID: "br-12345", - }, - Spec: types.BucketRequestSpec{ - BucketPrefix: "cosi", - BucketClassName: "classgold", - }, - Status: types.BucketRequestStatus{ - BucketName: "cosi1234567890", - BucketAvailable: true, - }, -} - -var bucketAccessRequest1 = types.BucketAccessRequest{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "objectstorage.k8s.io/v1alpha1", - Kind: "BucketAccessRequest", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: "bucketaccessrequest1", - Namespace: "default", - UID: "bar-12345", - }, - Spec: types.BucketAccessRequestSpec{ - ServiceAccountName: "sa1", - BucketRequestName: "bucketrequest1", - BucketAccessClassName: "classaccessgold", - }, -} - -var bucketAccessRequest2 = types.BucketAccessRequest{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "objectstorage.k8s.io/v1alpha1", - Kind: "BucketAccessRequest", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: "bucketaccessrequest2", - Namespace: "default", - UID: "bar-67890", - }, - Spec: types.BucketAccessRequestSpec{ - ServiceAccountName: "sa2", - BucketRequestName: "bucketrequest1", - BucketAccessClassName: "classaccessgold", - }, -} - -// Test basic add functionality -func TestAddBAR(t *testing.T) { - runCreateBucketAccess(t, "add") -} - -// Test add with multipleBRs -func TestAddWithMultipleBAR(t *testing.T) { - runCreateBucketWithMultipleBA(t, "addWithMultipleBR") -} - -// Test add idempotency -func TestAddBARIdempotency(t *testing.T) { - runCreateBucketIdempotency(t, "addWithMultipleBR") -} - -func runCreateBucketAccess(t *testing.T, name string) { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - client := bucketclientset.NewSimpleClientset() - kubeClient := fake.NewSimpleClientset() - - listener := NewListener() - listener.InitializeKubeClient(kubeClient) - listener.InitializeBucketClient(client) - - _, err := kubeClient.CoreV1().ServiceAccounts(sa1.Namespace).Create(ctx, &sa1, metav1.CreateOptions{}) - if err != nil { - t.Fatalf("Error occurred when creating ServiceAccount: %v", err) - } - defer kubeClient.CoreV1().ServiceAccounts(sa1.Namespace).Delete(ctx, sa1.Name, metav1.DeleteOptions{}) - - _, err = kubeClient.CoreV1().ConfigMaps(cosiConfigMap.Namespace).Create(ctx, &cosiConfigMap, metav1.CreateOptions{}) - if err != nil { - t.Fatalf("Error occurred when creating ConfigMap: %v", err) - } - defer kubeClient.CoreV1().ConfigMaps(cosiConfigMap.Namespace).Delete(ctx, cosiConfigMap.Name, metav1.DeleteOptions{}) - - bucketaccessclass, err := util.CreateBucketAccessClass(ctx, client, &goldAccessClass) - if err != nil { - t.Fatalf("Error occurred when creating BucketAccessClass: %v", err) - } - - bucketrequest, err := util.CreateBucketRequest(ctx, client, &bucketRequest1) - if err != nil { - t.Fatalf("Error occurred when creating BucketRequest: %v", err) - } - - bucketaccessrequest, err := util.CreateBucketAccessRequest(ctx, client, &bucketAccessRequest1) - if err != nil { - t.Fatalf("Error occurred when creating BucketAccessRequest: %v", err) - } - - listener.Add(ctx, bucketaccessrequest) - - bucketAccessList := util.GetBucketAccesses(ctx, client, 1) - defer util.DeleteObjects(ctx, client, *bucketrequest, *bucketaccessrequest, *bucketaccessclass, bucketAccessList.Items) - - if len(bucketAccessList.Items) != 1 { - t.Fatalf("Expecting a single BucketAccess created but found %v", len(bucketAccessList.Items)) - } - bucketaccess := bucketAccessList.Items[0] - - bucketaccessrequest, err = client.ObjectstorageV1alpha1().BucketAccessRequests(bucketaccessrequest.Namespace).Get(ctx, bucketaccessrequest.Name, metav1.GetOptions{}) - if err != nil { - t.Fatalf("Error occurred when updating BucketAccessRequest: %v", err) - } - - if util.ValidateBucketAccess(bucketaccess, *bucketaccessrequest, *bucketaccessclass) { - return - } else { - t.Fatalf("Failed to compare the resulting BucketAccess with the BucketAccessRequest %v and BucketAccessClass %v", bucketaccessrequest, bucketaccessclass) - } -} - -func runCreateBucketWithMultipleBA(t *testing.T, name string) { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - client := bucketclientset.NewSimpleClientset() - kubeClient := fake.NewSimpleClientset() - - listener := NewListener() - listener.InitializeKubeClient(kubeClient) - listener.InitializeBucketClient(client) - - _, err := kubeClient.CoreV1().ServiceAccounts(sa1.Namespace).Create(ctx, &sa1, metav1.CreateOptions{}) - if err != nil { - t.Fatalf("Error occurred when creating ServiceAccount: %v", err) - } - defer kubeClient.CoreV1().ServiceAccounts(sa1.Namespace).Delete(ctx, sa1.Name, metav1.DeleteOptions{}) - - _, err = kubeClient.CoreV1().ServiceAccounts(sa2.Namespace).Create(ctx, &sa2, metav1.CreateOptions{}) - if err != nil { - t.Fatalf("Error occurred when creating ServiceAccount: %v", err) - } - defer kubeClient.CoreV1().ServiceAccounts(sa2.Namespace).Delete(ctx, sa2.Name, metav1.DeleteOptions{}) - - _, err = kubeClient.CoreV1().ConfigMaps(cosiConfigMap.Namespace).Create(ctx, &cosiConfigMap, metav1.CreateOptions{}) - if err != nil { - t.Fatalf("Error occurred when creating ConfigMap: %v", err) - } - defer kubeClient.CoreV1().ConfigMaps(cosiConfigMap.Namespace).Delete(ctx, cosiConfigMap.Name, metav1.DeleteOptions{}) - - bucketaccessclass, err := util.CreateBucketAccessClass(ctx, client, &goldAccessClass) - if err != nil { - t.Fatalf("Error occurred when creating BucketAccessClass: %v", err) - } - - bucketrequest, err := util.CreateBucketRequest(ctx, client, &bucketRequest1) - if err != nil { - t.Fatalf("Error occurred when creating BucketRequest: %v", err) - } - - bucketaccessrequest, err := util.CreateBucketAccessRequest(ctx, client, &bucketAccessRequest1) - if err != nil { - t.Fatalf("Error occurred when creating BucketAccessRequest: %v", err) - } - - bucketaccessrequest2, err := util.CreateBucketAccessRequest(ctx, client, &bucketAccessRequest2) - if err != nil { - t.Fatalf("Error occurred when creating BucketAccessRequest: %v", err) - } - - listener.Add(ctx, bucketaccessrequest) - listener.Add(ctx, bucketaccessrequest2) - - bucketAccessList := util.GetBucketAccesses(ctx, client, 2) - defer util.DeleteObjects(ctx, client, *bucketrequest, *bucketaccessrequest, *bucketaccessrequest2, *bucketaccessclass, bucketAccessList.Items) - - if len(bucketAccessList.Items) != 2 { - t.Fatalf("Expecting a single BucketAccess created but found %v", len(bucketAccessList.Items)) - } - bucketaccess := bucketAccessList.Items[0] - bucketaccess2 := bucketAccessList.Items[1] - - bucketaccessrequest, err = client.ObjectstorageV1alpha1().BucketAccessRequests(bucketaccessrequest.Namespace).Get(ctx, bucketaccessrequest.Name, metav1.GetOptions{}) - if err != nil { - t.Fatalf("Error occurred when updating BucketAccessRequest: %v", err) - } - bucketaccessrequest2, err = client.ObjectstorageV1alpha1().BucketAccessRequests(bucketaccessrequest2.Namespace).Get(ctx, bucketaccessrequest2.Name, metav1.GetOptions{}) - if err != nil { - t.Fatalf("Error occurred when updating BucketAccessRequest: %v", err) - } - - if (util.ValidateBucketAccess(bucketaccess, *bucketaccessrequest, *bucketaccessclass) && util.ValidateBucketAccess(bucketaccess2, *bucketaccessrequest2, *bucketaccessclass)) || - (util.ValidateBucketAccess(bucketaccess2, *bucketaccessrequest, *bucketaccessclass) && util.ValidateBucketAccess(bucketaccess, *bucketaccessrequest2, *bucketaccessclass)) { - return - } else { - t.Fatalf("Failed to compare the resulting BucketAccess with the BucketAccessRequest %v and BucketAccessClass %v", bucketaccessrequest, bucketaccessclass) - } - -} - -func runCreateBucketIdempotency(t *testing.T, name string) { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - client := bucketclientset.NewSimpleClientset() - kubeClient := fake.NewSimpleClientset() - - listener := NewListener() - listener.InitializeKubeClient(kubeClient) - listener.InitializeBucketClient(client) - - _, err := kubeClient.CoreV1().ServiceAccounts(sa1.Namespace).Create(ctx, &sa1, metav1.CreateOptions{}) - if err != nil { - t.Fatalf("Error occurred when creating ServiceAccount: %v", err) - } - defer kubeClient.CoreV1().ServiceAccounts(sa1.Namespace).Delete(ctx, sa1.Name, metav1.DeleteOptions{}) - - _, err = kubeClient.CoreV1().ConfigMaps(cosiConfigMap.Namespace).Create(ctx, &cosiConfigMap, metav1.CreateOptions{}) - if err != nil { - t.Fatalf("Error occurred when creating ConfigMap: %v", err) - } - defer kubeClient.CoreV1().ConfigMaps(cosiConfigMap.Namespace).Delete(ctx, cosiConfigMap.Name, metav1.DeleteOptions{}) - - bucketaccessclass, err := util.CreateBucketAccessClass(ctx, client, &goldAccessClass) - if err != nil { - t.Fatalf("Error occurred when creating BucketAccessClass: %v", err) - } - - bucketrequest, err := util.CreateBucketRequest(ctx, client, &bucketRequest1) - if err != nil { - t.Fatalf("Error occurred when creating BucketRequest: %v", err) - } - - bucketaccessrequest, err := util.CreateBucketAccessRequest(ctx, client, &bucketAccessRequest1) - if err != nil { - t.Fatalf("Error occurred when creating BucketAccessRequest: %v", err) - } - - listener.Add(ctx, bucketaccessrequest) - - bucketAccessList := util.GetBucketAccesses(ctx, client, 1) - defer util.DeleteObjects(ctx, client, *bucketrequest, *bucketaccessrequest, *bucketaccessclass, bucketAccessList.Items) - - if len(bucketAccessList.Items) != 1 { - t.Fatalf("Expecting a single BucketAccess created but found %v", len(bucketAccessList.Items)) - } - bucketaccess := bucketAccessList.Items[0] - - bucketaccessrequest, err = client.ObjectstorageV1alpha1().BucketAccessRequests(bucketaccessrequest.Namespace).Get(ctx, bucketaccessrequest.Name, metav1.GetOptions{}) - if err != nil { - t.Fatalf("Error occurred when updating BucketAccessRequest: %v", err) - } - - if !util.ValidateBucketAccess(bucketaccess, *bucketaccessrequest, *bucketaccessclass) { - t.Fatalf("Failed to compare the resulting BucketAccess with the BucketAccessRequest %v and BucketAccessClass %v", bucketaccessrequest, bucketaccessclass) - } - - // call the add directly the second time - listener.Add(ctx, bucketaccessrequest) - bucketAccessList = util.GetBucketAccesses(ctx, client, 1) - if len(bucketAccessList.Items) != 1 { - t.Fatalf("Expecting a single BucketAccess created but found %v", len(bucketAccessList.Items)) - } -} From 42b23175ea35c98d75deb2b0c3fa89492babfdff Mon Sep 17 00:00:00 2001 From: Akash Mukhopadhyay Date: Thu, 28 Jul 2022 09:16:37 -0700 Subject: [PATCH 179/242] More changes --- pkg/bucketclaim/bucketclaim.go | 5 ++--- pkg/util/util.go | 14 -------------- 2 files changed, 2 insertions(+), 17 deletions(-) diff --git a/pkg/bucketclaim/bucketclaim.go b/pkg/bucketclaim/bucketclaim.go index 601a5cca..1d34e87c 100644 --- a/pkg/bucketclaim/bucketclaim.go +++ b/pkg/bucketclaim/bucketclaim.go @@ -3,7 +3,6 @@ package bucketclaim import ( "context" - "github.com/google/uuid" v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -128,10 +127,10 @@ func (b *bucketClaimListener) provisionBucketClaimOperation(ctx context.Context, return err } - controllerutil.AddFinalizer(bucketClaim, finalizer) + // controllerutil.AddFinalizer(bucketClaim, finalizer) bucketClaim.Status.BucketName = bucket.Name - bucketClaim.Status.BucketAvailable = true + bucketClaim.Status.BucketAvailable = false _, err = b.BucketClaims(bucketClaim.Namespace).UpdateStatus(ctx, bucketClaim, metav1.UpdateOptions{}) if err != nil { return err diff --git a/pkg/util/util.go b/pkg/util/util.go index 1d14d359..ba6fa451 100644 --- a/pkg/util/util.go +++ b/pkg/util/util.go @@ -35,20 +35,6 @@ import ( "k8s.io/klog/v2" ) -var ( - // Error codes that the central controller will return - ErrBucketAlreadyExists = errors.New("A bucket already existing that matches the bucket request") - ErrInvalidBucketClass = errors.New("Cannot find bucket class with the name specified in the bucket request") - ErrBucketAccessAlreadyExists = errors.New("A bucket access already existing that matches the bucket access request") - ErrInvalidBucketAccessClass = errors.New("Cannot find bucket access class with the name specified in the bucket access request") - ErrInvalidBucketRequest = errors.New("Invalid bucket request specified in the bucket access request") - ErrInvalidBucketAccessRequest = errors.New("Invalid bucket access request specified") - ErrWaitForBucketProvisioning = errors.New("Bucket instance specified in the bucket request is not available to provision bucket access") - ErrBCUnavailable = errors.New("BucketClass is not available") - ErrNotImplemented = errors.New("Operation Not Implemented") - ErrNilConfigMap = errors.New("ConfigMap cannot be nil") -) - func CopySS(m map[string]string) map[string]string { if m == nil { return nil From c1bd0ebd50dff248323633d1a5b6c0e90c8cec25 Mon Sep 17 00:00:00 2001 From: aarongalang Date: Fri, 29 Jul 2022 14:32:51 -0400 Subject: [PATCH 180/242] Added push to Cloudbuild.yaml and swapped out quay.io with gcr repo --- Makefile | 2 +- cloudbuild.yaml | 9 +++++++-- go.sum | 6 ------ 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index 5a49dfd1..7a5a842d 100644 --- a/Makefile +++ b/Makefile @@ -27,5 +27,5 @@ CMDS=controller-manager include release-tools/build.make -IMAGE_NAME=quay.io/containerobjectstorage/objectstorage-controller +IMAGE_NAME=gcr.io/k8s-staging-sig-storage/objectstorage-controller IMAGE_TAGS=canary diff --git a/cloudbuild.yaml b/cloudbuild.yaml index 87af11a6..bd575de7 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -1,9 +1,14 @@ # See https://cloud.google.com/cloud-build/docs/build-config timeout: 3000s +substitutions: + _IMAGE_NAME: 'gcr.io/k8s-staging-sig-storage/objectstorage-controller' + _IMAGE_TAG: 'canary' options: substitution_option: ALLOW_LOOSE steps: - name: "gcr.io/k8s-testimages/gcb-docker-gcloud:v20200824-5d057db" entrypoint: make - args: - - build + args: ['build'] +- name: "gcr.io/k8s-testimages/gcb-docker-gcloud:v20200824-5d057db" + entrypoint: make + args: ['push'] \ No newline at end of file diff --git a/go.sum b/go.sum index b42a8434..28490716 100644 --- a/go.sum +++ b/go.sum @@ -183,7 +183,6 @@ github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7a github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= 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-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -204,7 +203,6 @@ github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrU github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= @@ -226,7 +224,6 @@ github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OI github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -275,7 +272,6 @@ github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2p 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/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.5 h1:JboBksRwiiAJWvIYJVo46AfV+IAIKZpfrSzVKj42R4Q= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.9 h1:UauaLniWCFHWd+Jp9oCEkTBj8VO/9DKg3PV3VCNMDIg= github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= @@ -703,7 +699,6 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0 h1:UhZDfRO8JRQru4/+LlLE0BRKGF8L+PICnvYZmx/fEGA= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= @@ -731,7 +726,6 @@ gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= From f263c96e25db8f824312776a5ce3992bb845a7bf Mon Sep 17 00:00:00 2001 From: Akash Mukhopadhyay Date: Thu, 4 Aug 2022 09:34:01 -0700 Subject: [PATCH 181/242] More updates to the bucket claim controller --- cmd/controller-manager/controller-manager.go | 2 - pkg/bucketclaim/bucketclaim.go | 134 ++++++++++++------- pkg/util/const.go | 4 + pkg/util/util.go | 60 --------- 4 files changed, 90 insertions(+), 110 deletions(-) diff --git a/cmd/controller-manager/controller-manager.go b/cmd/controller-manager/controller-manager.go index 8c89ccdf..a963ba1a 100644 --- a/cmd/controller-manager/controller-manager.go +++ b/cmd/controller-manager/controller-manager.go @@ -11,7 +11,6 @@ import ( "github.com/spf13/viper" bucketcontroller "sigs.k8s.io/container-object-storage-interface-api/controller" - "sigs.k8s.io/container-object-storage-interface-controller/pkg/bucketaccessrequest" "sigs.k8s.io/container-object-storage-interface-controller/pkg/bucketclaim" "k8s.io/klog/v2" @@ -68,6 +67,5 @@ func run(ctx context.Context, args []string) error { return err } ctrl.AddBucketClaimListener(bucketclaim.NewBucketClaimListener()) - ctrl.AddBucketAccessRequestListener(bucketaccessrequest.NewListener()) return ctrl.Run(ctx) } diff --git a/pkg/bucketclaim/bucketclaim.go b/pkg/bucketclaim/bucketclaim.go index 1d34e87c..efe27d3b 100644 --- a/pkg/bucketclaim/bucketclaim.go +++ b/pkg/bucketclaim/bucketclaim.go @@ -17,10 +17,6 @@ import ( "sigs.k8s.io/container-object-storage-interface-controller/pkg/util" ) -const ( - finalizer = "cosi.objectstorage.k8s.io/bucketclaim-protection" -) - // bucketClaimListener is a resource handler for bucket requests objects type bucketClaimListener struct { kubeClient kubeclientset.Interface @@ -34,8 +30,8 @@ func NewBucketClaimListener() *bucketClaimListener { // Add creates a bucket in response to a bucketClaim func (b *bucketClaimListener) Add(ctx context.Context, bucketClaim *v1alpha1.BucketClaim) error { klog.V(3).InfoS("Add BucketClaim", - "name", bucketClaim.Name, - "ns", bucketClaim.Namespace, + "name", bucketClaim.ObjectMeta.Name, + "ns", bucketClaim.ObjectMeta.Namespace, "bucketClass", bucketClaim.Spec.BucketClassName, "bucketPrefix", bucketClaim.Spec.BucketPrefix, ) @@ -45,27 +41,27 @@ func (b *bucketClaimListener) Add(ctx context.Context, bucketClaim *v1alpha1.Buc switch err { case util.ErrInvalidBucketClass: klog.ErrorS(util.ErrInvalidBucketClass, - "bucketClaim", bucketClaim.Name, - "ns", bucketClaim.Namespace, + "bucketClaim", bucketClaim.ObjectMeta.Name, + "ns", bucketClaim.ObjectMeta.Namespace, "bucketClassName", bucketClaim.Spec.BucketClassName) case util.ErrBucketAlreadyExists: klog.V(3).InfoS("Bucket already exists", - "bucketClaim", bucketClaim.Name, - "ns", bucketClaim.Namespace, + "bucketClaim", bucketClaim.ObjectMeta.Name, + "ns", bucketClaim.ObjectMeta.Namespace, ) return nil default: klog.ErrorS(err, - "name", bucketClaim.Name, - "ns", bucketClaim.Namespace, + "name", bucketClaim.ObjectMeta.Name, + "ns", bucketClaim.ObjectMeta.Namespace, "err", err) } return err } klog.V(3).InfoS("Add BucketClaim success", - "name", bucketClaim.Name, - "ns", bucketClaim.Namespace) + "name", bucketClaim.ObjectMeta.Name, + "ns", bucketClaim.ObjectMeta.Namespace) return nil } @@ -74,14 +70,24 @@ func (b *bucketClaimListener) Update(ctx context.Context, old, new *v1alpha1.Buc klog.V(3).InfoS("Update BucketClaim", "name", old.Name, "ns", old.Namespace) + + if !new.GetDeletionTimestamp().IsZero() { + if controllerutil.ContainsFinalizer(bucketClaim, util.BucketClaimFinalizer) { + bucketName := bucketClaim.Status.BucketName + err := b.Buckets().Delete(ctx, bucketName, metav1.DeleteOptions{}) + if err != nil { + return err + } + } + } return nil } // Delete processes a bucket for which bucket request is deleted func (b *bucketClaimListener) Delete(ctx context.Context, bucketClaim *v1alpha1.BucketClaim) error { klog.V(3).Infof("Delete BucketClaim %v", - "name", bucketClaim.Name, - "ns", bucketClaim.Namespace) + "name", bucketClaim.ObjectMeta.Name, + "ns", bucketClaim.ObjectMeta.Namespace) return nil } @@ -93,50 +99,82 @@ func (b *bucketClaimListener) Delete(ctx context.Context, bucketClaim *v1alpha1. // ErrBucketAlreadyExists - BucketClaim already processed // non-nil err - Internal error [requeue'd with exponential backoff] func (b *bucketClaimListener) provisionBucketClaimOperation(ctx context.Context, bucketClaim *v1alpha1.BucketClaim) error { - bucketClassName := b.getBucketClass(bucketClaim) - bucketClass, err := b.BucketClasses().Get(ctx, bucketClassName, metav1.GetOptions{}) - if err != nil { - klog.ErrorS(err, "Get Bucketclass Error", "name", bucketClassName) - return util.ErrInvalidBucketClass - } - if bucketClaim.Status.BucketReady { return util.ErrBucketAlreadyExists } - name = bucketClassName + string(bucketClaim.GetUID()) - - // create bucket - bucket := &v1alpha1.Bucket{} - bucket.Name = name - bucket.Status.BucketReady = false - bucket.Spec.DriverName = bucketClass.DriverName - bucket.Spec.BucketClassName = bucketClassName - bucket.Spec.DeletionPolicy = bucketClass.DeletionPolicy - bucket.Spec.BucketClaim = &v1.ObjectReference{ - Name: bucketClaim.Name, - Namespace: bucketClaim.Namespace, - UID: bucketClaim.ObjectMeta.UID, + var bucketName string + + if bucketClaim.Spec.ExistingBucketName != "" { + bucketName = bucketClaim.Spec.ExistingBucketName + bucket, err = b.Buckets().Get(ctx, bucketName, metav1.GetOptions{}) + if err != nil { + klog.ErrorS(err, "Get Bucket with ExistingBucketName error", "name", existingBucketName) + return err + } + + bucket.Spec.BucketClaim = &v1.ObjectReference{ + Name: bucketClaim.ObjectMeta.Name, + Namespace: bucketClaim.ObjectMeta.Namespace, + UID: bucketClaim.ObjectMeta.UID, + } + + _, err = b.Buckets().Update(ctx, bucket, metav1.UpdateOptions{}) + if err != nil { + return err + } + + bucketClaim.Status.BucketName = bucketName + bucketClaim.Status.BucketAvailable = true + } else { + bucketClassName := b.getBucketClass(bucketClaim) + bucketClass, err := b.BucketClasses().Get(ctx, bucketClassName, metav1.GetOptions{}) + if err != nil { + klog.ErrorS(err, "Get Bucketclass Error", "name", bucketClassName) + return util.ErrInvalidBucketClass + } + + bucketName = bucketClassName + string(bucketClaim.ObjectMeta.UID) + + // create bucket + bucket := &v1alpha1.Bucket{} + bucket.Name = bucketName + bucket.Spec.DriverName = bucketClass.DriverName + bucket.Status.BucketReady = false + bucket.Spec.BucketClassName = bucketClassName + bucket.Spec.DeletionPolicy = bucketClass.DeletionPolicy + bucket.Spec.Parameters = util.CopySS(bucketClass.Parameters) + + bucket.Spec.BucketClaim = &v1.ObjectReference{ + Name: bucketClaim.ObjectMeta.Name, + Namespace: bucketClaim.ObjectMeta.Namespace, + UID: bucketClaim.ObjectMeta.UID, + } + + bucket.Spec.Protocols = *bucketClaim.Spec.Protocol.DeepCopy() + bucket, err = b.Buckets().Create(ctx, bucket, metav1.CreateOptions{}) + if err != nil && !errors.IsAlreadyExists(err) { + klog.ErrorS(err, "name", bucketName) + return err + } + + bucketClaim.Status.BucketName = bucketName + bucketClaim.Status.BucketAvailable = false } - bucket.Spec.Protocols = *bucketClass.Protocol.DeepCopy() - bucket.Spec.Parameters = util.CopySS(bucketClass.Parameters) - bucket, err = b.Buckets().Create(ctx, bucket, metav1.CreateOptions{}) - if err != nil && !errors.IsAlreadyExists(err) { - klog.ErrorS(err, "name", bucket.Name) + _, err = b.BucketClaims(bucketClaim.ObjectMeta.Namespace).UpdateStatus(ctx, bucketClaim, metav1.UpdateOptions{}) + if err != nil { return err } - // controllerutil.AddFinalizer(bucketClaim, finalizer) - - bucketClaim.Status.BucketName = bucket.Name - bucketClaim.Status.BucketAvailable = false - _, err = b.BucketClaims(bucketClaim.Namespace).UpdateStatus(ctx, bucketClaim, metav1.UpdateOptions{}) + // Add the finalizers so that bucketClaim is deleted + // only after the associated bucket is deleted. + controllerutil.AddFinalizer(bucketClaim, util.BucketClaimFinalizer) + _, err = b.BucketClaims(bucketClaim.ObjectMeta.Namespace).Update(ctx, bucketClaim, metav1.UpdateOptions{}) if err != nil { return err } - - klog.Infof("Finished creating Bucket %v", bucket.Name) + klog.Infof("Finished creating Bucket %v", bucketName) return nil } diff --git a/pkg/util/const.go b/pkg/util/const.go index d4a1e535..5636696d 100644 --- a/pkg/util/const.go +++ b/pkg/util/const.go @@ -4,6 +4,10 @@ import ( "errors" ) +const ( + BucketClaimFinalizer = "cosi.objectstorage.k8s.io/bucketclaim-protection" +) + var ( // Error codes that the central controller will return ErrBucketAlreadyExists = errors.New("A bucket already existing that matches the bucket request") diff --git a/pkg/util/util.go b/pkg/util/util.go index ba6fa451..27fa9dc3 100644 --- a/pkg/util/util.go +++ b/pkg/util/util.go @@ -3,7 +3,6 @@ package util import ( "context" "encoding/json" - "errors" "fmt" "golang.org/x/time/rate" "os" @@ -228,65 +227,6 @@ func DeleteObjects(ctx context.Context, client bucketclientset.Interface, objs . } } -// CreateBucketRequest creates a bucket request object or return an existing bucket request object -// This is used by bucket request unit tests -func CreateBucketRequest(ctx context.Context, client bucketclientset.Interface, br *types.BucketRequest) (*types.BucketRequest, error) { - br, err := client.ObjectstorageV1alpha1().BucketRequests(br.Namespace).Create(ctx, br, metav1.CreateOptions{}) - if (err != nil) && apierrors.IsAlreadyExists(err) { - br, err = client.ObjectstorageV1alpha1().BucketRequests(br.Namespace).Get(ctx, br.Name, metav1.GetOptions{}) - } - return br, err -} - -// CreateBucketAccessRequest creates a bucket access request object or return an existing bucket access request object -// This is used by bucket access request unit tests -func CreateBucketAccessRequest(ctx context.Context, client bucketclientset.Interface, bar *types.BucketAccessRequest) (*types.BucketAccessRequest, error) { - bar, err := client.ObjectstorageV1alpha1().BucketAccessRequests(bar.Namespace).Create(ctx, bar, metav1.CreateOptions{}) - if (err != nil) && apierrors.IsAlreadyExists(err) { - bar, err = client.ObjectstorageV1alpha1().BucketAccessRequests(bar.Namespace).Get(ctx, bar.Name, metav1.GetOptions{}) - } - return bar, err -} - -// CreateBucketClass creates a bucket class object or return an existing bucket class object -// This is used by bucket request unit tests -func CreateBucketClass(ctx context.Context, client bucketclientset.Interface, bc *types.BucketClass) (*types.BucketClass, error) { - bc, err := client.ObjectstorageV1alpha1().BucketClasses().Create(ctx, bc, metav1.CreateOptions{}) - if (err != nil) && apierrors.IsAlreadyExists(err) { - bc, err = client.ObjectstorageV1alpha1().BucketClasses().Get(ctx, bc.Name, metav1.GetOptions{}) - } - return bc, err -} - -// CreateBucketAccessClass creates a bucket access class object or return an existing bucket access class object -// This is used by bucket request unit tests -func CreateBucketAccessClass(ctx context.Context, client bucketclientset.Interface, bac *types.BucketAccessClass) (*types.BucketAccessClass, error) { - bac, err := client.ObjectstorageV1alpha1().BucketAccessClasses().Create(ctx, bac, metav1.CreateOptions{}) - if (err != nil) && apierrors.IsAlreadyExists(err) { - bac, err = client.ObjectstorageV1alpha1().BucketAccessClasses().Get(ctx, bac.Name, metav1.GetOptions{}) - } - return bac, err -} - -// CreateBucket creates a bucket object or return an existing bucket object -// This is used by bucket request unit tests -func CreateBucket(ctx context.Context, client bucketclientset.Interface, b *types.Bucket) (*types.Bucket, error) { - b, err := client.ObjectstorageV1alpha1().Buckets().Create(ctx, b, metav1.CreateOptions{}) - if (err != nil) && apierrors.IsAlreadyExists(err) { - b, err = client.ObjectstorageV1alpha1().Buckets().Get(ctx, b.Name, metav1.GetOptions{}) - } - return b, err -} - -// CreateBucketAccess creates a bucket access object or return an existing bucket access object -// This is used by bucket access request unit tests -func CreateBucketAccess(ctx context.Context, client bucketclientset.Interface, ba *types.BucketAccess) (*types.BucketAccess, error) { - ba, err := client.ObjectstorageV1alpha1().BucketAccesses().Create(ctx, ba, metav1.CreateOptions{}) - if (err != nil) && apierrors.IsAlreadyExists(err) { - ba, err = client.ObjectstorageV1alpha1().BucketAccesses().Get(ctx, ba.Name, metav1.GetOptions{}) - } - return ba, err -} // getCRDClient returns CRD interface for managing CRD objects programmatically // Used by unit tests and functional tests From 090921db3ec28c19013e2cd66844539a9eff5655 Mon Sep 17 00:00:00 2001 From: Akash Mukhopadhyay Date: Fri, 5 Aug 2022 01:06:54 -0700 Subject: [PATCH 182/242] Updating the go mod and go sum and fixing compilation --- go.mod | 94 +++- go.sum | 843 +++++++++++++++++----------- pkg/bucketclaim/bucketclaim.go | 63 +-- pkg/bucketclaim/bucketclaim_test.go | 20 +- pkg/util/const.go | 13 +- pkg/util/util.go | 281 +--------- 6 files changed, 653 insertions(+), 661 deletions(-) diff --git a/go.mod b/go.mod index b73dc9e3..4470f16f 100644 --- a/go.mod +++ b/go.mod @@ -1,34 +1,76 @@ module sigs.k8s.io/container-object-storage-interface-controller -go 1.15 +go 1.18 require ( - github.com/google/go-cmp v0.5.2 // indirect - github.com/gopherjs/gopherjs v0.0.0-20190328170749-bb2674552d8f // indirect - github.com/kr/text v0.2.0 // indirect + github.com/spf13/cobra v1.4.0 + github.com/spf13/viper v1.12.0 + golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 + k8s.io/api v0.24.2 + k8s.io/apiextensions-apiserver v0.24.2 + k8s.io/apimachinery v0.24.2 + k8s.io/client-go v0.24.2 + k8s.io/klog/v2 v2.70.1 + sigs.k8s.io/container-object-storage-interface-api v0.0.0-20220727205553-02ff3dd25b5e + sigs.k8s.io/controller-runtime v0.12.3 + sigs.k8s.io/controller-tools v0.9.2 +) + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/emicklei/go-restful/v3 v3.8.0 // indirect + github.com/evanphx/json-patch v4.12.0+incompatible // indirect + github.com/fsnotify/fsnotify v1.5.4 // indirect + github.com/go-logr/logr v1.2.0 // indirect + github.com/go-openapi/jsonpointer v0.19.5 // indirect + github.com/go-openapi/jsonreference v0.20.0 // indirect + github.com/go-openapi/swag v0.19.15 // indirect + github.com/gobuffalo/flect v0.2.5 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/protobuf v1.5.2 // indirect + github.com/google/gnostic v0.5.7-v3refs // indirect + github.com/google/go-cmp v0.5.8 // indirect + github.com/google/gofuzz v1.1.0 // indirect + github.com/google/uuid v1.1.2 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/imdario/mergo v0.3.12 // indirect + github.com/inconshreveable/mousetrap v1.0.0 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/magiconair/properties v1.8.6 // indirect github.com/mailru/easyjson v0.7.6 // indirect - github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/pelletier/go-toml v1.9.5 // indirect + github.com/pelletier/go-toml/v2 v2.0.1 // indirect + github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/smartystreets/assertions v1.1.1 // indirect - github.com/spf13/cobra v1.1.1 - github.com/spf13/viper v1.7.1 - github.com/stretchr/testify v1.6.1 // indirect - golang.org/x/crypto v0.0.0-20201124201722-c8d3bf9c5392 // indirect - golang.org/x/net v0.0.0-20201216054612-986b41b23924 // indirect - golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d // indirect - golang.org/x/text v0.3.4 // indirect - golang.org/x/time v0.0.0-20191024005414-555d28b269f0 - golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e // indirect + github.com/spf13/afero v1.8.2 // indirect + github.com/spf13/cast v1.5.0 // indirect + github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/subosito/gotenv v1.3.0 // indirect + golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 // indirect + golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2 // indirect + golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5 // indirect + golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a // indirect + golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect + golang.org/x/text v0.3.7 // indirect + golang.org/x/tools v0.1.10 // indirect + golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df // indirect + google.golang.org/appengine v1.6.7 // indirect + google.golang.org/protobuf v1.28.0 // indirect gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b // indirect - gopkg.in/ini.v1 v1.57.0 // indirect - gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 // indirect - k8s.io/api v0.19.4 - k8s.io/apiextensions-apiserver v0.19.4 - k8s.io/apimachinery v0.19.4 - k8s.io/client-go v0.19.4 - k8s.io/klog/v2 v2.4.0 - k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd // indirect - sigs.k8s.io/container-object-storage-interface-api v0.0.0-20210507174303-fac7c5076c3d - sigs.k8s.io/controller-runtime v0.6.3 - sigs.k8s.io/controller-tools v0.4.1 + gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/ini.v1 v1.66.4 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.0 // indirect + k8s.io/kube-openapi v0.0.0-20220627174259-011e075b9cb8 // indirect + k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect + sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.2.1 // indirect + sigs.k8s.io/yaml v1.3.0 // indirect ) diff --git a/go.sum b/go.sum index b42a8434..bab02282 100644 --- a/go.sum +++ b/go.sum @@ -3,253 +3,265 @@ cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= 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.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= +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.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.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +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.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +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/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/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/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= 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/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.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest v0.9.6/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= -github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= -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/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/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= -github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= -github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/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/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/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 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= 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 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= 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/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= 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/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +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-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/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= 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 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= 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/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +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/coreos/bbolt v1.3.2/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/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -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/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/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= 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/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/dave/jennifer v1.4.1/go.mod h1:7jEdnm+qBcxl8PC0zyp7vxcpSRnzXSt9r39tpTVGlwA= +github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -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/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/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/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 h1:spTtZBk5DYEvbxMVutUuTyh1Ao2r4iyvLdACqsl/Ljk= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful/v3 v3.8.0 h1:eCZ8ulSerjdAiaNpF7GxXIE7ZCMo1moN1qX+S609eVw= +github.com/emicklei/go-restful/v3 v3.8.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= 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= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= 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/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -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 h1:kLcOMZeuLAJvL2BPWLMIj5oaZQobrkAqrL+WFZwQses= -github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= +github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +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/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +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 v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -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-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-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-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v0.2.0 h1:QvGt2nLcHH0WK9orKa+ppBPAxREcH364nPUedEpK0TY= github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/zapr v0.1.0 h1:h+WVe9j6HAA01niTJPA/kKH0i7e0rLZBCwauQFcRE54= -github.com/go-logr/zapr v0.1.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= -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.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.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= -github.com/go-openapi/errors v0.17.0/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/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.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w= +github.com/go-logr/logr v1.2.0 h1:QK40JKJyMdUDz+h+xvCsru/bJhvG0UxvePV0ufL/AcE= +github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/zapr v1.2.0 h1:n4JnPI1T3Qq1SFEi/F8rwLrZERp2bso19PJZDB9dayk= +github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -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.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= +github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= +github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.4 h1:3Vw+rh13uq2JFNxgnMTGE1rnoieU9FmyE1gvnyylsYg= -github.com/go-openapi/jsonreference v0.19.4/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= -github.com/go-openapi/loads v0.17.0/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.4/go.mod h1:zZVHonKd8DXyxyw4yfnVjPzBjIQcLt0CCsn0N0ZrQsk= -github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= -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/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.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.12 h1:OO9WrvhDwtiMY/Opr1j1iFZzirI3JW4/bxNFRcntAr4= -github.com/go-openapi/spec v0.19.12/go.mod h1:gwrgJS15eCUgjLpMjBJmbZezCsw88LmgeEip0M63doA= -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.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= -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.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/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= +github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA= +github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.11 h1:RFTu/dlFySpyVvJDfp/7674JY4SDglYWKztbiIGFpmc= -github.com/go-openapi/swag v0.19.11/go.mod h1:Uc0gKkdR+ojzsEpjh39QChyu92vPgIr72POcgHMAgSY= -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.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= +github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM= +github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/gobuffalo/flect v0.2.0 h1:EWCvMGGxOjsgwlWaP+f4+Hh6yrrte7JeFL2S6b+0hdM= -github.com/gobuffalo/flect v0.2.0/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80= +github.com/gobuffalo/flect v0.2.5 h1:H6vvsv2an0lalEaCDRThvtBfmg44W/QHXBCYUXf/6S4= +github.com/gobuffalo/flect v0.2.5/go.mod h1:1ZyCLIbg0YD7sDkzvFdPoOydPtD8y9JQnrOROolUcM8= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= 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/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= 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 h1:5ZkaAPbicIKTF2I64qf5Fh8Aa83Q/dnOafMYV0OMwjA= 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/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= -github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/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= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= 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/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/cel-go v0.10.1/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w= +github.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA= +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= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-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-20200708004538-1a94d8640e99/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-20201218002935-b9804c9f04c2/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/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -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.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU= -github.com/googleapis/gnostic v0.4.1 h1:DLJCy1n/vrD4HPjOvYcT8aYQXpPIzoRZONaYwyycI+I= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gopherjs/gopherjs v0.0.0-20190328170749-bb2674552d8f h1:4Gslotqbs16iAg+1KR/XdabIfq8TlAWHdwS5QJFksLc= -github.com/gopherjs/gopherjs v0.0.0-20190328170749-bb2674552d8f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -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/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= 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 v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/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.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= 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 v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -265,8 +277,6 @@ github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b 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.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= @@ -275,55 +285,51 @@ github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2p 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/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.5 h1:JboBksRwiiAJWvIYJVo46AfV+IAIKZpfrSzVKj42R4Q= +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.9 h1:UauaLniWCFHWd+Jp9oCEkTBj8VO/9DKg3PV3VCNMDIg= -github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= +github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/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 v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= 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.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= 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 h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= 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/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/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.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.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= 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/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -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/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= +github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= 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.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= 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.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= 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 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= @@ -335,46 +341,54 @@ github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eI 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/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= +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-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/munnerz/goautoneg v0.0.0-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/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= 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.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.2 h1:8mVmC9kjFFmA8H4pKMUhcblgifdkOIXPvbhN1T36q1M= -github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo/v2 v2.1.4 h1:GNapqRSid3zijZ9H77KrgVG4/8KqiyRsxcSxe+7ApXY= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/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.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= 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-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.0.1 h1:8e3L2cCQzLFi2CR4g7vGFuFxX7Jl1kKX8gW+iV0GUKU= +github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/pkg/errors v0.8.0/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/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -383,8 +397,10 @@ github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prY github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= 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.7.1 h1:NTGy1Ja9pByO+xAeH/qiWnLrKtr3hJPNjaVUwnjpdpA= 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 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= +github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/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= @@ -393,117 +409,145 @@ github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6T github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= 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.10.0 h1:RyRA7RzGXQZiW+tGMr7sxa85G1z0yOpM1qq5c8lNawc= 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 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= +github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/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.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.1.3 h1:F0+tqvhOksq22sc6iCHF5WGlWjdwj92p0udFh1VFBS8= github.com/prometheus/procfs v0.1.3/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 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= +github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= 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/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= 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/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/assertions v1.1.1 h1:T/YLemO5Yp7KPzS+lVtu+WsHn8yoSwTfItdAd1r3cck= -github.com/smartystreets/assertions v1.1.1/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= -github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= 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/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 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= +github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= +github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -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 v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.1.1 h1:KfztREH0tPxJJ+geloSLaAkaPkr4ki2Er5quFV1TDo4= -github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= -github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= +github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= +github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= +github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= +github.com/spf13/cobra v1.4.0 h1:y+wJpx64xcgO1V+RcnwW0LEHxTKRi2ZDPSBjWnrg88Q= +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/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag 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.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk= -github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ= +github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= +github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= 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/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= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/subosito/gotenv v1.3.0 h1:mjC+YW8QpAdXibNi+vNWgzmgBH4+5l5dCXv8cNysBLI= +github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -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/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= +github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +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= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -go.etcd.io/etcd v0.5.0-alpha.5.0.20200819165624-17cef6e3e9d5/go.mod h1:skWido08r9w6Lq/w70DO5XYIKMu4QFu1+4VsqLQuJy8= -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.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= +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.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.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +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 v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= +go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= +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/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM= +go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +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= +go.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/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-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-20190510104115-cbcb75029529/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-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201124201722-c8d3bf9c5392 h1:xYJJ3S178yv++9zXV/hnr29plCAGO9vAFG9dorqaFQc= -golang.org/x/crypto v0.0.0-20201124201722-c8d3bf9c5392/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/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-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/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-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -514,19 +558,26 @@ golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +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/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 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 h1:kQgndtyPBW/JIYERgdxfwMYh3AVStj88WQTlNDi2a+o= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= 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-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-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -534,40 +585,73 @@ golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-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-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/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-20190827160401-ba9fcec4b297/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-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= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-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-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201216054612-986b41b23924 h1:QsnDpLLOKwHBBDa8nDws4DYNc/ryVW2vCpxCs09d4PY= -golang.org/x/net v0.0.0-20201216054612-986b41b23924/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +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-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-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210825183410-e898025ed96a/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-20220520000938-2e3eb7b945c2 h1:NWy5+hlRbC7HK+PmcXVUmW1IMyFce7to56IUvhUFm7Y= +golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +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-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5 h1:OSnWWcOd/CtWQC2cYSBgbTSJv3ciqd8r54ySIW2y3RE= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= 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-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= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +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/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= @@ -575,58 +659,91 @@ golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5h 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-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-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-20190412213103-97732733099d/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-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-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/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-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-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-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-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-20200323222414-85ca7c5b95cd/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-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/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-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 h1:nxC68pudNYkKU6jWhgrqdreuFiOQWj1Fs7T3VrH4Pjw= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-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-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/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-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +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.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 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +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 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= 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 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/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 h1:vVKdlvoWBphwdxWKrFZEuM0kGgGLxUOYcY4U/2Vjg44= +golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/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-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -636,42 +753,90 @@ golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBn golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= 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-20190816200558-6889da9d5479/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-20191012152004-8de300cfc20a/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-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-20191115202509-3a792d9c32b2/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-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200616195046-dc31b401abb5/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e h1:Z2uDrs8MyXUWJbwGc4V+nGjV4Ygo+oubBbWSVQw21/I= +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-20200207183749-b753a1ba74fa/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-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-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-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/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-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-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-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= +golang.org/x/tools v0.1.10 h1:QjFRCZxdOhBJ/UNgnBZLbNV13DlbnK0quyivTnXJM20= +golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= 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 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gomodules.xyz/jsonpatch/v2 v2.0.1 h1:xyiBuvkD2g5n7cYzx6u2sxQvsAy4QJsZFCzGVdzOXZ0= -gomodules.xyz/jsonpatch/v2 v2.0.1/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df h1:5Pf6pFKu98ODmgnpvkJ3kFUOQGGLIzLIkbzUHp47618= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= 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.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= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +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.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.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/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= 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.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM= 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/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -681,20 +846,67 @@ google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98 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-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= google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +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-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-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +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-20200825200019-8632dd797987/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-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201102152239-715cce707fb0/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-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +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-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= 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.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= 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= -google.golang.org/grpc v1.35.0 h1:TwIQcH3es+MojMVojxxfQ3l3OF2KzlRxML2xZq0kRo8= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +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.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= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +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.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= 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= @@ -703,24 +915,27 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0 h1:UhZDfRO8JRQru4/+LlLE0BRKGF8L+PICnvYZmx/fEGA= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= 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-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-20200902074654-038fdea0a05b h1:QRR6H1YWRnHb4Y/HeNFCTJLFVxaq6wH4YuVdsUOr75U= gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -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/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.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.57.0 h1:9unxIsFcTt4I55uWluz+UmL95q4kdJ0buvQ1ZIqVQww= -gopkg.in/ini.v1 v1.57.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.66.4 h1:SsAcf+mM7mRZo2nJNGt8mZCjG8ZRaNGMURJw7BsIST4= +gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= 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/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= @@ -729,86 +944,66 @@ gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWD 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.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0-20190905181640-827449938966/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0 h1:hjy8E9ON/egN1tAYqKb61G10WtihqetD4sz2H+8nIeA= +gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= +gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= 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.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -k8s.io/api v0.18.2/go.mod h1:SJCWI7OLzhZSvbY7U8zwNl9UA4o1fizoug34OV/2r78= -k8s.io/api v0.18.6/go.mod h1:eeyxr+cwCjMdLAmr2W3RyDI0VvTawSg/3RFFBEnmZGI= -k8s.io/api v0.19.4 h1:I+1I4cgJYuCDgiLNjKx7SLmIbwgj9w7N7Zr5vSIdwpo= -k8s.io/api v0.19.4/go.mod h1:SbtJ2aHCItirzdJ36YslycFNzWADYH3tgOhvBEFtZAk= -k8s.io/apiextensions-apiserver v0.18.2/go.mod h1:q3faSnRGmYimiocj6cHQ1I3WpLqmDgJFlKL37fC4ZvY= -k8s.io/apiextensions-apiserver v0.18.6/go.mod h1:lv89S7fUysXjLZO7ke783xOwVTm6lKizADfvUM/SS/M= -k8s.io/apiextensions-apiserver v0.19.4 h1:D9ak9T012tb3vcGFWYmbQuj9SCC8YM4zhA4XZqsAQC4= -k8s.io/apiextensions-apiserver v0.19.4/go.mod h1:B9rpH/nu4JBCtuUp3zTTk8DEjZUupZTBEec7/2zNRYw= -k8s.io/apimachinery v0.18.2/go.mod h1:9SnR/e11v5IbyPCGbvJViimtJ0SwHG4nfZFjU77ftcA= -k8s.io/apimachinery v0.18.6/go.mod h1:OaXp26zu/5J7p0f92ASynJa1pZo06YlV9fG7BoWbCko= -k8s.io/apimachinery v0.19.4 h1:+ZoddM7nbzrDCp0T3SWnyxqf8cbWPT2fkZImoyvHUG0= -k8s.io/apimachinery v0.19.4/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA= -k8s.io/apiserver v0.18.2/go.mod h1:Xbh066NqrZO8cbsoenCwyDJ1OSi8Ag8I2lezeHxzwzw= -k8s.io/apiserver v0.18.6/go.mod h1:Zt2XvTHuaZjBz6EFYzpp+X4hTmgWGy8AthNVnTdm3Wg= -k8s.io/apiserver v0.19.4/go.mod h1:X8WRHCR1UGZDd7HpV0QDc1h/6VbbpAeAGyxSh8yzZXw= -k8s.io/client-go v0.18.2/go.mod h1:Xcm5wVGXX9HAA2JJ2sSBUn3tCJ+4SVlCbl2MNNv+CIU= -k8s.io/client-go v0.18.6/go.mod h1:/fwtGLjYMS1MaM5oi+eXhKwG+1UHidUEXRh6cNsdO0Q= -k8s.io/client-go v0.19.4 h1:85D3mDNoLF+xqpyE9Dh/OtrJDyJrSRKkHmDXIbEzer8= -k8s.io/client-go v0.19.4/go.mod h1:ZrEy7+wj9PjH5VMBCuu/BDlvtUAku0oVFk4MmnW9mWA= -k8s.io/code-generator v0.18.2/go.mod h1:+UHX5rSbxmR8kzS+FAv7um6dtYrZokQvjHpDSYRVkTc= -k8s.io/code-generator v0.18.6/go.mod h1:TgNEVx9hCyPGpdtCWA34olQYLkh3ok9ar7XfSsr8b6c= -k8s.io/code-generator v0.19.4/go.mod h1:moqLn7w0t9cMs4+5CQyxnfA/HV8MF6aAVENF+WZZhgk= -k8s.io/component-base v0.18.2/go.mod h1:kqLlMuhJNHQ9lz8Z7V5bxUUtjFZnrypArGl58gmDfUM= -k8s.io/component-base v0.18.6/go.mod h1:knSVsibPR5K6EW2XOjEHik6sdU5nCvKMrzMt2D4In14= -k8s.io/component-base v0.19.4/go.mod h1:ZzuSLlsWhajIDEkKF73j64Gz/5o0AgON08FgRbEPI70= -k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= -k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= +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.24.2 h1:g518dPU/L7VRLxWfcadQn2OnsiGWVOadTLpdnqgY2OI= +k8s.io/api v0.24.2/go.mod h1:AHqbSkTm6YrQ0ObxjO3Pmp/ubFF/KuM7jU+3khoBsOg= +k8s.io/apiextensions-apiserver v0.24.2 h1:/4NEQHKlEz1MlaK/wHT5KMKC9UKYz6NZz6JE6ov4G6k= +k8s.io/apiextensions-apiserver v0.24.2/go.mod h1:e5t2GMFVngUEHUd0wuCJzw8YDwZoqZfJiGOW6mm2hLQ= +k8s.io/apimachinery v0.24.2 h1:5QlH9SL2C8KMcrNJPor+LbXVTaZRReml7svPEh4OKDM= +k8s.io/apimachinery v0.24.2/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= +k8s.io/apiserver v0.24.2/go.mod h1:pSuKzr3zV+L+MWqsEo0kHHYwCo77AT5qXbFXP2jbvFI= +k8s.io/client-go v0.24.2 h1:CoXFSf8if+bLEbinDqN9ePIDGzcLtqhfd6jpfnwGOFA= +k8s.io/client-go v0.24.2/go.mod h1:zg4Xaoo+umDsfCWr4fCnmLEtQXyCNXCvJuSsglNcV30= +k8s.io/code-generator v0.24.2/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= +k8s.io/component-base v0.24.2/go.mod h1:ucHwW76dajvQ9B7+zecZAP3BVqvrHoOxm8olHEg0nmM= +k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= 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.4.0 h1:7+X0fUguPyrKEC4WjH8iGDg3laWgMo5tMnRTIGTTxGQ= -k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -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-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= -k8s.io/kube-openapi v0.0.0-20200923155610-8b5066479488/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= -k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd h1:sOHNzJIkytDF6qadMNKhhDRpc6ODik8lVC6nOur7B2c= -k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= -k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= -k8s.io/utils v0.0.0-20200603063816-c1c6865ac451/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20200729134348-d5654de09c73 h1:uJmqzgNWG7XyClnU/mLPBWwfKKF1K8Hf8whTseBgJcg= -k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/klog/v2 v2.70.1 h1:7aaoSdahviPmR+XkS7FyxlkkXs6tHISSG03RxleQAVQ= +k8s.io/klog/v2 v2.70.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= +k8s.io/kube-openapi v0.0.0-20220627174259-011e075b9cb8 h1:yEQKdMCjzAOvGeiTwG4hO/hNVNtDOuUFvMUZ0OlaIzs= +k8s.io/kube-openapi v0.0.0-20220627174259-011e075b9cb8/go.mod h1:mbJ+NSUoAhuR14N0S63bPkh8MGVSo3VYSGZtH/mfMe0= +k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc= +k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.9/go.mod h1:dzAXnQbTRyDlZPJX2SUPEqvnB+j7AJjtlox7PEwigU0= -sigs.k8s.io/container-object-storage-interface-api v0.0.0-20210507174303-fac7c5076c3d h1:4UhPuhdrRuoGmjbrpSBWPP+kT83zj9yBu66mXQLyuQA= -sigs.k8s.io/container-object-storage-interface-api v0.0.0-20210507174303-fac7c5076c3d/go.mod h1:WTzZGS4Q6MdQqDihJdMh2kCvqMx9Amhx0KIainA4lXQ= -sigs.k8s.io/container-object-storage-interface-spec v0.0.0-20210329232956-3bbacbbc9c19 h1:LrLrBCBqO7O/VjJtTrDSj3/f7hLSQaCIouLZFnHGxFg= -sigs.k8s.io/container-object-storage-interface-spec v0.0.0-20210329232956-3bbacbbc9c19/go.mod h1:kafkL5l/lTUrZXhVi/9p1GzpEE/ts29BkWkL3Ao33WU= -sigs.k8s.io/controller-runtime v0.6.3 h1:SBbr+inLPEKhvlJtrvDcwIpm+uhDvp63Bl72xYJtoOE= -sigs.k8s.io/controller-runtime v0.6.3/go.mod h1:WlZNXcM0++oyaQt4B7C2lEE5JYRs8vJUzRP4N4JpdAY= -sigs.k8s.io/controller-tools v0.4.1 h1:VkuV0MxlRPmRu5iTgBZU4UxUX2LiR99n3sdQGRxZF4w= -sigs.k8s.io/controller-tools v0.4.1/go.mod h1:G9rHdZMVlBDocIxGkK3jHLWqcTMNvveypYJwrvYKjWU= -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.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2 h1:YHQV7Dajm86OuqnIR6zAelnDWBRjo+YhYV9PmGrh1s8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw= +sigs.k8s.io/container-object-storage-interface-api v0.0.0-20220727205553-02ff3dd25b5e h1:FMupf2xGqbZaE89eeF0gUKbm82wzRpd2u9atmyuajIw= +sigs.k8s.io/container-object-storage-interface-api v0.0.0-20220727205553-02ff3dd25b5e/go.mod h1:YiB+i/UGkzqgODDhRG3u7jkbWkQcoUeLEJ7hwOT/2Qk= +sigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio= +sigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0= +sigs.k8s.io/controller-tools v0.9.2 h1:AkTE3QAdz9LS4iD3EJvHyYxBkg/g9fTbgiYsrcsFCcM= +sigs.k8s.io/controller-tools v0.9.2/go.mod h1:NUkn8FTV3Sad3wWpSK7dt/145qfuQ8CKJV6j4jHC5rM= +sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y= +sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= +sigs.k8s.io/structured-merge-diff/v4 v4.2.1 h1:bKCqE9GvQ5tiVHn5rfn1r+yao3aLQEaLzkkmAkf+A6Y= +sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= 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= diff --git a/pkg/bucketclaim/bucketclaim.go b/pkg/bucketclaim/bucketclaim.go index efe27d3b..9eb33c42 100644 --- a/pkg/bucketclaim/bucketclaim.go +++ b/pkg/bucketclaim/bucketclaim.go @@ -10,9 +10,9 @@ import ( "k8s.io/klog/v2" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - "sigs.k8s.io/container-object-storage-interface-api/apis/objectstorage.k8s.io/v1alpha1" - bucketclientset "sigs.k8s.io/container-object-storage-interface-api/clientset" - objectstoragev1alpha1 "sigs.k8s.io/container-object-storage-interface-api/clientset/typed/objectstorage.k8s.io/v1alpha1" + "sigs.k8s.io/container-object-storage-interface-api/apis/objectstorage/v1alpha1" + bucketclientset "sigs.k8s.io/container-object-storage-interface-api/client/clientset/versioned" + objectstoragev1alpha1 "sigs.k8s.io/container-object-storage-interface-api/client/clientset/versioned/typed/objectstorage/v1alpha1" "sigs.k8s.io/container-object-storage-interface-controller/pkg/util" ) @@ -33,7 +33,6 @@ func (b *bucketClaimListener) Add(ctx context.Context, bucketClaim *v1alpha1.Buc "name", bucketClaim.ObjectMeta.Name, "ns", bucketClaim.ObjectMeta.Namespace, "bucketClass", bucketClaim.Spec.BucketClassName, - "bucketPrefix", bucketClaim.Spec.BucketPrefix, ) err := b.provisionBucketClaimOperation(ctx, bucketClaim) @@ -71,10 +70,12 @@ func (b *bucketClaimListener) Update(ctx context.Context, old, new *v1alpha1.Buc "name", old.Name, "ns", old.Namespace) + bucketClaim := new.DeepCopy() + if !new.GetDeletionTimestamp().IsZero() { if controllerutil.ContainsFinalizer(bucketClaim, util.BucketClaimFinalizer) { bucketName := bucketClaim.Status.BucketName - err := b.Buckets().Delete(ctx, bucketName, metav1.DeleteOptions{}) + err := b.buckets().Delete(ctx, bucketName, metav1.DeleteOptions{}) if err != nil { return err } @@ -104,12 +105,13 @@ func (b *bucketClaimListener) provisionBucketClaimOperation(ctx context.Context, } var bucketName string + var err error if bucketClaim.Spec.ExistingBucketName != "" { bucketName = bucketClaim.Spec.ExistingBucketName - bucket, err = b.Buckets().Get(ctx, bucketName, metav1.GetOptions{}) + bucket, err := b.buckets().Get(ctx, bucketName, metav1.GetOptions{}) if err != nil { - klog.ErrorS(err, "Get Bucket with ExistingBucketName error", "name", existingBucketName) + klog.ErrorS(err, "Get Bucket with ExistingBucketName error", "name", bucketClaim.Spec.ExistingBucketName) return err } @@ -119,16 +121,20 @@ func (b *bucketClaimListener) provisionBucketClaimOperation(ctx context.Context, UID: bucketClaim.ObjectMeta.UID, } - _, err = b.Buckets().Update(ctx, bucket, metav1.UpdateOptions{}) + _, err = b.buckets().Update(ctx, bucket, metav1.UpdateOptions{}) if err != nil { return err } bucketClaim.Status.BucketName = bucketName - bucketClaim.Status.BucketAvailable = true + bucketClaim.Status.BucketReady = true } else { - bucketClassName := b.getBucketClass(bucketClaim) - bucketClass, err := b.BucketClasses().Get(ctx, bucketClassName, metav1.GetOptions{}) + bucketClassName := bucketClaim.Spec.BucketClassName + if bucketClassName == "" { + return util.ErrInvalidBucketClass + } + + bucketClass, err := b.bucketClasses().Get(ctx, bucketClassName, metav1.GetOptions{}) if err != nil { klog.ErrorS(err, "Get Bucketclass Error", "name", bucketClassName) return util.ErrInvalidBucketClass @@ -151,18 +157,21 @@ func (b *bucketClaimListener) provisionBucketClaimOperation(ctx context.Context, UID: bucketClaim.ObjectMeta.UID, } - bucket.Spec.Protocols = *bucketClaim.Spec.Protocol.DeepCopy() - bucket, err = b.Buckets().Create(ctx, bucket, metav1.CreateOptions{}) + protocolCopy := make([]v1alpha1.Protocol, len(bucketClaim.Spec.Protocols)) + copy(protocolCopy, bucketClaim.Spec.Protocols) + + bucket.Spec.Protocols = protocolCopy + bucket, err = b.buckets().Create(ctx, bucket, metav1.CreateOptions{}) if err != nil && !errors.IsAlreadyExists(err) { klog.ErrorS(err, "name", bucketName) return err } bucketClaim.Status.BucketName = bucketName - bucketClaim.Status.BucketAvailable = false + bucketClaim.Status.BucketReady = false } - _, err = b.BucketClaims(bucketClaim.ObjectMeta.Namespace).UpdateStatus(ctx, bucketClaim, metav1.UpdateOptions{}) + _, err = b.bucketClaims(bucketClaim.ObjectMeta.Namespace).UpdateStatus(ctx, bucketClaim, metav1.UpdateOptions{}) if err != nil { return err } @@ -170,7 +179,7 @@ func (b *bucketClaimListener) provisionBucketClaimOperation(ctx context.Context, // Add the finalizers so that bucketClaim is deleted // only after the associated bucket is deleted. controllerutil.AddFinalizer(bucketClaim, util.BucketClaimFinalizer) - _, err = b.BucketClaims(bucketClaim.ObjectMeta.Namespace).Update(ctx, bucketClaim, metav1.UpdateOptions{}) + _, err = b.bucketClaims(bucketClaim.ObjectMeta.Namespace).Update(ctx, bucketClaim, metav1.UpdateOptions{}) if err != nil { return err } @@ -178,22 +187,6 @@ func (b *bucketClaimListener) provisionBucketClaimOperation(ctx context.Context, return nil } -// getBucketClass returns BucketClassName. If no bucket class was in the request it returns empty -// TODO this methods can be more sophisticate to address bucketClass overrides using annotations just like SC. -func (b *bucketClaimListener) getBucketClass(bucketClaim *v1alpha1.BucketClaim) string { - if bucketClaim.Spec.BucketClassName != "" { - return bucketClaim.Spec.BucketClassName - } - - return "" -} - -// cloneTheBucket clones a bucket to a different namespace when a BR is for brownfield. -func (b *bucketClaimListener) cloneTheBucket(bucketClaim *v1alpha1.BucketClaim) error { - klog.InfoS("Cloning Bucket", "name", bucketClaim.Status.BucketName) - return util.ErrNotImplemented -} - func (b *bucketClaimListener) InitializeKubeClient(k kubeclientset.Interface) { b.kubeClient = k } @@ -202,21 +195,21 @@ func (b *bucketClaimListener) InitializeBucketClient(bc bucketclientset.Interfac b.bucketClient = bc } -func (b *bucketClaimListener) Buckets() objectstoragev1alpha1.BucketInterface { +func (b *bucketClaimListener) buckets() objectstoragev1alpha1.BucketInterface { if b.bucketClient != nil { return b.bucketClient.ObjectstorageV1alpha1().Buckets() } panic("uninitialized listener") } -func (b *bucketClaimListener) BucketClasses() objectstoragev1alpha1.BucketClassInterface { +func (b *bucketClaimListener) bucketClasses() objectstoragev1alpha1.BucketClassInterface { if b.bucketClient != nil { return b.bucketClient.ObjectstorageV1alpha1().BucketClasses() } panic("uninitialized listener") } -func (b *bucketClaimListener) BucketClaims(namespace string) objectstoragev1alpha1.BucketClaimInterface { +func (b *bucketClaimListener) bucketClaims(namespace string) objectstoragev1alpha1.BucketClaimInterface { if b.bucketClient != nil { return b.bucketClient.ObjectstorageV1alpha1().BucketClaims(namespace) } diff --git a/pkg/bucketclaim/bucketclaim_test.go b/pkg/bucketclaim/bucketclaim_test.go index 27084b7c..83cbcedb 100644 --- a/pkg/bucketclaim/bucketclaim_test.go +++ b/pkg/bucketclaim/bucketclaim_test.go @@ -7,8 +7,8 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes/fake" - types "sigs.k8s.io/container-object-storage-interface-api/apis/objectstorage.k8s.io/v1alpha1" - bucketclientset "sigs.k8s.io/container-object-storage-interface-api/clientset/fake" + types "sigs.k8s.io/container-object-storage-interface-api/apis/objectstorage/v1alpha1" + bucketclientset "sigs.k8s.io/container-object-storage-interface-api/client/clientset/versioned/fake" "sigs.k8s.io/container-object-storage-interface-controller/pkg/util" ) @@ -26,15 +26,9 @@ var goldClass = types.BucketClass{ ObjectMeta: metav1.ObjectMeta{ Name: "classgold", }, - AllowedNamespaces: []string{"default", "cosins"}, - Parameters: classGoldParameters, - Protocol: types.Protocol{ - S3: &types.S3Protocol{ - Region: "us-east-1", - SignatureVersion: "S3V4", - }, - }, - IsDefaultBucketClass: false, + DriverName: "sample.cosi.driver", + Parameters: classGoldParameters, + DeletionPolicy: types.DeletionPolicyDelete, } var bucketClaim1 = types.BucketClaim{ @@ -48,8 +42,8 @@ var bucketClaim1 = types.BucketClaim{ UID: "12345-67890", }, Spec: types.BucketClaimSpec{ - BucketPrefix: "cosi", BucketClassName: "classgold", + Protocols: []types.Protocol{types.ProtocolAzure, types.ProtocolS3}, }, } @@ -64,8 +58,8 @@ var bucketClaim2 = types.BucketClaim{ UID: "abcde-fghijk", }, Spec: types.BucketClaimSpec{ - BucketPrefix: "cosi", BucketClassName: "classgold", + Protocols: []types.Protocol{types.ProtocolAzure, types.GCS}, }, } diff --git a/pkg/util/const.go b/pkg/util/const.go index 5636696d..3557ac07 100644 --- a/pkg/util/const.go +++ b/pkg/util/const.go @@ -10,14 +10,7 @@ const ( var ( // Error codes that the central controller will return - ErrBucketAlreadyExists = errors.New("A bucket already existing that matches the bucket request") - ErrInvalidBucketClass = errors.New("Cannot find bucket class with the name specified in the bucket request") - ErrBucketAccessAlreadyExists = errors.New("A bucket access already existing that matches the bucket access request") - ErrInvalidBucketAccessClass = errors.New("Cannot find bucket access class with the name specified in the bucket access request") - ErrInvalidBucketRequest = errors.New("Invalid bucket request specified in the bucket access request") - ErrInvalidBucketAccessRequest = errors.New("Invalid bucket access request specified") - ErrWaitForBucketProvisioning = errors.New("Bucket instance specified in the bucket request is not available to provision bucket access") - ErrBCUnavailable = errors.New("BucketClass is not available") + ErrBucketAlreadyExists = errors.New("A bucket already existing that matches the bucket claim") + ErrInvalidBucketClass = errors.New("Cannot find bucket class with the name specified in the bucket claim") ErrNotImplemented = errors.New("Operation Not Implemented") - ErrNilConfigMap = errors.New("ConfigMap cannot be nil") -) \ No newline at end of file +) diff --git a/pkg/util/util.go b/pkg/util/util.go index 27fa9dc3..cdbfe18b 100644 --- a/pkg/util/util.go +++ b/pkg/util/util.go @@ -2,34 +2,14 @@ package util import ( "context" - "encoding/json" - "fmt" - "golang.org/x/time/rate" - "os" "reflect" - "strings" "time" - v1 "k8s.io/api/core/v1" - apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" - apiextensions "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/uuid" - kubeclientset "k8s.io/client-go/kubernetes" - "k8s.io/client-go/rest" - "k8s.io/client-go/tools/clientcmd" - "k8s.io/client-go/util/workqueue" - types "sigs.k8s.io/container-object-storage-interface-api/apis/objectstorage.k8s.io/v1alpha1" - bucketclientset "sigs.k8s.io/container-object-storage-interface-api/clientset" - "sigs.k8s.io/container-object-storage-interface-api/controller" - - "sigs.k8s.io/controller-tools/pkg/crd" - crdmarkers "sigs.k8s.io/controller-tools/pkg/crd/markers" - "sigs.k8s.io/controller-tools/pkg/genall" - "sigs.k8s.io/controller-tools/pkg/loader" - "sigs.k8s.io/controller-tools/pkg/markers" + types "sigs.k8s.io/container-object-storage-interface-api/apis/objectstorage/v1alpha1" + bucketclientset "sigs.k8s.io/container-object-storage-interface-api/client/clientset/versioned" "k8s.io/klog/v2" ) @@ -45,86 +25,6 @@ func CopySS(m map[string]string) map[string]string { return copy } -func CopyStrings(s []string) []string { - if s == nil { - return nil - } - c := make([]string, len(s)) - copy(c, s) - return c -} - -func GetUUID() string { - return string(uuid.NewUUID()) -} - -func ReadConfigData(kubeClient kubeclientset.Interface, configMapRef *v1.ObjectReference) (string, error) { - if configMapRef == nil { - return "", ErrNilConfigMap - } - configMap, err := kubeClient.CoreV1().ConfigMaps(configMapRef.Namespace).Get(context.TODO(), configMapRef.Name, metav1.GetOptions{}) - if err != nil { - return "", err - } - payload := make(map[string]string) - for name, data := range configMap.Data { - payload[name] = data - } - cData, err := json.Marshal(payload) - if err != nil { - return "", err - } - return string(cData), nil -} - -// SetupTest is utility function to create clients and controller -// This is used by bucket request and bucket access request unit tests -func SetupTest(ctx context.Context) (bucketclientset.Interface, kubeclientset.Interface, *controller.ObjectStorageController) { - - // Initialize the clients - config, err := func() (*rest.Config, error) { - kubeConfig := os.Getenv("KUBECONFIG") - if kubeConfig != "" { - return clientcmd.BuildConfigFromFlags("", kubeConfig) - } - return rest.InClusterConfig() - }() - if err != nil { - klog.Fatalf("Failed to create clients: %v", err) - } - - kubeClient, err := kubeclientset.NewForConfig(config) - if err != nil { - klog.Fatalf("Failed to create Kubernetes client: %v", err) - } - client, err := bucketclientset.NewForConfig(config) - if err != nil { - klog.Fatalf("Failed to create ObjectStorage client: %v", err) - } - - crdClientset, err := apiextensions.NewForConfig(config) - if err != nil { - klog.Fatalf("Failed to create CRD client: %v", err) - } - - err = RegisterCRDs(ctx, crdClientset.CustomResourceDefinitions()) - if err != nil { - klog.Fatalf("Failed to register CRDs: %v", err) - } - - rateLimit := workqueue.NewMaxOfRateLimiter( - workqueue.NewItemExponentialFailureRateLimiter(100*time.Millisecond, 600*time.Second), - &workqueue.BucketRateLimiter{Limiter: rate.NewLimiter(rate.Limit(10), 100)}, - ) - ctrl, err := controller.NewObjectStorageControllerWithClientset("controller-manager", "leader-lock", 40, rateLimit, kubeClient, client) - if err != nil { - klog.Fatalf("Failed to create ObjectStorage Controller: %v", err) - } - - go ctrl.Run(ctx) - return client, kubeClient, ctrl -} - // GetBuckets will wait and fetch expected number of buckets created by the test // This is used by bucket request unit tests func GetBuckets(ctx context.Context, client bucketclientset.Interface, numExpected int) *types.BucketList { @@ -148,52 +48,16 @@ func GetBuckets(ctx context.Context, client bucketclientset.Interface, numExpect // Validates the content of the bucket against bucket request and backet class // This is used by bucket request unit tests -func ValidateBucket(bucket types.Bucket, bucketrequest types.BucketRequest, bucketclass types.BucketClass) bool { - if strings.HasPrefix(bucket.Name, bucketrequest.Spec.BucketPrefix) && - bucketrequest.Status.BucketName == bucket.Name && - bucket.Spec.BucketClassName == bucketrequest.Spec.BucketClassName && - bucket.Spec.BucketRequest.Name == bucketrequest.Name && - bucket.Spec.BucketRequest.Namespace == bucketrequest.Namespace && - bucket.Spec.BucketRequest.UID == bucketrequest.ObjectMeta.UID && - bucket.Spec.BucketClassName == bucketclass.Name && - reflect.DeepEqual(bucket.Spec.Parameters, bucketclass.Parameters) && - bucket.Spec.Provisioner == bucketclass.Provisioner && - bucket.Spec.DeletionPolicy == bucketclass.DeletionPolicy { - return true - } - return false -} - -// Validates the content of the bucket against bucket request and backet class -// This is used by bucket access request unit tests -func GetBucketAccesses(ctx context.Context, client bucketclientset.Interface, numExpected int) *types.BucketAccessList { - bucketaccessList, _ := client.ObjectstorageV1alpha1().BucketAccesses().List(ctx, metav1.ListOptions{}) - if len(bucketaccessList.Items) > 0 { - return bucketaccessList - } - numtimes := 0 - for numtimes < 10 { - bucketaccessList, _ = client.ObjectstorageV1alpha1().BucketAccesses().List(ctx, metav1.ListOptions{}) - if len(bucketaccessList.Items) >= numExpected { - return bucketaccessList - } - numtimes++ - <-time.After(time.Duration(numtimes) * time.Second) - } - return &types.BucketAccessList{} -} - -// Validates the content of the bucket access against bucket access request and backet access class -// This is used by bucket access request unit tests -func ValidateBucketAccess(bucketaccess types.BucketAccess, bucketaccessrequest types.BucketAccessRequest, bucketaccessclass types.BucketAccessClass) bool { - if bucketaccess.Spec.BucketName != "" && - bucketaccessrequest.Status.BucketAccessName == bucketaccess.Name && - bucketaccess.Spec.BucketAccessRequest.UID == bucketaccessrequest.UID && - bucketaccess.Spec.ServiceAccount.Name == bucketaccessrequest.Spec.ServiceAccountName && - bucketaccess.Spec.PolicyActionsConfigMapData != "" { - return true - } - return false +func ValidateBucket(bucket types.Bucket, bucketClaim types.BucketClaim, bucketClass types.BucketClass) bool { + return (bucketClaim.Status.BucketName == bucket.ObjectMeta.Name && + bucket.Spec.BucketClassName == bucketClaim.Spec.BucketClassName && + bucket.Spec.BucketClaim.Name == bucketClaim.ObjectMeta.Name && + bucket.Spec.BucketClaim.Namespace == bucketClaim.ObjectMeta.Namespace && + bucket.Spec.BucketClaim.UID == bucketClaim.ObjectMeta.UID && + bucket.Spec.BucketClassName == bucketClass.ObjectMeta.Name && + reflect.DeepEqual(bucket.Spec.Parameters, bucketClass.Parameters) && + bucket.Spec.DriverName == bucketClass.DriverName && + bucket.Spec.DeletionPolicy == bucketClass.DeletionPolicy) } // Deletes any bucket api object or an array of bucket or bucket access objects. @@ -203,125 +67,36 @@ func DeleteObjects(ctx context.Context, client bucketclientset.Interface, objs . switch t := obj.(type) { case types.Bucket: client.ObjectstorageV1alpha1().Buckets().Delete(ctx, obj.(types.Bucket).Name, metav1.DeleteOptions{}) - case types.BucketRequest: - client.ObjectstorageV1alpha1().BucketRequests(obj.(types.BucketRequest).Namespace).Delete(ctx, obj.(types.BucketRequest).Name, metav1.DeleteOptions{}) + case types.BucketClaim: + client.ObjectstorageV1alpha1().BucketClaims(obj.(types.BucketClaim).Namespace).Delete(ctx, obj.(types.BucketClaim).Name, metav1.DeleteOptions{}) case types.BucketClass: client.ObjectstorageV1alpha1().BucketClasses().Delete(ctx, obj.(types.BucketClass).Name, metav1.DeleteOptions{}) case []types.Bucket: for _, a := range obj.([]types.Bucket) { DeleteObjects(ctx, client, a) } - case types.BucketAccess: - client.ObjectstorageV1alpha1().BucketAccesses().Delete(ctx, obj.(types.BucketAccess).Name, metav1.DeleteOptions{}) - case types.BucketAccessRequest: - client.ObjectstorageV1alpha1().BucketAccessRequests(obj.(types.BucketAccessRequest).Namespace).Delete(ctx, obj.(types.BucketAccessRequest).Name, metav1.DeleteOptions{}) - case types.BucketAccessClass: - client.ObjectstorageV1alpha1().BucketAccessClasses().Delete(ctx, obj.(types.BucketAccessClass).Name, metav1.DeleteOptions{}) - case []types.BucketAccess: - for _, a := range obj.([]types.BucketAccess) { - DeleteObjects(ctx, client, a) - } default: klog.Errorf("Unknown Obj of type %v", t) } } } - -// getCRDClient returns CRD interface for managing CRD objects programmatically -// Used by unit tests and functional tests -func getCRDClient() (apiextensions.CustomResourceDefinitionInterface, error) { - config, err := func() (*rest.Config, error) { - kubeConfig := os.Getenv("KUBECONFIG") - - if kubeConfig != "" { - return clientcmd.BuildConfigFromFlags("", kubeConfig) - } - return rest.InClusterConfig() - }() - - crdClientset, err := apiextensions.NewForConfig(config) - if err != nil { - klog.Fatalf("could not initialize crd client: %v", err) - return nil, err +// CreateBucketClaim creates a bucket claim object or return an existing bucket request object +// This is used by bucket claim unit tests +func CreateBucketClaim(ctx context.Context, client bucketclientset.Interface, bc *types.BucketClaim) (*types.BucketClaim, error) { + bc, err := client.ObjectstorageV1alpha1().BucketClaims(bc.Namespace).Create(ctx, bc, metav1.CreateOptions{}) + if (err != nil) && apierrors.IsAlreadyExists(err) { + bc, err = client.ObjectstorageV1alpha1().BucketClaims(bc.Namespace).Get(ctx, bc.Name, metav1.GetOptions{}) } - return crdClientset.CustomResourceDefinitions(), err + return bc, err } -// RegisterCRDs registers the CRD so that unit tests can use the CRD to perform bucket API testing -func RegisterCRDs(ctx context.Context, client apiextensions.CustomResourceDefinitionInterface) error { - var err error - if client == nil { - client, err = getCRDClient() - } - if err != nil { - return err - } - - roots, err := loader.LoadRoots("sigs.k8s.io/container-object-storage-interface-api/apis/objectstorage.k8s.io/v1alpha1") - if err != nil { - return err - } - - defn := markers.Must(markers.MakeDefinition("crd", markers.DescribesPackage, crd.Generator{})) - optionsRegistry := &markers.Registry{} - if err := optionsRegistry.Register(defn); err != nil { - return err - } - - if err := genall.RegisterOptionsMarkers(optionsRegistry); err != nil { - return err - } - - if err := crdmarkers.Register(optionsRegistry); err != nil { - return err - } - - parser := &crd.Parser{ - Collector: &markers.Collector{ - Registry: optionsRegistry, - }, - Checker: &loader.TypeChecker{}, - } - crd.AddKnownTypes(parser) - for _, root := range roots { - parser.NeedPackage(root) - } - - metav1Pkg := crd.FindMetav1(roots) - if metav1Pkg == nil { - // no objects in the roots, since nothing imported metav1 - return fmt.Errorf("no objects found in all roots") - } - - // TODO: allow selecting a specific object - kubeKinds := crd.FindKubeKinds(parser, metav1Pkg) - if len(kubeKinds) == 0 { - // no objects in the roots - return fmt.Errorf("no kube kind-objects found in all roots") - } - - //crdClient := utils.GetCRDClient() - crdClient := client - - for groupKind := range kubeKinds { - parser.NeedCRDFor(groupKind, func() *int { - i := 256 - return &i - }()) - crdRaw := parser.CustomResourceDefinitions[groupKind] - klog.Infof("creating CRD: %v", groupKind) - if crdRaw.ObjectMeta.Annotations == nil { - crdRaw.ObjectMeta.Annotations = map[string]string{} - } - if _, ok := crdRaw.ObjectMeta.Annotations[apiextensionsv1.KubeAPIApprovedAnnotation]; !ok { - crdRaw.ObjectMeta.Annotations[apiextensionsv1.KubeAPIApprovedAnnotation] = "https://github.com/kubernetes/kubernetes/pull/78458" - } - if _, err := crdClient.Create(ctx, &crdRaw, metav1.CreateOptions{}); err != nil { - if !apierrors.IsAlreadyExists(err) { - return err - } - } +// CreateBucketClass creates a bucket class object or return an existing bucket class object +// This is used by bucket claim unit tests +func CreateBucketClass(ctx context.Context, client bucketclientset.Interface, bc *types.BucketClass) (*types.BucketClass, error) { + bc, err := client.ObjectstorageV1alpha1().BucketClasses().Create(ctx, bc, metav1.CreateOptions{}) + if (err != nil) && apierrors.IsAlreadyExists(err) { + bc, err = client.ObjectstorageV1alpha1().BucketClasses().Get(ctx, bc.Name, metav1.GetOptions{}) } - return nil + return bc, err } From 15d318d32e92d2c79f552cc165aaa0e7ebaa41a9 Mon Sep 17 00:00:00 2001 From: Akash Mukhopadhyay Date: Fri, 5 Aug 2022 09:48:25 -0700 Subject: [PATCH 183/242] Compilation fix --- pkg/bucketclaim/bucketclaim_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/bucketclaim/bucketclaim_test.go b/pkg/bucketclaim/bucketclaim_test.go index 83cbcedb..318be9f6 100644 --- a/pkg/bucketclaim/bucketclaim_test.go +++ b/pkg/bucketclaim/bucketclaim_test.go @@ -59,7 +59,7 @@ var bucketClaim2 = types.BucketClaim{ }, Spec: types.BucketClaimSpec{ BucketClassName: "classgold", - Protocols: []types.Protocol{types.ProtocolAzure, types.GCS}, + Protocols: []types.Protocol{types.ProtocolAzure, types.ProtocolGCP}, }, } From 6f0d53f9cba94c5dd7fdf46fb9563292d4d5e106 Mon Sep 17 00:00:00 2001 From: Akash Mukhopadhyay Date: Fri, 5 Aug 2022 13:22:27 -0700 Subject: [PATCH 184/242] Fixing fo dfiles and gofmt --- go.mod | 9 +- go.sum | 289 ---------------------------- pkg/bucketclaim/bucketclaim_test.go | 8 +- pkg/util/const.go | 6 +- 4 files changed, 8 insertions(+), 304 deletions(-) diff --git a/go.mod b/go.mod index 4470f16f..1cbf4915 100644 --- a/go.mod +++ b/go.mod @@ -5,15 +5,12 @@ go 1.18 require ( github.com/spf13/cobra v1.4.0 github.com/spf13/viper v1.12.0 - golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 k8s.io/api v0.24.2 - k8s.io/apiextensions-apiserver v0.24.2 k8s.io/apimachinery v0.24.2 k8s.io/client-go v0.24.2 k8s.io/klog/v2 v2.70.1 sigs.k8s.io/container-object-storage-interface-api v0.0.0-20220727205553-02ff3dd25b5e sigs.k8s.io/controller-runtime v0.12.3 - sigs.k8s.io/controller-tools v0.9.2 ) require ( @@ -25,14 +22,12 @@ require ( github.com/go-openapi/jsonpointer v0.19.5 // indirect github.com/go-openapi/jsonreference v0.20.0 // indirect github.com/go-openapi/swag v0.19.15 // indirect - github.com/gobuffalo/flect v0.2.5 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.2 // indirect github.com/google/gnostic v0.5.7-v3refs // indirect github.com/google/go-cmp v0.5.8 // indirect github.com/google/gofuzz v1.1.0 // indirect - github.com/google/uuid v1.1.2 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/imdario/mergo v0.3.12 // indirect github.com/inconshreveable/mousetrap v1.0.0 // indirect @@ -53,14 +48,12 @@ require ( github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/subosito/gotenv v1.3.0 // indirect - golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 // indirect golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2 // indirect golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5 // indirect golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a // indirect golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect golang.org/x/text v0.3.7 // indirect - golang.org/x/tools v0.1.10 // indirect - golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df // indirect + golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/protobuf v1.28.0 // indirect gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b // indirect diff --git a/go.sum b/go.sum index bab02282..3da7cc83 100644 --- a/go.sum +++ b/go.sum @@ -28,7 +28,6 @@ cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4g cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= 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/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= 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= @@ -40,7 +39,6 @@ cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RX cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= @@ -51,39 +49,13 @@ github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBp 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/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/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -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/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -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-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -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-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/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= 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 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= -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 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= 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= @@ -91,28 +63,12 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk 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/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -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/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -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-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -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.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= 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= @@ -123,13 +79,9 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= 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/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= 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/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= @@ -138,23 +90,15 @@ github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4 github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= 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 v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= 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-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-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v1.2.0 h1:QK40JKJyMdUDz+h+xvCsru/bJhvG0UxvePV0ufL/AcE= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/zapr v1.2.0 h1:n4JnPI1T3Qq1SFEi/F8rwLrZERp2bso19PJZDB9dayk= -github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= @@ -166,18 +110,9 @@ github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM= github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/gobuffalo/flect v0.2.5 h1:H6vvsv2an0lalEaCDRThvtBfmg44W/QHXBCYUXf/6S4= -github.com/gobuffalo/flect v0.2.5/go.mod h1:1ZyCLIbg0YD7sDkzvFdPoOydPtD8y9JQnrOROolUcM8= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -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/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -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= @@ -212,8 +147,6 @@ github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu 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/cel-go v0.10.1/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w= -github.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA= 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= @@ -253,36 +186,13 @@ github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ 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/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/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 v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -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 v1.0.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-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 v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -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.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/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/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= @@ -291,29 +201,16 @@ github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/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 v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -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/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/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.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.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= @@ -321,50 +218,31 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= 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.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -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 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -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/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-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -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/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.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -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-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/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/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= 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.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= @@ -375,94 +253,40 @@ github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGV github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml/v2 v2.0.1 h1:8e3L2cCQzLFi2CR4g7vGFuFxX7Jl1kKX8gW+iV0GUKU= github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/pkg/errors v0.8.0/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/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -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.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 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/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 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -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.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 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/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.1.3/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 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= -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/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -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/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -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/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/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= github.com/spf13/cobra v1.4.0 h1:y+wJpx64xcgO1V+RcnwW0LEHxTKRi2ZDPSBjWnrg88Q= github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag 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.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ= github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= 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/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= @@ -471,30 +295,13 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/subosito/gotenv v1.3.0 h1:mjC+YW8QpAdXibNi+vNWgzmgBH4+5l5dCXv8cNysBLI= github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs= -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/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= 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= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -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.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.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -502,40 +309,16 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -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 v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= -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/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -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= go.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/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-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -561,7 +344,6 @@ golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRu golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -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/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -573,15 +355,9 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 h1:kQgndtyPBW/JIYERgdxfwMYh3AVStj88WQTlNDi2a+o= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= 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-20181023162649-9b4f9f5ad519/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-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -589,7 +365,6 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn 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-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-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= @@ -612,16 +387,12 @@ golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81R 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-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-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210825183410-e898025ed96a/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-20220520000938-2e3eb7b945c2 h1:NWy5+hlRbC7HK+PmcXVUmW1IMyFce7to56IUvhUFm7Y= @@ -637,7 +408,6 @@ 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-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5 h1:OSnWWcOd/CtWQC2cYSBgbTSJv3ciqd8r54ySIW2y3RE= golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= @@ -652,17 +422,11 @@ 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/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-20190215142949-d0b11bdaac8a/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-20190412213103-97732733099d/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-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -671,11 +435,9 @@ golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/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-20191026070338-33540a1f6037/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-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-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -689,34 +451,24 @@ golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7w 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-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-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= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/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-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k= @@ -737,30 +489,23 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= 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-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 h1:vVKdlvoWBphwdxWKrFZEuM0kGgGLxUOYcY4U/2Vjg44= golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/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-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/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-20190328211700-ab21143f2384/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-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/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-20190816200558-6889da9d5479/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-20191012152004-8de300cfc20a/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-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-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -796,17 +541,11 @@ golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -golang.org/x/tools v0.1.10 h1:QjFRCZxdOhBJ/UNgnBZLbNV13DlbnK0quyivTnXJM20= -golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= 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= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df h1:5Pf6pFKu98ODmgnpvkJ3kFUOQGGLIzLIkbzUHp47618= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= @@ -858,10 +597,8 @@ google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfG 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-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-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= @@ -870,7 +607,6 @@ google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/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-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201102152239-715cce707fb0/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-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -882,9 +618,6 @@ 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-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -898,15 +631,11 @@ 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.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= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= 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.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= 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= @@ -922,7 +651,6 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -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-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -933,20 +661,13 @@ 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/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.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.66.4 h1:SsAcf+mM7mRZo2nJNGt8mZCjG8ZRaNGMURJw7BsIST4= gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -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/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= 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/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.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= @@ -956,8 +677,6 @@ gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0 h1:hjy8E9ON/egN1tAYqKb61G10WtihqetD4sz2H+8nIeA= gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= 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= @@ -968,16 +687,11 @@ honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 k8s.io/api v0.24.2 h1:g518dPU/L7VRLxWfcadQn2OnsiGWVOadTLpdnqgY2OI= k8s.io/api v0.24.2/go.mod h1:AHqbSkTm6YrQ0ObxjO3Pmp/ubFF/KuM7jU+3khoBsOg= k8s.io/apiextensions-apiserver v0.24.2 h1:/4NEQHKlEz1MlaK/wHT5KMKC9UKYz6NZz6JE6ov4G6k= -k8s.io/apiextensions-apiserver v0.24.2/go.mod h1:e5t2GMFVngUEHUd0wuCJzw8YDwZoqZfJiGOW6mm2hLQ= k8s.io/apimachinery v0.24.2 h1:5QlH9SL2C8KMcrNJPor+LbXVTaZRReml7svPEh4OKDM= k8s.io/apimachinery v0.24.2/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apiserver v0.24.2/go.mod h1:pSuKzr3zV+L+MWqsEo0kHHYwCo77AT5qXbFXP2jbvFI= k8s.io/client-go v0.24.2 h1:CoXFSf8if+bLEbinDqN9ePIDGzcLtqhfd6jpfnwGOFA= k8s.io/client-go v0.24.2/go.mod h1:zg4Xaoo+umDsfCWr4fCnmLEtQXyCNXCvJuSsglNcV30= -k8s.io/code-generator v0.24.2/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/component-base v0.24.2/go.mod h1:ucHwW76dajvQ9B7+zecZAP3BVqvrHoOxm8olHEg0nmM= k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= 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.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= @@ -992,13 +706,10 @@ k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/ rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw= sigs.k8s.io/container-object-storage-interface-api v0.0.0-20220727205553-02ff3dd25b5e h1:FMupf2xGqbZaE89eeF0gUKbm82wzRpd2u9atmyuajIw= sigs.k8s.io/container-object-storage-interface-api v0.0.0-20220727205553-02ff3dd25b5e/go.mod h1:YiB+i/UGkzqgODDhRG3u7jkbWkQcoUeLEJ7hwOT/2Qk= sigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio= sigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0= -sigs.k8s.io/controller-tools v0.9.2 h1:AkTE3QAdz9LS4iD3EJvHyYxBkg/g9fTbgiYsrcsFCcM= -sigs.k8s.io/controller-tools v0.9.2/go.mod h1:NUkn8FTV3Sad3wWpSK7dt/145qfuQ8CKJV6j4jHC5rM= sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y= sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= diff --git a/pkg/bucketclaim/bucketclaim_test.go b/pkg/bucketclaim/bucketclaim_test.go index 318be9f6..f377a78d 100644 --- a/pkg/bucketclaim/bucketclaim_test.go +++ b/pkg/bucketclaim/bucketclaim_test.go @@ -26,8 +26,8 @@ var goldClass = types.BucketClass{ ObjectMeta: metav1.ObjectMeta{ Name: "classgold", }, - DriverName: "sample.cosi.driver", - Parameters: classGoldParameters, + DriverName: "sample.cosi.driver", + Parameters: classGoldParameters, DeletionPolicy: types.DeletionPolicyDelete, } @@ -43,7 +43,7 @@ var bucketClaim1 = types.BucketClaim{ }, Spec: types.BucketClaimSpec{ BucketClassName: "classgold", - Protocols: []types.Protocol{types.ProtocolAzure, types.ProtocolS3}, + Protocols: []types.Protocol{types.ProtocolAzure, types.ProtocolS3}, }, } @@ -59,7 +59,7 @@ var bucketClaim2 = types.BucketClaim{ }, Spec: types.BucketClaimSpec{ BucketClassName: "classgold", - Protocols: []types.Protocol{types.ProtocolAzure, types.ProtocolGCP}, + Protocols: []types.Protocol{types.ProtocolAzure, types.ProtocolGCP}, }, } diff --git a/pkg/util/const.go b/pkg/util/const.go index 3557ac07..0aa9bf7d 100644 --- a/pkg/util/const.go +++ b/pkg/util/const.go @@ -10,7 +10,7 @@ const ( var ( // Error codes that the central controller will return - ErrBucketAlreadyExists = errors.New("A bucket already existing that matches the bucket claim") - ErrInvalidBucketClass = errors.New("Cannot find bucket class with the name specified in the bucket claim") - ErrNotImplemented = errors.New("Operation Not Implemented") + ErrBucketAlreadyExists = errors.New("A bucket already existing that matches the bucket claim") + ErrInvalidBucketClass = errors.New("Cannot find bucket class with the name specified in the bucket claim") + ErrNotImplemented = errors.New("Operation Not Implemented") ) From 859524127432ca81bebf988a7311c82acb822948 Mon Sep 17 00:00:00 2001 From: Akash Mukhopadhyay Date: Mon, 8 Aug 2022 01:48:52 -0700 Subject: [PATCH 185/242] Fixing the updated api version and rbac rules --- go.mod | 2 +- go.sum | 4 ++-- resources/rbac.yaml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 1cbf4915..fd0cdf1a 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( k8s.io/apimachinery v0.24.2 k8s.io/client-go v0.24.2 k8s.io/klog/v2 v2.70.1 - sigs.k8s.io/container-object-storage-interface-api v0.0.0-20220727205553-02ff3dd25b5e + sigs.k8s.io/container-object-storage-interface-api v0.0.0-20220806044417-5d7517114883 sigs.k8s.io/controller-runtime v0.12.3 ) diff --git a/go.sum b/go.sum index 3da7cc83..65ae442c 100644 --- a/go.sum +++ b/go.sum @@ -706,8 +706,8 @@ k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/ rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= 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/container-object-storage-interface-api v0.0.0-20220727205553-02ff3dd25b5e h1:FMupf2xGqbZaE89eeF0gUKbm82wzRpd2u9atmyuajIw= -sigs.k8s.io/container-object-storage-interface-api v0.0.0-20220727205553-02ff3dd25b5e/go.mod h1:YiB+i/UGkzqgODDhRG3u7jkbWkQcoUeLEJ7hwOT/2Qk= +sigs.k8s.io/container-object-storage-interface-api v0.0.0-20220806044417-5d7517114883 h1:CtqK7l2m9Atw8L5daJdsXvVgxxvQkRBbJbUz7NiadD8= +sigs.k8s.io/container-object-storage-interface-api v0.0.0-20220806044417-5d7517114883/go.mod h1:YiB+i/UGkzqgODDhRG3u7jkbWkQcoUeLEJ7hwOT/2Qk= sigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio= sigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0= sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y= diff --git a/resources/rbac.yaml b/resources/rbac.yaml index 1005c358..8123e1aa 100644 --- a/resources/rbac.yaml +++ b/resources/rbac.yaml @@ -11,10 +11,10 @@ metadata: app.kubernetes.io/name: container-object-storage-interface-controller rules: - apiGroups: ["objectstorage.k8s.io"] - resources: ["bucketrequests", "bucketaccessrequests", "bucketrequests/status", "bucketaccessrequests/status"] + resources: ["bucketclaims", "bucketaccesses", "bucketclaims/status", "bucketaccesses/status"] verbs: ["get", "list", "watch", "update"] - apiGroups: ["objectstorage.k8s.io"] - resources: ["buckets", "bucketaccesses"] + resources: ["buckets"] verbs: ["get", "list", "watch", "update", "create", "delete"] - apiGroups: ["objectstorage.k8s.io"] resources: ["bucketclasses","bucketaccessclasses"] From 5ad03d43750d09603810c9491dd0b6de16f87261 Mon Sep 17 00:00:00 2001 From: Akash Mukhopadhyay Date: Thu, 11 Aug 2022 11:03:09 -0700 Subject: [PATCH 186/242] Updating go version in travis.yaml --- release-tools/travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release-tools/travis.yml b/release-tools/travis.yml index bfd7647b..f12d7ee4 100644 --- a/release-tools/travis.yml +++ b/release-tools/travis.yml @@ -6,7 +6,7 @@ git: depth: false matrix: include: - - go: 1.13.3 + - go: 1.18.4 before_script: - mkdir -p bin - wget https://github.com/golang/dep/releases/download/v0.5.1/dep-linux-amd64 -O bin/dep From e919add2c66151ab4a51a83168be59490fd652c3 Mon Sep 17 00:00:00 2001 From: Akash Mukhopadhyay Date: Thu, 11 Aug 2022 11:06:17 -0700 Subject: [PATCH 187/242] Fixing the text in deployment guide --- docs/deployment-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/deployment-guide.md b/docs/deployment-guide.md index 7373d6ab..12682051 100644 --- a/docs/deployment-guide.md +++ b/docs/deployment-guide.md @@ -1,4 +1,4 @@ -# Deploying Container Object Storage Interface (COSI) Controller On Kubernetes +# Deployment guide for Container Object Storage Interface (COSI) Controller On Kubernetes This document describes steps for Kubernetes administrators to setup Container Object Storage Interface Controller (COSI) Controller onto a Kubernetes cluster. From 09c54a61f05e52540a18e24c68f3afe2121642b9 Mon Sep 17 00:00:00 2001 From: wlan0 Date: Thu, 11 Aug 2022 11:28:01 -0700 Subject: [PATCH 188/242] update kubernetes version to v1.24.0 --- release-tools/prow.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/release-tools/prow.sh b/release-tools/prow.sh index bc14bf87..5e9968c9 100755 --- a/release-tools/prow.sh +++ b/release-tools/prow.sh @@ -127,7 +127,7 @@ configvar COSI_PROW_BUILD_JOB true "building code in repo enabled" # use the same settings as for "latest" Kubernetes. This works # as long as there are no breaking changes in Kubernetes, like # deprecating or changing the implementation of an alpha feature. -configvar COSI_PROW_KUBERNETES_VERSION 1.17.0 "Kubernetes" +configvar COSI_PROW_KUBERNETES_VERSION 1.24.0 "Kubernetes" # This is a hack to workaround the issue that each version # of kind currently only supports specific patch versions of @@ -137,7 +137,7 @@ configvar COSI_PROW_KUBERNETES_VERSION 1.17.0 "Kubernetes" # # If the version is prefixed with "release-", then nothing # is overridden. -override_k8s_version "1.19.3" +override_k8s_version "1.24.0" # COSI_PROW_KUBERNETES_VERSION reduced to first two version numbers and # with underscore (1_13 instead of 1.13.3) and in uppercase (LATEST From cd8fb0485c664c64b8dfcfa8acd925932462bfbd Mon Sep 17 00:00:00 2001 From: Akash Mukhopadhyay Date: Thu, 11 Aug 2022 11:30:51 -0700 Subject: [PATCH 189/242] Doc changes --- docs/deployment-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/deployment-guide.md b/docs/deployment-guide.md index 12682051..32c3e575 100644 --- a/docs/deployment-guide.md +++ b/docs/deployment-guide.md @@ -1,4 +1,4 @@ -# Deployment guide for Container Object Storage Interface (COSI) Controller On Kubernetes +# Deployment guide This document describes steps for Kubernetes administrators to setup Container Object Storage Interface Controller (COSI) Controller onto a Kubernetes cluster. From 7d0998e1fcd88caab5b579dc1920017e662e925a Mon Sep 17 00:00:00 2001 From: Akash Mukhopadhyay Date: Thu, 11 Aug 2022 11:37:15 -0700 Subject: [PATCH 190/242] Updating the k8s-testimages --- cloudbuild.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index bd575de7..fa8784be 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -6,9 +6,9 @@ substitutions: options: substitution_option: ALLOW_LOOSE steps: -- name: "gcr.io/k8s-testimages/gcb-docker-gcloud:v20200824-5d057db" +- name: "gcr.io/k8s-testimages/gcb-docker-gcloud:v20220617-174ad91c3a" entrypoint: make args: ['build'] -- name: "gcr.io/k8s-testimages/gcb-docker-gcloud:v20200824-5d057db" +- name: "gcr.io/k8s-testimages/gcb-docker-gcloud:v20220617-174ad91c3a" entrypoint: make args: ['push'] \ No newline at end of file From 68ba92afa4dfb24869f3b10c7375b426cd98f2c3 Mon Sep 17 00:00:00 2001 From: Sidhartha Mani Date: Mon, 15 Aug 2022 14:33:09 -0700 Subject: [PATCH 191/242] Create CHANGELOG-0.1.md --- CHANGELOG/CHANGELOG-0.1.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 CHANGELOG/CHANGELOG-0.1.md diff --git a/CHANGELOG/CHANGELOG-0.1.md b/CHANGELOG/CHANGELOG-0.1.md new file mode 100644 index 00000000..14ed6145 --- /dev/null +++ b/CHANGELOG/CHANGELOG-0.1.md @@ -0,0 +1,5 @@ +# First Release v0.1.0 + +### New Features + +- Support GRPC calls between COSI driver and sidecar From 2d34fea6905187800763724fb895292e7e2eb853 Mon Sep 17 00:00:00 2001 From: Sidhartha Mani Date: Mon, 15 Aug 2022 14:47:12 -0700 Subject: [PATCH 192/242] Create CHANGELOG-0.1.md --- CHANGELOG/CHANGELOG-0.1.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 CHANGELOG/CHANGELOG-0.1.md diff --git a/CHANGELOG/CHANGELOG-0.1.md b/CHANGELOG/CHANGELOG-0.1.md new file mode 100644 index 00000000..60d975be --- /dev/null +++ b/CHANGELOG/CHANGELOG-0.1.md @@ -0,0 +1,7 @@ +# First Release v0.1.0 + + ### New Features + + - Listen on Bucket* events + - Create Buckets in response to BucketClaim creation + - Enable lifecycle of Buckets and BucketAccesses From 598ce6ea7befb33d9935a88380dd6ef9d5e3d3e5 Mon Sep 17 00:00:00 2001 From: Sidhartha Mani Date: Mon, 15 Aug 2022 17:51:59 -0700 Subject: [PATCH 193/242] Update cloudbuild.yaml Update image tag --- cloudbuild.yaml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index fa8784be..bacbd1d7 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -2,13 +2,20 @@ timeout: 3000s substitutions: _IMAGE_NAME: 'gcr.io/k8s-staging-sig-storage/objectstorage-controller' - _IMAGE_TAG: 'canary' + _GIT_TAG: '12345' + _PULL_BASE_REF: 'master' options: substitution_option: ALLOW_LOOSE steps: - name: "gcr.io/k8s-testimages/gcb-docker-gcloud:v20220617-174ad91c3a" entrypoint: make args: ['build'] + env: + - GIT_TAG=${_GIT_TAG} + - PULL_BASE_REF=${_PULL_BASE_REF} - name: "gcr.io/k8s-testimages/gcb-docker-gcloud:v20220617-174ad91c3a" entrypoint: make - args: ['push'] \ No newline at end of file + args: ['push'] + env: + - GIT_TAG=${_GIT_TAG} + - PULL_BASE_REF=${_PULL_BASE_REF} From 3b88f297f8194c24bdfcb14aee644b92a62bd2cb Mon Sep 17 00:00:00 2001 From: Niu Lechuan Date: Fri, 2 Sep 2022 11:53:19 +0800 Subject: [PATCH 194/242] update CRDs url, and remove deleted test file in README.md Signed-off-by: Niu Lechuan --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 1ca66051..436ae7a7 100644 --- a/README.md +++ b/README.md @@ -15,13 +15,12 @@ and generates the associated CRDs: Before diving into the code of this repo, we suggest that you familiarize yourself with: -- The Spec of CRDs in [objectstorage.k8s.io/v1alpha1/types.go](https://github.com/kubernetes-sigs/container-object-storage-interface-api/blob/master/apis/objectstorage.k8s.io/v1alpha1/types.go) +- The Spec of CRDs in [objectstorage.k8s.io/v1alpha1/types.go](https://github.com/kubernetes-sigs/container-object-storage-interface-api/blob/master/apis/objectstorage/v1alpha1/types.go) - The Spec of the COSI objects [sigs.k8s.io/container-object-storage-interface-spec](https://github.com/kubernetes-sigs/container-object-storage-interface-spec) A good starting point towards understanding the functionality of this repo would be to study the tests: -- [BucketRequest Test](./pkg/bucketrequest/bucketrequest_test.go) -- [BucketAccessRequest Test](./pkg/bucketaccessrequest/bucketaccessrequest_test.go) +- [BucketClaim Test](./pkg/bucketclaim/bucketclaim_test.go) ### Build and Test From 6dcf2928714197349112df8f5ff5d8d616ac85fd Mon Sep 17 00:00:00 2001 From: Sidhartha Mani Date: Thu, 8 Sep 2022 10:20:31 -0700 Subject: [PATCH 195/242] Update Makefile Remove tag override --- Makefile | 1 - 1 file changed, 1 deletion(-) diff --git a/Makefile b/Makefile index 7a5a842d..970f5f32 100644 --- a/Makefile +++ b/Makefile @@ -28,4 +28,3 @@ CMDS=controller-manager include release-tools/build.make IMAGE_NAME=gcr.io/k8s-staging-sig-storage/objectstorage-controller -IMAGE_TAGS=canary From 7f1fe3770988d055c839232ab750a874db28cf4a Mon Sep 17 00:00:00 2001 From: Sidhartha Mani Date: Thu, 15 Sep 2022 10:15:54 -0700 Subject: [PATCH 196/242] Update Makefile Set `git tab` --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index 970f5f32..c8fb281e 100644 --- a/Makefile +++ b/Makefile @@ -28,3 +28,4 @@ CMDS=controller-manager include release-tools/build.make IMAGE_NAME=gcr.io/k8s-staging-sig-storage/objectstorage-controller +IMAGE_TAGS=$(GIT_TAG) From ff5c0eac1f1b255c338f04ce4b84343cc36a34a7 Mon Sep 17 00:00:00 2001 From: Akash Mukhopadhyay Date: Sun, 18 Sep 2022 18:30:52 -0700 Subject: [PATCH 197/242] Fixing a bucketclaim object updation bug --- pkg/bucketclaim/bucketclaim.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pkg/bucketclaim/bucketclaim.go b/pkg/bucketclaim/bucketclaim.go index 9eb33c42..fb20d0f9 100644 --- a/pkg/bucketclaim/bucketclaim.go +++ b/pkg/bucketclaim/bucketclaim.go @@ -99,7 +99,8 @@ func (b *bucketClaimListener) Delete(ctx context.Context, bucketClaim *v1alpha1. // ErrInvalidBucketClass - BucketClass does not exist [requeue'd with exponential backoff] // ErrBucketAlreadyExists - BucketClaim already processed // non-nil err - Internal error [requeue'd with exponential backoff] -func (b *bucketClaimListener) provisionBucketClaimOperation(ctx context.Context, bucketClaim *v1alpha1.BucketClaim) error { +func (b *bucketClaimListener) provisionBucketClaimOperation(ctx context.Context, inputBucketClaim *v1alpha1.BucketClaim) error { + bucketClaim := inputBucketClaim.DeepCopy() if bucketClaim.Status.BucketReady { return util.ErrBucketAlreadyExists } From f5d937d1e682632800c1afd018850ffe66328076 Mon Sep 17 00:00:00 2001 From: Akash Mukhopadhyay Date: Mon, 19 Sep 2022 00:44:19 -0700 Subject: [PATCH 198/242] Fixing a couple of update bugs --- pkg/bucketclaim/bucketclaim.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/pkg/bucketclaim/bucketclaim.go b/pkg/bucketclaim/bucketclaim.go index fb20d0f9..7cb532df 100644 --- a/pkg/bucketclaim/bucketclaim.go +++ b/pkg/bucketclaim/bucketclaim.go @@ -86,7 +86,7 @@ func (b *bucketClaimListener) Update(ctx context.Context, old, new *v1alpha1.Buc // Delete processes a bucket for which bucket request is deleted func (b *bucketClaimListener) Delete(ctx context.Context, bucketClaim *v1alpha1.BucketClaim) error { - klog.V(3).Infof("Delete BucketClaim %v", + klog.V(3).Infof("Delete BucketClaim", "name", bucketClaim.ObjectMeta.Name, "ns", bucketClaim.ObjectMeta.Namespace) @@ -172,8 +172,11 @@ func (b *bucketClaimListener) provisionBucketClaimOperation(ctx context.Context, bucketClaim.Status.BucketReady = false } - _, err = b.bucketClaims(bucketClaim.ObjectMeta.Namespace).UpdateStatus(ctx, bucketClaim, metav1.UpdateOptions{}) + // Fetching the updated bucketClaim again, so that the update + // operation doesn't happen on an outdated version of the bucketClaim. + bucketClaim, err = b.bucketClaims(bucketClaim.ObjectMeta.Namespace).UpdateStatus(ctx, bucketClaim, metav1.UpdateOptions{}) if err != nil { + klog.ErrorS(err, "Failed to update status of BucketClaim", "name", bucketClaim.ObjectMeta.Name) return err } @@ -182,8 +185,10 @@ func (b *bucketClaimListener) provisionBucketClaimOperation(ctx context.Context, controllerutil.AddFinalizer(bucketClaim, util.BucketClaimFinalizer) _, err = b.bucketClaims(bucketClaim.ObjectMeta.Namespace).Update(ctx, bucketClaim, metav1.UpdateOptions{}) if err != nil { + klog.ErrorS(err, "Failed to update BucketClaim", "name", bucketClaim.ObjectMeta.Name) return err } + klog.Infof("Finished creating Bucket %v", bucketName) return nil } From 6fd93c5cf57e93cd8d3b2aff78b9e272988104c2 Mon Sep 17 00:00:00 2001 From: Akash Mukhopadhyay Date: Mon, 19 Sep 2022 11:22:23 -0700 Subject: [PATCH 199/242] Improving some logs --- pkg/bucketclaim/bucketclaim.go | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/pkg/bucketclaim/bucketclaim.go b/pkg/bucketclaim/bucketclaim.go index 7cb532df..387fb50e 100644 --- a/pkg/bucketclaim/bucketclaim.go +++ b/pkg/bucketclaim/bucketclaim.go @@ -39,7 +39,7 @@ func (b *bucketClaimListener) Add(ctx context.Context, bucketClaim *v1alpha1.Buc if err != nil { switch err { case util.ErrInvalidBucketClass: - klog.ErrorS(util.ErrInvalidBucketClass, + klog.V(3).ErrorS(util.ErrInvalidBucketClass, "bucketClaim", bucketClaim.ObjectMeta.Name, "ns", bucketClaim.ObjectMeta.Namespace, "bucketClassName", bucketClaim.Spec.BucketClassName) @@ -50,7 +50,7 @@ func (b *bucketClaimListener) Add(ctx context.Context, bucketClaim *v1alpha1.Buc ) return nil default: - klog.ErrorS(err, + klog.V(3).ErrorS(err, "name", bucketClaim.ObjectMeta.Name, "ns", bucketClaim.ObjectMeta.Namespace, "err", err) @@ -77,10 +77,19 @@ func (b *bucketClaimListener) Update(ctx context.Context, old, new *v1alpha1.Buc bucketName := bucketClaim.Status.BucketName err := b.buckets().Delete(ctx, bucketName, metav1.DeleteOptions{}) if err != nil { + klog.V(3).ErrorS(err, "Error deleting bucket", + "bucket", bucketName, + "bucketClaim", bucketClaim.ObjectMeta.Name) return err } + + klog.V(5).Infof("Successfully deleted bucket: %s from bucketClaim: %s", bucketName, bucketClaim.ObjectMeta.Name) } } + + klog.V(3).InfoS("Update BucketClaim success", + "name", bucketClaim.ObjectMeta.Name, + "ns", bucketClaim.ObjectMeta.Namespace) return nil } @@ -112,7 +121,7 @@ func (b *bucketClaimListener) provisionBucketClaimOperation(ctx context.Context, bucketName = bucketClaim.Spec.ExistingBucketName bucket, err := b.buckets().Get(ctx, bucketName, metav1.GetOptions{}) if err != nil { - klog.ErrorS(err, "Get Bucket with ExistingBucketName error", "name", bucketClaim.Spec.ExistingBucketName) + klog.V(3).ErrorS(err, "Get Bucket with ExistingBucketName error", "name", bucketClaim.Spec.ExistingBucketName) return err } @@ -124,6 +133,9 @@ func (b *bucketClaimListener) provisionBucketClaimOperation(ctx context.Context, _, err = b.buckets().Update(ctx, bucket, metav1.UpdateOptions{}) if err != nil { + klog.V(3).ErrorS(err, "Error updating existing bucket", + "bucket", bucket.ObjectMeta.Name, + "bucketClaim", bucketClaim.ObjectMeta.Name) return err } @@ -137,7 +149,7 @@ func (b *bucketClaimListener) provisionBucketClaimOperation(ctx context.Context, bucketClass, err := b.bucketClasses().Get(ctx, bucketClassName, metav1.GetOptions{}) if err != nil { - klog.ErrorS(err, "Get Bucketclass Error", "name", bucketClassName) + klog.V(3).ErrorS(err, "Get Bucketclass Error", "name", bucketClassName) return util.ErrInvalidBucketClass } @@ -164,7 +176,9 @@ func (b *bucketClaimListener) provisionBucketClaimOperation(ctx context.Context, bucket.Spec.Protocols = protocolCopy bucket, err = b.buckets().Create(ctx, bucket, metav1.CreateOptions{}) if err != nil && !errors.IsAlreadyExists(err) { - klog.ErrorS(err, "name", bucketName) + klog.V(3).ErrorS(err, "Error creationg bucket", + "bucket", bucketName, + "bucketClaim", bucketClaim.ObjectMeta.Name) return err } @@ -176,7 +190,7 @@ func (b *bucketClaimListener) provisionBucketClaimOperation(ctx context.Context, // operation doesn't happen on an outdated version of the bucketClaim. bucketClaim, err = b.bucketClaims(bucketClaim.ObjectMeta.Namespace).UpdateStatus(ctx, bucketClaim, metav1.UpdateOptions{}) if err != nil { - klog.ErrorS(err, "Failed to update status of BucketClaim", "name", bucketClaim.ObjectMeta.Name) + klog.V(3).ErrorS(err, "Failed to update status of BucketClaim", "name", bucketClaim.ObjectMeta.Name) return err } @@ -185,11 +199,11 @@ func (b *bucketClaimListener) provisionBucketClaimOperation(ctx context.Context, controllerutil.AddFinalizer(bucketClaim, util.BucketClaimFinalizer) _, err = b.bucketClaims(bucketClaim.ObjectMeta.Namespace).Update(ctx, bucketClaim, metav1.UpdateOptions{}) if err != nil { - klog.ErrorS(err, "Failed to update BucketClaim", "name", bucketClaim.ObjectMeta.Name) + klog.V(3).ErrorS(err, "Failed to add finalizer BucketClaim", "name", bucketClaim.ObjectMeta.Name) return err } - klog.Infof("Finished creating Bucket %v", bucketName) + klog.V(3).Infof("Finished creating Bucket %v", bucketName) return nil } From 2a7e4aadffa691d7d61ebedeb6d304295fc2c9cb Mon Sep 17 00:00:00 2001 From: Akash Mukhopadhyay Date: Wed, 28 Sep 2022 09:22:38 -0700 Subject: [PATCH 200/242] Fixing some parameters in case of existing bucket id --- pkg/bucketclaim/bucketclaim.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkg/bucketclaim/bucketclaim.go b/pkg/bucketclaim/bucketclaim.go index 387fb50e..a32337e9 100644 --- a/pkg/bucketclaim/bucketclaim.go +++ b/pkg/bucketclaim/bucketclaim.go @@ -131,6 +131,10 @@ func (b *bucketClaimListener) provisionBucketClaimOperation(ctx context.Context, UID: bucketClaim.ObjectMeta.UID, } + protocolCopy := make([]v1alpha1.Protocol, len(bucketClaim.Spec.Protocols)) + copy(protocolCopy, bucketClaim.Spec.Protocols) + + bucket.Spec.Protocols = protocolCopy _, err = b.buckets().Update(ctx, bucket, metav1.UpdateOptions{}) if err != nil { klog.V(3).ErrorS(err, "Error updating existing bucket", From 1a0858c6f98dd2c45e513eee35615639ef8c1440 Mon Sep 17 00:00:00 2001 From: Akash Mukhopadhyay Date: Thu, 6 Oct 2022 09:34:19 -0700 Subject: [PATCH 201/242] Introducing delete_context to be passed with DriverDeleBucketRequest --- cosi.pb.go | 360 ++++++++++++++++++++++++++++------------------------- cosi.proto | 5 + spec.md | 9 +- 3 files changed, 204 insertions(+), 170 deletions(-) diff --git a/cosi.pb.go b/cosi.pb.go index d25d1b2c..f7e3a19b 100644 --- a/cosi.pb.go +++ b/cosi.pb.go @@ -728,6 +728,10 @@ type DriverDeleteBucketRequest struct { // bucket_id is a globally unique identifier for the bucket // in the object storage provider BucketId string `protobuf:"bytes,1,opt,name=bucket_id,json=bucketId,proto3" json:"bucket_id,omitempty"` + // This field is OPTIONAL + // The caller should treat the values in delete_context as opaque. + // The receiver is responsible for parsing and validating the values. + DeleteContext map[string]string `protobuf:"bytes,2,rep,name=delete_context,json=deleteContext,proto3" json:"delete_context,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *DriverDeleteBucketRequest) Reset() { @@ -769,6 +773,13 @@ func (x *DriverDeleteBucketRequest) GetBucketId() string { return "" } +func (x *DriverDeleteBucketRequest) GetDeleteContext() map[string]string { + if x != nil { + return x.DeleteContext + } + return nil +} + type DriverDeleteBucketResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1242,144 +1253,155 @@ var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDesc 0x12, 0x38, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x0a, - 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x38, 0x0a, 0x19, 0x44, 0x72, + 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0xde, 0x01, 0x0a, 0x19, 0x44, + 0x72, 0x69, 0x76, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x75, 0x63, 0x6b, + 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x75, 0x63, + 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x62, 0x0a, 0x0e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, + 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x75, 0x63, 0x6b, 0x65, - 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x75, 0x63, 0x6b, - 0x65, 0x74, 0x49, 0x64, 0x22, 0x1c, 0x0a, 0x1a, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0xc3, 0x02, 0x0a, 0x1e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x47, 0x72, 0x61, - 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, - 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x52, 0x0a, 0x13, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, - 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x12, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x5d, 0x0a, 0x0a, 0x70, 0x61, - 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, - 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, - 0x72, 0x69, 0x76, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, - 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, - 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x85, 0x02, 0x0a, 0x1f, 0x44, 0x72, 0x69, - 0x76, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x61, 0x0a, 0x0b, 0x63, - 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x3f, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, - 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x1a, 0x60, - 0x0a, 0x10, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x44, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x5d, 0x0a, 0x1f, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, - 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x64, - 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x22, - 0x22, 0x0a, 0x20, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x64, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x1a, 0x40, 0x0a, 0x12, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1c, 0x0a, 0x1a, 0x44, + 0x72, 0x69, 0x76, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc3, 0x02, 0x0a, 0x1e, 0x44, 0x72, + 0x69, 0x76, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, + 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x52, 0x0a, + 0x13, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x63, 0x6f, 0x73, + 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x65, + 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x12, 0x61, + 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x5d, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, + 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x85, 0x02, 0x0a, 0x1f, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x2a, 0x3e, 0x0a, 0x12, 0x53, 0x33, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x10, 0x55, 0x6e, 0x6b, - 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x10, 0x00, 0x12, - 0x08, 0x0a, 0x04, 0x53, 0x33, 0x56, 0x32, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x33, 0x56, - 0x34, 0x10, 0x02, 0x2a, 0x71, 0x0a, 0x19, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x6f, 0x75, 0x73, - 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, - 0x12, 0x1b, 0x0a, 0x17, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x42, 0x75, 0x63, 0x6b, 0x65, - 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x10, 0x00, 0x12, 0x0b, 0x0a, - 0x07, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, - 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x72, 0x69, 0x74, - 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, 0x57, - 0x72, 0x69, 0x74, 0x65, 0x10, 0x04, 0x2a, 0x45, 0x0a, 0x12, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, - 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x19, - 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x4b, - 0x65, 0x79, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x49, 0x41, 0x4d, 0x10, 0x02, 0x32, 0x68, 0x0a, - 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x5c, 0x0a, 0x0d, 0x44, 0x72, 0x69, - 0x76, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x23, 0x2e, 0x63, 0x6f, 0x73, - 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, - 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x24, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x32, 0xde, 0x03, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x12, 0x6b, 0x0a, 0x12, 0x44, 0x72, 0x69, 0x76, 0x65, - 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x28, 0x2e, - 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, - 0x69, 0x76, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x6b, 0x0a, 0x12, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x28, 0x2e, 0x63, 0x6f, 0x73, - 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, - 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x78, 0x0a, 0x17, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, - 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x2d, 0x2e, 0x63, - 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, - 0x76, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x63, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x49, 0x64, 0x12, 0x61, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x47, 0x72, + 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x61, 0x6c, 0x73, 0x1a, 0x60, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x61, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x63, 0x6f, 0x73, + 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x5d, 0x0a, 0x1f, 0x44, 0x72, 0x69, 0x76, 0x65, + 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x75, + 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, + 0x75, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x22, 0x0a, 0x20, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, + 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x3e, 0x0a, 0x12, 0x53, 0x33, + 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x14, 0x0a, 0x10, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x69, 0x67, 0x6e, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x33, 0x56, 0x32, 0x10, 0x01, + 0x12, 0x08, 0x0a, 0x04, 0x53, 0x33, 0x56, 0x34, 0x10, 0x02, 0x2a, 0x71, 0x0a, 0x19, 0x41, 0x6e, + 0x6f, 0x6e, 0x79, 0x6d, 0x6f, 0x75, 0x73, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x0a, 0x17, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, + 0x77, 0x6e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, + 0x64, 0x65, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x10, + 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x02, 0x12, + 0x0d, 0x0a, 0x09, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x03, 0x12, 0x0d, + 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x04, 0x2a, 0x45, 0x0a, + 0x12, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x19, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x41, 0x75, + 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, + 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x4b, 0x65, 0x79, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x49, + 0x41, 0x4d, 0x10, 0x02, 0x32, 0x68, 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x12, 0x5c, 0x0a, 0x0d, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x23, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x47, 0x65, 0x74, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x32, 0xde, + 0x03, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x12, 0x6b, + 0x0a, 0x12, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, + 0x63, 0x6b, 0x65, 0x74, 0x12, 0x28, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, + 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, + 0x72, 0x69, 0x76, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6b, 0x0a, 0x12, 0x44, + 0x72, 0x69, 0x76, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x12, 0x28, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, + 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, + 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x78, 0x0a, 0x17, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7b, 0x0a, 0x18, 0x44, + 0x65, 0x73, 0x73, 0x12, 0x2d, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, + 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, + 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x7b, 0x0a, 0x18, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, + 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x2e, + 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, + 0x72, 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, + 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, - 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x2e, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, - 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, - 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3a, 0x3c, 0x0a, 0x0a, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xdc, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x45, 0x6e, 0x75, 0x6d, 0x3a, 0x4c, 0x0a, 0x10, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, - 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, - 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xdc, 0x08, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x45, 0x6e, 0x75, 0x6d, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x3f, 0x0a, 0x0b, 0x63, 0x6f, 0x73, 0x69, 0x5f, 0x73, 0x65, 0x63, - 0x72, 0x65, 0x74, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0xdb, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x63, 0x6f, 0x73, 0x69, 0x53, - 0x65, 0x63, 0x72, 0x65, 0x74, 0x3a, 0x3f, 0x0a, 0x0b, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x66, - 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0xdc, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x3a, 0x45, 0x0a, 0x0d, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xdc, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0c, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x42, 0x0a, - 0x0c, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x1e, 0x2e, + 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3a, + 0x3c, 0x0a, 0x0a, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xdc, 0x08, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x4d, 0x65, 0x74, 0x68, 0x6f, - 0x64, 0x3a, 0x45, 0x0a, 0x0d, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0xdc, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, 0x3a, 0x5a, 0x38, 0x73, 0x69, 0x67, 0x73, - 0x2e, 0x6b, 0x38, 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x2d, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2d, 0x73, 0x70, 0x65, 0x63, 0x3b, - 0x63, 0x6f, 0x73, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xdc, 0x08, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x09, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x45, 0x6e, 0x75, 0x6d, 0x3a, 0x4c, 0x0a, + 0x10, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x12, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xdc, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x3f, 0x0a, 0x0b, 0x63, + 0x6f, 0x73, 0x69, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xdb, 0x08, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0a, 0x63, 0x6f, 0x73, 0x69, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x3a, 0x3f, 0x0a, 0x0b, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, + 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xdc, 0x08, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0a, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x3a, 0x45, 0x0a, + 0x0d, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0xdc, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x3a, 0x42, 0x0a, 0x0c, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x6d, 0x65, + 0x74, 0x68, 0x6f, 0x64, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xdc, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3a, 0x45, 0x0a, 0x0d, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xdc, 0x08, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, + 0x3a, 0x5a, 0x38, 0x73, 0x69, 0x67, 0x73, 0x2e, 0x6b, 0x38, 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2d, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2d, + 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, + 0x65, 0x2d, 0x73, 0x70, 0x65, 0x63, 0x3b, 0x63, 0x6f, 0x73, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( @@ -1395,7 +1417,7 @@ func file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDesc } var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes = make([]protoimpl.MessageInfo, 19) +var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes = make([]protoimpl.MessageInfo, 20) var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_goTypes = []interface{}{ (S3SignatureVersion)(0), // 0: cosi.v1alpha1.S3SignatureVersion (AnonymousBucketAccessMode)(0), // 1: cosi.v1alpha1.AnonymousBucketAccessMode @@ -1417,14 +1439,15 @@ var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_goTypes (*DriverRevokeBucketAccessResponse)(nil), // 17: cosi.v1alpha1.DriverRevokeBucketAccessResponse nil, // 18: cosi.v1alpha1.CredentialDetails.SecretsEntry nil, // 19: cosi.v1alpha1.DriverCreateBucketRequest.ParametersEntry - nil, // 20: cosi.v1alpha1.DriverGrantBucketAccessRequest.ParametersEntry - nil, // 21: cosi.v1alpha1.DriverGrantBucketAccessResponse.CredentialsEntry - (*descriptor.EnumOptions)(nil), // 22: google.protobuf.EnumOptions - (*descriptor.EnumValueOptions)(nil), // 23: google.protobuf.EnumValueOptions - (*descriptor.FieldOptions)(nil), // 24: google.protobuf.FieldOptions - (*descriptor.MessageOptions)(nil), // 25: google.protobuf.MessageOptions - (*descriptor.MethodOptions)(nil), // 26: google.protobuf.MethodOptions - (*descriptor.ServiceOptions)(nil), // 27: google.protobuf.ServiceOptions + nil, // 20: cosi.v1alpha1.DriverDeleteBucketRequest.DeleteContextEntry + nil, // 21: cosi.v1alpha1.DriverGrantBucketAccessRequest.ParametersEntry + nil, // 22: cosi.v1alpha1.DriverGrantBucketAccessResponse.CredentialsEntry + (*descriptor.EnumOptions)(nil), // 23: google.protobuf.EnumOptions + (*descriptor.EnumValueOptions)(nil), // 24: google.protobuf.EnumValueOptions + (*descriptor.FieldOptions)(nil), // 25: google.protobuf.FieldOptions + (*descriptor.MessageOptions)(nil), // 26: google.protobuf.MessageOptions + (*descriptor.MethodOptions)(nil), // 27: google.protobuf.MethodOptions + (*descriptor.ServiceOptions)(nil), // 28: google.protobuf.ServiceOptions } var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_depIdxs = []int32{ 0, // 0: cosi.v1alpha1.S3.signature_version:type_name -> cosi.v1alpha1.S3SignatureVersion @@ -1434,32 +1457,33 @@ var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_depIdxs 18, // 4: cosi.v1alpha1.CredentialDetails.secrets:type_name -> cosi.v1alpha1.CredentialDetails.SecretsEntry 19, // 5: cosi.v1alpha1.DriverCreateBucketRequest.parameters:type_name -> cosi.v1alpha1.DriverCreateBucketRequest.ParametersEntry 6, // 6: cosi.v1alpha1.DriverCreateBucketResponse.bucket_info:type_name -> cosi.v1alpha1.Protocol - 2, // 7: cosi.v1alpha1.DriverGrantBucketAccessRequest.authentication_type:type_name -> cosi.v1alpha1.AuthenticationType - 20, // 8: cosi.v1alpha1.DriverGrantBucketAccessRequest.parameters:type_name -> cosi.v1alpha1.DriverGrantBucketAccessRequest.ParametersEntry - 21, // 9: cosi.v1alpha1.DriverGrantBucketAccessResponse.credentials:type_name -> cosi.v1alpha1.DriverGrantBucketAccessResponse.CredentialsEntry - 7, // 10: cosi.v1alpha1.DriverGrantBucketAccessResponse.CredentialsEntry.value:type_name -> cosi.v1alpha1.CredentialDetails - 22, // 11: cosi.v1alpha1.alpha_enum:extendee -> google.protobuf.EnumOptions - 23, // 12: cosi.v1alpha1.alpha_enum_value:extendee -> google.protobuf.EnumValueOptions - 24, // 13: cosi.v1alpha1.cosi_secret:extendee -> google.protobuf.FieldOptions - 24, // 14: cosi.v1alpha1.alpha_field:extendee -> google.protobuf.FieldOptions - 25, // 15: cosi.v1alpha1.alpha_message:extendee -> google.protobuf.MessageOptions - 26, // 16: cosi.v1alpha1.alpha_method:extendee -> google.protobuf.MethodOptions - 27, // 17: cosi.v1alpha1.alpha_service:extendee -> google.protobuf.ServiceOptions - 8, // 18: cosi.v1alpha1.Identity.DriverGetInfo:input_type -> cosi.v1alpha1.DriverGetInfoRequest - 10, // 19: cosi.v1alpha1.Provisioner.DriverCreateBucket:input_type -> cosi.v1alpha1.DriverCreateBucketRequest - 12, // 20: cosi.v1alpha1.Provisioner.DriverDeleteBucket:input_type -> cosi.v1alpha1.DriverDeleteBucketRequest - 14, // 21: cosi.v1alpha1.Provisioner.DriverGrantBucketAccess:input_type -> cosi.v1alpha1.DriverGrantBucketAccessRequest - 16, // 22: cosi.v1alpha1.Provisioner.DriverRevokeBucketAccess:input_type -> cosi.v1alpha1.DriverRevokeBucketAccessRequest - 9, // 23: cosi.v1alpha1.Identity.DriverGetInfo:output_type -> cosi.v1alpha1.DriverGetInfoResponse - 11, // 24: cosi.v1alpha1.Provisioner.DriverCreateBucket:output_type -> cosi.v1alpha1.DriverCreateBucketResponse - 13, // 25: cosi.v1alpha1.Provisioner.DriverDeleteBucket:output_type -> cosi.v1alpha1.DriverDeleteBucketResponse - 15, // 26: cosi.v1alpha1.Provisioner.DriverGrantBucketAccess:output_type -> cosi.v1alpha1.DriverGrantBucketAccessResponse - 17, // 27: cosi.v1alpha1.Provisioner.DriverRevokeBucketAccess:output_type -> cosi.v1alpha1.DriverRevokeBucketAccessResponse - 23, // [23:28] is the sub-list for method output_type - 18, // [18:23] is the sub-list for method input_type - 18, // [18:18] is the sub-list for extension type_name - 11, // [11:18] is the sub-list for extension extendee - 0, // [0:11] is the sub-list for field type_name + 20, // 7: cosi.v1alpha1.DriverDeleteBucketRequest.delete_context:type_name -> cosi.v1alpha1.DriverDeleteBucketRequest.DeleteContextEntry + 2, // 8: cosi.v1alpha1.DriverGrantBucketAccessRequest.authentication_type:type_name -> cosi.v1alpha1.AuthenticationType + 21, // 9: cosi.v1alpha1.DriverGrantBucketAccessRequest.parameters:type_name -> cosi.v1alpha1.DriverGrantBucketAccessRequest.ParametersEntry + 22, // 10: cosi.v1alpha1.DriverGrantBucketAccessResponse.credentials:type_name -> cosi.v1alpha1.DriverGrantBucketAccessResponse.CredentialsEntry + 7, // 11: cosi.v1alpha1.DriverGrantBucketAccessResponse.CredentialsEntry.value:type_name -> cosi.v1alpha1.CredentialDetails + 23, // 12: cosi.v1alpha1.alpha_enum:extendee -> google.protobuf.EnumOptions + 24, // 13: cosi.v1alpha1.alpha_enum_value:extendee -> google.protobuf.EnumValueOptions + 25, // 14: cosi.v1alpha1.cosi_secret:extendee -> google.protobuf.FieldOptions + 25, // 15: cosi.v1alpha1.alpha_field:extendee -> google.protobuf.FieldOptions + 26, // 16: cosi.v1alpha1.alpha_message:extendee -> google.protobuf.MessageOptions + 27, // 17: cosi.v1alpha1.alpha_method:extendee -> google.protobuf.MethodOptions + 28, // 18: cosi.v1alpha1.alpha_service:extendee -> google.protobuf.ServiceOptions + 8, // 19: cosi.v1alpha1.Identity.DriverGetInfo:input_type -> cosi.v1alpha1.DriverGetInfoRequest + 10, // 20: cosi.v1alpha1.Provisioner.DriverCreateBucket:input_type -> cosi.v1alpha1.DriverCreateBucketRequest + 12, // 21: cosi.v1alpha1.Provisioner.DriverDeleteBucket:input_type -> cosi.v1alpha1.DriverDeleteBucketRequest + 14, // 22: cosi.v1alpha1.Provisioner.DriverGrantBucketAccess:input_type -> cosi.v1alpha1.DriverGrantBucketAccessRequest + 16, // 23: cosi.v1alpha1.Provisioner.DriverRevokeBucketAccess:input_type -> cosi.v1alpha1.DriverRevokeBucketAccessRequest + 9, // 24: cosi.v1alpha1.Identity.DriverGetInfo:output_type -> cosi.v1alpha1.DriverGetInfoResponse + 11, // 25: cosi.v1alpha1.Provisioner.DriverCreateBucket:output_type -> cosi.v1alpha1.DriverCreateBucketResponse + 13, // 26: cosi.v1alpha1.Provisioner.DriverDeleteBucket:output_type -> cosi.v1alpha1.DriverDeleteBucketResponse + 15, // 27: cosi.v1alpha1.Provisioner.DriverGrantBucketAccess:output_type -> cosi.v1alpha1.DriverGrantBucketAccessResponse + 17, // 28: cosi.v1alpha1.Provisioner.DriverRevokeBucketAccess:output_type -> cosi.v1alpha1.DriverRevokeBucketAccessResponse + 24, // [24:29] is the sub-list for method output_type + 19, // [19:24] is the sub-list for method input_type + 19, // [19:19] is the sub-list for extension type_name + 12, // [12:19] is the sub-list for extension extendee + 0, // [0:12] is the sub-list for field type_name } func init() { file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_init() } @@ -1660,7 +1684,7 @@ func file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_init() GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDesc, NumEnums: 3, - NumMessages: 19, + NumMessages: 20, NumExtensions: 7, NumServices: 2, }, diff --git a/cosi.proto b/cosi.proto index c9e0a3fc..b2164ce5 100644 --- a/cosi.proto +++ b/cosi.proto @@ -180,6 +180,11 @@ message DriverDeleteBucketRequest { // bucket_id is a globally unique identifier for the bucket // in the object storage provider string bucket_id = 1; + + // This field is OPTIONAL + // The caller should treat the values in delete_context as opaque. + // The receiver is responsible for parsing and validating the values. + map delete_context = 2; } message DriverDeleteBucketResponse { diff --git a/spec.md b/spec.md index 953eb70d..4b78914e 100644 --- a/spec.md +++ b/spec.md @@ -287,7 +287,7 @@ message DriverCreateBucketRequest { string name = 1; // This field is OPTIONAL - // The caller should treat the values in parameters as opaque. + // The caller should treat the values in parameters as opaque. // The receiver is responsible for parsing and validating the values. map parameters = 2; } @@ -307,6 +307,11 @@ message DriverDeleteBucketRequest { // bucket_id is a globally unique identifier for the bucket // in the object storage provider string bucket_id = 1; + + // This field is OPTIONAL + // The caller should treat the values in delete_context as opaque. + // The receiver is responsible for parsing and validating the values. + map delete_context = 2; } message DriverDeleteBucketResponse { @@ -329,7 +334,7 @@ message DriverGrantBucketAccessRequest { AuthenticationType authentication_type = 3; // This field is OPTIONAL - // The caller should treat the values in parameters as opaque. + // The caller should treat the values in parameters as opaque. // The receiver is responsible for parsing and validating the values. map parameters = 4; } From 988b9d0d61ad866621bb21f9dc99cc6dd6dd1ae5 Mon Sep 17 00:00:00 2001 From: Akash Mukhopadhyay Date: Fri, 21 Oct 2022 12:48:16 -0700 Subject: [PATCH 202/242] Modifying owners --- OWNERS | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/OWNERS b/OWNERS index 9ea2b344..2eb42391 100644 --- a/OWNERS +++ b/OWNERS @@ -6,5 +6,4 @@ approvers: - saad-ali - xing-yang - wlan0 - - brahmaroutu - - rrati + - mukhoakash From 9c8dfba4df55701a2dded765158f59e38ae0b95e Mon Sep 17 00:00:00 2001 From: Akash Mukhopadhyay Date: Tue, 15 Nov 2022 13:52:10 -0800 Subject: [PATCH 203/242] Fixing the controller version --- resources/deployment.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/deployment.yaml b/resources/deployment.yaml index 452ec018..e222fa60 100644 --- a/resources/deployment.yaml +++ b/resources/deployment.yaml @@ -31,7 +31,7 @@ spec: serviceAccountName: objectstorage-controller-sa containers: - name: objectstorage-controller - image: quay.io/containerobjectstorage/objectstorage-controller:canary + image: gcr.io/k8s-staging-sig-storage/objectstorage-controller:v20221027-v0.1.1-8-g300019f imagePullPolicy: Always args: - "--v=5" From 6796feee74ca8748ebc7775b6f1e11ae3fdc1a35 Mon Sep 17 00:00:00 2001 From: cpanato Date: Mon, 30 Jan 2023 14:39:53 +0100 Subject: [PATCH 204/242] Migrate away from google.com gcp project k8s-testimages Signed-off-by: cpanato --- cloudbuild.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index bacbd1d7..98feb780 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -7,15 +7,15 @@ substitutions: options: substitution_option: ALLOW_LOOSE steps: -- name: "gcr.io/k8s-testimages/gcb-docker-gcloud:v20220617-174ad91c3a" +- name: "gcr.io/k8s-staging-test-infra/gcb-docker-gcloud:v20221214-1b4dd4d69a" entrypoint: make args: ['build'] - env: + env: - GIT_TAG=${_GIT_TAG} - PULL_BASE_REF=${_PULL_BASE_REF} -- name: "gcr.io/k8s-testimages/gcb-docker-gcloud:v20220617-174ad91c3a" +- name: "gcr.io/k8s-staging-test-infra/gcb-docker-gcloud:v20221214-1b4dd4d69a" entrypoint: make args: ['push'] - env: + env: - GIT_TAG=${_GIT_TAG} - PULL_BASE_REF=${_PULL_BASE_REF} From 13d31e6b93a041a76615fbb6545cdf90f2956569 Mon Sep 17 00:00:00 2001 From: Mateusz Urbanek Date: Tue, 23 May 2023 13:32:07 +0200 Subject: [PATCH 205/242] fix(log): switched to structured log --- pkg/bucketclaim/bucketclaim.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/bucketclaim/bucketclaim.go b/pkg/bucketclaim/bucketclaim.go index a32337e9..1924d5f1 100644 --- a/pkg/bucketclaim/bucketclaim.go +++ b/pkg/bucketclaim/bucketclaim.go @@ -95,7 +95,7 @@ func (b *bucketClaimListener) Update(ctx context.Context, old, new *v1alpha1.Buc // Delete processes a bucket for which bucket request is deleted func (b *bucketClaimListener) Delete(ctx context.Context, bucketClaim *v1alpha1.BucketClaim) error { - klog.V(3).Infof("Delete BucketClaim", + klog.V(3).Info("Delete BucketClaim", "name", bucketClaim.ObjectMeta.Name, "ns", bucketClaim.ObjectMeta.Namespace) From 928805b9cd41ae2f5b3de19f26523bf155d684b7 Mon Sep 17 00:00:00 2001 From: Mateusz Urbanek Date: Tue, 23 May 2023 13:37:28 +0200 Subject: [PATCH 206/242] chore(formatting): go fmt on the repo --- pkg/bucketclaim/bucketclaim.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/pkg/bucketclaim/bucketclaim.go b/pkg/bucketclaim/bucketclaim.go index 1924d5f1..963e2cbc 100644 --- a/pkg/bucketclaim/bucketclaim.go +++ b/pkg/bucketclaim/bucketclaim.go @@ -104,10 +104,11 @@ func (b *bucketClaimListener) Delete(ctx context.Context, bucketClaim *v1alpha1. // provisionBucketClaimOperation attempts to provision a bucket for a given bucketClaim. // Return values -// nil - BucketClaim successfully processed -// ErrInvalidBucketClass - BucketClass does not exist [requeue'd with exponential backoff] -// ErrBucketAlreadyExists - BucketClaim already processed -// non-nil err - Internal error [requeue'd with exponential backoff] +// +// nil - BucketClaim successfully processed +// ErrInvalidBucketClass - BucketClass does not exist [requeue'd with exponential backoff] +// ErrBucketAlreadyExists - BucketClaim already processed +// non-nil err - Internal error [requeue'd with exponential backoff] func (b *bucketClaimListener) provisionBucketClaimOperation(ctx context.Context, inputBucketClaim *v1alpha1.BucketClaim) error { bucketClaim := inputBucketClaim.DeepCopy() if bucketClaim.Status.BucketReady { From ee3d1530061fb15c087794d1ea3fe8529d7c80b7 Mon Sep 17 00:00:00 2001 From: Mateusz Urbanek Date: Thu, 11 May 2023 15:06:23 +0200 Subject: [PATCH 207/242] feat(bucketclaim): added EventRecorder --- pkg/bucketclaim/bucketclaim.go | 67 +++++++++++++++++++++-------- pkg/bucketclaim/bucketclaim_test.go | 7 +++ 2 files changed, 56 insertions(+), 18 deletions(-) diff --git a/pkg/bucketclaim/bucketclaim.go b/pkg/bucketclaim/bucketclaim.go index 963e2cbc..539a27f6 100644 --- a/pkg/bucketclaim/bucketclaim.go +++ b/pkg/bucketclaim/bucketclaim.go @@ -4,9 +4,11 @@ import ( "context" v1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/errors" + kubeerrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" kubeclientset "k8s.io/client-go/kubernetes" + "k8s.io/client-go/tools/record" "k8s.io/klog/v2" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" @@ -17,18 +19,20 @@ import ( "sigs.k8s.io/container-object-storage-interface-controller/pkg/util" ) -// bucketClaimListener is a resource handler for bucket requests objects -type bucketClaimListener struct { +// BucketClaimListener is a resource handler for bucket requests objects +type BucketClaimListener struct { + eventRecorder record.EventRecorder + kubeClient kubeclientset.Interface bucketClient bucketclientset.Interface } -func NewBucketClaimListener() *bucketClaimListener { - return &bucketClaimListener{} +func NewBucketClaimListener() *BucketClaimListener { + return &BucketClaimListener{} } // Add creates a bucket in response to a bucketClaim -func (b *bucketClaimListener) Add(ctx context.Context, bucketClaim *v1alpha1.BucketClaim) error { +func (b *BucketClaimListener) Add(ctx context.Context, bucketClaim *v1alpha1.BucketClaim) error { klog.V(3).InfoS("Add BucketClaim", "name", bucketClaim.ObjectMeta.Name, "ns", bucketClaim.ObjectMeta.Namespace, @@ -65,7 +69,7 @@ func (b *bucketClaimListener) Add(ctx context.Context, bucketClaim *v1alpha1.Buc } // update processes any updates made to the bucket request -func (b *bucketClaimListener) Update(ctx context.Context, old, new *v1alpha1.BucketClaim) error { +func (b *BucketClaimListener) Update(ctx context.Context, old, new *v1alpha1.BucketClaim) error { klog.V(3).InfoS("Update BucketClaim", "name", old.Name, "ns", old.Namespace) @@ -94,8 +98,8 @@ func (b *bucketClaimListener) Update(ctx context.Context, old, new *v1alpha1.Buc } // Delete processes a bucket for which bucket request is deleted -func (b *bucketClaimListener) Delete(ctx context.Context, bucketClaim *v1alpha1.BucketClaim) error { - klog.V(3).Info("Delete BucketClaim", +func (b *BucketClaimListener) Delete(ctx context.Context, bucketClaim *v1alpha1.BucketClaim) error { + klog.V(3).InfoS("Delete BucketClaim", "name", bucketClaim.ObjectMeta.Name, "ns", bucketClaim.ObjectMeta.Namespace) @@ -103,13 +107,19 @@ func (b *bucketClaimListener) Delete(ctx context.Context, bucketClaim *v1alpha1. } // provisionBucketClaimOperation attempts to provision a bucket for a given bucketClaim. +// +// Recorded events +// +// InvalidBucket - Bucket provided in the BucketClaim does not exist +// InvalidBucketClass - BucketClass provided in the BucketClaim does not exist +// // Return values // // nil - BucketClaim successfully processed // ErrInvalidBucketClass - BucketClass does not exist [requeue'd with exponential backoff] // ErrBucketAlreadyExists - BucketClaim already processed // non-nil err - Internal error [requeue'd with exponential backoff] -func (b *bucketClaimListener) provisionBucketClaimOperation(ctx context.Context, inputBucketClaim *v1alpha1.BucketClaim) error { +func (b *BucketClaimListener) provisionBucketClaimOperation(ctx context.Context, inputBucketClaim *v1alpha1.BucketClaim) error { bucketClaim := inputBucketClaim.DeepCopy() if bucketClaim.Status.BucketReady { return util.ErrBucketAlreadyExists @@ -121,7 +131,10 @@ func (b *bucketClaimListener) provisionBucketClaimOperation(ctx context.Context, if bucketClaim.Spec.ExistingBucketName != "" { bucketName = bucketClaim.Spec.ExistingBucketName bucket, err := b.buckets().Get(ctx, bucketName, metav1.GetOptions{}) - if err != nil { + if kubeerrors.IsNotFound(err) { + b.recordEvent(inputBucketClaim, v1.EventTypeWarning, "InvalidBucket", "Bucket provided in the BucketClaim does not exist") + return err + } else if err != nil { klog.V(3).ErrorS(err, "Get Bucket with ExistingBucketName error", "name", bucketClaim.Spec.ExistingBucketName) return err } @@ -153,7 +166,10 @@ func (b *bucketClaimListener) provisionBucketClaimOperation(ctx context.Context, } bucketClass, err := b.bucketClasses().Get(ctx, bucketClassName, metav1.GetOptions{}) - if err != nil { + if kubeerrors.IsNotFound(err) { + b.recordEvent(inputBucketClaim, v1.EventTypeWarning, "InvalidBucketClass", "BucketClass provided in the BucketClaim does not exist") + return util.ErrInvalidBucketClass + } else if err != nil { klog.V(3).ErrorS(err, "Get Bucketclass Error", "name", bucketClassName) return util.ErrInvalidBucketClass } @@ -180,7 +196,7 @@ func (b *bucketClaimListener) provisionBucketClaimOperation(ctx context.Context, bucket.Spec.Protocols = protocolCopy bucket, err = b.buckets().Create(ctx, bucket, metav1.CreateOptions{}) - if err != nil && !errors.IsAlreadyExists(err) { + if err != nil && !kubeerrors.IsAlreadyExists(err) { klog.V(3).ErrorS(err, "Error creationg bucket", "bucket", bucketName, "bucketClaim", bucketClaim.ObjectMeta.Name) @@ -212,31 +228,46 @@ func (b *bucketClaimListener) provisionBucketClaimOperation(ctx context.Context, return nil } -func (b *bucketClaimListener) InitializeKubeClient(k kubeclientset.Interface) { +// InitializeKubeClient initializes the kubernetes client +func (b *BucketClaimListener) InitializeKubeClient(k kubeclientset.Interface) { b.kubeClient = k } -func (b *bucketClaimListener) InitializeBucketClient(bc bucketclientset.Interface) { +// InitializeBucketClient initializes the object storage bucket client +func (b *BucketClaimListener) InitializeBucketClient(bc bucketclientset.Interface) { b.bucketClient = bc } -func (b *bucketClaimListener) buckets() objectstoragev1alpha1.BucketInterface { +// InitializeEventRecorder initializes the event recorder +func (b *BucketClaimListener) InitializeEventRecorder(er record.EventRecorder) { + b.eventRecorder = er +} + +func (b *BucketClaimListener) buckets() objectstoragev1alpha1.BucketInterface { if b.bucketClient != nil { return b.bucketClient.ObjectstorageV1alpha1().Buckets() } panic("uninitialized listener") } -func (b *bucketClaimListener) bucketClasses() objectstoragev1alpha1.BucketClassInterface { +func (b *BucketClaimListener) bucketClasses() objectstoragev1alpha1.BucketClassInterface { if b.bucketClient != nil { return b.bucketClient.ObjectstorageV1alpha1().BucketClasses() } panic("uninitialized listener") } -func (b *bucketClaimListener) bucketClaims(namespace string) objectstoragev1alpha1.BucketClaimInterface { +func (b *BucketClaimListener) bucketClaims(namespace string) objectstoragev1alpha1.BucketClaimInterface { if b.bucketClient != nil { return b.bucketClient.ObjectstorageV1alpha1().BucketClaims(namespace) } panic("uninitialized listener") } + +// recordEvent during the processing of the objects +func (b *BucketClaimListener) recordEvent(subject runtime.Object, eventtype, reason, message string) { + if b.eventRecorder == nil { + return + } + b.eventRecorder.Event(subject, eventtype, reason, message) +} diff --git a/pkg/bucketclaim/bucketclaim_test.go b/pkg/bucketclaim/bucketclaim_test.go index f377a78d..e010c962 100644 --- a/pkg/bucketclaim/bucketclaim_test.go +++ b/pkg/bucketclaim/bucketclaim_test.go @@ -6,6 +6,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes/fake" + "k8s.io/client-go/tools/record" types "sigs.k8s.io/container-object-storage-interface-api/apis/objectstorage/v1alpha1" bucketclientset "sigs.k8s.io/container-object-storage-interface-api/client/clientset/versioned/fake" @@ -84,10 +85,12 @@ func runCreateBucket(t *testing.T, name string) { client := bucketclientset.NewSimpleClientset() kubeClient := fake.NewSimpleClientset() + eventRecorder := record.NewFakeRecorder(3) listener := NewBucketClaimListener() listener.InitializeKubeClient(kubeClient) listener.InitializeBucketClient(client) + listener.InitializeEventRecorder(eventRecorder) bucketclass, err := util.CreateBucketClass(ctx, client, &goldClass) if err != nil { @@ -127,10 +130,12 @@ func runCreateBucketWithMultipleBR(t *testing.T, name string) { client := bucketclientset.NewSimpleClientset() kubeClient := fake.NewSimpleClientset() + eventRecorder := record.NewFakeRecorder(3) listener := NewBucketClaimListener() listener.InitializeKubeClient(kubeClient) listener.InitializeBucketClient(client) + listener.InitializeEventRecorder(eventRecorder) bucketclass, err := util.CreateBucketClass(ctx, client, &goldClass) if err != nil { @@ -181,10 +186,12 @@ func runCreateBucketIdempotency(t *testing.T, name string) { client := bucketclientset.NewSimpleClientset() kubeClient := fake.NewSimpleClientset() + eventRecorder := record.NewFakeRecorder(3) listener := NewBucketClaimListener() listener.InitializeKubeClient(kubeClient) listener.InitializeBucketClient(client) + listener.InitializeEventRecorder(eventRecorder) bucketclass, err := util.CreateBucketClass(ctx, client, &goldClass) if err != nil { From 0260e7560c8c550b25bd0d1b9318f7de02c235b6 Mon Sep 17 00:00:00 2001 From: Jiffin Tony Thottan Date: Mon, 12 Jun 2023 15:49:48 +0530 Subject: [PATCH 208/242] Introduce revoke_access_context in DriverRevokeBucketAccessRequest The BucketAccessClass's opaque field may required by the driver to perform operations for revoking the permissions, hence adding it as revoke_access_context in the DriverRevokeBucketAccessRequest. Signed-off-by: Jiffin Tony Thottan --- cosi.pb.go | 284 +++++++++++++++++++++++++++++------------------------ cosi.proto | 11 ++- spec.md | 5 + 3 files changed, 168 insertions(+), 132 deletions(-) diff --git a/cosi.pb.go b/cosi.pb.go index f7e3a19b..6e1aaa7e 100644 --- a/cosi.pb.go +++ b/cosi.pb.go @@ -371,6 +371,7 @@ type Protocol struct { unknownFields protoimpl.UnknownFields // Types that are assignable to Type: + // // *Protocol_S3 // *Protocol_AzureBlob // *Protocol_Gcs @@ -972,6 +973,10 @@ type DriverRevokeBucketAccessRequest struct { // This field is REQUIRED // This is the account_id that is having its access revoked. AccountId string `protobuf:"bytes,2,opt,name=account_id,json=accountId,proto3" json:"account_id,omitempty"` + // This field is OPTIONAL + // The caller should treat the values in revoke_access_context as opaque. + // The receiver is responsible for parsing and validating the values. + RevokeAccessContext map[string]string `protobuf:"bytes,3,rep,name=revoke_access_context,json=revokeAccessContext,proto3" json:"revoke_access_context,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *DriverRevokeBucketAccessRequest) Reset() { @@ -1020,6 +1025,13 @@ func (x *DriverRevokeBucketAccessRequest) GetAccountId() string { return "" } +func (x *DriverRevokeBucketAccessRequest) GetRevokeAccessContext() map[string]string { + if x != nil { + return x.RevokeAccessContext + } + return nil +} + type DriverRevokeBucketAccessResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1306,102 +1318,114 @@ var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDesc 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x5d, 0x0a, 0x1f, 0x44, 0x72, 0x69, 0x76, 0x65, - 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x75, - 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, - 0x75, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x22, 0x0a, 0x20, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, - 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x3e, 0x0a, 0x12, 0x53, 0x33, - 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x14, 0x0a, 0x10, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x69, 0x67, 0x6e, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x33, 0x56, 0x32, 0x10, 0x01, - 0x12, 0x08, 0x0a, 0x04, 0x53, 0x33, 0x56, 0x34, 0x10, 0x02, 0x2a, 0x71, 0x0a, 0x19, 0x41, 0x6e, - 0x6f, 0x6e, 0x79, 0x6d, 0x6f, 0x75, 0x73, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x0a, 0x17, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, - 0x77, 0x6e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, - 0x64, 0x65, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x10, - 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x02, 0x12, - 0x0d, 0x0a, 0x09, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x03, 0x12, 0x0d, - 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x10, 0x04, 0x2a, 0x45, 0x0a, - 0x12, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x19, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x41, 0x75, - 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, - 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x4b, 0x65, 0x79, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x49, - 0x41, 0x4d, 0x10, 0x02, 0x32, 0x68, 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, - 0x12, 0x5c, 0x0a, 0x0d, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x23, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x47, 0x65, 0x74, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x32, 0xde, - 0x03, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x12, 0x6b, - 0x0a, 0x12, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, - 0x63, 0x6b, 0x65, 0x74, 0x12, 0x28, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa2, 0x02, 0x0a, 0x1f, 0x44, 0x72, 0x69, 0x76, + 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x62, + 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x7b, 0x0a, 0x15, 0x72, 0x65, 0x76, 0x6f, 0x6b, + 0x65, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, 0x76, + 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x13, 0x72, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x78, 0x74, 0x1a, 0x46, 0x0a, 0x18, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x22, 0x0a, 0x20, + 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, + 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x2a, 0x3e, 0x0a, 0x12, 0x53, 0x33, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x10, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, + 0x6e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, + 0x53, 0x33, 0x56, 0x32, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x33, 0x56, 0x34, 0x10, 0x02, + 0x2a, 0x71, 0x0a, 0x19, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x6f, 0x75, 0x73, 0x42, 0x75, 0x63, + 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x0a, + 0x17, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x64, 0x4f, + 0x6e, 0x6c, 0x79, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4f, 0x6e, + 0x6c, 0x79, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, + 0x65, 0x10, 0x04, 0x2a, 0x45, 0x0a, 0x12, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x19, 0x55, 0x6e, 0x6b, + 0x6e, 0x6f, 0x77, 0x6e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x4b, 0x65, 0x79, 0x10, + 0x01, 0x12, 0x07, 0x0a, 0x03, 0x49, 0x41, 0x4d, 0x10, 0x02, 0x32, 0x68, 0x0a, 0x08, 0x49, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x5c, 0x0a, 0x0d, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, + 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x23, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x47, 0x65, + 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x63, + 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, + 0x76, 0x65, 0x72, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x32, 0xde, 0x03, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x65, 0x72, 0x12, 0x6b, 0x0a, 0x12, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x28, 0x2e, 0x63, 0x6f, 0x73, + 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, + 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, - 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, - 0x72, 0x69, 0x76, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6b, 0x0a, 0x12, 0x44, - 0x72, 0x69, 0x76, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, - 0x74, 0x12, 0x28, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x6b, 0x0a, 0x12, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x28, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, - 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x6f, - 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, - 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x78, 0x0a, 0x17, 0x44, 0x72, 0x69, 0x76, - 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x12, 0x2d, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, - 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, - 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x7b, 0x0a, 0x18, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, - 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x2e, - 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, - 0x72, 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, - 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, - 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, - 0x72, 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, - 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3a, - 0x3c, 0x0a, 0x0a, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x1c, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xdc, 0x08, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x09, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x45, 0x6e, 0x75, 0x6d, 0x3a, 0x4c, 0x0a, - 0x10, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x12, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xdc, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x3f, 0x0a, 0x0b, 0x63, - 0x6f, 0x73, 0x69, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, - 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xdb, 0x08, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0a, 0x63, 0x6f, 0x73, 0x69, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x3a, 0x3f, 0x0a, 0x0b, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, - 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xdc, 0x08, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0a, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x3a, 0x45, 0x0a, - 0x0d, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0xdc, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x3a, 0x42, 0x0a, 0x0c, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x6d, 0x65, - 0x74, 0x68, 0x6f, 0x64, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xdc, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3a, 0x45, 0x0a, 0x0d, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xdc, 0x08, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, - 0x3a, 0x5a, 0x38, 0x73, 0x69, 0x67, 0x73, 0x2e, 0x6b, 0x38, 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2d, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2d, - 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, - 0x65, 0x2d, 0x73, 0x70, 0x65, 0x63, 0x3b, 0x63, 0x6f, 0x73, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x78, + 0x0a, 0x17, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, + 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x2d, 0x2e, 0x63, 0x6f, 0x73, 0x69, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, + 0x47, 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x47, + 0x72, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7b, 0x0a, 0x18, 0x44, 0x72, 0x69, 0x76, + 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x12, 0x2e, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, + 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x63, 0x6f, 0x73, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x52, 0x65, 0x76, 0x6f, 0x6b, + 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3a, 0x3c, 0x0a, 0x0a, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x65, + 0x6e, 0x75, 0x6d, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0xdc, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x45, + 0x6e, 0x75, 0x6d, 0x3a, 0x4c, 0x0a, 0x10, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x65, 0x6e, 0x75, + 0x6d, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xdc, 0x08, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0e, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x3f, 0x0a, 0x0b, 0x63, 0x6f, 0x73, 0x69, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0xdb, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x63, 0x6f, 0x73, 0x69, 0x53, 0x65, 0x63, 0x72, + 0x65, 0x74, 0x3a, 0x3f, 0x0a, 0x0b, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0xdc, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x46, 0x69, + 0x65, 0x6c, 0x64, 0x3a, 0x45, 0x0a, 0x0d, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xdc, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x42, 0x0a, 0x0c, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xdc, 0x08, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3a, 0x45, + 0x0a, 0x0d, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, + 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0xdc, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, 0x3a, 0x5a, 0x38, 0x73, 0x69, 0x67, 0x73, 0x2e, 0x6b, 0x38, + 0x73, 0x2e, 0x69, 0x6f, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2d, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2d, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2d, 0x73, 0x70, 0x65, 0x63, 0x3b, 0x63, 0x6f, 0x73, + 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1417,7 +1441,7 @@ func file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDesc } var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes = make([]protoimpl.MessageInfo, 20) +var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_msgTypes = make([]protoimpl.MessageInfo, 21) var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_goTypes = []interface{}{ (S3SignatureVersion)(0), // 0: cosi.v1alpha1.S3SignatureVersion (AnonymousBucketAccessMode)(0), // 1: cosi.v1alpha1.AnonymousBucketAccessMode @@ -1442,12 +1466,13 @@ var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_goTypes nil, // 20: cosi.v1alpha1.DriverDeleteBucketRequest.DeleteContextEntry nil, // 21: cosi.v1alpha1.DriverGrantBucketAccessRequest.ParametersEntry nil, // 22: cosi.v1alpha1.DriverGrantBucketAccessResponse.CredentialsEntry - (*descriptor.EnumOptions)(nil), // 23: google.protobuf.EnumOptions - (*descriptor.EnumValueOptions)(nil), // 24: google.protobuf.EnumValueOptions - (*descriptor.FieldOptions)(nil), // 25: google.protobuf.FieldOptions - (*descriptor.MessageOptions)(nil), // 26: google.protobuf.MessageOptions - (*descriptor.MethodOptions)(nil), // 27: google.protobuf.MethodOptions - (*descriptor.ServiceOptions)(nil), // 28: google.protobuf.ServiceOptions + nil, // 23: cosi.v1alpha1.DriverRevokeBucketAccessRequest.RevokeAccessContextEntry + (*descriptor.EnumOptions)(nil), // 24: google.protobuf.EnumOptions + (*descriptor.EnumValueOptions)(nil), // 25: google.protobuf.EnumValueOptions + (*descriptor.FieldOptions)(nil), // 26: google.protobuf.FieldOptions + (*descriptor.MessageOptions)(nil), // 27: google.protobuf.MessageOptions + (*descriptor.MethodOptions)(nil), // 28: google.protobuf.MethodOptions + (*descriptor.ServiceOptions)(nil), // 29: google.protobuf.ServiceOptions } var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_depIdxs = []int32{ 0, // 0: cosi.v1alpha1.S3.signature_version:type_name -> cosi.v1alpha1.S3SignatureVersion @@ -1461,29 +1486,30 @@ var file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_depIdxs 2, // 8: cosi.v1alpha1.DriverGrantBucketAccessRequest.authentication_type:type_name -> cosi.v1alpha1.AuthenticationType 21, // 9: cosi.v1alpha1.DriverGrantBucketAccessRequest.parameters:type_name -> cosi.v1alpha1.DriverGrantBucketAccessRequest.ParametersEntry 22, // 10: cosi.v1alpha1.DriverGrantBucketAccessResponse.credentials:type_name -> cosi.v1alpha1.DriverGrantBucketAccessResponse.CredentialsEntry - 7, // 11: cosi.v1alpha1.DriverGrantBucketAccessResponse.CredentialsEntry.value:type_name -> cosi.v1alpha1.CredentialDetails - 23, // 12: cosi.v1alpha1.alpha_enum:extendee -> google.protobuf.EnumOptions - 24, // 13: cosi.v1alpha1.alpha_enum_value:extendee -> google.protobuf.EnumValueOptions - 25, // 14: cosi.v1alpha1.cosi_secret:extendee -> google.protobuf.FieldOptions - 25, // 15: cosi.v1alpha1.alpha_field:extendee -> google.protobuf.FieldOptions - 26, // 16: cosi.v1alpha1.alpha_message:extendee -> google.protobuf.MessageOptions - 27, // 17: cosi.v1alpha1.alpha_method:extendee -> google.protobuf.MethodOptions - 28, // 18: cosi.v1alpha1.alpha_service:extendee -> google.protobuf.ServiceOptions - 8, // 19: cosi.v1alpha1.Identity.DriverGetInfo:input_type -> cosi.v1alpha1.DriverGetInfoRequest - 10, // 20: cosi.v1alpha1.Provisioner.DriverCreateBucket:input_type -> cosi.v1alpha1.DriverCreateBucketRequest - 12, // 21: cosi.v1alpha1.Provisioner.DriverDeleteBucket:input_type -> cosi.v1alpha1.DriverDeleteBucketRequest - 14, // 22: cosi.v1alpha1.Provisioner.DriverGrantBucketAccess:input_type -> cosi.v1alpha1.DriverGrantBucketAccessRequest - 16, // 23: cosi.v1alpha1.Provisioner.DriverRevokeBucketAccess:input_type -> cosi.v1alpha1.DriverRevokeBucketAccessRequest - 9, // 24: cosi.v1alpha1.Identity.DriverGetInfo:output_type -> cosi.v1alpha1.DriverGetInfoResponse - 11, // 25: cosi.v1alpha1.Provisioner.DriverCreateBucket:output_type -> cosi.v1alpha1.DriverCreateBucketResponse - 13, // 26: cosi.v1alpha1.Provisioner.DriverDeleteBucket:output_type -> cosi.v1alpha1.DriverDeleteBucketResponse - 15, // 27: cosi.v1alpha1.Provisioner.DriverGrantBucketAccess:output_type -> cosi.v1alpha1.DriverGrantBucketAccessResponse - 17, // 28: cosi.v1alpha1.Provisioner.DriverRevokeBucketAccess:output_type -> cosi.v1alpha1.DriverRevokeBucketAccessResponse - 24, // [24:29] is the sub-list for method output_type - 19, // [19:24] is the sub-list for method input_type - 19, // [19:19] is the sub-list for extension type_name - 12, // [12:19] is the sub-list for extension extendee - 0, // [0:12] is the sub-list for field type_name + 23, // 11: cosi.v1alpha1.DriverRevokeBucketAccessRequest.revoke_access_context:type_name -> cosi.v1alpha1.DriverRevokeBucketAccessRequest.RevokeAccessContextEntry + 7, // 12: cosi.v1alpha1.DriverGrantBucketAccessResponse.CredentialsEntry.value:type_name -> cosi.v1alpha1.CredentialDetails + 24, // 13: cosi.v1alpha1.alpha_enum:extendee -> google.protobuf.EnumOptions + 25, // 14: cosi.v1alpha1.alpha_enum_value:extendee -> google.protobuf.EnumValueOptions + 26, // 15: cosi.v1alpha1.cosi_secret:extendee -> google.protobuf.FieldOptions + 26, // 16: cosi.v1alpha1.alpha_field:extendee -> google.protobuf.FieldOptions + 27, // 17: cosi.v1alpha1.alpha_message:extendee -> google.protobuf.MessageOptions + 28, // 18: cosi.v1alpha1.alpha_method:extendee -> google.protobuf.MethodOptions + 29, // 19: cosi.v1alpha1.alpha_service:extendee -> google.protobuf.ServiceOptions + 8, // 20: cosi.v1alpha1.Identity.DriverGetInfo:input_type -> cosi.v1alpha1.DriverGetInfoRequest + 10, // 21: cosi.v1alpha1.Provisioner.DriverCreateBucket:input_type -> cosi.v1alpha1.DriverCreateBucketRequest + 12, // 22: cosi.v1alpha1.Provisioner.DriverDeleteBucket:input_type -> cosi.v1alpha1.DriverDeleteBucketRequest + 14, // 23: cosi.v1alpha1.Provisioner.DriverGrantBucketAccess:input_type -> cosi.v1alpha1.DriverGrantBucketAccessRequest + 16, // 24: cosi.v1alpha1.Provisioner.DriverRevokeBucketAccess:input_type -> cosi.v1alpha1.DriverRevokeBucketAccessRequest + 9, // 25: cosi.v1alpha1.Identity.DriverGetInfo:output_type -> cosi.v1alpha1.DriverGetInfoResponse + 11, // 26: cosi.v1alpha1.Provisioner.DriverCreateBucket:output_type -> cosi.v1alpha1.DriverCreateBucketResponse + 13, // 27: cosi.v1alpha1.Provisioner.DriverDeleteBucket:output_type -> cosi.v1alpha1.DriverDeleteBucketResponse + 15, // 28: cosi.v1alpha1.Provisioner.DriverGrantBucketAccess:output_type -> cosi.v1alpha1.DriverGrantBucketAccessResponse + 17, // 29: cosi.v1alpha1.Provisioner.DriverRevokeBucketAccess:output_type -> cosi.v1alpha1.DriverRevokeBucketAccessResponse + 25, // [25:30] is the sub-list for method output_type + 20, // [20:25] is the sub-list for method input_type + 20, // [20:20] is the sub-list for extension type_name + 13, // [13:20] is the sub-list for extension extendee + 0, // [0:13] is the sub-list for field type_name } func init() { file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_init() } @@ -1684,7 +1710,7 @@ func file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_init() GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_sigs_k8s_io_container_object_storage_interface_spec_cosi_proto_rawDesc, NumEnums: 3, - NumMessages: 20, + NumMessages: 21, NumExtensions: 7, NumServices: 2, }, @@ -1790,8 +1816,8 @@ var _Identity_serviceDesc = grpc.ServiceDesc{ type ProvisionerClient interface { // This call is made to create the bucket in the backend. // This call is idempotent - // 1. If a bucket that matches both name and parameters already exists, then OK (success) must be returned. - // 2. If a bucket by same name, but different parameters is provided, then the appropriate error code ALREADY_EXISTS must be returned. + // 1. If a bucket that matches both name and parameters already exists, then OK (success) must be returned. + // 2. If a bucket by same name, but different parameters is provided, then the appropriate error code ALREADY_EXISTS must be returned. DriverCreateBucket(ctx context.Context, in *DriverCreateBucketRequest, opts ...grpc.CallOption) (*DriverCreateBucketResponse, error) // This call is made to delete the bucket in the backend. // If the bucket has already been deleted, then no error should be returned. @@ -1851,8 +1877,8 @@ func (c *provisionerClient) DriverRevokeBucketAccess(ctx context.Context, in *Dr type ProvisionerServer interface { // This call is made to create the bucket in the backend. // This call is idempotent - // 1. If a bucket that matches both name and parameters already exists, then OK (success) must be returned. - // 2. If a bucket by same name, but different parameters is provided, then the appropriate error code ALREADY_EXISTS must be returned. + // 1. If a bucket that matches both name and parameters already exists, then OK (success) must be returned. + // 2. If a bucket by same name, but different parameters is provided, then the appropriate error code ALREADY_EXISTS must be returned. DriverCreateBucket(context.Context, *DriverCreateBucketRequest) (*DriverCreateBucketResponse, error) // This call is made to delete the bucket in the backend. // If the bucket has already been deleted, then no error should be returned. diff --git a/cosi.proto b/cosi.proto index b2164ce5..ca55a5ff 100644 --- a/cosi.proto +++ b/cosi.proto @@ -160,7 +160,7 @@ message DriverCreateBucketRequest { string name = 1; // This field is OPTIONAL - // The caller should treat the values in parameters as opaque. + // The caller should treat the values in parameters as opaque. // The receiver is responsible for parsing and validating the values. map parameters = 2; } @@ -182,7 +182,7 @@ message DriverDeleteBucketRequest { string bucket_id = 1; // This field is OPTIONAL - // The caller should treat the values in delete_context as opaque. + // The caller should treat the values in delete_context as opaque. // The receiver is responsible for parsing and validating the values. map delete_context = 2; } @@ -207,7 +207,7 @@ message DriverGrantBucketAccessRequest { AuthenticationType authentication_type = 3; // This field is OPTIONAL - // The caller should treat the values in parameters as opaque. + // The caller should treat the values in parameters as opaque. // The receiver is responsible for parsing and validating the values. map parameters = 4; } @@ -232,6 +232,11 @@ message DriverRevokeBucketAccessRequest { // This field is REQUIRED // This is the account_id that is having its access revoked. string account_id = 2; + + // This field is OPTIONAL + // The caller should treat the values in revoke_access_context as opaque. + // The receiver is responsible for parsing and validating the values. + map revoke_access_context = 3; } message DriverRevokeBucketAccessResponse { diff --git a/spec.md b/spec.md index 4b78914e..bbb1e47a 100644 --- a/spec.md +++ b/spec.md @@ -359,6 +359,11 @@ message DriverRevokeBucketAccessRequest { // This field is REQUIRED // This is the account_id that is having its access revoked. string account_id = 2; + + // This field is OPTIONAL + // The caller should treat the values in revoke_access_context as opaque. + // The receiver is responsible for parsing and validating the values. + map revoke_access_context = 3; } message DriverRevokeBucketAccessResponse { From 8ffd85bf0ed055ac1d0c163773256d3ae601c702 Mon Sep 17 00:00:00 2001 From: Blaine Gardner Date: Tue, 12 Sep 2023 16:37:31 -0600 Subject: [PATCH 209/242] implement mvp release tooling Implement minimum viable release tooling. Tooling has these goals: 1. `make build` target for local development 2. K8s-compliant GCP cloudbuild config for multi-arch release images 3. allow future use of depandabot with little to no change 4. keep build tooling as simple as possible Signed-off-by: Blaine Gardner --- Dockerfile | 32 +++++++++++++++- Makefile | 80 ++++++++++++++++++++++++--------------- cloudbuild.yaml | 39 +++++++++++-------- resources/deployment.yaml | 2 +- 4 files changed, 104 insertions(+), 49 deletions(-) diff --git a/Dockerfile b/Dockerfile index 3d388720..9d8d161c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,36 @@ +# +# BUILDER +# +FROM docker.io/library/golang:1.21.1 AS builder + +WORKDIR /buildroot + +# Cache deps before building and copying source, so that we don't need to re-download +# as much and so that source changes don't invalidate our downloaded layer. +COPY go.mod go.mod +COPY go.sum go.sum +RUN go mod download + +COPY cmd/ cmd/ +COPY pkg/ pkg/ + +ENV CGO_ENABLED=0 + +RUN go build -o artifacts/controller-manager cmd/controller-manager/*.go + + +# +# FINAL IMAGE +# FROM gcr.io/distroless/static:latest + LABEL maintainers="Kubernetes Authors" LABEL description="COSI Controller" -COPY ./bin/controller-manager controller-manager +LABEL org.opencontainers.image.title="COSI Controller" +LABEL org.opencontainers.image.description="Container Object Storage Interface (COSI) Controller" +LABEL org.opencontainers.image.source="https://github.com/kubernetes-sigs/container-object-storage-interface-controller" +LABEL org.opencontainers.image.licenses="APACHE-2.0" + +COPY --from=builder /buildroot/artifacts/controller-manager . ENTRYPOINT ["/controller-manager"] diff --git a/Makefile b/Makefile index c8fb281e..fc1b750c 100644 --- a/Makefile +++ b/Makefile @@ -1,31 +1,49 @@ -# Copyright 2020 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. - -all: reltools build -.PHONY: reltools -reltools: release-tools/build.make -release-tools/build.make: - $(eval CURDIR := $(shell pwd)) - $(eval TMP := $(shell mktemp -d)) - $(shell cd ${TMP} && git clone https://github.com/kubernetes-sigs/container-object-storage-interface-spec) - $(shell cp -r ${TMP}/container-object-storage-interface-spec/release-tools ${CURDIR}/) - $(shell rm -rf ${TMP}) - ln -s release-tools/travis.yml travis.yml - -CMDS=controller-manager - -include release-tools/build.make - -IMAGE_NAME=gcr.io/k8s-staging-sig-storage/objectstorage-controller -IMAGE_TAGS=$(GIT_TAG) +.DEFAULT_GOAL := help +SHELL = /usr/bin/env bash + +# 'go env' vars aren't always available in make environments, so get defaults for needed ones +GOARCH ?= $(shell go env GOARCH) + +## +## ==== ARGS ===== # + +## Container build tool compatible with `docker` API +DOCKER ?= docker + +## Platform for 'build' +PLATFORM ?= linux/$(GOARCH) + +## Platform list for multi-arch 'buildx' build +BUILDX_PLATFORMS ?= linux/amd64,linux/arm64 + +## Image tag for all builds +IMAGE_TAG ?= local/cosi-controller:latest + +## Add additional build args if desired +BUILD_ARGS ?= + +## +## === TARGETS === # + +.PHONY: build +## Build local image for development, defaulting linux/ +build: + # $(DOCKER) build --platform $(PLATFORM) --tag $(IMAGE_TAG) . + true # return true temporarily to allow prow to succeed + +.PHONY: buildx +## Build cross-platform image for release +buildx: + $(DOCKER) buildx build --platform $(BUILDX_PLATFORMS) $(BUILD_ARGS) --tag $(IMAGE_TAG) . + +.PHONY: test +## Test packages +test: + go vet ./... + go test ./... + +# print out lines beginning with double-comments, plus next line as basic help text +.PHONY: help +## Show this help text +help: + @sed -n -e "/^##/{N;s/^/\n/p;}" $(MAKEFILE_LIST) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index 98feb780..f40c1f9a 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -1,21 +1,28 @@ -# See https://cloud.google.com/cloud-build/docs/build-config +# GCloud build docs: https://cloud.google.com/cloud-build/docs/build-config +# Build console: +# https://console.cloud.google.com/gcr/images/k8s-staging-test-infra/global/objectstorage-controller timeout: 3000s +options: + substitution_option: 'ALLOW_LOOSE' + machineType: 'E2_HIGHCPU_8' substitutions: - _IMAGE_NAME: 'gcr.io/k8s-staging-sig-storage/objectstorage-controller' + # GCloud provides som built-in substitution vars: + # https://cloud.google.com/build/docs/configuring-builds/substitute-variable-values + # K8s provides custom substitutions _GIT_TAG and _PULL_BASE_REF: + # https://github.com/kubernetes/test-infra/blob/master/config/jobs/image-pushing/README.md#custom-substitutions _GIT_TAG: '12345' _PULL_BASE_REF: 'master' -options: - substitution_option: ALLOW_LOOSE steps: -- name: "gcr.io/k8s-staging-test-infra/gcb-docker-gcloud:v20221214-1b4dd4d69a" - entrypoint: make - args: ['build'] - env: - - GIT_TAG=${_GIT_TAG} - - PULL_BASE_REF=${_PULL_BASE_REF} -- name: "gcr.io/k8s-staging-test-infra/gcb-docker-gcloud:v20221214-1b4dd4d69a" - entrypoint: make - args: ['push'] - env: - - GIT_TAG=${_GIT_TAG} - - PULL_BASE_REF=${_PULL_BASE_REF} + # it is extremely unclear in GCR docs whether standard gcr.io/cloud-builders/docker builds allow + # building multi-arch image manifests as 'docker buildx build' does; therefore, use make buildx + # target to be certain multi-arch images are released + - name: 'gcr.io/k8s-staging-test-infra/gcb-docker-gcloud:v20230522-312425ae46' + entrypoint: make + args: ['buildx'] + env: + - BUILDX_PLATFORMS='linux/amd64,linux/arm64' + - IMAGE_TAG='gcr.io/k8s-staging-test-infra/objectstorage-controller:${_GIT_TAG}' + - BUILD_ARGS='--tag "gcr.io/k8s-staging-test-infra/objectstorage-controller:latest"' +images: + - gcr.io/k8s-staging-test-infra/objectstorage-controller:${_GIT_TAG} + - gcr.io/k8s-staging-test-infra/objectstorage-controller:latest diff --git a/resources/deployment.yaml b/resources/deployment.yaml index e222fa60..835de47b 100644 --- a/resources/deployment.yaml +++ b/resources/deployment.yaml @@ -31,7 +31,7 @@ spec: serviceAccountName: objectstorage-controller-sa containers: - name: objectstorage-controller - image: gcr.io/k8s-staging-sig-storage/objectstorage-controller:v20221027-v0.1.1-8-g300019f + image: host.minikube.internal:5001/cosi-controller:local-build imagePullPolicy: Always args: - "--v=5" From 7e0b577209b0a57e60fc7e423c77b288c5d0d563 Mon Sep 17 00:00:00 2001 From: Blaine Gardner Date: Wed, 13 Sep 2023 15:16:09 -0600 Subject: [PATCH 210/242] push images using PROJECT_ID in cloudbuild PROJECT_ID is an env var provided by GCP's Cloudbuild automatically. After further investigation, k8s-staging-test-infra does not seem to house any other Kubernetes SIG images. Other SIGs use `gcr.io/$PROJECT_ID` as the repository base for their images. This should work for the COSI controller as well. Signed-off-by: Blaine Gardner --- cloudbuild.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index f40c1f9a..00f76c74 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -21,8 +21,8 @@ steps: args: ['buildx'] env: - BUILDX_PLATFORMS='linux/amd64,linux/arm64' - - IMAGE_TAG='gcr.io/k8s-staging-test-infra/objectstorage-controller:${_GIT_TAG}' - - BUILD_ARGS='--tag "gcr.io/k8s-staging-test-infra/objectstorage-controller:latest"' + - IMAGE_TAG='gcr.io/$PROJECT_ID/objectstorage-controller:${_GIT_TAG}' + - BUILD_ARGS='--tag "gcr.io/$PROJECT_ID/objectstorage-controller:latest"' images: - - gcr.io/k8s-staging-test-infra/objectstorage-controller:${_GIT_TAG} - - gcr.io/k8s-staging-test-infra/objectstorage-controller:latest + - gcr.io/$PROJECT_ID/objectstorage-controller:${_GIT_TAG} + - gcr.io/$PROJECT_ID/objectstorage-controller:latest From 4cb262199724c6510ee80f98cec1b8aab9edccf0 Mon Sep 17 00:00:00 2001 From: Blaine Gardner Date: Wed, 13 Sep 2023 16:48:28 -0600 Subject: [PATCH 211/242] use k8s-staging-sig-storage for cloudbuild The newly apparently correct place to send sig-storage project staging images is k8s-staging-sig-storage. Try building images to that location. Signed-off-by: Blaine Gardner --- cloudbuild.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index 00f76c74..4b15be6e 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -21,8 +21,8 @@ steps: args: ['buildx'] env: - BUILDX_PLATFORMS='linux/amd64,linux/arm64' - - IMAGE_TAG='gcr.io/$PROJECT_ID/objectstorage-controller:${_GIT_TAG}' - - BUILD_ARGS='--tag "gcr.io/$PROJECT_ID/objectstorage-controller:latest"' + - IMAGE_TAG='gcr.io/k8s-staging-sig-storage/objectstorage-controller:${_GIT_TAG}' + - BUILD_ARGS='--tag "gcr.io/k8s-staging-sig-storage/objectstorage-controller:latest"' images: - - gcr.io/$PROJECT_ID/objectstorage-controller:${_GIT_TAG} - - gcr.io/$PROJECT_ID/objectstorage-controller:latest + - gcr.io/k8s-staging-sig-storage/objectstorage-controller:${_GIT_TAG} + - gcr.io/k8s-staging-sig-storage/objectstorage-controller:latest From 854c289999332a79d1c24a36e21eb345a5d6c997 Mon Sep 17 00:00:00 2001 From: Blaine Gardner Date: Thu, 14 Sep 2023 11:19:28 -0600 Subject: [PATCH 212/242] use buildx from cloudbuild directly It is simpler and likely easier to maintain to have the cloudbuild use `docker buildx build ...` directly rather than to rely on a make target. This makes the build tooling more transparent with fewer layers between the build config and the Dockerfile. Signed-off-by: Blaine Gardner --- Makefile | 10 +--------- cloudbuild.yaml | 28 ++++++++++++++-------------- 2 files changed, 15 insertions(+), 23 deletions(-) diff --git a/Makefile b/Makefile index fc1b750c..033c677e 100644 --- a/Makefile +++ b/Makefile @@ -17,10 +17,7 @@ PLATFORM ?= linux/$(GOARCH) BUILDX_PLATFORMS ?= linux/amd64,linux/arm64 ## Image tag for all builds -IMAGE_TAG ?= local/cosi-controller:latest - -## Add additional build args if desired -BUILD_ARGS ?= +IMAGE_TAG ?= cosi-controller:latest ## ## === TARGETS === # @@ -31,11 +28,6 @@ build: # $(DOCKER) build --platform $(PLATFORM) --tag $(IMAGE_TAG) . true # return true temporarily to allow prow to succeed -.PHONY: buildx -## Build cross-platform image for release -buildx: - $(DOCKER) buildx build --platform $(BUILDX_PLATFORMS) $(BUILD_ARGS) --tag $(IMAGE_TAG) . - .PHONY: test ## Test packages test: diff --git a/cloudbuild.yaml b/cloudbuild.yaml index 4b15be6e..f8057d34 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -1,6 +1,5 @@ # GCloud build docs: https://cloud.google.com/cloud-build/docs/build-config -# Build console: -# https://console.cloud.google.com/gcr/images/k8s-staging-test-infra/global/objectstorage-controller +# Builds go to: https://console.cloud.google.com/gcr/images/k8s-staging-test-infra/global/ timeout: 3000s options: substitution_option: 'ALLOW_LOOSE' @@ -10,19 +9,20 @@ substitutions: # https://cloud.google.com/build/docs/configuring-builds/substitute-variable-values # K8s provides custom substitutions _GIT_TAG and _PULL_BASE_REF: # https://github.com/kubernetes/test-infra/blob/master/config/jobs/image-pushing/README.md#custom-substitutions - _GIT_TAG: '12345' - _PULL_BASE_REF: 'master' + _GIT_TAG: '12345' # e.g., vYYYYMMDD-hash, vYYYYMMDD-tag, or vYYYYMMDD-tag-n-ghash + _PULL_BASE_REF: 'master' # e.g., master or release-0.2 for a PR merge, or v0.2 for a tag steps: - # it is extremely unclear in GCR docs whether standard gcr.io/cloud-builders/docker builds allow - # building multi-arch image manifests as 'docker buildx build' does; therefore, use make buildx - # target to be certain multi-arch images are released - - name: 'gcr.io/k8s-staging-test-infra/gcb-docker-gcloud:v20230522-312425ae46' - entrypoint: make - args: ['buildx'] - env: - - BUILDX_PLATFORMS='linux/amd64,linux/arm64' - - IMAGE_TAG='gcr.io/k8s-staging-sig-storage/objectstorage-controller:${_GIT_TAG}' - - BUILD_ARGS='--tag "gcr.io/k8s-staging-sig-storage/objectstorage-controller:latest"' + # based on simple build example + # https://github.com/kubernetes/test-infra/blob/master/config/jobs/image-pushing/README.md + - name: gcr.io/cloud-builders/docker + # entrypoint: # docker by default + args: + - buildx + - build + - --platform="linux/amd64,linux/arm64" + - --tag=gcr.io/k8s-staging-sig-storage/objectstorage-controller:${_GIT_TAG} + - --tag=gcr.io/k8s-staging-sig-storage/objectstorage-controller:latest + - . images: - gcr.io/k8s-staging-sig-storage/objectstorage-controller:${_GIT_TAG} - gcr.io/k8s-staging-sig-storage/objectstorage-controller:latest From ee45c461a2e988cec68f322d7c13c49cceef1ff7 Mon Sep 17 00:00:00 2001 From: Blaine Gardner Date: Thu, 14 Sep 2023 13:39:24 -0600 Subject: [PATCH 213/242] allow cloudbuild to build git tags Use the K8s-/Prow-provided _PULL_BASE_REF substitution variable [1] to build images with tags based on the git commit tag. By the K8s docs, this should work, but it remains to be tested. [1] https://github.com/kubernetes/test-infra/blob/master/config/jobs/image-pushing/README.md#custom-substitutions Signed-off-by: Blaine Gardner --- cloudbuild.yaml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index f8057d34..ea212e66 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -1,5 +1,6 @@ # GCloud build docs: https://cloud.google.com/cloud-build/docs/build-config -# Builds go to: https://console.cloud.google.com/gcr/images/k8s-staging-test-infra/global/ +# Builds go to https://console.cloud.google.com/gcr/images/k8s-staging-test-infra/global/ +# Build logs in https://testgrid.k8s.io/sig-storage-image-build timeout: 3000s options: substitution_option: 'ALLOW_LOOSE' @@ -19,10 +20,15 @@ steps: args: - buildx - build - - --platform="linux/amd64,linux/arm64" + - --platform=linux/amd64,linux/arm64 - --tag=gcr.io/k8s-staging-sig-storage/objectstorage-controller:${_GIT_TAG} + # using _PULL_BASE_REF as a tag will often just build and overwrite the same 'master' tag, + # BUT! if the commit has a git tag, it will build that tag instead. this mechanism allows + # creating the semver-tagged images that will be auto-promoted to release + - --tag=gcr.io/k8s-staging-sig-storage/objectstorage-controller:${_PULL_BASE_REF} - --tag=gcr.io/k8s-staging-sig-storage/objectstorage-controller:latest - . images: - gcr.io/k8s-staging-sig-storage/objectstorage-controller:${_GIT_TAG} + - gcr.io/k8s-staging-sig-storage/objectstorage-controller:${_PULL_BASE_REF} - gcr.io/k8s-staging-sig-storage/objectstorage-controller:latest From fc2824c1e13e220adc3144343658c1082b6cd595 Mon Sep 17 00:00:00 2001 From: Blaine Gardner Date: Thu, 14 Sep 2023 14:43:40 -0600 Subject: [PATCH 214/242] revert accidental image modification in deployment Revert an accidental modification of the deployment image resource. Signed-off-by: Blaine Gardner --- resources/deployment.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/deployment.yaml b/resources/deployment.yaml index 835de47b..e222fa60 100644 --- a/resources/deployment.yaml +++ b/resources/deployment.yaml @@ -31,7 +31,7 @@ spec: serviceAccountName: objectstorage-controller-sa containers: - name: objectstorage-controller - image: host.minikube.internal:5001/cosi-controller:local-build + image: gcr.io/k8s-staging-sig-storage/objectstorage-controller:v20221027-v0.1.1-8-g300019f imagePullPolicy: Always args: - "--v=5" From 90227d25e70a311d1e82c6570529076fa80a4042 Mon Sep 17 00:00:00 2001 From: Blaine Gardner Date: Thu, 14 Sep 2023 16:49:16 -0600 Subject: [PATCH 215/242] set up cloudbuild multi-arch builder before use Cloud builder's default docker install does not set up a multi-arch builder. It's easy to use docker's buildx tools to create a multi-arch-compatible builder. Signed-off-by: Blaine Gardner --- cloudbuild.yaml | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index ea212e66..02083994 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -1,3 +1,4 @@ +# K8s infra build example: https://github.com/kubernetes/test-infra/blob/master/config/jobs/image-pushing/README.md # GCloud build docs: https://cloud.google.com/cloud-build/docs/build-config # Builds go to https://console.cloud.google.com/gcr/images/k8s-staging-test-infra/global/ # Build logs in https://testgrid.k8s.io/sig-storage-image-build @@ -6,29 +7,36 @@ options: substitution_option: 'ALLOW_LOOSE' machineType: 'E2_HIGHCPU_8' substitutions: - # GCloud provides som built-in substitution vars: - # https://cloud.google.com/build/docs/configuring-builds/substitute-variable-values # K8s provides custom substitutions _GIT_TAG and _PULL_BASE_REF: # https://github.com/kubernetes/test-infra/blob/master/config/jobs/image-pushing/README.md#custom-substitutions _GIT_TAG: '12345' # e.g., vYYYYMMDD-hash, vYYYYMMDD-tag, or vYYYYMMDD-tag-n-ghash _PULL_BASE_REF: 'master' # e.g., master or release-0.2 for a PR merge, or v0.2 for a tag + # COSI substitutions: + _IMAGE: objectstorage-controller + _PLATFORMS: linux/amd64,linux/arm64 # add more platforms here if desired steps: - # based on simple build example - # https://github.com/kubernetes/test-infra/blob/master/config/jobs/image-pushing/README.md - - name: gcr.io/cloud-builders/docker - # entrypoint: # docker by default + # based on k8s infra build example and modified to use docker buildx + # buildx refs: https://github.com/docker/buildx/blob/master/docs/reference/buildx.md + - id: set-up-multi-arch-builder-as-default + name: gcr.io/cloud-builders/docker + args: ["buildx", "create", "--use", "--name", "multi-arch", "--platform=${_PLATFORMS}"] + - id: bootstrap-multi-arch-builder + name: gcr.io/cloud-builders/docker + args: ["buildx", "inspect", "--bootstrap"] + - id: do-multi-arch-build + name: gcr.io/cloud-builders/docker args: - buildx - build - - --platform=linux/amd64,linux/arm64 - - --tag=gcr.io/k8s-staging-sig-storage/objectstorage-controller:${_GIT_TAG} + - --platform=${_PLATFORMS} + - --tag=gcr.io/k8s-staging-sig-storage/${_IMAGE}:${_GIT_TAG} # using _PULL_BASE_REF as a tag will often just build and overwrite the same 'master' tag, # BUT! if the commit has a git tag, it will build that tag instead. this mechanism allows # creating the semver-tagged images that will be auto-promoted to release - - --tag=gcr.io/k8s-staging-sig-storage/objectstorage-controller:${_PULL_BASE_REF} - - --tag=gcr.io/k8s-staging-sig-storage/objectstorage-controller:latest + - --tag=gcr.io/k8s-staging-sig-storage/${_IMAGE}:${_PULL_BASE_REF} + - --tag=gcr.io/k8s-staging-sig-storage/${_IMAGE}:latest - . images: - - gcr.io/k8s-staging-sig-storage/objectstorage-controller:${_GIT_TAG} - - gcr.io/k8s-staging-sig-storage/objectstorage-controller:${_PULL_BASE_REF} - - gcr.io/k8s-staging-sig-storage/objectstorage-controller:latest + - gcr.io/k8s-staging-sig-storage/${_IMAGE}:${_GIT_TAG} + - gcr.io/k8s-staging-sig-storage/${_IMAGE}:${_PULL_BASE_REF} + - gcr.io/k8s-staging-sig-storage/${_IMAGE}:latest From 6daf4ce640cf0e2e727f28309490c327e512a195 Mon Sep 17 00:00:00 2001 From: Blaine Gardner Date: Thu, 14 Sep 2023 17:29:44 -0600 Subject: [PATCH 216/242] cloudbuild: use --load flag to allow pushing images The cloud build uses the `docker-container` driver which does not make build images available in the local image store by default -- only in the cache. This means the cloud build process doesn't see the images in order to push them at the end. Use the --load flag to fix this. See: https://docs.docker.com/build/drivers/docker-container/#loading-to-local-image-store Signed-off-by: Blaine Gardner --- cloudbuild.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index 02083994..aa9e89db 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -28,6 +28,7 @@ steps: args: - buildx - build + - --load # https://docs.docker.com/build/drivers/docker-container/#loading-to-local-image-store - --platform=${_PLATFORMS} - --tag=gcr.io/k8s-staging-sig-storage/${_IMAGE}:${_GIT_TAG} # using _PULL_BASE_REF as a tag will often just build and overwrite the same 'master' tag, From bc000d7979e69b712243b314ad44b5e2c12cc38f Mon Sep 17 00:00:00 2001 From: Blaine Gardner Date: Thu, 14 Sep 2023 17:44:22 -0600 Subject: [PATCH 217/242] cloudbuild: push images straight from docker build Using `docker buildx build --load ...` with multi arch builds returns the below error: > error: docker exporter does not currently support exporting manifest lists Use --push instead to push images directy from the docker build. This makes the `images` cloudbuild step unnecessary. Signed-off-by: Blaine Gardner --- cloudbuild.yaml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/cloudbuild.yaml b/cloudbuild.yaml index aa9e89db..6c25e05a 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -28,7 +28,7 @@ steps: args: - buildx - build - - --load # https://docs.docker.com/build/drivers/docker-container/#loading-to-local-image-store + - --push # --load doesn't work with multi-platform builds, so just push from docker build - --platform=${_PLATFORMS} - --tag=gcr.io/k8s-staging-sig-storage/${_IMAGE}:${_GIT_TAG} # using _PULL_BASE_REF as a tag will often just build and overwrite the same 'master' tag, @@ -37,7 +37,3 @@ steps: - --tag=gcr.io/k8s-staging-sig-storage/${_IMAGE}:${_PULL_BASE_REF} - --tag=gcr.io/k8s-staging-sig-storage/${_IMAGE}:latest - . -images: - - gcr.io/k8s-staging-sig-storage/${_IMAGE}:${_GIT_TAG} - - gcr.io/k8s-staging-sig-storage/${_IMAGE}:${_PULL_BASE_REF} - - gcr.io/k8s-staging-sig-storage/${_IMAGE}:latest From 1942868820e329d70dcc304d3bf132e618c666fe Mon Sep 17 00:00:00 2001 From: Blaine Gardner Date: Fri, 15 Sep 2023 12:10:51 -0600 Subject: [PATCH 218/242] tidy up build and make configs Tidy up some minor nits now that the cloudbuild is working. Signed-off-by: Blaine Gardner --- Makefile | 6 +----- cloudbuild.yaml | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 033c677e..91df56a1 100644 --- a/Makefile +++ b/Makefile @@ -13,9 +13,6 @@ DOCKER ?= docker ## Platform for 'build' PLATFORM ?= linux/$(GOARCH) -## Platform list for multi-arch 'buildx' build -BUILDX_PLATFORMS ?= linux/amd64,linux/arm64 - ## Image tag for all builds IMAGE_TAG ?= cosi-controller:latest @@ -25,8 +22,7 @@ IMAGE_TAG ?= cosi-controller:latest .PHONY: build ## Build local image for development, defaulting linux/ build: - # $(DOCKER) build --platform $(PLATFORM) --tag $(IMAGE_TAG) . - true # return true temporarily to allow prow to succeed + $(DOCKER) build --platform $(PLATFORM) --tag $(IMAGE_TAG) . .PHONY: test ## Test packages diff --git a/cloudbuild.yaml b/cloudbuild.yaml index 6c25e05a..bd1d6886 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -1,6 +1,6 @@ # K8s infra build example: https://github.com/kubernetes/test-infra/blob/master/config/jobs/image-pushing/README.md # GCloud build docs: https://cloud.google.com/cloud-build/docs/build-config -# Builds go to https://console.cloud.google.com/gcr/images/k8s-staging-test-infra/global/ +# Builds go to https://console.cloud.google.com/gcr/images/k8s-staging-sig-storage/GLOBAL # Build logs in https://testgrid.k8s.io/sig-storage-image-build timeout: 3000s options: From af53be682a287653ec380c7bdc477506ac42aad1 Mon Sep 17 00:00:00 2001 From: Blaine Gardner Date: Wed, 20 Sep 2023 09:11:07 -0600 Subject: [PATCH 219/242] add dependabot config for gomod and docker Use dependabot for updating Go module dependencies and docker container images. Signed-off-by: Blaine Gardner --- .github/dependabot.yml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..64972d37 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,24 @@ +version: 2 +enable-beta-ecosystems: true +updates: + + - package-ecosystem: "gomod" + directory: "/" + schedule: + interval: "weekly" + groups: # batch updates together for fewer dependabot PRs + golang-dependencies: + patterns: + - "github.com/golang*" + k8s-dependencies: + patterns: + - "k8s.io*" + - "sigs.k8s.io*" + github-dependencies: + patterns: + - "github.com*" + + - package-ecosystem: "docker" + directory: "/" + schedule: + interval: "weekly" From 74ee318683fcb7219b9444b611aaf90dd066a205 Mon Sep 17 00:00:00 2001 From: Blaine Gardner Date: Thu, 21 Sep 2023 13:23:53 -0600 Subject: [PATCH 220/242] remove unused prow config Remove the unused `.prow.sh` file. Signed-off-by: Blaine Gardner --- .prow.sh | 6 ------ 1 file changed, 6 deletions(-) delete mode 100755 .prow.sh diff --git a/.prow.sh b/.prow.sh deleted file mode 100755 index 682601dd..00000000 --- a/.prow.sh +++ /dev/null @@ -1,6 +0,0 @@ -#! /bin/bash - -. release-tools/prow.sh - -main - From 82e127f0a41f3437d561d596324951d1817c751e Mon Sep 17 00:00:00 2001 From: Blaine Gardner Date: Thu, 21 Sep 2023 13:26:39 -0600 Subject: [PATCH 221/242] separate controller-runtime in dependabot config Controller-Runtime, based on history in the Rook project [1], makes breaking API changes more often than other k8s projects. Separating these updates from the other k8s updates will help keep most dependabot PRs merge-able. [1] github.com/rook/rook Signed-off-by: Blaine Gardner --- .github/dependabot.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 64972d37..eb774b36 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -14,6 +14,9 @@ updates: patterns: - "k8s.io*" - "sigs.k8s.io*" + exclude-patterns: + # controller-runtime has history of breaking API changes more often than other k8s projects + - "sigs.k8s.io/controller-runtime" github-dependencies: patterns: - "github.com*" From 9729752ff75da3b5f2ad3f73e02dc6e2ae568e67 Mon Sep 17 00:00:00 2001 From: Mateusz Urbanek Date: Wed, 18 Oct 2023 14:17:25 +0200 Subject: [PATCH 222/242] feat: replace API --- go.mod | 2 ++ go.sum | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index fd0cdf1a..91a77dab 100644 --- a/go.mod +++ b/go.mod @@ -2,6 +2,8 @@ module sigs.k8s.io/container-object-storage-interface-controller go 1.18 +replace sigs.k8s.io/container-object-storage-interface-api => github.com/shanduur/container-object-storage-interface-api v0.0.0-20231018120758-aef9fef22070 + require ( github.com/spf13/cobra v1.4.0 github.com/spf13/viper v1.12.0 diff --git a/go.sum b/go.sum index 65ae442c..f485e6ea 100644 --- a/go.sum +++ b/go.sum @@ -272,6 +272,8 @@ github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0 github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/shanduur/container-object-storage-interface-api v0.0.0-20231018120758-aef9fef22070 h1:johRtfTuppEtm1S/IK1ir88NaXjCOL/8BezwawGRQx0= +github.com/shanduur/container-object-storage-interface-api v0.0.0-20231018120758-aef9fef22070/go.mod h1:YiB+i/UGkzqgODDhRG3u7jkbWkQcoUeLEJ7hwOT/2Qk= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= @@ -706,8 +708,6 @@ k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/ rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= 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/container-object-storage-interface-api v0.0.0-20220806044417-5d7517114883 h1:CtqK7l2m9Atw8L5daJdsXvVgxxvQkRBbJbUz7NiadD8= -sigs.k8s.io/container-object-storage-interface-api v0.0.0-20220806044417-5d7517114883/go.mod h1:YiB+i/UGkzqgODDhRG3u7jkbWkQcoUeLEJ7hwOT/2Qk= sigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio= sigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0= sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y= From 0e3520cf485ed15fd804fad101827fad57263c9b Mon Sep 17 00:00:00 2001 From: Mateusz Urbanek Date: Wed, 18 Oct 2023 14:47:30 +0200 Subject: [PATCH 223/242] feat: fix panic --- go.mod | 2 +- go.sum | 4 ++-- resources/deployment.yaml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 91a77dab..4ac42513 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,7 @@ module sigs.k8s.io/container-object-storage-interface-controller go 1.18 -replace sigs.k8s.io/container-object-storage-interface-api => github.com/shanduur/container-object-storage-interface-api v0.0.0-20231018120758-aef9fef22070 +replace sigs.k8s.io/container-object-storage-interface-api => github.com/shanduur/container-object-storage-interface-api v0.0.0-20231018124508-45d4532cbbfc require ( github.com/spf13/cobra v1.4.0 diff --git a/go.sum b/go.sum index f485e6ea..efbfbe82 100644 --- a/go.sum +++ b/go.sum @@ -272,8 +272,8 @@ github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0 github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/shanduur/container-object-storage-interface-api v0.0.0-20231018120758-aef9fef22070 h1:johRtfTuppEtm1S/IK1ir88NaXjCOL/8BezwawGRQx0= -github.com/shanduur/container-object-storage-interface-api v0.0.0-20231018120758-aef9fef22070/go.mod h1:YiB+i/UGkzqgODDhRG3u7jkbWkQcoUeLEJ7hwOT/2Qk= +github.com/shanduur/container-object-storage-interface-api v0.0.0-20231018124508-45d4532cbbfc h1:BxGRby1y7TlyeLbNMwnDp6BMcrPB4jM+MdfG+S7X0Qo= +github.com/shanduur/container-object-storage-interface-api v0.0.0-20231018124508-45d4532cbbfc/go.mod h1:YiB+i/UGkzqgODDhRG3u7jkbWkQcoUeLEJ7hwOT/2Qk= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= diff --git a/resources/deployment.yaml b/resources/deployment.yaml index e222fa60..7d106096 100644 --- a/resources/deployment.yaml +++ b/resources/deployment.yaml @@ -31,7 +31,7 @@ spec: serviceAccountName: objectstorage-controller-sa containers: - name: objectstorage-controller - image: gcr.io/k8s-staging-sig-storage/objectstorage-controller:v20221027-v0.1.1-8-g300019f + image: docker.io/shanduur/cosi-controller:latest imagePullPolicy: Always args: - "--v=5" From d9f02c30c57db02ce2c0eb68d1ee566c9d205bd6 Mon Sep 17 00:00:00 2001 From: Mateusz Urbanek Date: Wed, 18 Oct 2023 15:55:30 +0200 Subject: [PATCH 224/242] feat: API registration --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 4ac42513..46718666 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,7 @@ module sigs.k8s.io/container-object-storage-interface-controller go 1.18 -replace sigs.k8s.io/container-object-storage-interface-api => github.com/shanduur/container-object-storage-interface-api v0.0.0-20231018124508-45d4532cbbfc +replace sigs.k8s.io/container-object-storage-interface-api => github.com/shanduur/container-object-storage-interface-api v0.0.0-20231018134926-df1d34a6d9e9 require ( github.com/spf13/cobra v1.4.0 diff --git a/go.sum b/go.sum index efbfbe82..b02b7566 100644 --- a/go.sum +++ b/go.sum @@ -272,8 +272,8 @@ github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0 github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/shanduur/container-object-storage-interface-api v0.0.0-20231018124508-45d4532cbbfc h1:BxGRby1y7TlyeLbNMwnDp6BMcrPB4jM+MdfG+S7X0Qo= -github.com/shanduur/container-object-storage-interface-api v0.0.0-20231018124508-45d4532cbbfc/go.mod h1:YiB+i/UGkzqgODDhRG3u7jkbWkQcoUeLEJ7hwOT/2Qk= +github.com/shanduur/container-object-storage-interface-api v0.0.0-20231018134926-df1d34a6d9e9 h1:ASp7U0yEVMR1/OOUI/KbwgWNh43oSoV90jkpyx2PykY= +github.com/shanduur/container-object-storage-interface-api v0.0.0-20231018134926-df1d34a6d9e9/go.mod h1:YiB+i/UGkzqgODDhRG3u7jkbWkQcoUeLEJ7hwOT/2Qk= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= From e40e69fb8c5cd095077fcfb413fad95a0bf4c720 Mon Sep 17 00:00:00 2001 From: Mateusz Urbanek Date: Thu, 16 Nov 2023 18:29:10 +0100 Subject: [PATCH 225/242] chore: update API Signed-off-by: Mateusz Urbanek --- go.mod | 4 +--- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 46718666..966d7164 100644 --- a/go.mod +++ b/go.mod @@ -2,8 +2,6 @@ module sigs.k8s.io/container-object-storage-interface-controller go 1.18 -replace sigs.k8s.io/container-object-storage-interface-api => github.com/shanduur/container-object-storage-interface-api v0.0.0-20231018134926-df1d34a6d9e9 - require ( github.com/spf13/cobra v1.4.0 github.com/spf13/viper v1.12.0 @@ -11,7 +9,7 @@ require ( k8s.io/apimachinery v0.24.2 k8s.io/client-go v0.24.2 k8s.io/klog/v2 v2.70.1 - sigs.k8s.io/container-object-storage-interface-api v0.0.0-20220806044417-5d7517114883 + sigs.k8s.io/container-object-storage-interface-api v0.1.1-0.20231116171305-97700454b010 sigs.k8s.io/controller-runtime v0.12.3 ) diff --git a/go.sum b/go.sum index b02b7566..77afabec 100644 --- a/go.sum +++ b/go.sum @@ -272,8 +272,6 @@ github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0 github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/shanduur/container-object-storage-interface-api v0.0.0-20231018134926-df1d34a6d9e9 h1:ASp7U0yEVMR1/OOUI/KbwgWNh43oSoV90jkpyx2PykY= -github.com/shanduur/container-object-storage-interface-api v0.0.0-20231018134926-df1d34a6d9e9/go.mod h1:YiB+i/UGkzqgODDhRG3u7jkbWkQcoUeLEJ7hwOT/2Qk= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= @@ -708,6 +706,8 @@ k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/ rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= 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/container-object-storage-interface-api v0.1.1-0.20231116171305-97700454b010 h1:8Lw3AyLbbkRGlB9GRu9prtSPEp8DLlXjUzaXN6b9gxM= +sigs.k8s.io/container-object-storage-interface-api v0.1.1-0.20231116171305-97700454b010/go.mod h1:YiB+i/UGkzqgODDhRG3u7jkbWkQcoUeLEJ7hwOT/2Qk= sigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio= sigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0= sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y= From 83a394bea316db81b03a15e2fcaa695cd1132ba4 Mon Sep 17 00:00:00 2001 From: Mateusz Urbanek Date: Thu, 16 Nov 2023 18:36:01 +0100 Subject: [PATCH 226/242] fix: revert deployment change Signed-off-by: Mateusz Urbanek --- resources/deployment.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/deployment.yaml b/resources/deployment.yaml index 7d106096..e222fa60 100644 --- a/resources/deployment.yaml +++ b/resources/deployment.yaml @@ -31,7 +31,7 @@ spec: serviceAccountName: objectstorage-controller-sa containers: - name: objectstorage-controller - image: docker.io/shanduur/cosi-controller:latest + image: gcr.io/k8s-staging-sig-storage/objectstorage-controller:v20221027-v0.1.1-8-g300019f imagePullPolicy: Always args: - "--v=5" From cb0dca9b95f748c1d342d5fdad9acba5c97eade9 Mon Sep 17 00:00:00 2001 From: Mateusz Urbanek Date: Thu, 30 Nov 2023 19:24:07 +0100 Subject: [PATCH 227/242] fix: adjust case according to go std --- pkg/util/const.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/util/const.go b/pkg/util/const.go index 0aa9bf7d..0bc2b49c 100644 --- a/pkg/util/const.go +++ b/pkg/util/const.go @@ -10,7 +10,7 @@ const ( var ( // Error codes that the central controller will return - ErrBucketAlreadyExists = errors.New("A bucket already existing that matches the bucket claim") - ErrInvalidBucketClass = errors.New("Cannot find bucket class with the name specified in the bucket claim") - ErrNotImplemented = errors.New("Operation Not Implemented") + ErrBucketAlreadyExists = errors.New("a bucket already existing that matches the bucket claim") + ErrInvalidBucketClass = errors.New("cannot find bucket class with the name specified in the bucket claim") + ErrNotImplemented = errors.New("operation not implemented") ) From 8a308774e8e7d1e0306cac8369f56a5fa38c870e Mon Sep 17 00:00:00 2001 From: Mateusz Urbanek Date: Thu, 30 Nov 2023 19:38:00 +0100 Subject: [PATCH 228/242] fix(review/1): added event constants Signed-off-by: Mateusz Urbanek --- pkg/bucketclaim/bucketclaim.go | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/pkg/bucketclaim/bucketclaim.go b/pkg/bucketclaim/bucketclaim.go index 539a27f6..b5026e56 100644 --- a/pkg/bucketclaim/bucketclaim.go +++ b/pkg/bucketclaim/bucketclaim.go @@ -10,13 +10,12 @@ import ( kubeclientset "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/record" "k8s.io/klog/v2" - "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - "sigs.k8s.io/container-object-storage-interface-api/apis/objectstorage/v1alpha1" bucketclientset "sigs.k8s.io/container-object-storage-interface-api/client/clientset/versioned" objectstoragev1alpha1 "sigs.k8s.io/container-object-storage-interface-api/client/clientset/versioned/typed/objectstorage/v1alpha1" - + "sigs.k8s.io/container-object-storage-interface-api/controller/events" "sigs.k8s.io/container-object-storage-interface-controller/pkg/util" + "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" ) // BucketClaimListener is a resource handler for bucket requests objects @@ -43,7 +42,7 @@ func (b *BucketClaimListener) Add(ctx context.Context, bucketClaim *v1alpha1.Buc if err != nil { switch err { case util.ErrInvalidBucketClass: - klog.V(3).ErrorS(util.ErrInvalidBucketClass, + klog.V(3).ErrorS(err, "bucketClaim", bucketClaim.ObjectMeta.Name, "ns", bucketClaim.ObjectMeta.Namespace, "bucketClassName", bucketClaim.Spec.BucketClassName) @@ -108,17 +107,11 @@ func (b *BucketClaimListener) Delete(ctx context.Context, bucketClaim *v1alpha1. // provisionBucketClaimOperation attempts to provision a bucket for a given bucketClaim. // -// Recorded events -// -// InvalidBucket - Bucket provided in the BucketClaim does not exist -// InvalidBucketClass - BucketClass provided in the BucketClaim does not exist -// // Return values -// -// nil - BucketClaim successfully processed -// ErrInvalidBucketClass - BucketClass does not exist [requeue'd with exponential backoff] -// ErrBucketAlreadyExists - BucketClaim already processed -// non-nil err - Internal error [requeue'd with exponential backoff] +// - nil - BucketClaim successfully processed +// - ErrInvalidBucketClass - BucketClass does not exist [requeue'd with exponential backoff] +// - ErrBucketAlreadyExists - BucketClaim already processed +// - non-nil err - Internal error [requeue'd with exponential backoff] func (b *BucketClaimListener) provisionBucketClaimOperation(ctx context.Context, inputBucketClaim *v1alpha1.BucketClaim) error { bucketClaim := inputBucketClaim.DeepCopy() if bucketClaim.Status.BucketReady { @@ -132,7 +125,7 @@ func (b *BucketClaimListener) provisionBucketClaimOperation(ctx context.Context, bucketName = bucketClaim.Spec.ExistingBucketName bucket, err := b.buckets().Get(ctx, bucketName, metav1.GetOptions{}) if kubeerrors.IsNotFound(err) { - b.recordEvent(inputBucketClaim, v1.EventTypeWarning, "InvalidBucket", "Bucket provided in the BucketClaim does not exist") + b.recordEvent(inputBucketClaim, v1.EventTypeWarning, events.ProvisioningFailed, "Bucket provided in the BucketClaim does not exist") return err } else if err != nil { klog.V(3).ErrorS(err, "Get Bucket with ExistingBucketName error", "name", bucketClaim.Spec.ExistingBucketName) @@ -167,11 +160,11 @@ func (b *BucketClaimListener) provisionBucketClaimOperation(ctx context.Context, bucketClass, err := b.bucketClasses().Get(ctx, bucketClassName, metav1.GetOptions{}) if kubeerrors.IsNotFound(err) { - b.recordEvent(inputBucketClaim, v1.EventTypeWarning, "InvalidBucketClass", "BucketClass provided in the BucketClaim does not exist") + b.recordEvent(inputBucketClaim, v1.EventTypeWarning, events.ProvisioningFailed, "BucketClass provided in the BucketClaim does not exist") return util.ErrInvalidBucketClass } else if err != nil { klog.V(3).ErrorS(err, "Get Bucketclass Error", "name", bucketClassName) - return util.ErrInvalidBucketClass + return err } bucketName = bucketClassName + string(bucketClaim.ObjectMeta.UID) From c06ed1cdd9c8677c2d2783e0fad9e36a11771090 Mon Sep 17 00:00:00 2001 From: Mateusz Urbanek Date: Fri, 8 Dec 2023 20:36:35 +0100 Subject: [PATCH 229/242] fix(review/1): format message Signed-off-by: Mateusz Urbanek --- pkg/bucketclaim/bucketclaim.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/pkg/bucketclaim/bucketclaim.go b/pkg/bucketclaim/bucketclaim.go index b5026e56..498c7e84 100644 --- a/pkg/bucketclaim/bucketclaim.go +++ b/pkg/bucketclaim/bucketclaim.go @@ -2,6 +2,7 @@ package bucketclaim import ( "context" + "fmt" v1 "k8s.io/api/core/v1" kubeerrors "k8s.io/apimachinery/pkg/api/errors" @@ -125,7 +126,7 @@ func (b *BucketClaimListener) provisionBucketClaimOperation(ctx context.Context, bucketName = bucketClaim.Spec.ExistingBucketName bucket, err := b.buckets().Get(ctx, bucketName, metav1.GetOptions{}) if kubeerrors.IsNotFound(err) { - b.recordEvent(inputBucketClaim, v1.EventTypeWarning, events.ProvisioningFailed, "Bucket provided in the BucketClaim does not exist") + b.recordEvent(inputBucketClaim, v1.EventTypeWarning, events.FailedCreateBucket, "Bucket %q provided in the BucketClaim does not exist.", bucketName) return err } else if err != nil { klog.V(3).ErrorS(err, "Get Bucket with ExistingBucketName error", "name", bucketClaim.Spec.ExistingBucketName) @@ -160,7 +161,7 @@ func (b *BucketClaimListener) provisionBucketClaimOperation(ctx context.Context, bucketClass, err := b.bucketClasses().Get(ctx, bucketClassName, metav1.GetOptions{}) if kubeerrors.IsNotFound(err) { - b.recordEvent(inputBucketClaim, v1.EventTypeWarning, events.ProvisioningFailed, "BucketClass provided in the BucketClaim does not exist") + b.recordEvent(inputBucketClaim, v1.EventTypeWarning, events.FailedCreateBucket, "BucketClass %q provided in the BucketClaim does not exist.", bucketClassName) return util.ErrInvalidBucketClass } else if err != nil { klog.V(3).ErrorS(err, "Get Bucketclass Error", "name", bucketClassName) @@ -258,9 +259,9 @@ func (b *BucketClaimListener) bucketClaims(namespace string) objectstoragev1alph } // recordEvent during the processing of the objects -func (b *BucketClaimListener) recordEvent(subject runtime.Object, eventtype, reason, message string) { +func (b *BucketClaimListener) recordEvent(subject runtime.Object, eventtype, reason, message string, args ...any) { if b.eventRecorder == nil { return } - b.eventRecorder.Event(subject, eventtype, reason, message) + b.eventRecorder.Event(subject, eventtype, reason, fmt.Sprintf(message, args...)) } From 6376b6e579674053cda55ca256d8c9ce433f6b4c Mon Sep 17 00:00:00 2001 From: Mateusz Urbanek Date: Fri, 8 Dec 2023 20:52:07 +0100 Subject: [PATCH 230/242] fix: typo in error Co-authored-by: Blaine Gardner Signed-off-by: Mateusz Urbanek --- pkg/util/const.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/util/const.go b/pkg/util/const.go index 0bc2b49c..082d779e 100644 --- a/pkg/util/const.go +++ b/pkg/util/const.go @@ -10,7 +10,7 @@ const ( var ( // Error codes that the central controller will return - ErrBucketAlreadyExists = errors.New("a bucket already existing that matches the bucket claim") + ErrBucketAlreadyExists = errors.New("a bucket already exists that matches the bucket claim") ErrInvalidBucketClass = errors.New("cannot find bucket class with the name specified in the bucket claim") ErrNotImplemented = errors.New("operation not implemented") ) From 3fd9a83099149a2866930f85efa321db7c749a98 Mon Sep 17 00:00:00 2001 From: Mateusz Urbanek Date: Tue, 13 Feb 2024 21:36:54 +0100 Subject: [PATCH 231/242] fix(deps): updated api Signed-off-by: Mateusz Urbanek --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 966d7164..176d1a71 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( k8s.io/apimachinery v0.24.2 k8s.io/client-go v0.24.2 k8s.io/klog/v2 v2.70.1 - sigs.k8s.io/container-object-storage-interface-api v0.1.1-0.20231116171305-97700454b010 + sigs.k8s.io/container-object-storage-interface-api v0.1.1-0.20240208184109-05444273ee49 sigs.k8s.io/controller-runtime v0.12.3 ) diff --git a/go.sum b/go.sum index 77afabec..54fd3bfb 100644 --- a/go.sum +++ b/go.sum @@ -708,6 +708,8 @@ 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/container-object-storage-interface-api v0.1.1-0.20231116171305-97700454b010 h1:8Lw3AyLbbkRGlB9GRu9prtSPEp8DLlXjUzaXN6b9gxM= sigs.k8s.io/container-object-storage-interface-api v0.1.1-0.20231116171305-97700454b010/go.mod h1:YiB+i/UGkzqgODDhRG3u7jkbWkQcoUeLEJ7hwOT/2Qk= +sigs.k8s.io/container-object-storage-interface-api v0.1.1-0.20240208184109-05444273ee49 h1:Ax4j3ThWolmk6yH6jvL3Yf0Fzxe0ZfVuDlSLNILU3GA= +sigs.k8s.io/container-object-storage-interface-api v0.1.1-0.20240208184109-05444273ee49/go.mod h1:YiB+i/UGkzqgODDhRG3u7jkbWkQcoUeLEJ7hwOT/2Qk= sigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio= sigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0= sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y= From a54e17843bbdc34e55d84cd2ff590266893d979c Mon Sep 17 00:00:00 2001 From: Mateusz Urbanek Date: Tue, 13 Feb 2024 21:44:16 +0100 Subject: [PATCH 232/242] test: added scaffolding for testing events Signed-off-by: Mateusz Urbanek --- pkg/bucketclaim/bucketclaim_test.go | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/pkg/bucketclaim/bucketclaim_test.go b/pkg/bucketclaim/bucketclaim_test.go index e010c962..65d04e5e 100644 --- a/pkg/bucketclaim/bucketclaim_test.go +++ b/pkg/bucketclaim/bucketclaim_test.go @@ -5,6 +5,7 @@ import ( "testing" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/kubernetes/fake" "k8s.io/client-go/tools/record" @@ -79,6 +80,28 @@ func TestAddBRIdempotency(t *testing.T) { runCreateBucketIdempotency(t, "addWithMultipleBR") } +// Test recording events +func TestRecordEvents(t *testing.T) { + t.Parallel() + + for _, tc := range []struct { + name string + expectedEvent struct { + subject runtime.Object + reason string + message string + } + }{} { + tc := tc + + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + // TODO: actual test + }) + } +} + func runCreateBucket(t *testing.T, name string) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() From 3749eb6f54a401de8fa67032e7c44f46ffa1bc6a Mon Sep 17 00:00:00 2001 From: Mateusz Urbanek Date: Wed, 14 Feb 2024 21:55:42 +0100 Subject: [PATCH 233/242] test: extended scaffolding Signed-off-by: Mateusz Urbanek --- pkg/bucketclaim/bucketclaim.go | 4 +-- pkg/bucketclaim/bucketclaim_test.go | 53 ++++++++++++++++++++++++----- 2 files changed, 46 insertions(+), 11 deletions(-) diff --git a/pkg/bucketclaim/bucketclaim.go b/pkg/bucketclaim/bucketclaim.go index 498c7e84..dcbb7257 100644 --- a/pkg/bucketclaim/bucketclaim.go +++ b/pkg/bucketclaim/bucketclaim.go @@ -126,7 +126,7 @@ func (b *BucketClaimListener) provisionBucketClaimOperation(ctx context.Context, bucketName = bucketClaim.Spec.ExistingBucketName bucket, err := b.buckets().Get(ctx, bucketName, metav1.GetOptions{}) if kubeerrors.IsNotFound(err) { - b.recordEvent(inputBucketClaim, v1.EventTypeWarning, events.FailedCreateBucket, "Bucket %q provided in the BucketClaim does not exist.", bucketName) + b.recordEvent(inputBucketClaim, v1.EventTypeWarning, events.FailedCreateBucket, "Bucket %v provided in the BucketClaim does not exist.", bucketName) return err } else if err != nil { klog.V(3).ErrorS(err, "Get Bucket with ExistingBucketName error", "name", bucketClaim.Spec.ExistingBucketName) @@ -161,7 +161,7 @@ func (b *BucketClaimListener) provisionBucketClaimOperation(ctx context.Context, bucketClass, err := b.bucketClasses().Get(ctx, bucketClassName, metav1.GetOptions{}) if kubeerrors.IsNotFound(err) { - b.recordEvent(inputBucketClaim, v1.EventTypeWarning, events.FailedCreateBucket, "BucketClass %q provided in the BucketClaim does not exist.", bucketClassName) + b.recordEvent(inputBucketClaim, v1.EventTypeWarning, events.FailedCreateBucket, "BucketClass %v provided in the BucketClaim does not exist.", bucketClassName) return util.ErrInvalidBucketClass } else if err != nil { klog.V(3).ErrorS(err, "Get Bucketclass Error", "name", bucketClassName) diff --git a/pkg/bucketclaim/bucketclaim_test.go b/pkg/bucketclaim/bucketclaim_test.go index 65d04e5e..65636843 100644 --- a/pkg/bucketclaim/bucketclaim_test.go +++ b/pkg/bucketclaim/bucketclaim_test.go @@ -2,16 +2,17 @@ package bucketclaim import ( "context" + "fmt" "testing" + v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/kubernetes/fake" "k8s.io/client-go/tools/record" types "sigs.k8s.io/container-object-storage-interface-api/apis/objectstorage/v1alpha1" bucketclientset "sigs.k8s.io/container-object-storage-interface-api/client/clientset/versioned/fake" - + "sigs.k8s.io/container-object-storage-interface-api/controller/events" "sigs.k8s.io/container-object-storage-interface-controller/pkg/util" ) @@ -84,20 +85,50 @@ func TestAddBRIdempotency(t *testing.T) { func TestRecordEvents(t *testing.T) { t.Parallel() + ctx := context.TODO() + for _, tc := range []struct { name string - expectedEvent struct { - subject runtime.Object - reason string - message string - } - }{} { + expectedEvent string + eventTrigger func(context.Context, *BucketClaimListener) + }{ + { + name: "", + expectedEvent: newEvent( + v1.EventTypeWarning, + events.FailedCreateBucket, + ""), + eventTrigger: func(ctx context.Context, bcl *BucketClaimListener) { + panic("unimplemented") + }, + }, + { + name: "", + expectedEvent: newEvent( + v1.EventTypeWarning, + events.FailedCreateBucket, + ""), + eventTrigger: func(ctx context.Context, bcl *BucketClaimListener) { + panic("unimplemented") + }, + }, + } { tc := tc t.Run(tc.name, func(t *testing.T) { t.Parallel() - // TODO: actual test + recorder := record.NewFakeRecorder(1) + + bcl := &BucketClaimListener{} + bcl.InitializeEventRecorder(recorder) + + tc.eventTrigger(ctx, bcl) + + event := <-recorder.Events + if event != tc.expectedEvent { + t.Errorf("Expected %s \n got %s", tc.expectedEvent, event) + } }) } } @@ -255,3 +286,7 @@ func runCreateBucketIdempotency(t *testing.T, name string) { t.Fatalf("Expecting a single Bucket created but found %v", len(bucketList.Items)) } } + +func newEvent(eventType, reason, message string) string { + return fmt.Sprintf("%s %s %s", eventType, reason, message) +} From eafb1464e1b36621266348456d9815f47ac0a695 Mon Sep 17 00:00:00 2001 From: Mateusz Urbanek Date: Thu, 15 Feb 2024 20:56:30 +0100 Subject: [PATCH 234/242] test: implemented tests for Events Signed-off-by: Mateusz Urbanek --- pkg/bucketclaim/bucketclaim.go | 6 +- pkg/bucketclaim/bucketclaim_test.go | 157 +++++++++++++++++----------- 2 files changed, 99 insertions(+), 64 deletions(-) diff --git a/pkg/bucketclaim/bucketclaim.go b/pkg/bucketclaim/bucketclaim.go index dcbb7257..b443af3c 100644 --- a/pkg/bucketclaim/bucketclaim.go +++ b/pkg/bucketclaim/bucketclaim.go @@ -126,7 +126,7 @@ func (b *BucketClaimListener) provisionBucketClaimOperation(ctx context.Context, bucketName = bucketClaim.Spec.ExistingBucketName bucket, err := b.buckets().Get(ctx, bucketName, metav1.GetOptions{}) if kubeerrors.IsNotFound(err) { - b.recordEvent(inputBucketClaim, v1.EventTypeWarning, events.FailedCreateBucket, "Bucket %v provided in the BucketClaim does not exist.", bucketName) + b.recordEvent(inputBucketClaim, v1.EventTypeWarning, events.FailedCreateBucket, err.Error()) return err } else if err != nil { klog.V(3).ErrorS(err, "Get Bucket with ExistingBucketName error", "name", bucketClaim.Spec.ExistingBucketName) @@ -161,8 +161,8 @@ func (b *BucketClaimListener) provisionBucketClaimOperation(ctx context.Context, bucketClass, err := b.bucketClasses().Get(ctx, bucketClassName, metav1.GetOptions{}) if kubeerrors.IsNotFound(err) { - b.recordEvent(inputBucketClaim, v1.EventTypeWarning, events.FailedCreateBucket, "BucketClass %v provided in the BucketClaim does not exist.", bucketClassName) - return util.ErrInvalidBucketClass + b.recordEvent(inputBucketClaim, v1.EventTypeWarning, events.FailedCreateBucket, err.Error()) + return err } else if err != nil { klog.V(3).ErrorS(err, "Get Bucketclass Error", "name", bucketClassName) return err diff --git a/pkg/bucketclaim/bucketclaim_test.go b/pkg/bucketclaim/bucketclaim_test.go index 65636843..e60af78a 100644 --- a/pkg/bucketclaim/bucketclaim_test.go +++ b/pkg/bucketclaim/bucketclaim_test.go @@ -6,12 +6,13 @@ import ( "testing" v1 "k8s.io/api/core/v1" + kubeerrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/client-go/kubernetes/fake" + fakekubeclientset "k8s.io/client-go/kubernetes/fake" "k8s.io/client-go/tools/record" - + "sigs.k8s.io/container-object-storage-interface-api/apis/objectstorage/v1alpha1" types "sigs.k8s.io/container-object-storage-interface-api/apis/objectstorage/v1alpha1" - bucketclientset "sigs.k8s.io/container-object-storage-interface-api/client/clientset/versioned/fake" + fakebucketclientset "sigs.k8s.io/container-object-storage-interface-api/client/clientset/versioned/fake" "sigs.k8s.io/container-object-storage-interface-api/controller/events" "sigs.k8s.io/container-object-storage-interface-controller/pkg/util" ) @@ -81,64 +82,12 @@ func TestAddBRIdempotency(t *testing.T) { runCreateBucketIdempotency(t, "addWithMultipleBR") } -// Test recording events -func TestRecordEvents(t *testing.T) { - t.Parallel() - - ctx := context.TODO() - - for _, tc := range []struct { - name string - expectedEvent string - eventTrigger func(context.Context, *BucketClaimListener) - }{ - { - name: "", - expectedEvent: newEvent( - v1.EventTypeWarning, - events.FailedCreateBucket, - ""), - eventTrigger: func(ctx context.Context, bcl *BucketClaimListener) { - panic("unimplemented") - }, - }, - { - name: "", - expectedEvent: newEvent( - v1.EventTypeWarning, - events.FailedCreateBucket, - ""), - eventTrigger: func(ctx context.Context, bcl *BucketClaimListener) { - panic("unimplemented") - }, - }, - } { - tc := tc - - t.Run(tc.name, func(t *testing.T) { - t.Parallel() - - recorder := record.NewFakeRecorder(1) - - bcl := &BucketClaimListener{} - bcl.InitializeEventRecorder(recorder) - - tc.eventTrigger(ctx, bcl) - - event := <-recorder.Events - if event != tc.expectedEvent { - t.Errorf("Expected %s \n got %s", tc.expectedEvent, event) - } - }) - } -} - func runCreateBucket(t *testing.T, name string) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - client := bucketclientset.NewSimpleClientset() - kubeClient := fake.NewSimpleClientset() + client := fakebucketclientset.NewSimpleClientset() + kubeClient := fakekubeclientset.NewSimpleClientset() eventRecorder := record.NewFakeRecorder(3) listener := NewBucketClaimListener() @@ -182,8 +131,8 @@ func runCreateBucketWithMultipleBR(t *testing.T, name string) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - client := bucketclientset.NewSimpleClientset() - kubeClient := fake.NewSimpleClientset() + client := fakebucketclientset.NewSimpleClientset() + kubeClient := fakekubeclientset.NewSimpleClientset() eventRecorder := record.NewFakeRecorder(3) listener := NewBucketClaimListener() @@ -238,8 +187,8 @@ func runCreateBucketIdempotency(t *testing.T, name string) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - client := bucketclientset.NewSimpleClientset() - kubeClient := fake.NewSimpleClientset() + client := fakebucketclientset.NewSimpleClientset() + kubeClient := fakekubeclientset.NewSimpleClientset() eventRecorder := record.NewFakeRecorder(3) listener := NewBucketClaimListener() @@ -287,6 +236,92 @@ func runCreateBucketIdempotency(t *testing.T, name string) { } } +// Test recording events +func TestRecordEvents(t *testing.T) { + t.Parallel() + + defaultBucketClaim := &v1alpha1.BucketClaim{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-bucketClaim", + Namespace: "test-ns", + }, + Spec: v1alpha1.BucketClaimSpec{ + BucketClassName: "test-bucketClass", + }, + } + + for _, tc := range []struct { + name string + expectedEvent string + eventTrigger func(*testing.T, *BucketClaimListener) + }{ + { + name: "ExistingBucketNotFound", + expectedEvent: newEvent( + v1.EventTypeWarning, + events.FailedCreateBucket, + "buckets.objectstorage.k8s.io \"existing-bucket\" not found"), + eventTrigger: func(t *testing.T, bcl *BucketClaimListener) { + ctx := context.TODO() + + bucketClaim := defaultBucketClaim.DeepCopy() + bucketClaim.Spec.ExistingBucketName = "existing-bucket" + + err := bcl.Add(ctx, bucketClaim) + if !kubeerrors.IsNotFound(err) { + t.Errorf("expected Not Found error got %v", err) + } + }, + }, + { + name: "BucketClassNotFound", + expectedEvent: newEvent( + v1.EventTypeWarning, + events.FailedCreateBucket, + "bucketclasses.objectstorage.k8s.io \"test-bucketClass\" not found"), + eventTrigger: func(t *testing.T, listener *BucketClaimListener) { + ctx := context.TODO() + bucketClaim := defaultBucketClaim.DeepCopy() + + err := listener.Add(ctx, bucketClaim) + if !kubeerrors.IsNotFound(err) { + t.Errorf("expected Not Found error got %v", err) + } + }, + }, + } { + tc := tc + + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + client := fakebucketclientset.NewSimpleClientset() + kubeClient := fakekubeclientset.NewSimpleClientset() + eventRecorder := record.NewFakeRecorder(1) + + listener := NewBucketClaimListener() + listener.InitializeKubeClient(kubeClient) + listener.InitializeBucketClient(client) + listener.InitializeEventRecorder(eventRecorder) + + tc.eventTrigger(t, listener) + + select { + case event, ok := <-eventRecorder.Events: + if ok { + if event != tc.expectedEvent { + t.Errorf("Expected %s \n got %s", tc.expectedEvent, event) + } + } else { + t.Error("channel closed, no event") + } + default: + t.Errorf("no event after trigger") + } + }) + } +} + func newEvent(eventType, reason, message string) string { return fmt.Sprintf("%s %s %s", eventType, reason, message) } From 2e33d55f098c569b9478454f8656a73a12517af0 Mon Sep 17 00:00:00 2001 From: Mateusz Urbanek Date: Fri, 16 Feb 2024 13:53:28 +0100 Subject: [PATCH 235/242] chore: go mod tidy Signed-off-by: Mateusz Urbanek --- go.sum | 2 -- pkg/bucketclaim/bucketclaim_test.go | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/go.sum b/go.sum index 54fd3bfb..0dc3b45f 100644 --- a/go.sum +++ b/go.sum @@ -706,8 +706,6 @@ k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/ rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= 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/container-object-storage-interface-api v0.1.1-0.20231116171305-97700454b010 h1:8Lw3AyLbbkRGlB9GRu9prtSPEp8DLlXjUzaXN6b9gxM= -sigs.k8s.io/container-object-storage-interface-api v0.1.1-0.20231116171305-97700454b010/go.mod h1:YiB+i/UGkzqgODDhRG3u7jkbWkQcoUeLEJ7hwOT/2Qk= sigs.k8s.io/container-object-storage-interface-api v0.1.1-0.20240208184109-05444273ee49 h1:Ax4j3ThWolmk6yH6jvL3Yf0Fzxe0ZfVuDlSLNILU3GA= sigs.k8s.io/container-object-storage-interface-api v0.1.1-0.20240208184109-05444273ee49/go.mod h1:YiB+i/UGkzqgODDhRG3u7jkbWkQcoUeLEJ7hwOT/2Qk= sigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio= diff --git a/pkg/bucketclaim/bucketclaim_test.go b/pkg/bucketclaim/bucketclaim_test.go index e60af78a..56701ad4 100644 --- a/pkg/bucketclaim/bucketclaim_test.go +++ b/pkg/bucketclaim/bucketclaim_test.go @@ -310,7 +310,7 @@ func TestRecordEvents(t *testing.T) { case event, ok := <-eventRecorder.Events: if ok { if event != tc.expectedEvent { - t.Errorf("Expected %s \n got %s", tc.expectedEvent, event) + t.Errorf("expected %s got %s", tc.expectedEvent, event) } } else { t.Error("channel closed, no event") From 76bbcfcf8496b05bb2eedd831fc5473ea4d454d2 Mon Sep 17 00:00:00 2001 From: Mateusz Urbanek Date: Thu, 14 Mar 2024 13:23:49 +0100 Subject: [PATCH 236/242] fix: added events to each error Signed-off-by: Mateusz Urbanek --- pkg/bucketclaim/bucketclaim.go | 32 ++++++++++++++++++----------- pkg/bucketclaim/bucketclaim_test.go | 12 +++++------ 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/pkg/bucketclaim/bucketclaim.go b/pkg/bucketclaim/bucketclaim.go index b443af3c..6ab94569 100644 --- a/pkg/bucketclaim/bucketclaim.go +++ b/pkg/bucketclaim/bucketclaim.go @@ -84,7 +84,7 @@ func (b *BucketClaimListener) Update(ctx context.Context, old, new *v1alpha1.Buc klog.V(3).ErrorS(err, "Error deleting bucket", "bucket", bucketName, "bucketClaim", bucketClaim.ObjectMeta.Name) - return err + return b.recordError(bucketClaim, v1.EventTypeWarning, events.FailedDeleteBucket, err) } klog.V(5).Infof("Successfully deleted bucket: %s from bucketClaim: %s", bucketName, bucketClaim.ObjectMeta.Name) @@ -126,11 +126,10 @@ func (b *BucketClaimListener) provisionBucketClaimOperation(ctx context.Context, bucketName = bucketClaim.Spec.ExistingBucketName bucket, err := b.buckets().Get(ctx, bucketName, metav1.GetOptions{}) if kubeerrors.IsNotFound(err) { - b.recordEvent(inputBucketClaim, v1.EventTypeWarning, events.FailedCreateBucket, err.Error()) - return err + return b.recordError(inputBucketClaim, v1.EventTypeWarning, events.FailedCreateBucket, err) } else if err != nil { klog.V(3).ErrorS(err, "Get Bucket with ExistingBucketName error", "name", bucketClaim.Spec.ExistingBucketName) - return err + return b.recordError(inputBucketClaim, v1.EventTypeWarning, events.FailedCreateBucket, err) } bucket.Spec.BucketClaim = &v1.ObjectReference{ @@ -148,7 +147,7 @@ func (b *BucketClaimListener) provisionBucketClaimOperation(ctx context.Context, klog.V(3).ErrorS(err, "Error updating existing bucket", "bucket", bucket.ObjectMeta.Name, "bucketClaim", bucketClaim.ObjectMeta.Name) - return err + return b.recordError(inputBucketClaim, v1.EventTypeWarning, events.FailedCreateBucket, err) } bucketClaim.Status.BucketName = bucketName @@ -156,16 +155,15 @@ func (b *BucketClaimListener) provisionBucketClaimOperation(ctx context.Context, } else { bucketClassName := bucketClaim.Spec.BucketClassName if bucketClassName == "" { - return util.ErrInvalidBucketClass + return b.recordError(inputBucketClaim, v1.EventTypeWarning, events.FailedCreateBucket, util.ErrInvalidBucketClass) } bucketClass, err := b.bucketClasses().Get(ctx, bucketClassName, metav1.GetOptions{}) if kubeerrors.IsNotFound(err) { - b.recordEvent(inputBucketClaim, v1.EventTypeWarning, events.FailedCreateBucket, err.Error()) - return err + return b.recordError(inputBucketClaim, v1.EventTypeWarning, events.FailedCreateBucket, err) } else if err != nil { klog.V(3).ErrorS(err, "Get Bucketclass Error", "name", bucketClassName) - return err + return b.recordError(inputBucketClaim, v1.EventTypeWarning, events.FailedCreateBucket, err) } bucketName = bucketClassName + string(bucketClaim.ObjectMeta.UID) @@ -194,7 +192,7 @@ func (b *BucketClaimListener) provisionBucketClaimOperation(ctx context.Context, klog.V(3).ErrorS(err, "Error creationg bucket", "bucket", bucketName, "bucketClaim", bucketClaim.ObjectMeta.Name) - return err + return b.recordError(inputBucketClaim, v1.EventTypeWarning, events.FailedCreateBucket, err) } bucketClaim.Status.BucketName = bucketName @@ -206,7 +204,7 @@ func (b *BucketClaimListener) provisionBucketClaimOperation(ctx context.Context, bucketClaim, err = b.bucketClaims(bucketClaim.ObjectMeta.Namespace).UpdateStatus(ctx, bucketClaim, metav1.UpdateOptions{}) if err != nil { klog.V(3).ErrorS(err, "Failed to update status of BucketClaim", "name", bucketClaim.ObjectMeta.Name) - return err + return b.recordError(inputBucketClaim, v1.EventTypeWarning, events.FailedCreateBucket, err) } // Add the finalizers so that bucketClaim is deleted @@ -215,7 +213,7 @@ func (b *BucketClaimListener) provisionBucketClaimOperation(ctx context.Context, _, err = b.bucketClaims(bucketClaim.ObjectMeta.Namespace).Update(ctx, bucketClaim, metav1.UpdateOptions{}) if err != nil { klog.V(3).ErrorS(err, "Failed to add finalizer BucketClaim", "name", bucketClaim.ObjectMeta.Name) - return err + return b.recordError(inputBucketClaim, v1.EventTypeWarning, events.FailedCreateBucket, err) } klog.V(3).Infof("Finished creating Bucket %v", bucketName) @@ -258,6 +256,16 @@ func (b *BucketClaimListener) bucketClaims(namespace string) objectstoragev1alph panic("uninitialized listener") } +// recordError during the processing of the objects +func (b *BucketClaimListener) recordError(subject runtime.Object, eventtype, reason string, err error) error { + if b.eventRecorder == nil { + return err + } + b.eventRecorder.Event(subject, eventtype, reason, err.Error()) + + return err +} + // recordEvent during the processing of the objects func (b *BucketClaimListener) recordEvent(subject runtime.Object, eventtype, reason, message string, args ...any) { if b.eventRecorder == nil { diff --git a/pkg/bucketclaim/bucketclaim_test.go b/pkg/bucketclaim/bucketclaim_test.go index 56701ad4..22a173d0 100644 --- a/pkg/bucketclaim/bucketclaim_test.go +++ b/pkg/bucketclaim/bucketclaim_test.go @@ -69,20 +69,20 @@ var bucketClaim2 = types.BucketClaim{ // Test basic add functionality func TestAddBR(t *testing.T) { - runCreateBucket(t, "add") + runCreateBucket(t) } // Test add with multipleBRs func TestAddWithMultipleBR(t *testing.T) { - runCreateBucketWithMultipleBR(t, "addWithMultipleBR") + runCreateBucketWithMultipleBR(t) } // Test add idempotency func TestAddBRIdempotency(t *testing.T) { - runCreateBucketIdempotency(t, "addWithMultipleBR") + runCreateBucketIdempotency(t) } -func runCreateBucket(t *testing.T, name string) { +func runCreateBucket(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -127,7 +127,7 @@ func runCreateBucket(t *testing.T, name string) { } } -func runCreateBucketWithMultipleBR(t *testing.T, name string) { +func runCreateBucketWithMultipleBR(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -183,7 +183,7 @@ func runCreateBucketWithMultipleBR(t *testing.T, name string) { } } -func runCreateBucketIdempotency(t *testing.T, name string) { +func runCreateBucketIdempotency(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() From 5f57d7f8f3593c9b6efc4cd2520b2be29e30e1c4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Mar 2024 02:13:15 +0000 Subject: [PATCH 237/242] Bump the github-dependencies group with 2 updates Bumps the github-dependencies group with 2 updates: [github.com/spf13/cobra](https://github.com/spf13/cobra) and [github.com/spf13/viper](https://github.com/spf13/viper). Updates `github.com/spf13/cobra` from 1.4.0 to 1.8.0 - [Release notes](https://github.com/spf13/cobra/releases) - [Commits](https://github.com/spf13/cobra/compare/v1.4.0...v1.8.0) Updates `github.com/spf13/viper` from 1.12.0 to 1.18.2 - [Release notes](https://github.com/spf13/viper/releases) - [Commits](https://github.com/spf13/viper/compare/v1.12.0...v1.18.2) --- updated-dependencies: - dependency-name: github.com/spf13/cobra dependency-type: direct:production update-type: version-update:semver-minor dependency-group: github-dependencies - dependency-name: github.com/spf13/viper dependency-type: direct:production update-type: version-update:semver-minor dependency-group: github-dependencies ... Signed-off-by: dependabot[bot] --- go.mod | 51 +++++++++++----------- go.sum | 133 ++++++++++++++++++++++++++++----------------------------- 2 files changed, 92 insertions(+), 92 deletions(-) diff --git a/go.mod b/go.mod index fd0cdf1a..6e14d469 100644 --- a/go.mod +++ b/go.mod @@ -3,8 +3,8 @@ module sigs.k8s.io/container-object-storage-interface-controller go 1.18 require ( - github.com/spf13/cobra v1.4.0 - github.com/spf13/viper v1.12.0 + github.com/spf13/cobra v1.8.0 + github.com/spf13/viper v1.18.2 k8s.io/api v0.24.2 k8s.io/apimachinery v0.24.2 k8s.io/client-go v0.24.2 @@ -14,53 +14,56 @@ require ( ) require ( - github.com/davecgh/go-spew v1.1.1 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/emicklei/go-restful/v3 v3.8.0 // indirect github.com/evanphx/json-patch v4.12.0+incompatible // indirect - github.com/fsnotify/fsnotify v1.5.4 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/go-logr/logr v1.2.0 // indirect github.com/go-openapi/jsonpointer v0.19.5 // indirect github.com/go-openapi/jsonreference v0.20.0 // indirect github.com/go-openapi/swag v0.19.15 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.2 // indirect + github.com/golang/protobuf v1.5.3 // indirect github.com/google/gnostic v0.5.7-v3refs // indirect - github.com/google/go-cmp v0.5.8 // indirect + github.com/google/go-cmp v0.5.9 // indirect github.com/google/gofuzz v1.1.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/imdario/mergo v0.3.12 // indirect - github.com/inconshreveable/mousetrap v1.0.0 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/magiconair/properties v1.8.6 // indirect + github.com/magiconair/properties v1.8.7 // indirect github.com/mailru/easyjson v0.7.6 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/pelletier/go-toml v1.9.5 // indirect - github.com/pelletier/go-toml/v2 v2.0.1 // indirect + github.com/pelletier/go-toml/v2 v2.1.0 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/spf13/afero v1.8.2 // indirect - github.com/spf13/cast v1.5.0 // indirect - github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/sagikazarmark/locafero v0.4.0 // indirect + github.com/sagikazarmark/slog-shim v0.1.0 // indirect + github.com/sourcegraph/conc v0.3.0 // indirect + github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/cast v1.6.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/subosito/gotenv v1.3.0 // indirect - golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2 // indirect - golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5 // indirect - golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a // indirect - golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect - golang.org/x/text v0.3.7 // indirect - golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 // indirect + github.com/subosito/gotenv v1.6.0 // indirect + go.uber.org/atomic v1.9.0 // indirect + go.uber.org/multierr v1.9.0 // indirect + golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect + golang.org/x/net v0.19.0 // indirect + golang.org/x/oauth2 v0.15.0 // indirect + golang.org/x/sys v0.15.0 // indirect + golang.org/x/term v0.15.0 // indirect + golang.org/x/text v0.14.0 // indirect + golang.org/x/time v0.5.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/protobuf v1.28.0 // indirect + google.golang.org/protobuf v1.31.0 // indirect gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b // indirect gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/ini.v1 v1.66.4 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect k8s.io/kube-openapi v0.0.0-20220627174259-011e075b9cb8 // indirect k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect diff --git a/go.sum b/go.sum index 65ae442c..044f386b 100644 --- a/go.sum +++ b/go.sum @@ -3,7 +3,6 @@ cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= 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.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= @@ -16,7 +15,6 @@ cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOY cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= 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.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= 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= @@ -37,7 +35,6 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo 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.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= @@ -63,11 +60,12 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk 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/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= 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= @@ -84,11 +82,11 @@ github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= 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/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= 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.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= @@ -142,8 +140,9 @@ 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/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= 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= @@ -160,8 +159,8 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +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/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -177,15 +176,13 @@ github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/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-20201218002935-b9804c9f04c2/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/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= 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/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= @@ -199,8 +196,8 @@ github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1: github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= @@ -210,16 +207,15 @@ github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1 github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= 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.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= -github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= 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.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= @@ -253,50 +249,53 @@ github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGV github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= -github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= -github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.1 h1:8e3L2cCQzLFi2CR4g7vGFuFxX7Jl1kKX8gW+iV0GUKU= -github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= +github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4= +github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= +github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= +github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= +github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= +github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= +github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= -github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= -github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= -github.com/spf13/cobra v1.4.0 h1:y+wJpx64xcgO1V+RcnwW0LEHxTKRi2ZDPSBjWnrg88Q= -github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= -github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= +github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= +github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= +github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= 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.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ= -github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= +github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ= +github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/subosito/gotenv v1.3.0 h1:mjC+YW8QpAdXibNi+vNWgzmgBH4+5l5dCXv8cNysBLI= -github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= +github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= 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= @@ -309,17 +308,17 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= -go.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI= +go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= +go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= +go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -331,6 +330,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= 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-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -388,15 +389,14 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY 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-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-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-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-20220520000938-2e3eb7b945c2 h1:NWy5+hlRbC7HK+PmcXVUmW1IMyFce7to56IUvhUFm7Y= -golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -409,8 +409,8 @@ golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5 h1:OSnWWcOd/CtWQC2cYSBgbTSJv3ciqd8r54ySIW2y3RE= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.15.0 h1:s8pnnxNVzjWyrvYdFUQq5llS1PX2zhPXmccZv99h7uQ= +golang.org/x/oauth2 v0.15.0/go.mod h1:q48ptWNTY5XWf+JNten23lcvHpLJ0ZSxF5ttTHKVCAM= 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= @@ -459,23 +459,21 @@ golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/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-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/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-20210615035016-665e8c7367d1/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-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/text v0.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= @@ -484,13 +482,15 @@ 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 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.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-20220210224613-90d013bbcef8 h1:vVKdlvoWBphwdxWKrFZEuM0kGgGLxUOYcY4U/2Vjg44= golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -539,7 +539,6 @@ golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -611,9 +610,7 @@ google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 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= @@ -649,8 +646,8 @@ 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.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= -google.golang.org/protobuf v1.28.0/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/check.v1 v0.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= @@ -661,8 +658,8 @@ 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/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.66.4 h1:SsAcf+mM7mRZo2nJNGt8mZCjG8ZRaNGMURJw7BsIST4= -gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= 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/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -675,8 +672,8 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.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 h1:hjy8E9ON/egN1tAYqKb61G10WtihqetD4sz2H+8nIeA= -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= 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= From 6b51239caad2b0823e45199f425dba6f59c23237 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Apr 2024 02:35:41 +0000 Subject: [PATCH 238/242] Bump library/golang from 1.21.1 to 1.22.2 Bumps library/golang from 1.21.1 to 1.22.2. --- updated-dependencies: - dependency-name: library/golang dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 9d8d161c..fc164382 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ # # BUILDER # -FROM docker.io/library/golang:1.21.1 AS builder +FROM docker.io/library/golang:1.22.2 AS builder WORKDIR /buildroot From 2e50764ba71825ff84fd9be76790415e86deb553 Mon Sep 17 00:00:00 2001 From: Blaine Gardner Date: Mon, 13 May 2024 09:08:55 -0600 Subject: [PATCH 239/242] Add BlaineEXE to the owners file Add BlaineEXE to the owners file to allow reviewing and merging code changes. --- OWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/OWNERS b/OWNERS index b3c654f2..0cd103b3 100644 --- a/OWNERS +++ b/OWNERS @@ -5,3 +5,4 @@ approvers: - msau42 - saad-ali - xing-yang + - BlaineEXE From 5518cd8acdbac3d556f83bd792e697bdc0143e59 Mon Sep 17 00:00:00 2001 From: Blaine Gardner Date: Mon, 13 May 2024 09:09:38 -0600 Subject: [PATCH 240/242] Add BlaineEXE to the owners file Add BlaineEXE to the owners file to allow reviewing and merging code changes. --- OWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/OWNERS b/OWNERS index 2eb42391..19980cfd 100644 --- a/OWNERS +++ b/OWNERS @@ -7,3 +7,4 @@ approvers: - xing-yang - wlan0 - mukhoakash + - BlaineEXE From b66cd17ce7066577cbe66b7034377da1b9bc5abc Mon Sep 17 00:00:00 2001 From: Mateusz Urbanek Date: Fri, 17 May 2024 15:14:42 +0200 Subject: [PATCH 241/242] chore: added shanduur Signed-off-by: Mateusz Urbanek --- OWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/OWNERS b/OWNERS index 0cd103b3..0f0e9b26 100644 --- a/OWNERS +++ b/OWNERS @@ -6,3 +6,4 @@ approvers: - saad-ali - xing-yang - BlaineEXE + - shanduur From 3baa065274dc257839de0ac129af6c053f59a3a1 Mon Sep 17 00:00:00 2001 From: Mateusz Urbanek Date: Fri, 17 May 2024 15:14:42 +0200 Subject: [PATCH 242/242] chore: added shanduur Signed-off-by: Mateusz Urbanek --- OWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/OWNERS b/OWNERS index 19980cfd..e1434ba0 100644 --- a/OWNERS +++ b/OWNERS @@ -8,3 +8,4 @@ approvers: - wlan0 - mukhoakash - BlaineEXE + - shanduur