From 4c764e09a47eeeeb889fce54c4b8a88712db29bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A1n=20Del=20Valle?= Date: Mon, 12 Apr 2021 12:00:01 -0700 Subject: [PATCH] Public release of katbox --- .gitignore | 2 + CHANGELOG.md | 8 + Dockerfile | 8 + LICENSE | 201 ++++ Makefile | 41 + README.md | 42 + cmd/katboxplugin/main.go | 87 ++ deploy/kubernetes-1.18/README.md | 2 + deploy/kubernetes-1.18/csi-katbox-plugin.yaml | 145 +++ deploy/kubernetes-1.20/csi-katbox-plugin.yaml | 146 +++ deploy/latest | 1 + docs/README.md | 6 + docs/create-delete-flow.md | 51 + docs/deploy-1.18-and-later.md | 296 ++++++ docs/images/katboxCreate.png | Bin 0 -> 91133 bytes docs/images/katboxDaemonSet.png | Bin 0 -> 52356 bytes docs/images/katboxDelete.png | Bin 0 -> 129112 bytes docs/images/katboxDeploy.png | Bin 0 -> 70490 bytes docs/overview.md | 23 + examples/csi-app-inline.yaml | 16 + go.mod | 46 + go.sum | 902 ++++++++++++++++++ hack/README.md | 4 + hack/e2e-tests.sh | 78 ++ hack/img2minikube.sh | 13 + hack/kind-multi.yml | 8 + pkg/katbox/README.md | 58 ++ pkg/katbox/gc.go | 191 ++++ pkg/katbox/gc_test.go | 48 + pkg/katbox/identityserver.go | 80 ++ pkg/katbox/katbox.go | 118 +++ pkg/katbox/node.go | 230 +++++ pkg/katbox/nodeserver.go | 358 +++++++ pkg/katbox/server.go | 125 +++ pkg/katbox/types.go | 47 + pkg/katbox/util.go | 73 ++ pkg/katbox/util_test.go | 51 + stream/Dockerfile | 23 + stream/docs/docs.go | 232 +++++ stream/docs/swagger.json | 170 ++++ stream/docs/swagger.yaml | 113 +++ stream/go.mod | 9 + stream/go.sum | 97 ++ stream/k8s.yaml | 23 + stream/main.go | 347 +++++++ stream/main_test.go | 127 +++ 46 files changed, 4646 insertions(+) create mode 100644 .gitignore create mode 100644 CHANGELOG.md create mode 100644 Dockerfile create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 README.md create mode 100644 cmd/katboxplugin/main.go create mode 100644 deploy/kubernetes-1.18/README.md create mode 100644 deploy/kubernetes-1.18/csi-katbox-plugin.yaml create mode 100644 deploy/kubernetes-1.20/csi-katbox-plugin.yaml create mode 120000 deploy/latest create mode 100644 docs/README.md create mode 100644 docs/create-delete-flow.md create mode 100644 docs/deploy-1.18-and-later.md create mode 100644 docs/images/katboxCreate.png create mode 100644 docs/images/katboxDaemonSet.png create mode 100644 docs/images/katboxDelete.png create mode 100644 docs/images/katboxDeploy.png create mode 100644 docs/overview.md create mode 100644 examples/csi-app-inline.yaml create mode 100644 go.mod create mode 100644 go.sum create mode 100644 hack/README.md create mode 100644 hack/e2e-tests.sh create mode 100755 hack/img2minikube.sh create mode 100644 hack/kind-multi.yml create mode 100644 pkg/katbox/README.md create mode 100644 pkg/katbox/gc.go create mode 100644 pkg/katbox/gc_test.go create mode 100644 pkg/katbox/identityserver.go create mode 100644 pkg/katbox/katbox.go create mode 100644 pkg/katbox/node.go create mode 100644 pkg/katbox/nodeserver.go create mode 100644 pkg/katbox/server.go create mode 100644 pkg/katbox/types.go create mode 100644 pkg/katbox/util.go create mode 100644 pkg/katbox/util_test.go create mode 100644 stream/Dockerfile create mode 100644 stream/docs/docs.go create mode 100644 stream/docs/swagger.json create mode 100644 stream/docs/swagger.yaml create mode 100644 stream/go.mod create mode 100644 stream/go.sum create mode 100644 stream/k8s.yaml create mode 100644 stream/main.go create mode 100644 stream/main_test.go diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0099b83 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/bin +.idea diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..d994671 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,8 @@ +# v0.0.1 + +* Support for delayed garbage collection. Once a volume has been unmounted it is not deleted until a certain +amount of time has passed. +* Upon `NodeUnpublish` directories are unmounted but not removed from the underlying storage. +* Node driver handles calls with folders that it cannot find in memory while warning. +* Node driver now detects when a volume queued for deletion has already been deleted by an external source +and removes it from the queue. diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..2750697 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,8 @@ +FROM alpine +LABEL maintainers="PayPal" +LABEL description="Katbox Driver" + +# Add util-linux to get a new version of losetup. +RUN apk add util-linux +COPY ./bin/katboxplugin /katboxplugin +ENTRYPOINT ["/katboxplugin"] diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8dada3e --- /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/Makefile b/Makefile new file mode 100644 index 0000000..945cf7c --- /dev/null +++ b/Makefile @@ -0,0 +1,41 @@ +# Copyright 2019 The Kubernetes Authors. +# +# Modifications copyright 2020 PayPal. +# +# 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. + +REV=$(shell git describe --long --tags --match='v*' --dirty 2>/dev/null || git rev-list -n1 HEAD) +VERSION := 1.0.0_$(shell git rev-parse --short HEAD) + +all: build + +clean: + -rm -rf bin + +build: + CGO_ENABLED=0 GOOS="linux" GOARCH="amd64" go build -a -ldflags '-X main.version=$(REV) -extldflags "-static"' -o ./bin/katboxplugin ./cmd/katboxplugin/main.go + +docker-build-katbox: + docker build . --tag quay.io/katbox/katboxplugin:${VERSION} --no-cache + +docker-push-katbox: + docker push quay.io/katbox/katboxplugin:${VERSION} + +docker-build-stream: + docker build ./stream --tag quay.io/katbox/stream:${VERSION} --no-cache + +docker-push-stream: + docker push quay.io/katbox/stream:${VERSION} + +ci-build: docker-build-katbox docker-build-stream docker-push-katbox docker-push-stream + diff --git a/README.md b/README.md new file mode 100644 index 0000000..cd3fd3d --- /dev/null +++ b/README.md @@ -0,0 +1,42 @@ +# CSI Katbox Driver + +Katbox is an inline ephemeral volume manager with delayed deletion for Kubernetes. + +It is inspired by the "Sandbox" functionality provided by +[Apache Mesos](http://mesos.apache.org/documentation/latest/sandbox/). + +## Pre-requisite +- Kubernetes cluster +- Running version 1.18 or later +- Access to terminal with `kubectl` installed + +## Deployment +Deployment varies depending on the Kubernetes version your cluster is running: +- [Deployment for Kubernetes 1.18 and later](docs/deploy-1.18-and-later.md) + +## Examples +The following examples assume that the CSI Katbox driver has been deployed and validated: +- [Inline ephemeral volumes](docs/example-ephemeral.md) + +## Building the binaries +If you want to build the driver yourself, you can do so with the following command from the root directory: + +```shell +make +``` + +## Building a docker image +If you want to make a docker image to be used on a kubernetes cluster you may do so with the following command: + +```shell +docker build . -t +``` + +## Documentation +A high level overview of how katbox works can be found [here](docs/overview.md) + +A closer look at how the creation and deletion of volumes works can be found [here](docs/create-delete-flow.md) + +# Credits +This project was initially a fork of +[CSI Hostpath driver](https://github.com/kubernetes-csi/csi-driver-host-path). \ No newline at end of file diff --git a/cmd/katboxplugin/main.go b/cmd/katboxplugin/main.go new file mode 100644 index 0000000..05ba6b7 --- /dev/null +++ b/cmd/katboxplugin/main.go @@ -0,0 +1,87 @@ +/* +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +import ( + "flag" + "fmt" + "os" + "path" + "time" + + "github.com/paypal/katbox/pkg/katbox" +) + +func init() { + flag.Set("logtostderr", "true") +} + +var ( + endpoint = flag.String("endpoint", "unix://tmp/csi.sock", "CSI endpoint") + driverName = flag.String("drivername", "kbox.csi.paypal.com", "name of the driver") + nodeID = flag.String("nodeid", "", "node id") + maxVolumesPerNode = flag.Int64("maxvolumespernode", 0, "limit of volumes per node") + workdir = flag.String("workdir", "/csi-data-dir", "Location where plugin will store configuration and directories") + afterLifespan = flag.Duration( + "afterlifespan", + time.Hour*12, + "Length of time to keep a volume after a request for deletion", + ) + pruneInterval = flag.Duration( + "pruneinterval", + time.Second*5, + "Interval at which the background process looking to evict deleted volumes runs.", + ) + headroom = flag.Float64( + "headroom", + 0.1, + "Value between 0.0 and 1.0 (inclusive) that determines the percentage of space that should be attempted to be kept free in the underlying storage device", + ) + showVersion = flag.Bool("version", false, "Show version.") + // Set by the build process + version = "" +) + +func main() { + flag.Parse() + + if *showVersion { + baseName := path.Base(os.Args[0]) + fmt.Println(baseName, version) + return + } + + handle() + os.Exit(0) +} + +func handle() { + driver, err := katbox.NewKatboxDriver( + *driverName, + *nodeID, + *endpoint, + *workdir, + *maxVolumesPerNode, + *afterLifespan, + *pruneInterval, + *headroom, + version, + ) + if err != nil { + fmt.Printf("Failed to initialize driver: %s", err.Error()) + os.Exit(1) + } + driver.Run() +} diff --git a/deploy/kubernetes-1.18/README.md b/deploy/kubernetes-1.18/README.md new file mode 100644 index 0000000..647371c --- /dev/null +++ b/deploy/kubernetes-1.18/README.md @@ -0,0 +1,2 @@ +The deployment for Kubernetes 1.18 uses VolumeSnapshot Beta CRDs and thus is incompatible +with Kubernetes < 1.17 when the VolumeSnapshot CRDs were Alpha. diff --git a/deploy/kubernetes-1.18/csi-katbox-plugin.yaml b/deploy/kubernetes-1.18/csi-katbox-plugin.yaml new file mode 100644 index 0000000..49f1b73 --- /dev/null +++ b/deploy/kubernetes-1.18/csi-katbox-plugin.yaml @@ -0,0 +1,145 @@ +--- +apiVersion: v1 +kind: Namespace +metadata: + name: katbox +--- +apiVersion: storage.k8s.io/v1 +kind: CSIDriver +metadata: + name: katbox.csi.paypal.com +spec: + # Supports persistent and ephemeral inline volumes. + volumeLifecycleModes: + - Ephemeral + # To determine at runtime which mode a volume uses, pod info and its + # "csi.storage.k8s.io/ephemeral" entry are needed. + podInfoOnMount: true + attachRequired: false +--- +kind: DaemonSet +apiVersion: apps/v1 +metadata: + name: csi-katboxplugin + namespace: katbox +spec: + selector: + matchLabels: + app: csi-katboxplugin + template: + metadata: + labels: + app: csi-katboxplugin + spec: + hostNetwork: true + tolerations: + - key: "node-role.kubernetes.io/master" + operator: "Exists" + effect: "NoSchedule" + - operator: "Exists" + containers: + - name: node-driver-registrar + image: k8s.gcr.io/sig-storage/csi-node-driver-registrar:v2.0.1 + args: + - --v=5 + - --csi-address=/csi/csi.sock + - --kubelet-registration-path=/var/lib/kubelet/plugins/csi-katbox/csi.sock + securityContext: + # This is necessary only for systems with SELinux, where + # non-privileged sidecar containers cannot access unix domain socket + # created by privileged CSI driver container. + privileged: true + env: + - name: KUBE_NODE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: spec.nodeName + volumeMounts: + - mountPath: /csi + name: socket-dir + - mountPath: /registration + name: registration-dir + - mountPath: /csi-data-dir + name: csi-data-dir + + - name: katbox + image: quay.io/katbox/katboxplugin:v1.0.0 + args: + - "--drivername=katbox.csi.paypal.com" + - "--v=5" + - "--endpoint=$(CSI_ENDPOINT)" + - "--nodeid=$(KUBE_NODE_NAME)" + - "--afterlifespan=3h" + - "--headroom=.1" + env: + - name: CSI_ENDPOINT + value: unix:///csi/csi.sock + - name: KUBE_NODE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: spec.nodeName + securityContext: + privileged: true + ports: + - containerPort: 9898 + name: healthz + protocol: TCP + livenessProbe: + failureThreshold: 5 + httpGet: + path: /healthz + port: healthz + initialDelaySeconds: 10 + timeoutSeconds: 3 + periodSeconds: 10 + volumeMounts: + - mountPath: /csi + name: socket-dir + - mountPath: /var/lib/kubelet/pods + mountPropagation: Bidirectional + name: mountpoint-dir + - mountPath: /var/lib/kubelet/plugins + mountPropagation: Bidirectional + name: plugins-dir + - mountPath: /csi-data-dir + name: csi-data-dir + - mountPath: /dev + name: dev-dir + - name: liveness-probe + volumeMounts: + - mountPath: /csi + name: socket-dir + image: k8s.gcr.io/sig-storage/livenessprobe:v2.2.0 + args: + - --csi-address=/csi/csi.sock + - --health-port=9898 + + volumes: + - hostPath: + path: /var/lib/kubelet/plugins/csi-katbox + type: DirectoryOrCreate + name: socket-dir + - hostPath: + path: /var/lib/kubelet/pods + type: DirectoryOrCreate + name: mountpoint-dir + - hostPath: + path: /var/lib/kubelet/plugins_registry + type: Directory + name: registration-dir + - hostPath: + path: /var/lib/kubelet/plugins + type: Directory + name: plugins-dir + - hostPath: + # 'path' is where PV data is persisted on host. + # using /tmp is also possible while the PVs will not available after plugin container recreation or host reboot + path: /var/lib/csi-katbox-data/ + type: DirectoryOrCreate + name: csi-data-dir + - hostPath: + path: /dev + type: Directory + name: dev-dir diff --git a/deploy/kubernetes-1.20/csi-katbox-plugin.yaml b/deploy/kubernetes-1.20/csi-katbox-plugin.yaml new file mode 100644 index 0000000..1569340 --- /dev/null +++ b/deploy/kubernetes-1.20/csi-katbox-plugin.yaml @@ -0,0 +1,146 @@ +--- +apiVersion: v1 +kind: Namespace +metadata: + name: katbox +--- +apiVersion: storage.k8s.io/v1 +kind: CSIDriver +metadata: + name: katbox.csi.paypal.com +spec: + # Supports persistent and ephemeral inline volumes. + volumeLifecycleModes: + - Ephemeral + # To determine at runtime which mode a volume uses, pod info and its + # "csi.storage.k8s.io/ephemeral" entry are needed. + podInfoOnMount: true + attachRequired: false + fsGroupPolicy: File +--- +kind: DaemonSet +apiVersion: apps/v1 +metadata: + name: csi-katboxplugin + namespace: katbox +spec: + selector: + matchLabels: + app: csi-katboxplugin + template: + metadata: + labels: + app: csi-katboxplugin + spec: + hostNetwork: true + tolerations: + - key: "node-role.kubernetes.io/master" + operator: "Exists" + effect: "NoSchedule" + - operator: "Exists" + containers: + - name: node-driver-registrar + image: k8s.gcr.io/sig-storage/csi-node-driver-registrar:v2.0.1 + args: + - --v=5 + - --csi-address=/csi/csi.sock + - --kubelet-registration-path=/var/lib/kubelet/plugins/csi-katbox/csi.sock + securityContext: + # This is necessary only for systems with SELinux, where + # non-privileged sidecar containers cannot access unix domain socket + # created by privileged CSI driver container. + privileged: true + env: + - name: KUBE_NODE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: spec.nodeName + volumeMounts: + - mountPath: /csi + name: socket-dir + - mountPath: /registration + name: registration-dir + - mountPath: /csi-data-dir + name: csi-data-dir + + - name: katbox + image: k8s.gcr.io/sig-storage/livenessprobe:v2.2.0 + args: + - "--drivername=katbox.csi.paypal.com" + - "--v=5" + - "--endpoint=$(CSI_ENDPOINT)" + - "--nodeid=$(KUBE_NODE_NAME)" + - "--afterlifespan=3h" + - "--headroom=.1" + env: + - name: CSI_ENDPOINT + value: unix:///csi/csi.sock + - name: KUBE_NODE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: spec.nodeName + securityContext: + privileged: true + ports: + - containerPort: 9898 + name: healthz + protocol: TCP + livenessProbe: + failureThreshold: 5 + httpGet: + path: /healthz + port: healthz + initialDelaySeconds: 10 + timeoutSeconds: 3 + periodSeconds: 10 + volumeMounts: + - mountPath: /csi + name: socket-dir + - mountPath: /var/lib/kubelet/pods + mountPropagation: Bidirectional + name: mountpoint-dir + - mountPath: /var/lib/kubelet/plugins + mountPropagation: Bidirectional + name: plugins-dir + - mountPath: /csi-data-dir + name: csi-data-dir + - mountPath: /dev + name: dev-dir + - name: liveness-probe + volumeMounts: + - mountPath: /csi + name: socket-dir + image: k8s.gcr.io/sig-storage/livenessprobe:v2.2.0 + args: + - --csi-address=/csi/csi.sock + - --health-port=9898 + + volumes: + - hostPath: + path: /var/lib/kubelet/plugins/csi-katbox + type: DirectoryOrCreate + name: socket-dir + - hostPath: + path: /var/lib/kubelet/pods + type: DirectoryOrCreate + name: mountpoint-dir + - hostPath: + path: /var/lib/kubelet/plugins_registry + type: Directory + name: registration-dir + - hostPath: + path: /var/lib/kubelet/plugins + type: Directory + name: plugins-dir + - hostPath: + # 'path' is where PV data is persisted on host. + # using /tmp is also possible while the PVs will not available after plugin container recreation or host reboot + path: /var/lib/csi-katbox-data/ + type: DirectoryOrCreate + name: csi-data-dir + - hostPath: + path: /dev + type: Directory + name: dev-dir diff --git a/deploy/latest b/deploy/latest new file mode 120000 index 0000000..721e0c6 --- /dev/null +++ b/deploy/latest @@ -0,0 +1 @@ +kubernetes-1.20 \ No newline at end of file diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..87d09cf --- /dev/null +++ b/docs/README.md @@ -0,0 +1,6 @@ +# Katbox Documentation + +* [High level overview](overview.md) +* [Volume creation and deletion flow](create-delete-flow.md) +* [How to deploy Katbox](deploy-1.18-and-later.md) +* [Running an sample application leveraging katbox](example-ephemeral.md) \ No newline at end of file diff --git a/docs/create-delete-flow.md b/docs/create-delete-flow.md new file mode 100644 index 0000000..68bf0b8 --- /dev/null +++ b/docs/create-delete-flow.md @@ -0,0 +1,51 @@ +# Creation and Deletion of Volumes +## Volume Creation Flow +![Katbox Create Flow](images/katboxCreate.png) + +A request is made to the kubernetes to create a pod. Kubernetes schedules a pod on a worker node in the cluster. + +The kubelet sees that there is a request for an ephemeral-inline volume from the driver `katbox.csi.paypal.com` so it looks through its registered plugins and finds Katbox. It creates a `NodePublishVolume` api requests through the Unix Domain Socket registered for Katbox by the CSI Node Registrar. + +Katbox receives the request and creates a folder in its working directory. By default, this directory is located at `/var/lib/csi-katbox`. + +Using the information provided by the request, a new folder is created in the working directory using the volume ID received: +`$WORKDIR/` + +This newly created folder is then bind mounted to the mount location expected by the kubelet called the `targetPath`. By default this folder's location is in: +`/var/lib/kubelet/pods//volumes/kubernetes.io-csi//mount` + +The pod UUID is generated by Kubernetes when the pod is created, while the volume name is the name given to the mount in the spec. + +Once the bind mount is successful, Katbox replies to the request as having succeeded. + +If for any reason katbox is unable to fulfill the request, an error is returned to the kubelet and the pod creation process fails. + +## Volume Deletion Flow +![Katbox Delete Flow](images/katboxDelete.png) + +When a pod which uses a Katbox allocated volume is deleted, the kubelet sends a `NodeUnpublishVolume` api request to katbox via a previously registered Unix Domain Socket. + +Katbox unbinds the folder that was bound from katbox's working directory to the `targetPath`. Next, katbox adds the volume to its deletion queue and returns a successful deletion message to the kubelet. + +If for some reason katbox is unable to unmount the given folder, katbox will instead return an error to the kubelet which will then begin attempting to retry the deletion. + +The information given to the deletion queue includes the path of the folder used for the volume inside katbox's working directory, the time at which it was deleted, as well as a lifespan. + +An example of the information given to the queue looks like this: +``` +{ + Path: "/var/lib/kubelet/csi-katbox//", + Time: time.Now(), + Lifespan: > /data/test; sleep 100; done"] + volumes: + - name: my-csi-volume + csi: + driver: katbox.csi.paypal.com +``` + +Finally, inspect the application pod `my-csi-app` which mounts a katbox volume: + +```shell +$ kubectl describe pods/my-csi-app +Name: my-csi-app-inline +Namespace: default +Priority: 0 +Node: k8s-test-node-4/10.180.73.244 +Start Time: Thu, 16 Jul 2020 13:44:53 -0700 +Labels: +Annotations: Status: Running +IP: 10.180.96.189 +IPs: + IP: 10.180.96.189 +Containers: + my-frontend: + Container ID: docker://f777b8c44d0d146241d73bbc2663b85274dca2e954c19d23ff504e81ffc0e875 + Image: busybox + Image ID: docker-pullable://busybox@sha256:9ddee63a712cea977267342e8750ecbc60d3aab25f04ceacfa795e6fce341793 + Port: + Host Port: + Command: + sh + -c + while true; do echo hello >> /data/test; sleep 100; done + State: Running + Started: Thu, 16 Jul 2020 13:44:59 -0700 + Ready: True + Restart Count: 0 + Environment: + Mounts: + /data from my-csi-volume (rw) + /var/run/secrets/kubernetes.io/serviceaccount from default-token-wrfhf (ro) +Conditions: + Type Status + Initialized True + Ready True + ContainersReady True + PodScheduled True +Volumes: + my-csi-volume: + Type: CSI (a Container Storage Interface (CSI) volume source) + Driver: katbox.csi.paypal.com + FSType: + ReadOnly: false + VolumeAttributes: + default-token-wrfhf: + Type: Secret (a volume populated by a Secret) + SecretName: default-token-wrfhf + Optional: false +QoS Class: BestEffort +Node-Selectors: +Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s + node.kubernetes.io/unreachable:NoExecute for 300s +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal Scheduled default-scheduler Successfully assigned default/my-csi-app-inline to k8s-test-node-4 + Normal Pulling 32s kubelet, k8s-test-node-4 Pulling image "busybox" + Normal Pulled 28s kubelet, k8s-test-node-4 Successfully pulled image "busybox" + Normal Created 28s kubelet, k8s-test-node-4 Created container my-frontend + Normal Started 27s kubelet, k8s-test-node-4 Started container my-frontend +``` + +## Confirm the katbox driver works +The katpox driver is configured to create new volumes under `/csi-data-dir` inside the katbox container that is specified in the plugin DaemonSet previously deployed. + +A file written in a properly mounted katbox volume inside an application should show up inside the katbox container. The following steps confirms that katbox is working properly. First, create a file from the application pod as shown: + +```shell +$ kubectl exec -it my-csi-app-inline -- /bin/sh +/ # touch /data/hello-world +/ # exit +``` + +Find the node in which the sample app is running in by running: +```shell +$ kubectl get pods my-csi-app-inline -o wide +NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES +my-csi-app-inline 1/1 Running 0 7m57s 10.180.96.189 k8s-test-node-4 +``` + +Next, find the katbox driver for the node on which the sample application is running on: +```shell +$ kubectl get pods -n csi-plugins -o wide --field-selector spec.nodeName=k8s-test-node-4 +NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES +csi-katboxplugin-n62fm 3/3 Running 0 43h 10.180.73.244 k8s-test-node-4 +``` + +Next, ssh into the katbox container and verify that the file shows up there: +```shell +$ kubectl exec -it csi-katboxplugin-n62fm -n csi-plugin -c katbox -- /bin/sh +``` +Then, use the following command to locate the file. If everything works OK you should get a result similar to the following: + +```shell +/ # find / -name hello-world +/csi-data-dir/csi-69121cc2ba7624a259442664bc942c00811cf4495faefccdd11efc2e79d1127c/hello-world +/var/lib/kubelet/pods/32a784c5-88a3-4585-8827-989d2c79dbfe/volumes/kubernetes.io~csi/my-csi-volume/mount/hello-world +/ # +``` + + diff --git a/docs/images/katboxCreate.png b/docs/images/katboxCreate.png new file mode 100644 index 0000000000000000000000000000000000000000..5956792ba6b6edc043bf131b1da18e37851a19dd GIT binary patch literal 91133 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 HiSYjbCi(9l literal 0 HcmV?d00001 diff --git a/docs/images/katboxDaemonSet.png b/docs/images/katboxDaemonSet.png new file mode 100644 index 0000000000000000000000000000000000000000..827606b50cc1c67e3d847f1559aca6bb12882459 GIT binary patch literal 52356 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 TQ&<&vVbw7!d&^RbGnfAZHM4=@ literal 0 HcmV?d00001 diff --git a/docs/images/katboxDelete.png b/docs/images/katboxDelete.png new file mode 100644 index 0000000000000000000000000000000000000000..b73f7285cc91776dec3a74ba5a403592db29a3bd GIT binary patch literal 129112 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

-E#MvvxL9_^X|G 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/images/katboxDeploy.png b/docs/images/katboxDeploy.png new file mode 100644 index 0000000000000000000000000000000000000000..49f8389df5e648c00e49aa95b936b453e0f3a343 GIT binary patch literal 70490 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 literal 0 HcmV?d00001 diff --git a/docs/overview.md b/docs/overview.md new file mode 100644 index 0000000..453ed06 --- /dev/null +++ b/docs/overview.md @@ -0,0 +1,23 @@ +# Overview of how Katbox works +The Katbox pod is comprised of a CSI Node Driver, a Liveness probe, as well as a [CSI node driver registrar](https://github.com/kubernetes-csi/node-driver-registrar/). + +Before bringing up the Katbox pod, we must register some information with Kubernetes so that Katbox is able to serve requests for ephemeral-inline volumes. + +The `kubectl` command is used to tell Kubernetes about our CSI Driver's name, what type of volume lifecycles it supports (ephemeral only), and whether or not we need extra info provided to the CSI when a volume is being mounted (we do). + +An example can be seen in[ csi-katbox-driverinfo.yaml](../deploy/latest/katbox/csi-katbox-driverinfo.yaml) + +Since we want to be able to create Katbox containers in all worker nodes, we can deploy Katbox as a [DaemonSet](https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/). + +![Katbox DaemonSet](images/katboxDaemonSet.png) + + +An example configuration can be seen in [csi-katbox-plugin.yaml](../deploy/latest/katbox/csi-katbox-plugin.yaml) + +![Katbox DaemonSet](images/katboxDeploy.png) + +The CSI node driver registrar comes up and registers Katbox by creating a Unix Domain Socket located at`/var/lib/kubelet/plugins_registry/katbox.csi.paypal.com-reg.sock`. The registrar is also responsible for querying the Katbox plugin, via a socket located at `/var/lib/kubelet/plugins/csi-katbox/csi.sock` for information about the plugin using the `GetPluginInfo()` gRPC call. It uses this information provided by the CSI plugin while registering the node with the Kubelet. + +If the registration is successful, the Katbox plugin will now be able to receive communication via `/var/lib/kubelet/plugins/csi-katbox/csi.sock` whenever an ephemeral volume from the driver `katbox.csi.paypal.com` is requested. This request will come in the form of a `NodePublishVolume` API call. When an ephemeral-inline volume previously allocated by Katbox needs to be deleted, a `NodeUnpublishVolume` API call will come through the same socket. + +The [Liveness probe container](https://github.com/kubernetes-csi/livenessprobe), as its name implies, is responsible for sending HTTP health checks to the Katbox plugin. If the plugin does not reply to the heartbeat requests, the Liveness probe container signals the failure to the kubelet and the kubelet restarts the Katbox plugin container. \ No newline at end of file diff --git a/examples/csi-app-inline.yaml b/examples/csi-app-inline.yaml new file mode 100644 index 0000000..d6f3ef2 --- /dev/null +++ b/examples/csi-app-inline.yaml @@ -0,0 +1,16 @@ +kind: Pod +apiVersion: v1 +metadata: + name: my-csi-app-inline +spec: + containers: + - name: my-frontend + image: busybox:1.32.0 + volumeMounts: + - mountPath: "/data" + name: my-csi-volume + command: ["sh", "-c", "while true; do echo hello >> /data/test; sleep 100; done"] + volumes: + - name: my-csi-volume + csi: + driver: katbox.csi.paypal.com diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..ff802b0 --- /dev/null +++ b/go.mod @@ -0,0 +1,46 @@ +module github.com/paypal/katbox + +go 1.16 + +require ( + github.com/container-storage-interface/spec v1.3.0 + github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b + github.com/kubernetes-csi/csi-lib-utils v0.9.0 + github.com/ricochet2200/go-disk-usage v0.0.0-20150921141558-f0d1b743428f + github.com/stretchr/testify v1.6.1 + go.etcd.io/bbolt v1.3.5 + golang.org/x/net v0.0.0-20201209123823-ac852fbbde11 + golang.org/x/sys v0.0.0-20201207223542-d4d67f95c62d // indirect + google.golang.org/genproto v0.0.0-20201209185603-f92720507ed4 // indirect + google.golang.org/grpc v1.34.0 + k8s.io/kubernetes v1.20.0 + k8s.io/mount-utils v0.0.0 + k8s.io/utils v0.0.0-20201110183641-67b214c5f920 +) + +replace ( + k8s.io/api => k8s.io/api v0.20.0 + k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.20.0 + k8s.io/apimachinery => k8s.io/apimachinery v0.21.0-alpha.0 + k8s.io/apiserver => k8s.io/apiserver v0.20.0 + k8s.io/cli-runtime => k8s.io/cli-runtime v0.20.0 + k8s.io/client-go => k8s.io/client-go v0.20.0 + k8s.io/cloud-provider => k8s.io/cloud-provider v0.20.0 + k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.20.0 + k8s.io/code-generator => k8s.io/code-generator v0.20.1-rc.0 + k8s.io/component-base => k8s.io/component-base v0.20.0 + k8s.io/component-helpers => k8s.io/component-helpers v0.20.0 + k8s.io/controller-manager => k8s.io/controller-manager v0.20.0 + k8s.io/cri-api => k8s.io/cri-api v0.20.1-rc.0 + k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.20.0 + k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.20.0 + k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.20.0 + k8s.io/kube-proxy => k8s.io/kube-proxy v0.20.0 + k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.20.0 + k8s.io/kubectl => k8s.io/kubectl v0.20.0 + k8s.io/kubelet => k8s.io/kubelet v0.20.0 + k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.20.0 + k8s.io/metrics => k8s.io/metrics v0.20.0 + k8s.io/mount-utils => k8s.io/mount-utils v0.20.1-rc.0 + k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.20.0 +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..fe6bd33 --- /dev/null +++ b/go.sum @@ -0,0 +1,902 @@ +bitbucket.org/bertimus9/systemstat v0.0.0-20180207000608-0eeff89b0690/go.mod h1:Ulb78X89vxKYgdL24HMTiXYHlyHEvruOj1ZPlqeNEZM= +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.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= +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/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/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/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= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/Azure/azure-sdk-for-go v43.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= +github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= +github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/to v0.2.0/go.mod h1:GunWKJp1AEqgMaGLV+iocmRAJWqST1wQYhyyjXJ3SJc= +github.com/Azure/go-autorest/autorest/validation v0.1.0/go.mod h1:Ha3z/SqBeaalWQvokg3NZAlQTalVMtOIAs1aGK7G6u8= +github.com/Azure/go-autorest/logger v0.2.0/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/GoogleCloudPlatform/k8s-cloud-provider v0.0.0-20200415212048-7901bc822317/go.mod h1:DF8FZRxMHMGv/vP2lQP6h+dYzzjpuRn24VeRiYn3qjQ= +github.com/JeffAshton/win_pdh v0.0.0-20161109143554-76bb4ee9f0ab/go.mod h1:3VYc5hodBMJ5+l/7J4xAyMeuM2PNuepvHlGs8yilUCA= +github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= +github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= +github.com/Microsoft/go-winio v0.4.15/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= +github.com/Microsoft/hcsshim v0.8.10-0.20200715222032-5eafd1556990/go.mod h1:ay/0dTb7NsG8QMDfsRfLHgZo/6xAJShLe1+ePPflihk= +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.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +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/auth0/go-jwt-middleware v0.0.0-20170425171159-5493cabe49f7/go.mod h1:LWMyo4iOLWXHGdBki7NIht1kHru/0wM179h+d3g8ATM= +github.com/aws/aws-sdk-go v1.35.24/go.mod h1:tlPOdRjfxPBpNIwqDj61rmsnA85v9jc0Ps9+muhnW+k= +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/bifurcation/mint v0.0.0-20180715133206-93c51c6ce115/go.mod h1:zVt7zX3K/aDCk9Tj+VM7YymsX66ERvzCJzw8rFCX2JU= +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 v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= +github.com/caddyserver/caddy v1.0.3/go.mod h1:G+ouvOY32gENkJC+jhgl62TyhvqEsFaDiZ4uw0RzP1E= +github.com/cenkalti/backoff v2.1.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +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/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= +github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= +github.com/cheekybits/genny v0.0.0-20170328200008-9127e812e1e9/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= +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/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= +github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/clusterhq/flocker-go v0.0.0-20160920122132-2b8b7259d313/go.mod h1:P1wt9Z3DP8O6W3rvwCt0REIlshg1InHImaLW0t3ObY0= +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/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/codegangsta/negroni v1.0.0/go.mod h1:v0y3T5G7Y1UlFfyxFn/QLRU4a2EuNau2iZY63YTKWo0= +github.com/container-storage-interface/spec v1.2.0/go.mod h1:6URME8mwIBbpVyZV93Ce5St17xBiQJQY67NDsuohiy4= +github.com/container-storage-interface/spec v1.3.0 h1:wMH4UIoWnK/TXYw8mbcIHgZmB6kHOeIsYsiaTJwa6bc= +github.com/container-storage-interface/spec v1.3.0/go.mod h1:6URME8mwIBbpVyZV93Ce5St17xBiQJQY67NDsuohiy4= +github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM= +github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= +github.com/containerd/console v1.0.0/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= +github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= +github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= +github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= +github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= +github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= +github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= +github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/coredns/corefile-migration v1.0.10/go.mod h1:RMy/mXdeDlYwzt0vdMEJvT2hGJ2I86/eO0UdXmH9XNI= +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-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/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/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/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +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/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE= +github.com/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/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v17.12.0-ce-rc1.0.20200916142827-bd33bbf0497b+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +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/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.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/euank/go-kmsg-parser v2.0.0+incompatible/go.mod h1:MhmAMZ8V4CYH4ybgdRwPr2TU5ThnS43puaKEMpja1uw= +github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4= +github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +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/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= +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-acme/lego v2.5.0+incompatible/go.mod h1:yzMNe9CasVUhkquNvti5nAtPmG94USbYxYrZfTkIn0M= +github.com/go-bindata/go-bindata v3.1.1+incompatible/go.mod h1:xK8Dsgwmeed+BBsSy2XTopBn/8uK2HWuGSnA11C3Joo= +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-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-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.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/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +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/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.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/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.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/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-ozzo/ozzo-validation v3.5.0+incompatible/go.mod h1:gsEKFIVnabGBt6mXmxK0MoFy+cZoTJY6mu5Ll3LVLBU= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/godbus/dbus/v5 v5.0.3/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/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +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/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/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/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/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/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/golangplus/bytes v0.0.0-20160111154220-45c989fe5450/go.mod h1:Bk6SMAONeMXrxql8uvOKuAZSu8aM5RUGv+1C6IJaEho= +github.com/golangplus/fmt v0.0.0-20150411045040-2a5d6d7d2995/go.mod h1:lJgMEyOkYFkPcDKwRXegd+iM6E7matEszMG5HhwytU8= +github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= +github.com/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/cadvisor v0.38.5/go.mod h1:1OFB9sOOMkBdUBGCO/1SArawTnDscgMzTodacVDe8mA= +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.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= +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/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/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/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +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.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/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +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.0.0-20180201235237-0fb14efe8c47/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +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/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/heketi/heketi v9.0.1-0.20190917153846-c2e2a4ab7ab9+incompatible/go.mod h1:bB9ly3RchcQqsQ9CpyaQwvva7RS5ytVoSoholZQON6o= +github.com/heketi/tests v0.0.0-20151005000721-f3775cbcefd6/go.mod h1:xGMAM8JLi7UkZt1i4FQeQy0R2T8GLUwQhOP5M1gBhy4= +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/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/ishidawataru/sctp v0.0.0-20190723014705-7c296d48a2b5/go.mod h1:DM4VvS+hD/kDi1U1QsX2fnZowwBhqD0Dk3bRPKF/Oc8= +github.com/jimstudt/http-authentication v0.0.0-20140401203705-3eca13d6893a/go.mod h1:wK6yTYYcgjHE1Z1QtXACPDjcFJyBskHEdagmnq3vsP8= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/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.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/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/karrick/godirwalk v1.16.1/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= +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/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/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-csi/csi-lib-utils v0.9.0 h1:TbuDmxoVqM+fvVkzG/7sShyX/8jUln0ElLHuETcsQJI= +github.com/kubernetes-csi/csi-lib-utils v0.9.0/go.mod h1:8E2jVUX9j3QgspwHXa6LwyN7IHQDjW9jX3kwoWnSC+M= +github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= +github.com/libopenstorage/openstorage v1.0.0/go.mod h1:Sp1sIObHjat1BeXhfMqLZ14wnOzEhNx2YQedreMcUyc= +github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= +github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= +github.com/lpabon/godbc v0.1.1/go.mod h1:Jo9QV0cf3U6jZABgiJ2skINAXb9j8m51r07g4KI92ZA= +github.com/lucas-clemente/aes12 v0.0.0-20171027163421-cd47fb39b79f/go.mod h1:JpH9J1c9oX6otFSgdUHwUBUizmKlrMjxWnIAjff4m04= +github.com/lucas-clemente/quic-clients v0.1.0/go.mod h1:y5xVIEoObKqULIKivu+gD/LU90pL73bTdtQjPBvtCBk= +github.com/lucas-clemente/quic-go v0.10.2/go.mod h1:hvaRS9IHjFLMq76puFJeWNfmn+H70QZ/CXoxqw9bzao= +github.com/lucas-clemente/quic-go-certificates v0.0.0-20160823095156-d2f86524cced/go.mod h1:NCcRLrOTZbzhZvixZLlERbJtDtYsmMw8Jc4vS8Z0g58= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/marten-seemann/qtls v0.2.3/go.mod h1:xzjG7avBwGGbdZ8dTGxlBnLArsVKLvwmjgmPuiQEcYk= +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/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +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/mholt/certmagic v0.6.2-0.20190624175158-6a42ef9fe8c2/go.mod h1:g4cOPxcjV0oFq3qwpjSA30LReKD8AoIfwAY9VvG35NY= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.3/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.4/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/mindprince/gonvml v0.0.0-20190828220739-9ebdce4bb989/go.mod h1:2eu9pRWp8mo84xCg6KswZ+USQHjwgRhNp06sozOdsTY= +github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= +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/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/moby/ipvs v1.0.1/go.mod h1:2pngiyseZbIKXNv7hsKj3O9UEz30c53MT9005gt2hxQ= +github.com/moby/sys/mountinfo v0.1.3/go.mod h1:w2t2Avltqx8vE7gX5l+QiBKxODu2TX0+Syr3h52Tw4o= +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/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/mohae/deepcopy v0.0.0-20170603005431-491d3605edfb/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/mrunalp/fileutils v0.0.0-20200520151820-abd8a0e76976/go.mod h1:x8F1gnqOkIEiO4rqoeEEEqQbo7HjGMTvyoq3gej4iT0= +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/mvdan/xurls v1.1.0/go.mod h1:tQlNn3BED8bE/15hnSL2HLkDeLWpNPAwtw7wkEq44oU= +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/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= +github.com/naoina/toml v0.1.1/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= +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.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc92/go.mod h1:X1zlU4p7wOlX4+WRCz+hvlRv8phdL7UqbYD+vQwNMmE= +github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.3-0.20200728170252-4d89ac9fbff6/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= +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/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/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-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/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.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/quobyte/api v0.1.8/go.mod h1:jL7lIHrmqQ7yh05OJ+eEEdHr0u/kmT1Ff9iHd+4H6VI= +github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= +github.com/ricochet2200/go-disk-usage v0.0.0-20150921141558-f0d1b743428f h1:w4VLAgWDnrcBDFSi8Ppn/MrB/Z1A570+MV90CvMtVVA= +github.com/ricochet2200/go-disk-usage v0.0.0-20150921141558-f0d1b743428f/go.mod h1:yhevTRDiduxPJHQDCtlqUn53ojFPkRh/mKhMUzQUCpc= +github.com/robfig/cron v1.1.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= +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/rubiojr/go-vhd v0.0.0-20200706105327-02e210299021/go.mod h1:DM5xW0nvfNNm2uytzsvhI3OnX8uzaRAg8UX/CnDqbto= +github.com/russross/blackfriday v0.0.0-20170610170232-067529f716f4/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +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/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= +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.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/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/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/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 v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/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/storageos/go-api v2.2.0+incompatible/go.mod h1:ZrLn+e0ZuF3Y65PNF6dIwbJPZqfmtCXxFm9ckv0agOY= +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/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/thecodeteam/goscaleio v0.1.0/go.mod h1:68sdkZAsK8bvEwBlbQnlLS+xU+hvLYM/iQ8KXej1AwM= +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/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= +github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= +github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= +github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= +github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= +github.com/vmware/govmomi v0.20.3/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= +github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= +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 h1:XAzx9gjCb0Rxj7EoqcClPD1d5ZBxZJk0jbuoPHenBt0= +go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= +go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= +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.opencensus.io v0.22.3/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-20190123085648-057139ce5d2b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +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-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-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-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= +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/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/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/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +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-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190328230028-74de082e2cca/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-20190724013045-ca1201d0de80/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-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-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11 h1:lwlPPsmjDKK0J6eG6xDWd5XPehI0R024zxjDnw3esPA= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/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/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +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/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-20190124100055-b90733256f2e/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-20190228124157-a34e9553db1e/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-20190606203320-7fc4e5ec1444/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-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/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-20191115151921-52ab43148777/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-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/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-20200217220822-9197077df867/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-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201110211018-35f3e6cf4a65/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201207223542-d4d67f95c62d h1:MiWWjyhUzZ+jvhZvloX6ZrUsdEghn8a64Upd8EMHglE= +golang.org/x/sys v0.0.0-20201207223542-d4d67f95c62d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +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/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-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-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-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-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-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-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-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-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/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/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= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0= +gonum.org/v1/gonum v0.6.2/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e/go.mod h1:kS+toOQn6AQKjmKJ7gzohV1XkqsFehRA2FbsbkopSuQ= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +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.15.1-0.20200106000736-b8fc810ca6b5/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.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +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/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-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-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/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-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201209185603-f92720507ed4 h1:J4dpx/41slnq1aogzUSTuBuvD7VXz7ZLkVpr32YgSlg= +google.golang.org/genproto v0.0.0-20201209185603-f92720507ed4/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +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.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.29.0/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.34.0 h1:raiipEjMOIC/TO2AvyTxP25XFdLxNIBwzDh3FM3XztI= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +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/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/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gcfg.v1 v1.2.0/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/mcuadros/go-syslog.v2 v2.2.1/go.mod h1:l5LPIyOOyIdQquNg+oU6Z3524YwrcqEm0aKH+5zpt2U= +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/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.1/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +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/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/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= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +k8s.io/api v0.20.0/go.mod h1:HyLC5l5eoS/ygQYl1BXBgFzWNlkHiAuyNAbevIn+FKg= +k8s.io/apiextensions-apiserver v0.20.0/go.mod h1:ZH+C33L2Bh1LY1+HphoRmN1IQVLTShVcTojivK3N9xg= +k8s.io/apimachinery v0.21.0-alpha.0 h1:iT01Vd/9MmJLSZRGe1zY8SMl6QmvJ52l4a6oKIJPClU= +k8s.io/apimachinery v0.21.0-alpha.0/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= +k8s.io/apiserver v0.20.0/go.mod h1:6gRIWiOkvGvQt12WTYmsiYoUyYW0FXSiMdNl4m+sxY8= +k8s.io/cli-runtime v0.20.0/go.mod h1:C5tewU1SC1t09D7pmkk83FT4lMAw+bvMDuRxA7f0t2s= +k8s.io/client-go v0.20.0/go.mod h1:4KWh/g+Ocd8KkCwKF8vUNnmqgv+EVnQDK4MBF4oB5tY= +k8s.io/cloud-provider v0.20.0/go.mod h1:Lz/luSVD5BrHDDhtVdjFh0C2qQCRYdf0b9BHQ9L+bXc= +k8s.io/cluster-bootstrap v0.20.0/go.mod h1:6WZaNIBvcvL7MkPzSRKrZDIr4u+ePW2oIWoRsEFMjmE= +k8s.io/code-generator v0.20.1-rc.0/go.mod h1:UsqdF+VX4PU2g46NC2JRs4gc+IfrctnwHb76RNbWHJg= +k8s.io/component-base v0.20.0/go.mod h1:wKPj+RHnAr8LW2EIBIK7AxOHPde4gme2lzXwVSoRXeA= +k8s.io/component-helpers v0.20.0/go.mod h1:nx6NOtfSfGOxnSZsDJxpGbnsVuUA1UXpwDvZIrtigNk= +k8s.io/controller-manager v0.20.0/go.mod h1:nD4qym/pmCz2v1tpqvlEBVlHW9CAZwedloM8GrJTLpg= +k8s.io/cri-api v0.20.1-rc.0/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= +k8s.io/csi-translation-lib v0.20.0/go.mod h1:M4CdD66GxEI6ev8aTtsA2NkK9kIF9K5VZQMcw/SsoLs= +k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/heapster v1.2.0-beta.1/go.mod h1:h1uhptVXMwC8xtZBYsPXKVi8fpdlYkTs6k949KozGrM= +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-aggregator v0.20.0/go.mod h1:3Is/gzzWmhhG/rA3CpA1+eVye87lreBQDFGcAGT7gzo= +k8s.io/kube-controller-manager v0.20.0/go.mod h1:Pmli7dnwIVpwKJVeab97yBt35QEFdw65oqT5ti0ikUs= +k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= +k8s.io/kube-proxy v0.20.0/go.mod h1:R97oobM6zSh3ZqFMXi5DzCH/qJXNzua/UzcDmuQRexM= +k8s.io/kube-scheduler v0.20.0/go.mod h1:cRTGsJU3TfQvbMJBmpoPgq9rBF5cQLpLKoOafKwdZnI= +k8s.io/kubectl v0.20.0/go.mod h1:8x5GzQkgikz7M2eFGGuu6yOfrenwnw5g4RXOUgbjR1M= +k8s.io/kubelet v0.20.0/go.mod h1:lMdjO1NA+JZXSYtxb48pQmNERmC+vVIXIYkJIugVhl0= +k8s.io/kubernetes v1.20.0 h1:mnc69esJC3PJgSptxNJomGz2gBthyGLSEy18WiyRH4U= +k8s.io/kubernetes v1.20.0/go.mod h1:/xrHGNfoQphtkhZvyd5bA1lRmz+QkDVmBZu+O8QMoek= +k8s.io/legacy-cloud-providers v0.20.0/go.mod h1:1jEkaU7h9+b1EYdfWDBvhFAr+QpRfUjQfK+dGhxPGfA= +k8s.io/metrics v0.20.0/go.mod h1:9yiRhfr8K8sjdj2EthQQE9WvpYDvsXIV3CjN4Ruq4Jw= +k8s.io/mount-utils v0.20.1-rc.0 h1:lEej6bnisHCO3A/KsfiXQAwwyMzDauT9n8JL1CaXsyk= +k8s.io/mount-utils v0.20.1-rc.0/go.mod h1:Jv9NRZ5L2LF87A17GaGlArD+r3JAJdZFvo4XD1cG4Kc= +k8s.io/sample-apiserver v0.20.0/go.mod h1:tScvbz/BcUG46IOsu2YLt4EjBP7XeUuMzMbQt2tQYWw= +k8s.io/system-validators v1.2.0/go.mod h1:bPldcLgkIUK22ALflnsXk8pvkTEndYdNuaHH6gRrl0Q= +k8s.io/utils v0.0.0-20201110183641-67b214c5f920 h1:CbnUZsM497iRC5QMVkHwyl8s2tB3g7yaSHkYPkpgelw= +k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= +modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= +modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= +modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= +modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= +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.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/kustomize v2.0.3+incompatible/go.mod h1:MkjgH3RdOWrievjo6c9T245dYlB5QeXV4WCbnt/PEpU= +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/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/hack/README.md b/hack/README.md new file mode 100644 index 0000000..8392ab8 --- /dev/null +++ b/hack/README.md @@ -0,0 +1,4 @@ + +## Running end to end tests +* Start [kubernetes in docker (kind) ](https://kind.sigs.k8s.io/) cluster +* Run e2e-tests.sh from anywhere withing the git repo \ No newline at end of file diff --git a/hack/e2e-tests.sh b/hack/e2e-tests.sh new file mode 100644 index 0000000..72ae2d5 --- /dev/null +++ b/hack/e2e-tests.sh @@ -0,0 +1,78 @@ +#!/bin/bash + +# Copyright 2020 PayPal. +# +# 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. + +GIT_PROJECT_ROOT="$(git rev-parse --show-toplevel)" + +pushd "$GIT_PROJECT_ROOT" || exit + +# Build latest katbox +docker build . -t quay.io/katbox/katboxplugin:latest + +# Load latest katbox on to kind +kind load docker-image quay.io/katbox/katboxplugin:latest + +# Pull sidecar containers on to local machine +docker pull quay.io/k8scsi/livenessprobe:v1.1.0 +docker pull quay.io/k8scsi/csi-node-driver-registrar:v1.3.0 +docker pull busybox:1.32.0 + +# Load sidecar containers +kind load docker-image quay.io/k8scsi/livenessprobe:v1.1.0 +kind load docker-image quay.io/k8scsi/csi-node-driver-registrar:v1.3.0 +kind load docker-image busybox:1.32.0 + +# Deploy katbox onto kind +kubectl apply -f deploy/latest/katbox/csi-katbox-plugin.yaml,deploy/latest/katbox/csi-katbox-driverinfo.yaml + +# Run a sample application +kubectl apply -f examples/csi-app-inline.yaml + +# Wait for sample app to be ready +kubectl wait --for=condition=Ready pod/my-csi-app-inline + +# Confirm that data has been printed on to the correct volume +sleep 10 + +OUTPUT=$(kubectl exec pod/my-csi-app-inline -- sh -c "cat /data/test") +PODUID=$(kubectl get pod my-csi-app-inline -o jsonpath='{.metadata.uid}') +MOUNTDIR="/var/lib/kubelet/pods/$PODUID/volumes/kubernetes.io~csi/my-csi-volume/" +VOLID=$(kubectl exec --filename deploy/latest/katbox/csi-katbox-plugin.yaml -c katbox -- sh -c "cat $MOUNTDIR/vol_data.json" | jq -r .volumeHandle) + +echo "Volume ID: $VOLID" +echo "Mounted at: $MOUNTDIR" + +sleep 10 + +if [ -z "$OUTPUT" ]; then + echo "FAILURE: No data found in test output"; +fi + +# Delete example app +kubectl delete -f examples/csi-app-inline.yaml + +# Make sure mount point is gone +kubectl exec --filename deploy/latest/katbox/csi-katbox-plugin.yaml -c katbox -- sh -c "if [ -d ""$MOUNTDIR"" ]; then echo 'Error: Mount point still exists'; else echo ''; fi" + +# Make sure folder allocated by katbox was deleted after 1 minutes +echo "Sleeping for 60 seconds to test if folder allocated by katbox was deleted" +sleep 60 + +kubectl exec --filename deploy/latest/katbox/csi-katbox-plugin.yaml -c katbox -- sh -c "if [ -d ""/csi-data-dir/$VOLID"" ]; then echo 'Error: Mount point still exists'; else echo ''; fi" + +# Delete katbox daemon set +kubectl delete -f deploy/latest/katbox/csi-katbox-plugin.yaml + +popd || exit diff --git a/hack/img2minikube.sh b/hack/img2minikube.sh new file mode 100755 index 0000000..3b7717f --- /dev/null +++ b/hack/img2minikube.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +TMPDIR=$(mktemp -d) + +pushd "$TMPDIR" || exit + +docker save -o image.dockerimg $1 + +scp -i ~/.minikube/machines/minikube/id_rsa image.dockerimg docker@"$(minikube ip)":~/image.dockerimg + +ssh -i ~/.minikube/machines/minikube/id_rsa docker@"$(minikube ip)" 'docker load -i ~/image.dockerimg' + +popd || exit diff --git a/hack/kind-multi.yml b/hack/kind-multi.yml new file mode 100644 index 0000000..ad166d5 --- /dev/null +++ b/hack/kind-multi.yml @@ -0,0 +1,8 @@ +# a cluster with 3 control-plane nodes and 3 workers +kind: Cluster +apiVersion: kind.x-k8s.io/v1alpha4 +nodes: +- role: control-plane +- role: worker +- role: worker +- role: worker diff --git a/pkg/katbox/README.md b/pkg/katbox/README.md new file mode 100644 index 0000000..1579858 --- /dev/null +++ b/pkg/katbox/README.md @@ -0,0 +1,58 @@ +# CSI Hostpath driver + +## Usage: + +### Build hostpathplugin +``` +$ make hostpath +``` + +### Start Hostpath driver +``` +$ sudo ./_output/hostpathplugin --endpoint tcp://127.0.0.1:10000 --nodeid CSINode -v=5 +``` + +### Test using csc +Get ```csc``` tool from https://github.com/rexray/gocsi/tree/master/csc + +#### Get plugin info +``` +$ csc identity plugin-info --endpoint tcp://127.0.0.1:10000 +"csi-hostpath" "0.1.0" +``` + +#### Create a volume +``` +$ csc controller new --endpoint tcp://127.0.0.1:10000 --cap 1,block CSIVolumeName +CSIVolumeID +``` + +#### Delete a volume +``` +$ csc controller del --endpoint tcp://127.0.0.1:10000 CSIVolumeID +CSIVolumeID +``` + +#### Validate volume capabilities +``` +$ csc controller validate-volume-capabilities --endpoint tcp://127.0.0.1:10000 --cap 1,block CSIVolumeID +CSIVolumeID true +``` + +#### NodePublish a volume +``` +$ csc node publish --endpoint tcp://127.0.0.1:10000 --cap 1,block --target-path /mnt/hostpath CSIVolumeID +CSIVolumeID +``` + +#### NodeUnpublish a volume +``` +$ csc node unpublish --endpoint tcp://127.0.0.1:10000 --target-path /mnt/hostpath CSIVolumeID +CSIVolumeID +``` + +#### Get NodeID +``` +$ csc node get-id --endpoint tcp://127.0.0.1:10000 +CSINode +``` diff --git a/pkg/katbox/gc.go b/pkg/katbox/gc.go new file mode 100644 index 0000000..c1270a8 --- /dev/null +++ b/pkg/katbox/gc.go @@ -0,0 +1,191 @@ +/* +Copyright 2020 PayPal. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package katbox + +import ( + "encoding/json" + "fmt" + "os" + "path/filepath" + "sync" + "time" + + "github.com/ricochet2200/go-disk-usage/du" + bolt "go.etcd.io/bbolt" + + "github.com/golang/glog" +) + +type deletedVolumes struct { + candidates map[string]*deletionCandidate + storage *bolt.DB + lock sync.RWMutex +} + +type deletionCandidate struct { + Time time.Time `json:"deleteTime"` + Lifespan time.Duration `json:"lifespan"` + Path string `json:"path"` +} + +func (d *deletedVolumes) periodicCleanup( + done <-chan struct{}, + interval time.Duration, + wg *sync.WaitGroup, + headroom float64, + workdir string, +) { + for { + select { + case <-done: + if err := d.storage.Close(); err != nil { + glog.Info("unable to close persistent storage ", err) + } + wg.Done() + return + default: + d.prune(workdir, headroom) + time.Sleep(interval) + } + } +} + +func (d *deletedVolumes) queue(id string, vol deletionCandidate) { + // Check if an entry for deletion already exists + d.lock.RLock() + _, found := d.candidates[id] + d.lock.RUnlock() + + if found { + return + } + + // Write ahead persist to local storage the volume that will be entering our deletion queue + err := d.storage.Update(func(tx *bolt.Tx) error { + bucket := tx.Bucket([]byte(deletedVolumesBucketName)) + if bucket == nil { + return fmt.Errorf("bucket %s does not exist", deletedVolumesBucketName) + } + + marshaledVol, err := json.Marshal(vol) + if err != nil { + return fmt.Errorf("unable to serialize deletion candidate: %w", err) + } + + err = bucket.Put([]byte(id), marshaledVol) + if err != nil { + return fmt.Errorf("unable to insert volume into database: %w", err) + } + + return nil + }) + + if err != nil { + glog.Infof("failed to persist "+id+" at "+vol.Path, ": ", err) + return + } + + d.lock.Lock() + defer d.lock.Unlock() + + d.candidates[id] = &vol +} + +func (d *deletedVolumes) remove(id string) { + err := d.storage.Update(func(tx *bolt.Tx) error { + bucket := tx.Bucket([]byte(deletedVolumesBucketName)) + + err := bucket.Delete([]byte(id)) + if err != nil { + return fmt.Errorf("unable to delete %s from permanent storage: %s", id, err) + } + return nil + }) + + if err != nil { + glog.Infof("failed to remove "+id+": ", err) + return + } + + d.lock.Lock() + defer d.lock.Unlock() + + delete(d.candidates, id) +} + +func (d *deletedVolumes) prune(workdir string, headroom float64) { + glog.V(2).Info("number of volumes queued for deletion: ", len(d.candidates)) + + // Only get the time once since this results in a syscall + // This may mean that some volumes may need to wait until next cycle to be pruned + currentTime := time.Now() + + // Determine pressure factor based on underlying storage utilization + diskUsage := du.NewDiskUsage(workdir) + pressureFactor, err := pressureFactor(diskUsage.Size(), diskUsage.Free(), headroom) + if err != nil { + glog.Info("error calculating pressure factor, setting pressure factor to default value of 0.10 ", err) + pressureFactor = 0.1 + } + + glog.Info("disk pressure factor being used for this prune round: ", pressureFactor) + + // Create a deep copy of the maps for safe reading + candidatesCopy := make(map[string]*deletionCandidate) + d.lock.RLock() + for id, vol := range d.candidates { + candidatesCopy[id] = vol + } + d.lock.RUnlock() + + // Iterate over the copy of the candidates list since iterating over the original + // provides no concurrency safety and attempting to use locks leads to a deadlock in many code paths. + for id, vol := range candidatesCopy { + if vol == nil { + continue + } + + if glog.V(5) { + glog.Infof("Deletion candidate volume ID: %v\n%+v", id, vol) + } + + // Short circuit if the path doesn't exist + if _, err := os.Stat(vol.Path); os.IsNotExist(err) { + glog.Infof("removing %v from queue as path %v does not exist", id, vol.Path) + d.remove(id) + } + + // Check to see if the current has passed the time when we need to evict this volume from + // the underlying storage. The point in time is a combination of the pressure factor + // and the configured afterlife duration. + if currentTime.After(vol.Time.Add(time.Duration(float64(vol.Lifespan) * pressureFactor))) { + err := os.RemoveAll(vol.Path) + if err != nil { + glog.Infof("unable to delete "+id+" at "+vol.Path, ": ", err) + continue + } + + // Attempt to remove PodUUID directory if empty. + // We ignore the error here because this will correctly fail when a pod with multiple katbox volumes + // attempts to delete the parent directory. Only the last remaining volume being deleted should succeed. + _ = os.Remove(filepath.Dir(vol.Path)) + + glog.Infof("deleted " + id + " at " + vol.Path) + d.remove(id) + } + } +} diff --git a/pkg/katbox/gc_test.go b/pkg/katbox/gc_test.go new file mode 100644 index 0000000..ffde643 --- /dev/null +++ b/pkg/katbox/gc_test.go @@ -0,0 +1,48 @@ +/* +Copyright 2020 PayPal. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package katbox + +import ( + "sync" + "testing" + "time" +) + +func TestDelete(t *testing.T) { + deleteQueue := deletedVolumes{candidates: make(map[string]*deletionCandidate), lock: sync.RWMutex{}} + deleteQueue.queue("volume1", deletionCandidate{ + Time: time.Now(), + Lifespan: time.Second * 5, + Path: "/doesnt/exist", + }) + deleteQueue.queue("vol2", deletionCandidate{ + Time: time.Now(), + Lifespan: time.Second * 1, + Path: "/doesnt/exist2", + }) + + deleteQueue.queue("vol3", deletionCandidate{ + Time: time.Now(), + Lifespan: time.Second * 3, + Path: "/doesnt/exist3", + }) + + for len(deleteQueue.candidates) > 0 { + deleteQueue.prune() + time.Sleep(time.Second * 1) + } +} diff --git a/pkg/katbox/identityserver.go b/pkg/katbox/identityserver.go new file mode 100644 index 0000000..4a1e10e --- /dev/null +++ b/pkg/katbox/identityserver.go @@ -0,0 +1,80 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Modifications copyright 2020 PayPal. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package katbox + +import ( + "github.com/container-storage-interface/spec/lib/go/csi" + "github.com/golang/glog" + "golang.org/x/net/context" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +type identityServer struct { + name string + version string +} + +func NewIdentityServer(name, version string) *identityServer { + return &identityServer{ + name: name, + version: version, + } +} + +func (ids *identityServer) GetPluginInfo(ctx context.Context, req *csi.GetPluginInfoRequest) (*csi.GetPluginInfoResponse, error) { + glog.V(5).Infof("Using default GetPluginInfo") + + if ids.name == "" { + return nil, status.Error(codes.Unavailable, "Driver name not configured") + } + + if ids.version == "" { + return nil, status.Error(codes.Unavailable, "Driver is missing version") + } + + return &csi.GetPluginInfoResponse{ + Name: ids.name, + VendorVersion: ids.version, + }, nil +} + +func (ids *identityServer) Probe(ctx context.Context, req *csi.ProbeRequest) (*csi.ProbeResponse, error) { + return &csi.ProbeResponse{}, nil +} + +func (ids *identityServer) GetPluginCapabilities(ctx context.Context, req *csi.GetPluginCapabilitiesRequest) (*csi.GetPluginCapabilitiesResponse, error) { + glog.V(5).Infof("Using default capabilities") + return &csi.GetPluginCapabilitiesResponse{ + Capabilities: []*csi.PluginCapability{ + { + Type: &csi.PluginCapability_Service_{ + Service: &csi.PluginCapability_Service{}, + }, + }, + { + Type: &csi.PluginCapability_Service_{ + Service: &csi.PluginCapability_Service{ + Type: csi.PluginCapability_Service_VOLUME_ACCESSIBILITY_CONSTRAINTS, + }, + }, + }, + }, + }, nil +} diff --git a/pkg/katbox/katbox.go b/pkg/katbox/katbox.go new file mode 100644 index 0000000..378cfee --- /dev/null +++ b/pkg/katbox/katbox.go @@ -0,0 +1,118 @@ +/* +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package katbox + +import ( + "errors" + "fmt" + "os" + "sync" + "time" + + "github.com/golang/glog" +) + +type katbox struct { + name string + nodeID string + version string + endpoint string + pruneInterval time.Duration + headroom float64 + + idServer *identityServer + nodeServer *nodeServer +} + +type volume struct { + Name string `json:"name"` + ID string `json:"id"` + PodUUID string `json:"podUUID"` + Size int64 `json:"size"` + Path string `json:"path"` + AccessType accessType `json:"accessType"` + ParentVolID string `json:"parentVolID,omitempty"` + Ephemeral bool `json:"ephemeral"` +} + +var ( + vendorVersion = "dev" +) + +func NewKatboxDriver( + driverName, nodeID, endpoint, workdir string, + maxVolumesPerNode int64, + afterlifeSpan, deleteInterval time.Duration, + headroom float64, + version string) (*katbox, error) { + if driverName == "" { + return nil, errors.New("no driver name provided") + } + + if nodeID == "" { + return nil, errors.New("no node id provided") + } + + if endpoint == "" { + return nil, errors.New("no driver endpoint provided") + } + if version != "" { + vendorVersion = version + } + + if err := os.MkdirAll(workdir, 0750); err != nil { + return nil, fmt.Errorf("failed to create working directory: %v", err) + } + + glog.Infof("Driver: %v ", driverName) + glog.Infof("Version: %s", vendorVersion) + + return &katbox{ + name: driverName, + version: vendorVersion, + nodeID: nodeID, + endpoint: endpoint, + pruneInterval: deleteInterval, + headroom: headroom, + idServer: NewIdentityServer(driverName, version), + nodeServer: &nodeServer{node: NewNode(nodeID, workdir, maxVolumesPerNode, afterlifeSpan)}, + }, nil +} + +func (k *katbox) Run() { + if k.idServer == nil || k.nodeServer == nil || k.nodeServer.node == nil { + glog.V(1).Infof("unable to create server") + return + } + + // Create GRPC servers + s := NewNonBlockingGRPCServer() + s.Start(k.endpoint, k.idServer, k.nodeServer) + + // Start pruner as a go routine + endPrune := make(chan struct{}) + wg := sync.WaitGroup{} + wg.Add(1) + go k.nodeServer.node.deletedVolumes.periodicCleanup(endPrune, k.pruneInterval, &wg, k.headroom, k.nodeServer.node.workdir) + + // Wait for identity and node server to shut down + s.Wait() + + // Signal to the pruner that it should clean up upon ending next loop + close(endPrune) + + // Wait for pruner to signal that has finished cleaning up + wg.Wait() +} diff --git a/pkg/katbox/node.go b/pkg/katbox/node.go new file mode 100644 index 0000000..e04f785 --- /dev/null +++ b/pkg/katbox/node.go @@ -0,0 +1,230 @@ +/* +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package katbox + +import ( + "encoding/json" + "errors" + "fmt" + "os" + "path" + "sync" + "time" + + "github.com/golang/glog" + + bolt "go.etcd.io/bbolt" + + "k8s.io/kubernetes/pkg/volume/util/volumepathhandler" + utilexec "k8s.io/utils/exec" +) + +type node struct { + id string + volumes map[string]volume + deletedVolumes deletedVolumes + workdir string + afterLifespan time.Duration + maxVolumes int64 + storage *bolt.DB +} + +func NewNode(id, workdir string, maxVolumes int64, afterLifespan time.Duration) *node { + db, err := initializePermanentStorage( + path.Join(workdir, "deletedVolumes.db"), + deletedVolumesBucketName, + volumesBucketName) + if err != nil { + return nil + } + + candidates, err := loadDeletedVolumesFromPersistent(db, deletedVolumesBucketName) + if err != nil { + return nil + } + + volumes, err := loadVolumesFromPersistent(db, volumesBucketName) + if err != nil { + return nil + } + + glog.V(4).Infof("loaded %d volume records into memory", len(volumes)) + + return &node{ + id: id, + volumes: volumes, + deletedVolumes: deletedVolumes{ + candidates: candidates, + lock: sync.RWMutex{}, + storage: db, + }, + workdir: workdir, + afterLifespan: afterLifespan, + maxVolumes: maxVolumes, + storage: db, + } +} + +func initializePermanentStorage(dbFilename string, bucketNames ...string) (*bolt.DB, error) { + db, err := bolt.Open(dbFilename, 0600, &bolt.Options{Timeout: 10 * time.Second}) + if err != nil { + glog.V(4).Infof("unable to open persistent storage: %s", err) + return nil, err + } + + err = db.Update(func(tx *bolt.Tx) error { + for _, name := range bucketNames { + _, err := tx.CreateBucketIfNotExists([]byte(name)) + if err != nil { + return fmt.Errorf("unable to create bucket: %w", err) + } + } + + return nil + }) + + if err != nil { + glog.V(4).Infof("unable to create bucket for storage: %s", err) + return nil, err + } + + return db, nil +} + +func loadDeletedVolumesFromPersistent(db *bolt.DB, bucketName string) (map[string]*deletionCandidate, error) { + if db == nil { + return nil, errors.New("database has not been initialized") + } + + // Load list of volumes to be deleted from the persistent layer + candidates := make(map[string]*deletionCandidate) + err := db.View(func(tx *bolt.Tx) error { + bucket := tx.Bucket([]byte(bucketName)) + if bucket == nil { + return fmt.Errorf("bucket %s doesn't exist", bucketName) + } + + c := bucket.Cursor() + for k, v := c.First(); k != nil; k, v = c.Next() { + var candidate deletionCandidate + id := string(k) + if err := json.Unmarshal(v, &candidate); err != nil { + glog.V(1).Infof("unable to load volume %s: %s", id, err) + } else { + glog.V(4).Infof("loaded volume %s info into memory", id) + } + + candidates[id] = &candidate + } + + return nil + }) + + if err != nil { + glog.Info("unable load persistent layer into memory ", err) + return nil, err + } + + return candidates, nil +} + +func loadVolumesFromPersistent(db *bolt.DB, bucketName string) (map[string]volume, error) { + if db == nil { + return nil, errors.New("database has not been initialized") + } + + // Load list of volumes to be deleted from the persistent layer + volumes := make(map[string]volume) + err := db.View(func(tx *bolt.Tx) error { + bucket := tx.Bucket([]byte(bucketName)) + if bucket == nil { + return fmt.Errorf("bucket %s doesn't exist", bucketName) + } + + c := bucket.Cursor() + for k, v := c.First(); k != nil; k, v = c.Next() { + var vol volume + id := string(k) + if err := json.Unmarshal(v, &vol); err != nil { + glog.V(1).Infof("unable to load volume %s: %s", id, err) + } else { + glog.V(4).Infof("loaded volume %s info into memory", id) + } + + volumes[id] = vol + } + return nil + }) + + if err != nil { + glog.Info("unable load persistent layer into memory: ", err) + return nil, err + } + + return volumes, nil +} + +// createEphemeralVolume create the directory for the katbox volume. +// It returns the volume path or err if one occurs. +func (n *node) createEphemeralVolume(volID, podUUID, name string, cap int64, volAccessType accessType) (*volume, error) { + fullPath := fullpath(n.workdir, podUUID, volID) + + switch volAccessType { + case mountAccess: + err := os.MkdirAll(fullPath, 0777) + if err != nil { + return nil, err + } + case blockAccess: + executor := utilexec.New() + size := fmt.Sprintf("%dM", cap/mib) + // Create a block file. + out, err := executor.Command("fallocate", "-l", size, fullPath).CombinedOutput() + if err != nil { + return nil, fmt.Errorf("failed to create block device: %v, %v", err, string(out)) + } + + // Associate block file with the loop device. + volPathHandler := volumepathhandler.VolumePathHandler{} + _, err = volPathHandler.AttachFileDevice(fullPath) + if err != nil { + // Remove the block file because it'll no longer be used again. + if err2 := os.Remove(fullPath); err2 != nil { + glog.Errorf("failed to cleanup block file %s: %v", fullPath, err2) + } + return nil, fmt.Errorf("failed to attach device %v: %v", fullPath, err) + } + default: + return nil, fmt.Errorf("unsupported access type %v", volAccessType) + } + + vol := volume{ + Name: name, + ID: volID, + PodUUID: podUUID, + Size: cap, + Path: fullPath, + AccessType: volAccessType, + Ephemeral: true, + } + n.volumes[volID] = vol + return &vol, nil +} + +func (n *node) volumeByID(id string) (volume, error) { + if vol, ok := n.volumes[id]; ok { + return vol, nil + } + return volume{}, fmt.Errorf("volume id %s does not exist in the volumes list", id) +} diff --git a/pkg/katbox/nodeserver.go b/pkg/katbox/nodeserver.go new file mode 100644 index 0000000..4ae7690 --- /dev/null +++ b/pkg/katbox/nodeserver.go @@ -0,0 +1,358 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Modifications copyright 2020 PayPal. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package katbox + +import ( + "encoding/json" + "fmt" + "os" + "strings" + "time" + + "github.com/container-storage-interface/spec/lib/go/csi" + "github.com/golang/glog" + + "golang.org/x/net/context" + + bolt "go.etcd.io/bbolt" + + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + + "k8s.io/kubernetes/pkg/volume/util/volumepathhandler" + "k8s.io/mount-utils" +) + +const TopologyKeyNode = "topology.katbox.csi/node" + +type nodeServer struct { + node *node +} + +func (ns *nodeServer) NodePublishVolume(ctx context.Context, req *csi.NodePublishVolumeRequest) (*csi.NodePublishVolumeResponse, error) { + + // Check arguments + if req.GetVolumeCapability() == nil { + return nil, status.Error(codes.InvalidArgument, "volume capability missing in request") + } + if len(req.GetVolumeId()) == 0 { + return nil, status.Error(codes.InvalidArgument, "volume ID missing in request") + } + if len(req.GetTargetPath()) == 0 { + return nil, status.Error(codes.InvalidArgument, "target path missing in request") + } + + targetPath := req.GetTargetPath() + // Kubernetes 1.15 doesn't have csi.storage.k8s.io/ephemeral. + ephemeralVolume := req.GetVolumeContext()[ephemeralContext] == "true" + podUUID := req.GetVolumeContext()[podUUIDContext] + + if !ephemeralVolume { + return nil, status.Error(codes.InvalidArgument, "this CSI driver only supports ephemeral volumes") + } + + if req.GetVolumeCapability().GetBlock() != nil && + req.GetVolumeCapability().GetMount() != nil { + return nil, status.Error(codes.InvalidArgument, "volume cannot be of both block and mount access type") + } + + volID := req.GetVolumeId() + volName := fmt.Sprintf("ephemeral-%s", volID) + ephVol, err := ns.node.createEphemeralVolume(req.GetVolumeId(), podUUID, volName, maxStorageCapacity, mountAccess) + if err != nil && !os.IsExist(err) { + glog.Error("failed to create ephemeral volume: ", err) + return nil, status.Error(codes.Internal, err.Error()) + } + glog.V(4).Infof("created ephemeral volume: %s", ephVol.Path) + + vol, err := ns.node.volumeByID(req.GetVolumeId()) + if err != nil { + return nil, status.Error(codes.NotFound, err.Error()) + } + + if req.GetVolumeCapability().GetBlock() != nil { + if vol.AccessType != blockAccess { + return nil, status.Error(codes.InvalidArgument, "cannot publish a non-block volume as block volume") + } + + volPathHandler := volumepathhandler.VolumePathHandler{} + + // Get loop device from the volume path. + loopDevice, err := volPathHandler.GetLoopDevice(vol.Path) + if err != nil { + return nil, status.Error(codes.Internal, fmt.Sprintf("failed to get the loop device: %v", err)) + } + + mounter := mount.New("") + + // Check if the target path exists. Create if not present. + _, err = os.Lstat(targetPath) + if os.IsNotExist(err) { + if err = makeFile(targetPath); err != nil { + return nil, status.Error(codes.Internal, fmt.Sprintf("failed to create target path: %s: %v", targetPath, err)) + } + } + if err != nil { + return nil, status.Errorf(codes.Internal, "failed to check if the target block file exists: %v", err) + } + + // Check if the target path is already mounted. Prevent remounting. + notMount, err := mount.IsNotMountPoint(mounter, targetPath) + if err != nil { + if !os.IsNotExist(err) { + return nil, status.Errorf(codes.Internal, "error checking path %s for mount: %s", targetPath, err) + } + notMount = true + } + if !notMount { + // It's already mounted. + glog.V(5).Infof("Skipping bind-mounting subpath %s: already mounted", targetPath) + return &csi.NodePublishVolumeResponse{}, nil + } + + if err := mount.New("").Mount(loopDevice, targetPath, "", []string{"bind"}); err != nil { + return nil, status.Error(codes.Internal, fmt.Sprintf("failed to mount block device: %s at %s: %v", loopDevice, targetPath, err)) + } + } else if req.GetVolumeCapability().GetMount() != nil { + if vol.AccessType != mountAccess { + return nil, status.Error(codes.InvalidArgument, "cannot publish a non-mount volume as mount volume") + } + + notMnt, err := mount.IsNotMountPoint(mount.New(""),targetPath) + if err != nil { + if os.IsNotExist(err) { + if err = os.MkdirAll(targetPath, 0750); err != nil { + return nil, status.Error(codes.Internal, err.Error()) + } + notMnt = true + } else { + return nil, status.Error(codes.Internal, err.Error()) + } + } + + if !notMnt { + return &csi.NodePublishVolumeResponse{}, nil + } + + fsType := req.GetVolumeCapability().GetMount().GetFsType() + + deviceId := "" + if req.GetPublishContext() != nil { + deviceId = req.GetPublishContext()[deviceID] + } + + readOnly := req.GetReadonly() + volumeId := req.GetVolumeId() + attrib := req.GetVolumeContext() + mountFlags := req.GetVolumeCapability().GetMount().GetMountFlags() + + glog.V(4).Infof( + "target %v\nfstype %v\ndevice %v\nreadonly %v\nvolumeId %v\nattributes %v\nmountflags %v\n", + targetPath, + fsType, + deviceId, + readOnly, + volumeId, + attrib, + mountFlags, + ) + + options := []string{"bind"} + if readOnly { + options = append(options, "ro") + } + mounter := mount.New("") + volumePath := fullpath(ns.node.workdir, podUUID, volumeId) + + if err := mounter.Mount(volumePath, targetPath, "", options); err != nil { + var errList strings.Builder + errList.WriteString(err.Error()) + if vol.Ephemeral { + if rmErr := os.RemoveAll(volumePath); rmErr != nil && !os.IsNotExist(rmErr) { + errList.WriteString(fmt.Sprintf(" :%s", rmErr.Error())) + } + } + return nil, status.Error(codes.Internal, fmt.Sprintf("failed to mount device: %s at %s: %s", volumePath, targetPath, errList.String())) + } + } else { + return nil, status.Error(codes.InvalidArgument, "volume must be of block or mount access type") + } + + // Persist newly created ephemeral volume into storage due to the fact that we need the PodUUID information + // when deleting this object. + err = ns.node.storage.Update(func(tx *bolt.Tx) error { + bucket := tx.Bucket([]byte(volumesBucketName)) + if bucket == nil { + return fmt.Errorf("bucket %s does not exist", volumesBucketName) + } + + marshaledVol, err := json.Marshal(*ephVol) + if err != nil { + return fmt.Errorf("unable to serialize deletion candidate: %w", err) + } + + err = bucket.Put([]byte(volID), marshaledVol) + if err != nil { + return fmt.Errorf("unable to insert volume %s into database: %w", volID, err) + } + + return nil + }) + + if err != nil { + glog.Errorf("Unable to persist volume %s: %s", volID, err) + } + + return &csi.NodePublishVolumeResponse{}, nil +} + +func (ns *nodeServer) NodeUnpublishVolume(ctx context.Context, req *csi.NodeUnpublishVolumeRequest) (*csi.NodeUnpublishVolumeResponse, error) { + + // Validate the request that was sent + if len(req.GetVolumeId()) == 0 { + return nil, status.Error(codes.InvalidArgument, "volume ID missing in request") + } + if len(req.GetTargetPath()) == 0 { + return nil, status.Error(codes.InvalidArgument, "target path missing in request") + } + + var vol volume + var err error + targetPath := req.GetTargetPath() + volumeID := req.GetVolumeId() + vol, err = ns.node.volumeByID(volumeID) + + if err != nil { + glog.V(4).Infof("handling deletion for volume %v even though it was not found in memory", volumeID) + } else if !vol.Ephemeral { + glog.Warningf("handling deletion for volume %v even though it is not ephemeral", vol) + } + + // Queue folder that was previously mounted on to pod for deletion. Note that this is different + // than the point where the folder was bind mounted to. + ns.node.deletedVolumes.queue( + volumeID, + deletionCandidate{ + Time: time.Now(), + Lifespan: ns.node.afterLifespan, + Path: fullpath(ns.node.workdir, vol.PodUUID, volumeID), + }, + ) + + // Unmount only if the target path is really a mount point. + // This will not delete the underlying data stored in the working directory. + notMnt, err := mount.IsNotMountPoint(mount.New(""), targetPath) + if err != nil { + if !os.IsNotExist(err) { + return nil, status.Error(codes.Internal, err.Error()) + } + } else if !notMnt { + // Un-mounting the image or filesystem. + err = mount.New("").Unmount(targetPath) + if err != nil { + return nil, status.Error(codes.Internal, err.Error()) + } + } + + if vol.AccessType == blockAccess { + return nil, fmt.Errorf("block access is unsupported by this driver") + } + + // Delete persisted volume information + err = ns.node.storage.Update(func(tx *bolt.Tx) error { + bucket := tx.Bucket([]byte(volumesBucketName)) + + err := bucket.Delete([]byte(volumeID)) + if err != nil { + return fmt.Errorf("unable to delete %s from permanent storage: %s", volumeID, err) + } + return nil + }) + + if err != nil { + glog.Error(err) + } + + delete(ns.node.volumes, volumeID) + + // Since we've already successfully queued the local volume for deletion, we return + // a payload indicating that the delete request was successful. The actual deletion from the local + // disk will take place at a later time. + // TODO(rdelvalle): Since we always tell k8s that we've been successful in removing the disk, we can run into + // an inconsistency issue when we are unable to delete a volume. Explore options to handle this. + return &csi.NodeUnpublishVolumeResponse{}, nil +} + +func (ns *nodeServer) NodeStageVolume(ctx context.Context, req *csi.NodeStageVolumeRequest) (*csi.NodeStageVolumeResponse, error) { + if len(req.GetVolumeId()) == 0 { + return nil, status.Error(codes.InvalidArgument, "Volume ID missing in request") + } + if len(req.GetStagingTargetPath()) == 0 { + return nil, status.Error(codes.InvalidArgument, "Target path missing in request") + } + if req.GetVolumeCapability() == nil { + return nil, status.Error(codes.InvalidArgument, "Volume Capability missing in request") + } + + return &csi.NodeStageVolumeResponse{}, nil +} + +func (ns *nodeServer) NodeUnstageVolume(ctx context.Context, req *csi.NodeUnstageVolumeRequest) (*csi.NodeUnstageVolumeResponse, error) { + if len(req.GetVolumeId()) == 0 { + return nil, status.Error(codes.InvalidArgument, "Volume ID missing in request") + } + if len(req.GetStagingTargetPath()) == 0 { + return nil, status.Error(codes.InvalidArgument, "Target path missing in request") + } + + return &csi.NodeUnstageVolumeResponse{}, nil +} + +func (ns *nodeServer) NodeGetInfo(ctx context.Context, req *csi.NodeGetInfoRequest) (*csi.NodeGetInfoResponse, error) { + topology := &csi.Topology{ + Segments: map[string]string{TopologyKeyNode: ns.node.id}, + } + + return &csi.NodeGetInfoResponse{ + NodeId: ns.node.id, + MaxVolumesPerNode: ns.node.maxVolumes, + AccessibleTopology: topology, + }, nil +} + +func (ns *nodeServer) NodeGetCapabilities(ctx context.Context, req *csi.NodeGetCapabilitiesRequest) (*csi.NodeGetCapabilitiesResponse, error) { + return &csi.NodeGetCapabilitiesResponse{ + Capabilities: []*csi.NodeServiceCapability{ + { + Type: &csi.NodeServiceCapability_Rpc{ + Rpc: &csi.NodeServiceCapability_RPC{}, + }, + }, + }, + }, nil +} + +func (ns *nodeServer) NodeGetVolumeStats(ctx context.Context, in *csi.NodeGetVolumeStatsRequest) (*csi.NodeGetVolumeStatsResponse, error) { + return nil, status.Error(codes.Unimplemented, "") +} + +// NodeExpandVolume is only implemented so the driver can be used for e2e testing. +func (ns *nodeServer) NodeExpandVolume(ctx context.Context, req *csi.NodeExpandVolumeRequest) (*csi.NodeExpandVolumeResponse, error) { + return nil, status.Error(codes.Unimplemented, "") +} diff --git a/pkg/katbox/server.go b/pkg/katbox/server.go new file mode 100644 index 0000000..4018246 --- /dev/null +++ b/pkg/katbox/server.go @@ -0,0 +1,125 @@ +/* +Copyright 2019 The Kubernetes Authors. + +Modifications copyright 2020 PayPal. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package katbox + +import ( + "fmt" + "net" + "os" + "strings" + "sync" + + "github.com/container-storage-interface/spec/lib/go/csi" + "github.com/golang/glog" + "github.com/kubernetes-csi/csi-lib-utils/protosanitizer" + + "golang.org/x/net/context" + + "google.golang.org/grpc" +) + +func NewNonBlockingGRPCServer() *nonBlockingGRPCServer { + return &nonBlockingGRPCServer{} +} + +// NonBlocking server +type nonBlockingGRPCServer struct { + wg sync.WaitGroup + server *grpc.Server +} + +func (s *nonBlockingGRPCServer) Start(endpoint string, ids csi.IdentityServer, ns csi.NodeServer) { + + s.wg.Add(1) + go s.serve(endpoint, ids, ns) + + return +} + +func (s *nonBlockingGRPCServer) Wait() { + s.wg.Wait() +} + +func (s *nonBlockingGRPCServer) Stop() { + s.server.GracefulStop() +} + +func (s *nonBlockingGRPCServer) ForceStop() { + s.server.Stop() +} + +func (s *nonBlockingGRPCServer) serve(endpoint string, ids csi.IdentityServer, ns csi.NodeServer) { + proto, addr, err := parseEndpoint(endpoint) + if err != nil { + glog.Fatal(err.Error()) + } + + if proto == "unix" { + addr = "/" + addr + if err := os.Remove(addr); err != nil && !os.IsNotExist(err) { //nolint: vetshadow + glog.Fatalf("Failed to remove %s, error: %s", addr, err.Error()) + } + } + + listener, err := net.Listen(proto, addr) + if err != nil { + glog.Fatalf("Failed to listen: %v", err) + } + + opts := []grpc.ServerOption{ + grpc.UnaryInterceptor(logGRPC), + } + server := grpc.NewServer(opts...) + s.server = server + + if ids != nil { + csi.RegisterIdentityServer(server, ids) + } + + if ns != nil { + csi.RegisterNodeServer(server, ns) + } + + glog.Infof("Listening for connections on address: %#v", listener.Addr()) + + server.Serve(listener) + +} + +func parseEndpoint(ep string) (string, string, error) { + if strings.HasPrefix(strings.ToLower(ep), "unix://") || strings.HasPrefix(strings.ToLower(ep), "tcp://") { + s := strings.SplitN(ep, "://", 2) + if s[1] != "" { + return s[0], s[1], nil + } + } + return "", "", fmt.Errorf("invalid endpoint: %v", ep) +} + +func logGRPC(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) { + glog.V(5).Infof("GRPC call: %s", info.FullMethod) + glog.V(5).Infof("GRPC request: %+v", protosanitizer.StripSecrets(req)) + resp, err := handler(ctx, req) + if err != nil { + glog.Errorf("GRPC error: %v", err) + } else { + glog.V(5).Infof("GRPC response: %+v", protosanitizer.StripSecrets(resp)) + } + return resp, err +} diff --git a/pkg/katbox/types.go b/pkg/katbox/types.go new file mode 100644 index 0000000..154a226 --- /dev/null +++ b/pkg/katbox/types.go @@ -0,0 +1,47 @@ +/* +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package katbox + +const ( + deviceID = "deviceID" + maxStorageCapacity = tib +) + +// Storage sizes +const ( + kib int64 = 1024 + mib int64 = kib * 1024 + gib int64 = mib * 1024 + gib100 int64 = gib * 100 + tib int64 = gib * 1024 + tib100 int64 = tib * 100 +) + +type accessType int + +const ( + mountAccess accessType = iota + blockAccess +) + +// Available contexts for volume +const ( + podUUIDContext = "csi.storage.k8s.io/pod.uid" + ephemeralContext = "csi.storage.k8s.io/ephemeral" +) + +const ( + volumesBucketName = "volumes" + deletedVolumesBucketName = "deletedVolumes" +) \ No newline at end of file diff --git a/pkg/katbox/util.go b/pkg/katbox/util.go new file mode 100644 index 0000000..8c59538 --- /dev/null +++ b/pkg/katbox/util.go @@ -0,0 +1,73 @@ +/* +Copyright 2020 PayPal. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package katbox + +import ( + "errors" + "math" + "os" + "path/filepath" + + "github.com/golang/glog" +) + +// fullpath returns the location where the katbox volume will be created inside the container +// running the katbox plugin +func fullpath(workdir, podUUID, p string) string { + return filepath.Join(workdir, podUUID, p) +} + +// pressureFactor returns a value to be used with afterlife calculations. +// The more space we're using in the head room, the more aggressive the early eviction should be. +// Therefore, as the the ratio of headroom space available diminishes, our ratio gets lower and lower. +// Since we will be multiplying by a type time.Duration which is added to the deletion time, we multiply by +// the complement of the percentage of used headroom. +// e.g: +// 40% of our headroom is being used. Therefore we need to reduce the afterlife by 40% (use 60% of afterlife). +// e.g: 600 seconds * .60 = 360 seconds. +// Thus when we check if we should evict, the calculation will be done using 360 seconds after the delete +// happened instead of 600 after the delete happened. +// This concept is inspired by the Apache Mesos disk pressure feature. +func pressureFactor(total, free uint64, headroom float64) (float64, error) { + if headroom < 0.0 || headroom > 1.0 { + return 0, errors.New("headroom must be a value between 0 and 1.0 (inclusive)") + } + + headroomSpace := uint64(math.Ceil(float64(total) * headroom)) + + glog.V(5).Infof("Total Size: %v\nTotal Free: %v\nTotal Headroom Space: %v", total, free, headroomSpace) + + if free >= headroomSpace { + return 1.0, nil + } + + // Determines how far into the headroom space we currently are and returns the inverse as that's how + // much of the afterlife we should be using. + return 1.0 - float64(headroomSpace-free)/float64(headroomSpace), nil +} + +// makeFile ensures that the file exists, creating it if necessary. +// The parent directory must exist. +func makeFile(pathname string) error { + f, err := os.OpenFile(pathname, os.O_CREATE, os.FileMode(0644)) + defer f.Close() + if err != nil { + if !os.IsExist(err) { + return err + } + } + return nil +} diff --git a/pkg/katbox/util_test.go b/pkg/katbox/util_test.go new file mode 100644 index 0000000..7820039 --- /dev/null +++ b/pkg/katbox/util_test.go @@ -0,0 +1,51 @@ +/* +Copyright 2020 PayPal. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package katbox + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func Test_pressureFactor(t *testing.T) { + tests := []struct { + name string + total uint64 + free uint64 + headroom float64 + expectedFactor float64 + expectErr bool + }{ + {"underUsage", 1000, 110, .10, 1.0, false}, + {"overUsage", 1000, 99, .10, .99, false}, + {"atUsage", 1000, 100, .10, 1.0, false}, + {"negativeHeadroom", 1000, 100, -.10, 0.0, true}, + {"greaterThan100", 1000, 100, 10, 0.0, true}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + pf, err := pressureFactor(tt.total, tt.free, tt.headroom) + + if tt.expectErr { + assert.Error(t, err, "expected an error") + } else { + assert.EqualValues(t, tt.expectedFactor, pf, "Incorrect pressure factor") + assert.NoError(t, err, "unexpected error") + } + }) + } +} \ No newline at end of file diff --git a/stream/Dockerfile b/stream/Dockerfile new file mode 100644 index 0000000..5144213 --- /dev/null +++ b/stream/Dockerfile @@ -0,0 +1,23 @@ +#Build from golang alpine as base image and add build base +FROM golang:1.16.0-alpine3.13 as golangbase +RUN apk add build-base + +LABEL maintainer="The Katbox Authors" + +WORKDIR /app +# Copy the source from the current directory to the Working Directory inside the container +COPY . . +RUN go mod download + +RUN go build -o main . + +#Start a new stage from scratch (multistage build) +FROM alpine:latest +RUN apk --no-cache add ca-certificates +WORKDIR /root/ + +# Copy the Pre-built binary file from the previous stage +COPY --from=golangbase /app/main . +#TODO:@revanth this port needs to updated before deploying on the cluster if needed +EXPOSE 5051 +CMD ["./main"] diff --git a/stream/docs/docs.go b/stream/docs/docs.go new file mode 100644 index 0000000..314f63b --- /dev/null +++ b/stream/docs/docs.go @@ -0,0 +1,232 @@ +// swag init +// Package docs GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// This file was generated by swaggo/swag +package docs + +import ( + "bytes" + "encoding/json" + "strings" + "text/template" + + "github.com/swaggo/swag" +) + +var doc = `{ + "schemes": {{ marshal .Schemes }}, + "swagger": "2.0", + "info": { + "description": "{{.Description}}", + "title": "{{.Title}}", + "contact": { + "name": "Revanth Chandra", + }, + "version": "{{.Version}}" + }, + "host": "{{.Host}}", + "basePath": "{{.BasePath}}", + "paths": { + "/files/browse": { + "get": { + "description": "serves sandbox logs filesystem as a json object", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "summary": "Browse Filesystem", + "parameters": [ + { + "type": "string", + "description": "Path", + "name": "path", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/main.Result" + } + } + } + } + }, + "/files/download": { + "get": { + "description": "Download any file from sandbox logs filesystem", + "consumes": [ + "application/json" + ], + "produces": [ + "application/octet-stream" + ], + "summary": "Download a file from Filesystem", + "parameters": [ + { + "type": "string", + "description": "Path", + "name": "path", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/main.StreamData" + } + } + } + } + }, + "/files/read": { + "get": { + "description": "Reads any file from sandbox logs filesystem and serves as a json object", + "consumes": [ + "application/json" + ], + "summary": "Read a file from Filesystem", + "parameters": [ + { + "type": "string", + "description": "Path", + "name": "path", + "in": "query", + "required": true + }, + { + "type": "integer", + "description": "Offset", + "name": "offset", + "in": "query", + "required": true + }, + { + "type": "integer", + "description": "Length", + "name": "length", + "in": "query", + "required": true + }, + { + "type": "string", + "description": "jsonp", + "name": "jsonp", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/main.StreamData" + } + } + } + } + } + }, + "definitions": { + "main.FileInformation": { + "type": "object", + "properties": { + "gid": { + "type": "string" + }, + "mode": { + "type": "string" + }, + "mtime": { + "type": "string" + }, + "nlink": { + "type": "string" + }, + "path": { + "type": "string" + }, + "size": { + "type": "string" + }, + "uid": { + "type": "string" + } + } + }, + "main.Result": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/definitions/main.FileInformation" + } + } + } + }, + "main.StreamData": { + "type": "object", + "properties": { + "data": { + "type": "string" + }, + "offset": { + "type": "integer" + } + } + } + } +}` + +type swaggerInfo struct { + Version string + Host string + BasePath string + Schemes []string + Title string + Description string +} + +// SwaggerInfo holds exported Swagger Info so clients can modify it +var SwaggerInfo = swaggerInfo{ + Version: "1.0", + Host: "localhost:8080", + BasePath: "/", + Schemes: []string{}, + Title: "k8s Sandbox Go Restful API with Swagger", + Description: "Rest API doc for sandbox API's", +} + +type s struct{} + +func (s *s) ReadDoc() string { + sInfo := SwaggerInfo + sInfo.Description = strings.Replace(sInfo.Description, "\n", "\\n", -1) + + t, err := template.New("swagger_info").Funcs(template.FuncMap{ + "marshal": func(v interface{}) string { + a, _ := json.Marshal(v) + return string(a) + }, + }).Parse(doc) + if err != nil { + return doc + } + + var tpl bytes.Buffer + if err := t.Execute(&tpl, sInfo); err != nil { + return doc + } + + return tpl.String() +} + +func init() { + swag.Register(swag.Name, &s{}) +} diff --git a/stream/docs/swagger.json b/stream/docs/swagger.json new file mode 100644 index 0000000..a5dd940 --- /dev/null +++ b/stream/docs/swagger.json @@ -0,0 +1,170 @@ +{ + "swagger": "2.0", + "info": { + "description": "Rest API doc for sandbox API's", + "title": "k8s Sandbox Go Restful API with Swagger", + "contact": { + "name": "Revanth Chandra", + }, + "version": "1.0" + }, + "host": "localhost:8080", + "basePath": "/", + "paths": { + "/files/browse": { + "get": { + "description": "serves sandbox logs filesystem as a json object", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "summary": "Browse Filesystem", + "parameters": [ + { + "type": "string", + "description": "Path", + "name": "path", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/main.Result" + } + } + } + } + }, + "/files/download": { + "get": { + "description": "Download any file from sandbox logs filesystem", + "consumes": [ + "application/json" + ], + "produces": [ + "application/octet-stream" + ], + "summary": "Download a file from Filesystem", + "parameters": [ + { + "type": "string", + "description": "Path", + "name": "path", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/main.StreamData" + } + } + } + } + }, + "/files/read": { + "get": { + "description": "Reads any file from sandbox logs filesystem and serves as a json object", + "consumes": [ + "application/json" + ], + "summary": "Read a file from Filesystem", + "parameters": [ + { + "type": "string", + "description": "Path", + "name": "path", + "in": "query", + "required": true + }, + { + "type": "integer", + "description": "Offset", + "name": "offset", + "in": "query", + "required": true + }, + { + "type": "integer", + "description": "Length", + "name": "length", + "in": "query", + "required": true + }, + { + "type": "string", + "description": "jsonp", + "name": "jsonp", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/main.StreamData" + } + } + } + } + } + }, + "definitions": { + "main.FileInformation": { + "type": "object", + "properties": { + "gid": { + "type": "string" + }, + "mode": { + "type": "string" + }, + "mtime": { + "type": "string" + }, + "nlink": { + "type": "string" + }, + "path": { + "type": "string" + }, + "size": { + "type": "string" + }, + "uid": { + "type": "string" + } + } + }, + "main.Result": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/definitions/main.FileInformation" + } + } + } + }, + "main.StreamData": { + "type": "object", + "properties": { + "data": { + "type": "string" + }, + "offset": { + "type": "integer" + } + } + } + } +} \ No newline at end of file diff --git a/stream/docs/swagger.yaml b/stream/docs/swagger.yaml new file mode 100644 index 0000000..e01da9a --- /dev/null +++ b/stream/docs/swagger.yaml @@ -0,0 +1,113 @@ +basePath: / +definitions: + main.FileInformation: + properties: + gid: + type: string + mode: + type: string + mtime: + type: string + nlink: + type: string + path: + type: string + size: + type: string + uid: + type: string + type: object + main.Result: + properties: + data: + items: + $ref: '#/definitions/main.FileInformation' + type: array + type: object + main.StreamData: + properties: + data: + type: string + offset: + type: integer + type: object +host: localhost:8080 +info: + contact: + name: Revanth Chandra + description: Rest API doc for sandbox API's + title: k8s Sandbox Go Restful API with Swagger + version: "1.0" +paths: + /files/browse: + get: + consumes: + - application/json + description: serves sandbox logs filesystem as a json object + parameters: + - description: Path + in: query + name: path + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/main.Result' + summary: Browse Filesystem + /files/download: + get: + consumes: + - application/json + description: Download any file from sandbox logs filesystem + parameters: + - description: Path + in: query + name: path + required: true + type: string + produces: + - application/octet-stream + responses: + "200": + description: OK + schema: + $ref: '#/definitions/main.StreamData' + summary: Download a file from Filesystem + /files/read: + get: + consumes: + - application/json + description: Reads any file from sandbox logs filesystem and serves as a json + object + parameters: + - description: Path + in: query + name: path + required: true + type: string + - description: Offset + in: query + name: offset + required: true + type: integer + - description: Length + in: query + name: length + required: true + type: integer + - description: jsonp + in: query + name: jsonp + required: true + type: string + responses: + "200": + description: OK + schema: + $ref: '#/definitions/main.StreamData' + summary: Read a file from Filesystem +swagger: "2.0" diff --git a/stream/go.mod b/stream/go.mod new file mode 100644 index 0000000..dd7874e --- /dev/null +++ b/stream/go.mod @@ -0,0 +1,9 @@ +module stream + +go 1.16 + +require ( + github.com/swaggo/http-swagger v1.0.0 // indirect + github.com/swaggo/swag v1.7.0 // indirect + golang.org/x/tools v0.1.0 // indirect +) diff --git a/stream/go.sum b/stream/go.sum new file mode 100644 index 0000000..d46fed3 --- /dev/null +++ b/stream/go.sum @@ -0,0 +1,97 @@ +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= +github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= +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-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/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +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/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-chi/chi v4.0.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= +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= +github.com/go-openapi/jsonreference v0.19.4/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= +github.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM= +github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= +github.com/go-openapi/spec v0.19.14/go.mod h1:gwrgJS15eCUgjLpMjBJmbZezCsw88LmgeEip0M63doA= +github.com/go-openapi/spec v0.20.0 h1:HGLc8AJ7ynOxwv0Lq4TsnwLsWMawHAYiJIFzbcML86I= +github.com/go-openapi/spec v0.20.0/go.mod h1:+81FIL1JwC5P3/Iuuozq3pPE9dXdIEGxFutcFKaVbmU= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.11/go.mod h1:Uc0gKkdR+ojzsEpjh39QChyu92vPgIr72POcgHMAgSY= +github.com/go-openapi/swag v0.19.12 h1:Bc0bnY2c3AoF7Gc+IMIAQQsD8fLHjHpc19wXvYuayQI= +github.com/go-openapi/swag v0.19.12/go.mod h1:eFdyEBkTdoAf/9RXBvj4cr1nH7GD8Kzo5HTt47gr72M= +github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +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/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/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +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/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +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.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/swaggo/files v0.0.0-20190704085106-630677cd5c14 h1:PyYN9JH5jY9j6av01SpfRMb+1DWg/i3MbGOKPxJ2wjM= +github.com/swaggo/files v0.0.0-20190704085106-630677cd5c14/go.mod h1:gxQT6pBGRuIGunNf/+tSOB5OHvguWi8Tbt82WOkf35E= +github.com/swaggo/http-swagger v1.0.0 h1:ksYgVBCYmAaxFsGVGojlPROgYfiQQSllETTWMtHJHTo= +github.com/swaggo/http-swagger v1.0.0/go.mod h1:cKIcshBU9yEAnfWv6ZzVKSsEf8h5ozxB8/zHQWyOQ/8= +github.com/swaggo/swag v1.7.0 h1:5bCA/MTLQoIqDXXyHfOpMeDvL9j68OY/udlK4pQoo4E= +github.com/swaggo/swag v1.7.0/go.mod h1:BdPIL73gvS9NBsdi7M1JOxLvlbfvNRaBP8m6WT6Aajo= +github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/mod v0.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-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201207224615-747e23833adb h1:xj2oMIbduz83x7tzglytWT7spn6rP+9hvKjTpro6/pM= +golang.org/x/net v0.0.0-20201207224615-747e23833adb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4 h1:myAQVi0cGEoqQVR5POX+8RR2mrocKqNN1hmeMqhX27k= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20201120155355-20be4ac4bd6e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208062317-e652b2f42cc7 h1:2OSu5vYyX4LVqZAtqZXnFEcN26SDKIJYlEVIRl1tj8U= +golang.org/x/tools v0.0.0-20201208062317-e652b2f42cc7/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0 h1:po9/4sTYwZU9lPhi1tOrb4hCv3qrhiQ77LZfGa2OjwY= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +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-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/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/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/stream/k8s.yaml b/stream/k8s.yaml new file mode 100644 index 0000000..e9947a2 --- /dev/null +++ b/stream/k8s.yaml @@ -0,0 +1,23 @@ +#---# +#k8s-base.yaml +apiVersion: apps/v1 +kind: ReplicaSet +metadata: + name: streamserver +spec: + replicas: 1 + selector: + matchLabels: + app: streamserver + template: + metadata: + labels: + app: streamserver + spec: + containers: + - name: streamserver + image: streamserver:latest + imagePullPolicy: IfNotPresent + ports: + - containerPort: 8080 + diff --git a/stream/main.go b/stream/main.go new file mode 100644 index 0000000..a303f74 --- /dev/null +++ b/stream/main.go @@ -0,0 +1,347 @@ +package main + +/* +#include +#include +#include +#include +*/ +import "C" + +import ( + "encoding/json" + "fmt" + "io" + "log" + "math" + "net/http" + "os" + "os/user" + "path/filepath" + "strconv" + _ "stream/docs" + "strings" + "syscall" + + httpSwagger "github.com/swaggo/http-swagger" +) + +type StreamData struct { + Data string `json:"data"` + Offset int64 `json:"offset"` +} + +type FileInformation struct { + Mode string `json:"mode"` + Nlink string `json:"nlink"` + UID string `json:"uid"` + GID string `json:"gid"` + Size string `json:"size"` + Mtime int64 `json:"mtime"` + Path string `json:"path"` +} + +type Result struct { + Data []FileInformation `json:"data` +} + +type Error struct { + Error string `json:"error"` +} + +// Download a file from sandbox filesystem with given offset and length godoc +// @Summary Download a file from Filesystem +// @Description Download any file from sandbox logs filesystem +// @Accept json +// @Produce octet-stream +// @Success 200 {object} main.StreamData +// @Router /files/download [get] +// @Param path query string true "Path" +func downloadhandler(w http.ResponseWriter, r *http.Request) { + //Get query params + params := r.URL.Query() + path := params["path"] + + if len(path) == 0 { + log.Println("path not found in URL") + error := &Error{ + Error: "path not found in URL"} + retObj, err := json.Marshal(error) + if err != nil { + log.Print(err) + } + w.Header().Set("Content-Type", "application/json") + w.Header().Set("Access-Control-Allow-Origin", "*") + w.Write(retObj) + return + } + + file, err := os.Open(path[0]) + if err != nil { + log.Print(err) + } + filename := filepath.Base(path[0]) + + w.Header().Set("Content-Type", "application/octet-stream") + w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=%q", filename)) + io.Copy(w, file) + file.Close() + +} + +// read a file from sandbox filesystem with given offset and length godoc +// @Summary Read a file from Filesystem +// @Description Reads any file from sandbox logs filesystem and serves as a json object +// @Accept json +// @Success 200 {object} main.StreamData +// @Router /files/read [get] +// @Param path query string true "Path" +// @Param offset query int true "Offset" +// @Param length query int true "Length" +// @Param jsonp query string true "jsonp" +func readHandler(w http.ResponseWriter, r *http.Request) { + // Get query path params + params := r.URL.Query() + path := params["path"] + + //check if path exists in the query params if not send error response + if len(path) == 0 { + log.Println("path not found in URL") + error := &Error{ + Error: "path not found in URL"} + retObj, err := json.Marshal(error) + if err != nil { + log.Print(err) + } + w.Header().Set("Content-Type", "application/json") + w.Header().Set("Access-Control-Allow-Origin", "*") + w.Write(retObj) + return + } + + var err error + //check if offset exists in the query params if not send error response + if len(params["offset"]) == 0 { + error := &Error{ + Error: "offset not found in URL"} + retObj, err := json.Marshal(error) + if err != nil { + log.Print(err) + } + w.Header().Set("Content-Type", "application/json") + w.Header().Set("Access-Control-Allow-Origin", "*") + w.Write(retObj) + return + } + offset, err := strconv.ParseInt(params["offset"][0], 10, 64) + if err != nil { + log.Print(err) + } + + //check if length exists in the query params if not send error response + if len(params["length"]) == 0 { + error := &Error{ + Error: "length not found in URL"} + retObj, err := json.Marshal(error) + if err != nil { + log.Print(err) + } + w.Header().Set("Content-Type", "application/json") + w.Header().Set("Access-Control-Allow-Origin", "*") + w.Write(retObj) + return + } + length, err := strconv.ParseInt(params["length"][0], 10, 64) + if err != nil { + log.Print(err) + } + + size := getSize(path[0]) + + // if offset is invalid set it to size of the file + if offset == -1 { + offset = size + } + + //set length if it is invalid + if length == -1 { + length = size - offset + } + + // Cap the read length at 16 pages. + length = int64(math.Min(float64(length), float64(C.sysconf(C._SC_PAGE_SIZE)*16))) + + // return empty data when offset is greater than size of the file + if offset >= size { + staremData := &StreamData{ + Data: "", + Offset: size} + + respObj, err := json.Marshal(staremData) + if err != nil { + fmt.Fprintf(w, "json encode error") + return + } + + callbackName := r.URL.Query().Get("jsonp") + if callbackName == "" { + fmt.Fprintf(w, "Please give callback name in query string") + return + } + + w.Header().Set("Content-Type", "application/javascript") + w.Header().Set("Access-Control-Allow-Origin", "*") + fmt.Fprintf(w, "%s(%s);", callbackName, respObj) + + return + } + + file, err := os.Open(path[0]) + if err != nil { + log.Print(err) + } + + defer file.Close() + + s := io.NewSectionReader(file, 0, size) + + buf2 := make([]byte, length) + _, err = s.ReadAt(buf2, offset) + if err != nil { + log.Print(err) + } + + staremData := &StreamData{ + Data: string(buf2), + Offset: offset} + + respObj, err := json.Marshal(staremData) + if err != nil { + fmt.Fprintf(w, "json encode error") + return + } + + callbackName := r.URL.Query().Get("jsonp") + if callbackName == "" { + fmt.Fprintf(w, "Please give callback name in query string") + return + } + + w.Header().Set("Content-Type", "application/javascript") + w.Header().Set("Access-Control-Allow-Origin", "*") + fmt.Fprintf(w, "%s(%s);", callbackName, respObj) + +} + +// browse sandbox filesystem godoc +// @Summary Browse Filesystem +// @Description serves sandbox logs filesystem as a json object +// @Accept json +// @Produce json +// @Success 200 {object} main.Result +// @Router /files/browse [get] +// @Param path query string true "Path" +func browseHandler(w http.ResponseWriter, r *http.Request) { + //Get query Params + params := r.URL.Query() + path := params["path"] + + //check if path exists in the query params if not send error response + if len(path) == 0 { + log.Println("path not found in URL") + error := &Error{ + Error: "path not found in URL"} + retObj, err := json.Marshal(error) + if err != nil { + log.Print(err) + } + w.Header().Set("Content-Type", "application/json") + w.Header().Set("Access-Control-Allow-Origin", "*") + w.Write(retObj) + return + } + + // walk through the directory structure and build fileInformation struct and append to result array + result := []FileInformation{} + //test := strings.Split(path[0], "/")[len(strings.Split(path[0], "/"))-1] + //fmt.Print(test, " ") + //fmt.Print(test, " ") + err := filepath.WalkDir(path[0], + func(filePath string, dirEntry os.DirEntry, err error) error { + if len(strings.Split(filePath, "/")) < len(strings.Split(path[0], "/"))+2 { + if err != nil { + return err + } + fileInfo, err := dirEntry.Info() + + fileStat, err := os.Stat(filePath) + if err != nil { + return err + } + // retrieve file ownership information and number of hardlinks to the file + var nlink, uid, gid uint64 + if sys := fileStat.Sys(); sys != nil { + if stat, ok := sys.(*syscall.Stat_t); ok { + nlink = uint64(stat.Nlink) + uid = uint64(stat.Uid) + gid = uint64(stat.Gid) + } + } + usr, err := user.LookupId(strconv.FormatUint(uid, 10)) + group, err := user.LookupGroupId(strconv.FormatUint(gid, 10)) + if err != nil { + return err + } + + jsonData := FileInformation{ + Mode: fileInfo.Mode().String(), + Nlink: string(strconv.FormatUint(nlink, 10)), + UID: usr.Username, + GID: group.Name, + Size: strconv.Itoa(int(fileInfo.Size())), + Mtime: fileInfo.ModTime().Unix(), + Path: filePath, + } + if err == nil { + result = append(result, jsonData) + } + } + + return nil + }) + if err != nil { + log.Println(err) + } + + resultdata := Result{result} + c, err := json.Marshal(resultdata) + + if err == nil { + w.Header().Set("Content-Type", "application/json") + w.Header().Set("Access-Control-Allow-Origin", "*") + w.Write(c) + } + +} + +//Get the size of a file +func getSize(p string) int64 { + if stat, err := os.Stat(p); err == nil { + return stat.Size() + } + return 0 +} + +// @title k8s Sandbox Go Restful API with Swagger +// @version 1.0 +// @description Rest API doc for sandbox API's +// @contact.name Revanth Chandra +// @host localhost:8080 +// @BasePath / +func main() { + http.HandleFunc("/files/read", readHandler) + http.HandleFunc("/files/browse", browseHandler) + http.HandleFunc("/files/download", downloadhandler) + http.HandleFunc("/swagger/", httpSwagger.WrapHandler) + http.ListenAndServe(":5051", nil) +} diff --git a/stream/main_test.go b/stream/main_test.go new file mode 100644 index 0000000..d040677 --- /dev/null +++ b/stream/main_test.go @@ -0,0 +1,127 @@ +package main + +import ( + "net/http" + "net/http/httptest" + "testing" +) + +func TestBrowseHandler(t *testing.T) { + req, err := http.NewRequest("GET", "/files/browse", nil) + if err != nil { + t.Fatal(err) + } + q := req.URL.Query() + q.Add("path", ".") + req.URL.RawQuery = q.Encode() + + rr := httptest.NewRecorder() + handler := http.HandlerFunc(browseHandler) + handler.ServeHTTP(rr, req) + if status := rr.Code; status != http.StatusOK { + t.Errorf("handler returned wrong status code: got %v want %v", + status, http.StatusOK) + } +} + +func TestReadHandlerWIthVakidOffset(t *testing.T) { + req, err := http.NewRequest("GET", "/files/read", nil) + if err != nil { + t.Fatal(err) + } + q := req.URL.Query() + q.Add("path", "/Users/revchandra/Desktop/go/dce.err") + q.Add("offset", "0") + q.Add("length", "1000") + q.Add("jsonp", "jQuery17107124409226948478_1614562818140&_=1614562818159") + req.URL.RawQuery = q.Encode() + + rr := httptest.NewRecorder() + handler := http.HandlerFunc(readHandler) + handler.ServeHTTP(rr, req) + if status := rr.Code; status != http.StatusOK { + t.Errorf("handler returned wrong status code: got %v want %v", + status, http.StatusOK) + } +} + +func TestReadHandlerWithOffsetOverflow(t *testing.T) { + req, err := http.NewRequest("GET", "/files/read", nil) + if err != nil { + t.Fatal(err) + } + q := req.URL.Query() + q.Add("path", ".") + q.Add("offset", "4174") + q.Add("length", "1000") + q.Add("jsonp", "jQuery17107124409226948478_1614562818140&_=1614562818159") + req.URL.RawQuery = q.Encode() + + rr := httptest.NewRecorder() + handler := http.HandlerFunc(readHandler) + handler.ServeHTTP(rr, req) + if status := rr.Code; status != http.StatusOK { + t.Errorf("handler returned wrong status code: got %v want %v", + status, http.StatusOK) + } + +} + +func TestReadHandlerWithInvalidOffset(t *testing.T) { + req, err := http.NewRequest("GET", "/files/read", nil) + if err != nil { + t.Fatal(err) + } + q := req.URL.Query() + q.Add("path", ".") + q.Add("offset", "-1") + q.Add("length", "-1") + q.Add("jsonp", "jQuery17107124409226948478_1614562818140&_=1614562818159") + req.URL.RawQuery = q.Encode() + + rr := httptest.NewRecorder() + handler := http.HandlerFunc(readHandler) + handler.ServeHTTP(rr, req) + if status := rr.Code; status != http.StatusOK { + t.Errorf("handler returned wrong status code: got %v want %v", + status, http.StatusOK) + } + +} +func TestDownloadHandler(t *testing.T) { + req, err := http.NewRequest("GET", "/files/download", nil) + if err != nil { + t.Fatal(err) + } + q := req.URL.Query() + q.Add("path", ".") + + req.URL.RawQuery = q.Encode() + + rr := httptest.NewRecorder() + handler := http.HandlerFunc(downloadhandler) + handler.ServeHTTP(rr, req) + if status := rr.Code; status != http.StatusOK { + t.Errorf("handler returned wrong status code: got %v want %v", + status, http.StatusOK) + } +} + +func TestDownloadHandlerWithInvalidPath(t *testing.T) { + req, err := http.NewRequest("GET", "/files/download", nil) + if err != nil { + t.Fatal(err) + } + q := req.URL.Query() + q.Add("path", ".") + + req.URL.RawQuery = q.Encode() + + rr := httptest.NewRecorder() + handler := http.HandlerFunc(downloadhandler) + handler.ServeHTTP(rr, req) + if status := rr.Code; status != http.StatusOK { + t.Errorf("handler returned wrong status code: got %v want %v", + status, http.StatusOK) + } +}