mirror of
https://github.com/ceph/ceph-csi.git
synced 2025-02-06 11:29:30 +00:00
Merge pull request #125 from ceph/devel
sync downstream devel from upstream devel
This commit is contained in:
commit
964a397116
2
.github/workflows/stale.yaml
vendored
2
.github/workflows/stale.yaml
vendored
@ -15,7 +15,7 @@ jobs:
|
|||||||
permissions:
|
permissions:
|
||||||
issues: write # for actions/stale to close stale issues
|
issues: write # for actions/stale to close stale issues
|
||||||
pull-requests: write # for actions/stale to close stale PRs
|
pull-requests: write # for actions/stale to close stale PRs
|
||||||
runs-on: ubuntu-18.04
|
runs-on: ubuntu-latest
|
||||||
if: github.repository == 'ceph/ceph-csi'
|
if: github.repository == 'ceph/ceph-csi'
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/stale@v5
|
- uses: actions/stale@v5
|
||||||
|
18
.mergify.yml
18
.mergify.yml
@ -161,14 +161,6 @@ pull_request_rules:
|
|||||||
queue:
|
queue:
|
||||||
name: default
|
name: default
|
||||||
delete_head_branch: {}
|
delete_head_branch: {}
|
||||||
- name: backport patches to release-v3.5 branch
|
|
||||||
conditions:
|
|
||||||
- base=devel
|
|
||||||
- label=backport-to-release-v3.5
|
|
||||||
actions:
|
|
||||||
backport:
|
|
||||||
branches:
|
|
||||||
- release-v3.5
|
|
||||||
- name: backport patches to release-v3.6 branch
|
- name: backport patches to release-v3.6 branch
|
||||||
conditions:
|
conditions:
|
||||||
- base=devel
|
- base=devel
|
||||||
@ -177,6 +169,14 @@ pull_request_rules:
|
|||||||
backport:
|
backport:
|
||||||
branches:
|
branches:
|
||||||
- release-v3.6
|
- release-v3.6
|
||||||
|
- name: backport patches to release-v3.7 branch
|
||||||
|
conditions:
|
||||||
|
- base=devel
|
||||||
|
- label=backport-to-release-v3.7
|
||||||
|
actions:
|
||||||
|
backport:
|
||||||
|
branches:
|
||||||
|
- release-v3.7
|
||||||
- name: remove outdated approvals on ci/centos
|
- name: remove outdated approvals on ci/centos
|
||||||
conditions:
|
conditions:
|
||||||
- base=ci/centos
|
- base=ci/centos
|
||||||
@ -294,6 +294,7 @@ pull_request_rules:
|
|||||||
add:
|
add:
|
||||||
- component/docs
|
- component/docs
|
||||||
- ci/skip/e2e
|
- ci/skip/e2e
|
||||||
|
- ci/skip/multi-arch-build
|
||||||
- name: title contains Mergify
|
- name: title contains Mergify
|
||||||
conditions:
|
conditions:
|
||||||
- "title~=(?i)mergify"
|
- "title~=(?i)mergify"
|
||||||
@ -302,3 +303,4 @@ pull_request_rules:
|
|||||||
add:
|
add:
|
||||||
- Repo activity
|
- Repo activity
|
||||||
- ci/skip/e2e
|
- ci/skip/e2e
|
||||||
|
- ci/skip/multi-arch-build
|
||||||
|
4
Makefile
4
Makefile
@ -49,7 +49,7 @@ GO_PROJECT=github.com/ceph/ceph-csi
|
|||||||
CEPH_VERSION ?= $(shell . $(CURDIR)/build.env ; echo $${CEPH_VERSION})
|
CEPH_VERSION ?= $(shell . $(CURDIR)/build.env ; echo $${CEPH_VERSION})
|
||||||
# TODO: ceph_preview tag may be removed with go-ceph 0.17.0
|
# TODO: ceph_preview tag may be removed with go-ceph 0.17.0
|
||||||
# TODO: ceph_ci_untested is added for subvolume metadata (go-ceph#691) and snapshot metadata management (go-ceph#698)
|
# TODO: ceph_ci_untested is added for subvolume metadata (go-ceph#691) and snapshot metadata management (go-ceph#698)
|
||||||
GO_TAGS_LIST ?= $(CEPH_VERSION) ceph_preview ceph_ci_untested
|
GO_TAGS_LIST ?= $(CEPH_VERSION) ceph_preview ceph_ci_untested ceph_pre_quincy
|
||||||
|
|
||||||
# go build flags
|
# go build flags
|
||||||
LDFLAGS ?=
|
LDFLAGS ?=
|
||||||
@ -184,7 +184,7 @@ run-e2e: NAMESPACE ?= cephcsi-e2e-$(shell uuidgen | cut -d- -f1)
|
|||||||
run-e2e:
|
run-e2e:
|
||||||
@test -e e2e.test || $(MAKE) e2e.test
|
@test -e e2e.test || $(MAKE) e2e.test
|
||||||
cd e2e && \
|
cd e2e && \
|
||||||
../e2e.test -test.v -test.timeout="${E2E_TIMEOUT}" --deploy-timeout="${DEPLOY_TIMEOUT}" --cephcsi-namespace=$(NAMESPACE) $(E2E_ARGS)
|
../e2e.test -test.v -ginkgo.timeout="${E2E_TIMEOUT}" --deploy-timeout="${DEPLOY_TIMEOUT}" --cephcsi-namespace=$(NAMESPACE) $(E2E_ARGS)
|
||||||
|
|
||||||
.container-cmd:
|
.container-cmd:
|
||||||
@test -n "$(shell which $(CONTAINER_CMD) 2>/dev/null)" || { echo "Missing container support, install Podman or Docker"; exit 1; }
|
@test -n "$(shell which $(CONTAINER_CMD) 2>/dev/null)" || { echo "Missing container support, install Podman or Docker"; exit 1; }
|
||||||
|
@ -56,6 +56,7 @@ environments.
|
|||||||
|
|
||||||
| Ceph CSI Version | Container Orchestrator Name | Version Tested|
|
| Ceph CSI Version | Container Orchestrator Name | Version Tested|
|
||||||
| -----------------| --------------------------- | --------------|
|
| -----------------| --------------------------- | --------------|
|
||||||
|
| v3.7.0 | Kubernetes | v1.22, v1.23, v1.24|
|
||||||
| v3.6.1 | Kubernetes | v1.21, v1.22, v1.23|
|
| v3.6.1 | Kubernetes | v1.21, v1.22, v1.23|
|
||||||
| v3.6.0 | Kubernetes | v1.21, v1.22, v1.23|
|
| v3.6.0 | Kubernetes | v1.21, v1.22, v1.23|
|
||||||
| v3.5.1 | Kubernetes | v1.21, v1.22, v1.23|
|
| v3.5.1 | Kubernetes | v1.21, v1.22, v1.23|
|
||||||
@ -70,8 +71,8 @@ NOTE:
|
|||||||
The supported window of Ceph CSI versions is "N.(x-1)":
|
The supported window of Ceph CSI versions is "N.(x-1)":
|
||||||
(N (Latest major release) . (x (Latest minor release) - 1)).
|
(N (Latest major release) . (x (Latest minor release) - 1)).
|
||||||
|
|
||||||
For example, if the Ceph CSI latest major version is `3.6.0` today, support is
|
For example, if the Ceph CSI latest major version is `3.7.0` today, support is
|
||||||
provided for the versions above `3.5.0`. If users are running an unsupported
|
provided for the versions above `3.6.0`. If users are running an unsupported
|
||||||
Ceph CSI version, they will be asked to upgrade when requesting support.
|
Ceph CSI version, they will be asked to upgrade when requesting support.
|
||||||
|
|
||||||
## Support Matrix
|
## Support Matrix
|
||||||
@ -131,6 +132,7 @@ in the Kubernetes documentation.
|
|||||||
| Ceph CSI Release/Branch | Container image name | Image Tag |
|
| Ceph CSI Release/Branch | Container image name | Image Tag |
|
||||||
| ----------------------- | ---------------------------- | --------- |
|
| ----------------------- | ---------------------------- | --------- |
|
||||||
| devel (Branch) | quay.io/cephcsi/cephcsi | canary |
|
| devel (Branch) | quay.io/cephcsi/cephcsi | canary |
|
||||||
|
| v3.7.0 (Release) | quay.io/cephcsi/cephcsi | v3.7.0 |
|
||||||
| v3.6.1 (Release) | quay.io/cephcsi/cephcsi | v3.6.1 |
|
| v3.6.1 (Release) | quay.io/cephcsi/cephcsi | v3.6.1 |
|
||||||
| v3.6.0 (Release) | quay.io/cephcsi/cephcsi | v3.6.0 |
|
| v3.6.0 (Release) | quay.io/cephcsi/cephcsi | v3.6.0 |
|
||||||
| v3.5.1 (Release) | quay.io/cephcsi/cephcsi | v3.5.1 |
|
| v3.5.1 (Release) | quay.io/cephcsi/cephcsi | v3.5.1 |
|
||||||
|
@ -16,14 +16,14 @@ BASE_IMAGE=quay.io/ceph/ceph:v17
|
|||||||
CEPH_VERSION=quincy
|
CEPH_VERSION=quincy
|
||||||
|
|
||||||
# standard Golang options
|
# standard Golang options
|
||||||
GOLANG_VERSION=1.17.10
|
GOLANG_VERSION=1.18.5
|
||||||
GO111MODULE=on
|
GO111MODULE=on
|
||||||
|
|
||||||
# commitlint version
|
# commitlint version
|
||||||
COMMITLINT_VERSION=latest
|
COMMITLINT_VERSION=latest
|
||||||
|
|
||||||
# static checks and linters
|
# static checks and linters
|
||||||
GOLANGCI_VERSION=v1.46.2
|
GOLANGCI_VERSION=v1.47.3
|
||||||
|
|
||||||
# external snapshotter version
|
# external snapshotter version
|
||||||
# Refer: https://github.com/kubernetes-csi/external-snapshotter/releases
|
# Refer: https://github.com/kubernetes-csi/external-snapshotter/releases
|
||||||
@ -35,7 +35,7 @@ SNAPSHOT_VERSION=v6.0.1
|
|||||||
#GO_COVER_DIR=_output/
|
#GO_COVER_DIR=_output/
|
||||||
|
|
||||||
# helm chart generation, testing and publishing
|
# helm chart generation, testing and publishing
|
||||||
HELM_VERSION=v3.9.0
|
HELM_VERSION=v3.9.2
|
||||||
|
|
||||||
# minikube settings
|
# minikube settings
|
||||||
MINIKUBE_VERSION=v1.26.1
|
MINIKUBE_VERSION=v1.26.1
|
||||||
@ -43,7 +43,7 @@ VM_DRIVER=none
|
|||||||
CHANGE_MINIKUBE_NONE_USER=true
|
CHANGE_MINIKUBE_NONE_USER=true
|
||||||
|
|
||||||
# Rook options
|
# Rook options
|
||||||
ROOK_VERSION=v1.9.4
|
ROOK_VERSION=v1.9.8
|
||||||
# Provide ceph image path
|
# Provide ceph image path
|
||||||
ROOK_CEPH_CLUSTER_IMAGE=quay.io/ceph/ceph:v17
|
ROOK_CEPH_CLUSTER_IMAGE=quay.io/ceph/ceph:v17
|
||||||
|
|
||||||
|
@ -1,51 +0,0 @@
|
|||||||
{{- if .Values.nodeplugin.podSecurityPolicy.enabled -}}
|
|
||||||
apiVersion: policy/v1beta1
|
|
||||||
kind: PodSecurityPolicy
|
|
||||||
metadata:
|
|
||||||
name: {{ include "ceph-csi-cephfs.nodeplugin.fullname" . }}
|
|
||||||
labels:
|
|
||||||
app: {{ include "ceph-csi-cephfs.fullname" . }}
|
|
||||||
chart: {{ include "ceph-csi-cephfs.chart" . }}
|
|
||||||
component: {{ .Values.nodeplugin.name }}
|
|
||||||
release: {{ .Release.Name }}
|
|
||||||
heritage: {{ .Release.Service }}
|
|
||||||
spec:
|
|
||||||
allowPrivilegeEscalation: true
|
|
||||||
allowedCapabilities:
|
|
||||||
- 'SYS_ADMIN'
|
|
||||||
fsGroup:
|
|
||||||
rule: RunAsAny
|
|
||||||
privileged: true
|
|
||||||
hostNetwork: true
|
|
||||||
hostPorts:
|
|
||||||
- min: {{ .Values.nodeplugin.httpMetrics.containerPort }}
|
|
||||||
max: {{ .Values.nodeplugin.httpMetrics.containerPort }}
|
|
||||||
hostPID: true
|
|
||||||
runAsUser:
|
|
||||||
rule: RunAsAny
|
|
||||||
seLinux:
|
|
||||||
rule: RunAsAny
|
|
||||||
supplementalGroups:
|
|
||||||
rule: RunAsAny
|
|
||||||
volumes:
|
|
||||||
- 'configMap'
|
|
||||||
- 'emptyDir'
|
|
||||||
- 'projected'
|
|
||||||
- 'secret'
|
|
||||||
- 'hostPath'
|
|
||||||
allowedHostPaths:
|
|
||||||
- pathPrefix: '/dev'
|
|
||||||
readOnly: false
|
|
||||||
- pathPrefix: '/run/mount'
|
|
||||||
readOnly: false
|
|
||||||
- pathPrefix: '/sys'
|
|
||||||
readOnly: false
|
|
||||||
{{- if .Values.selinuxMount }}
|
|
||||||
- pathPrefix: '/etc/selinux'
|
|
||||||
readOnly: true
|
|
||||||
{{- end }}
|
|
||||||
- pathPrefix: '/lib/modules'
|
|
||||||
readOnly: true
|
|
||||||
- pathPrefix: '{{ .Values.kubeletDir }}'
|
|
||||||
readOnly: false
|
|
||||||
{{- end }}
|
|
@ -1,18 +0,0 @@
|
|||||||
{{- if and .Values.rbac.create .Values.nodeplugin.podSecurityPolicy.enabled -}}
|
|
||||||
kind: Role
|
|
||||||
apiVersion: rbac.authorization.k8s.io/v1
|
|
||||||
metadata:
|
|
||||||
name: {{ include "ceph-csi-cephfs.nodeplugin.fullname" . }}
|
|
||||||
namespace: {{ .Release.Namespace }}
|
|
||||||
labels:
|
|
||||||
app: {{ include "ceph-csi-cephfs.fullname" . }}
|
|
||||||
chart: {{ include "ceph-csi-cephfs.chart" . }}
|
|
||||||
component: {{ .Values.nodeplugin.name }}
|
|
||||||
release: {{ .Release.Name }}
|
|
||||||
heritage: {{ .Release.Service }}
|
|
||||||
rules:
|
|
||||||
- apiGroups: ['policy']
|
|
||||||
resources: ['podsecuritypolicies']
|
|
||||||
verbs: ['use']
|
|
||||||
resourceNames: ['{{ include "ceph-csi-cephfs.nodeplugin.fullname" . }}']
|
|
||||||
{{- end -}}
|
|
@ -1,21 +0,0 @@
|
|||||||
{{- if and .Values.rbac.create .Values.nodeplugin.podSecurityPolicy.enabled -}}
|
|
||||||
kind: RoleBinding
|
|
||||||
apiVersion: rbac.authorization.k8s.io/v1
|
|
||||||
metadata:
|
|
||||||
name: {{ include "ceph-csi-cephfs.nodeplugin.fullname" . }}
|
|
||||||
namespace: {{ .Release.Namespace }}
|
|
||||||
labels:
|
|
||||||
app: {{ include "ceph-csi-cephfs.fullname" . }}
|
|
||||||
chart: {{ include "ceph-csi-cephfs.chart" . }}
|
|
||||||
component: {{ .Values.nodeplugin.name }}
|
|
||||||
release: {{ .Release.Name }}
|
|
||||||
heritage: {{ .Release.Service }}
|
|
||||||
subjects:
|
|
||||||
- kind: ServiceAccount
|
|
||||||
name: {{ include "ceph-csi-cephfs.serviceAccountName.nodeplugin" . }}
|
|
||||||
namespace: {{ .Release.Namespace }}
|
|
||||||
roleRef:
|
|
||||||
kind: Role
|
|
||||||
name: {{ include "ceph-csi-cephfs.nodeplugin.fullname" . }}
|
|
||||||
apiGroup: rbac.authorization.k8s.io
|
|
||||||
{{- end -}}
|
|
@ -1,34 +0,0 @@
|
|||||||
{{- if .Values.provisioner.podSecurityPolicy.enabled -}}
|
|
||||||
apiVersion: policy/v1beta1
|
|
||||||
kind: PodSecurityPolicy
|
|
||||||
metadata:
|
|
||||||
name: {{ include "ceph-csi-cephfs.provisioner.fullname" . }}
|
|
||||||
labels:
|
|
||||||
app: {{ include "ceph-csi-cephfs.name" . }}
|
|
||||||
chart: {{ include "ceph-csi-cephfs.chart" . }}
|
|
||||||
component: {{ .Values.provisioner.name }}
|
|
||||||
release: {{ .Release.Name }}
|
|
||||||
heritage: {{ .Release.Service }}
|
|
||||||
spec:
|
|
||||||
fsGroup:
|
|
||||||
rule: RunAsAny
|
|
||||||
runAsUser:
|
|
||||||
rule: RunAsAny
|
|
||||||
seLinux:
|
|
||||||
rule: RunAsAny
|
|
||||||
supplementalGroups:
|
|
||||||
rule: RunAsAny
|
|
||||||
volumes:
|
|
||||||
- 'configMap'
|
|
||||||
- 'emptyDir'
|
|
||||||
- 'projected'
|
|
||||||
- 'secret'
|
|
||||||
- 'hostPath'
|
|
||||||
allowedHostPaths:
|
|
||||||
- pathPrefix: '/dev'
|
|
||||||
readOnly: false
|
|
||||||
- pathPrefix: '/sys'
|
|
||||||
readOnly: false
|
|
||||||
- pathPrefix: '/lib/modules'
|
|
||||||
readOnly: true
|
|
||||||
{{- end }}
|
|
@ -17,10 +17,4 @@ rules:
|
|||||||
- apiGroups: ["coordination.k8s.io"]
|
- apiGroups: ["coordination.k8s.io"]
|
||||||
resources: ["leases"]
|
resources: ["leases"]
|
||||||
verbs: ["get", "watch", "list", "delete", "update", "create"]
|
verbs: ["get", "watch", "list", "delete", "update", "create"]
|
||||||
{{- if .Values.provisioner.podSecurityPolicy.enabled }}
|
|
||||||
- apiGroups: ['policy']
|
|
||||||
resources: ['podsecuritypolicies']
|
|
||||||
verbs: ['use']
|
|
||||||
resourceNames: ['{{ include "ceph-csi-cephfs.provisioner.fullname" . }}']
|
|
||||||
{{- end -}}
|
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
@ -110,11 +110,6 @@ nodeplugin:
|
|||||||
kernelmountoptions: ""
|
kernelmountoptions: ""
|
||||||
fusemountoptions: ""
|
fusemountoptions: ""
|
||||||
|
|
||||||
# If true, create & use Pod Security Policy resources
|
|
||||||
# https://kubernetes.io/docs/concepts/policy/pod-security-policy/
|
|
||||||
podSecurityPolicy:
|
|
||||||
enabled: false
|
|
||||||
|
|
||||||
provisioner:
|
provisioner:
|
||||||
name: provisioner
|
name: provisioner
|
||||||
replicaCount: 3
|
replicaCount: 3
|
||||||
@ -205,11 +200,6 @@ provisioner:
|
|||||||
|
|
||||||
affinity: {}
|
affinity: {}
|
||||||
|
|
||||||
# If true, create & use Pod Security Policy resources
|
|
||||||
# https://kubernetes.io/docs/concepts/policy/pod-security-policy/
|
|
||||||
podSecurityPolicy:
|
|
||||||
enabled: false
|
|
||||||
|
|
||||||
# Mount the host /etc/selinux inside pods to support
|
# Mount the host /etc/selinux inside pods to support
|
||||||
# selinux-enabled filesystems
|
# selinux-enabled filesystems
|
||||||
selinuxMount: true
|
selinuxMount: true
|
||||||
|
@ -1,53 +0,0 @@
|
|||||||
{{- if .Values.nodeplugin.podSecurityPolicy.enabled -}}
|
|
||||||
apiVersion: policy/v1beta1
|
|
||||||
kind: PodSecurityPolicy
|
|
||||||
metadata:
|
|
||||||
name: {{ include "ceph-csi-rbd.nodeplugin.fullname" . }}
|
|
||||||
labels:
|
|
||||||
app: {{ include "ceph-csi-rbd.name" . }}
|
|
||||||
chart: {{ include "ceph-csi-rbd.chart" . }}
|
|
||||||
component: {{ .Values.nodeplugin.name }}
|
|
||||||
release: {{ .Release.Name }}
|
|
||||||
heritage: {{ .Release.Service }}
|
|
||||||
spec:
|
|
||||||
allowPrivilegeEscalation: true
|
|
||||||
allowedCapabilities:
|
|
||||||
- 'SYS_ADMIN'
|
|
||||||
fsGroup:
|
|
||||||
rule: RunAsAny
|
|
||||||
privileged: true
|
|
||||||
hostNetwork: true
|
|
||||||
hostPorts:
|
|
||||||
- min: {{ .Values.nodeplugin.httpMetrics.containerPort }}
|
|
||||||
max: {{ .Values.nodeplugin.httpMetrics.containerPort }}
|
|
||||||
hostPID: true
|
|
||||||
runAsUser:
|
|
||||||
rule: RunAsAny
|
|
||||||
seLinux:
|
|
||||||
rule: RunAsAny
|
|
||||||
supplementalGroups:
|
|
||||||
rule: RunAsAny
|
|
||||||
volumes:
|
|
||||||
- 'configMap'
|
|
||||||
- 'emptyDir'
|
|
||||||
- 'projected'
|
|
||||||
- 'secret'
|
|
||||||
- 'hostPath'
|
|
||||||
allowedHostPaths:
|
|
||||||
- pathPrefix: '/dev'
|
|
||||||
readOnly: false
|
|
||||||
- pathPrefix: '/run/mount'
|
|
||||||
readOnly: false
|
|
||||||
- pathPrefix: '/sys'
|
|
||||||
readOnly: false
|
|
||||||
{{- if .Values.selinuxMount }}
|
|
||||||
- pathPrefix: '/etc/selinux'
|
|
||||||
readOnly: true
|
|
||||||
{{- end }}
|
|
||||||
- pathPrefix: '/lib/modules'
|
|
||||||
readOnly: true
|
|
||||||
- pathPrefix: '{{ .Values.cephLogDirHostPath }}'
|
|
||||||
readOnly: false
|
|
||||||
- pathPrefix: '{{ .Values.kubeletDir }}'
|
|
||||||
readOnly: false
|
|
||||||
{{- end }}
|
|
@ -1,18 +0,0 @@
|
|||||||
{{- if and .Values.rbac.create .Values.nodeplugin.podSecurityPolicy.enabled -}}
|
|
||||||
kind: Role
|
|
||||||
apiVersion: rbac.authorization.k8s.io/v1
|
|
||||||
metadata:
|
|
||||||
name: {{ include "ceph-csi-rbd.nodeplugin.fullname" . }}
|
|
||||||
namespace: {{ .Release.Namespace }}
|
|
||||||
labels:
|
|
||||||
app: {{ include "ceph-csi-rbd.name" . }}
|
|
||||||
chart: {{ include "ceph-csi-rbd.chart" . }}
|
|
||||||
component: {{ .Values.nodeplugin.name }}
|
|
||||||
release: {{ .Release.Name }}
|
|
||||||
heritage: {{ .Release.Service }}
|
|
||||||
rules:
|
|
||||||
- apiGroups: ['policy']
|
|
||||||
resources: ['podsecuritypolicies']
|
|
||||||
verbs: ['use']
|
|
||||||
resourceNames: ['{{ include "ceph-csi-rbd.nodeplugin.fullname" . }}']
|
|
||||||
{{- end -}}
|
|
@ -1,21 +0,0 @@
|
|||||||
{{- if and .Values.rbac.create .Values.nodeplugin.podSecurityPolicy.enabled -}}
|
|
||||||
kind: RoleBinding
|
|
||||||
apiVersion: rbac.authorization.k8s.io/v1
|
|
||||||
metadata:
|
|
||||||
name: {{ include "ceph-csi-rbd.nodeplugin.fullname" . }}
|
|
||||||
namespace: {{ .Release.Namespace }}
|
|
||||||
labels:
|
|
||||||
app: {{ include "ceph-csi-rbd.name" . }}
|
|
||||||
chart: {{ include "ceph-csi-rbd.chart" . }}
|
|
||||||
component: {{ .Values.nodeplugin.name }}
|
|
||||||
release: {{ .Release.Name }}
|
|
||||||
heritage: {{ .Release.Service }}
|
|
||||||
subjects:
|
|
||||||
- kind: ServiceAccount
|
|
||||||
name: {{ include "ceph-csi-rbd.serviceAccountName.nodeplugin" . }}
|
|
||||||
namespace: {{ .Release.Namespace }}
|
|
||||||
roleRef:
|
|
||||||
kind: Role
|
|
||||||
name: {{ include "ceph-csi-rbd.nodeplugin.fullname" . }}
|
|
||||||
apiGroup: rbac.authorization.k8s.io
|
|
||||||
{{- end -}}
|
|
@ -1,34 +0,0 @@
|
|||||||
{{- if .Values.provisioner.podSecurityPolicy.enabled -}}
|
|
||||||
apiVersion: policy/v1beta1
|
|
||||||
kind: PodSecurityPolicy
|
|
||||||
metadata:
|
|
||||||
name: {{ include "ceph-csi-rbd.provisioner.fullname" . }}
|
|
||||||
labels:
|
|
||||||
app: {{ include "ceph-csi-rbd.name" . }}
|
|
||||||
chart: {{ include "ceph-csi-rbd.chart" . }}
|
|
||||||
component: {{ .Values.provisioner.name }}
|
|
||||||
release: {{ .Release.Name }}
|
|
||||||
heritage: {{ .Release.Service }}
|
|
||||||
spec:
|
|
||||||
fsGroup:
|
|
||||||
rule: RunAsAny
|
|
||||||
runAsUser:
|
|
||||||
rule: RunAsAny
|
|
||||||
seLinux:
|
|
||||||
rule: RunAsAny
|
|
||||||
supplementalGroups:
|
|
||||||
rule: RunAsAny
|
|
||||||
volumes:
|
|
||||||
- 'configMap'
|
|
||||||
- 'emptyDir'
|
|
||||||
- 'projected'
|
|
||||||
- 'secret'
|
|
||||||
- 'hostPath'
|
|
||||||
allowedHostPaths:
|
|
||||||
- pathPrefix: '/dev'
|
|
||||||
readOnly: false
|
|
||||||
- pathPrefix: '/sys'
|
|
||||||
readOnly: false
|
|
||||||
- pathPrefix: '/lib/modules'
|
|
||||||
readOnly: true
|
|
||||||
{{- end }}
|
|
@ -17,10 +17,4 @@ rules:
|
|||||||
- apiGroups: ["coordination.k8s.io"]
|
- apiGroups: ["coordination.k8s.io"]
|
||||||
resources: ["leases"]
|
resources: ["leases"]
|
||||||
verbs: ["get", "watch", "list", "delete", "update", "create"]
|
verbs: ["get", "watch", "list", "delete", "update", "create"]
|
||||||
{{- if .Values.provisioner.podSecurityPolicy.enabled }}
|
|
||||||
- apiGroups: ['policy']
|
|
||||||
resources: ['podsecuritypolicies']
|
|
||||||
verbs: ['use']
|
|
||||||
resourceNames: ['{{ include "ceph-csi-rbd.provisioner.fullname" . }}']
|
|
||||||
{{- end -}}
|
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
@ -124,11 +124,6 @@ nodeplugin:
|
|||||||
|
|
||||||
affinity: {}
|
affinity: {}
|
||||||
|
|
||||||
# If true, create & use Pod Security Policy resources
|
|
||||||
# https://kubernetes.io/docs/concepts/policy/pod-security-policy/
|
|
||||||
podSecurityPolicy:
|
|
||||||
enabled: false
|
|
||||||
|
|
||||||
provisioner:
|
provisioner:
|
||||||
name: provisioner
|
name: provisioner
|
||||||
replicaCount: 3
|
replicaCount: 3
|
||||||
@ -247,11 +242,6 @@ provisioner:
|
|||||||
|
|
||||||
affinity: {}
|
affinity: {}
|
||||||
|
|
||||||
# If true, create & use Pod Security Policy resources
|
|
||||||
# https://kubernetes.io/docs/concepts/policy/pod-security-policy/
|
|
||||||
podSecurityPolicy:
|
|
||||||
enabled: false
|
|
||||||
|
|
||||||
topology:
|
topology:
|
||||||
# Specifies whether topology based provisioning support should
|
# Specifies whether topology based provisioning support should
|
||||||
# be exposed by CSI
|
# be exposed by CSI
|
||||||
|
@ -1,75 +0,0 @@
|
|||||||
---
|
|
||||||
apiVersion: policy/v1beta1
|
|
||||||
kind: PodSecurityPolicy
|
|
||||||
metadata:
|
|
||||||
name: cephfs-csi-nodeplugin-psp
|
|
||||||
spec:
|
|
||||||
allowPrivilegeEscalation: true
|
|
||||||
allowedCapabilities:
|
|
||||||
- 'SYS_ADMIN'
|
|
||||||
fsGroup:
|
|
||||||
rule: RunAsAny
|
|
||||||
privileged: true
|
|
||||||
hostNetwork: true
|
|
||||||
hostPID: true
|
|
||||||
runAsUser:
|
|
||||||
rule: RunAsAny
|
|
||||||
seLinux:
|
|
||||||
rule: RunAsAny
|
|
||||||
supplementalGroups:
|
|
||||||
rule: RunAsAny
|
|
||||||
volumes:
|
|
||||||
- 'configMap'
|
|
||||||
- 'emptyDir'
|
|
||||||
- 'projected'
|
|
||||||
- 'secret'
|
|
||||||
- 'hostPath'
|
|
||||||
allowedHostPaths:
|
|
||||||
- pathPrefix: '/dev'
|
|
||||||
readOnly: false
|
|
||||||
- pathPrefix: '/run/mount'
|
|
||||||
readOnly: false
|
|
||||||
- pathPrefix: '/sys'
|
|
||||||
readOnly: false
|
|
||||||
- pathPrefix: '/etc/selinux'
|
|
||||||
readOnly: true
|
|
||||||
- pathPrefix: '/lib/modules'
|
|
||||||
readOnly: true
|
|
||||||
- pathPrefix: '/var/lib/kubelet/pods'
|
|
||||||
readOnly: false
|
|
||||||
- pathPrefix: '/var/lib/kubelet/plugins/cephfs.csi.ceph.com'
|
|
||||||
readOnly: false
|
|
||||||
- pathPrefix: '/var/lib/kubelet/plugins_registry'
|
|
||||||
readOnly: false
|
|
||||||
- pathPrefix: '/var/lib/kubelet/plugins'
|
|
||||||
readOnly: false
|
|
||||||
|
|
||||||
---
|
|
||||||
kind: Role
|
|
||||||
apiVersion: rbac.authorization.k8s.io/v1
|
|
||||||
metadata:
|
|
||||||
name: cephfs-csi-nodeplugin-psp
|
|
||||||
# replace with non-default namespace name
|
|
||||||
namespace: default
|
|
||||||
rules:
|
|
||||||
- apiGroups: ['policy']
|
|
||||||
resources: ['podsecuritypolicies']
|
|
||||||
verbs: ['use']
|
|
||||||
resourceNames: ['cephfs-csi-nodeplugin-psp']
|
|
||||||
|
|
||||||
---
|
|
||||||
kind: RoleBinding
|
|
||||||
apiVersion: rbac.authorization.k8s.io/v1
|
|
||||||
metadata:
|
|
||||||
name: cephfs-csi-nodeplugin-psp
|
|
||||||
# replace with non-default namespace name
|
|
||||||
namespace: default
|
|
||||||
subjects:
|
|
||||||
- kind: ServiceAccount
|
|
||||||
name: cephfs-csi-nodeplugin
|
|
||||||
# replace with non-default namespace name
|
|
||||||
namespace: default
|
|
||||||
roleRef:
|
|
||||||
kind: Role
|
|
||||||
name: cephfs-csi-nodeplugin-psp
|
|
||||||
apiGroup: rbac.authorization.k8s.io
|
|
@ -1,57 +0,0 @@
|
|||||||
---
|
|
||||||
apiVersion: policy/v1beta1
|
|
||||||
kind: PodSecurityPolicy
|
|
||||||
metadata:
|
|
||||||
name: cephfs-csi-provisioner-psp
|
|
||||||
spec:
|
|
||||||
fsGroup:
|
|
||||||
rule: RunAsAny
|
|
||||||
runAsUser:
|
|
||||||
rule: RunAsAny
|
|
||||||
seLinux:
|
|
||||||
rule: RunAsAny
|
|
||||||
supplementalGroups:
|
|
||||||
rule: RunAsAny
|
|
||||||
volumes:
|
|
||||||
- 'configMap'
|
|
||||||
- 'emptyDir'
|
|
||||||
- 'projected'
|
|
||||||
- 'secret'
|
|
||||||
- 'hostPath'
|
|
||||||
allowedHostPaths:
|
|
||||||
- pathPrefix: '/dev'
|
|
||||||
readOnly: false
|
|
||||||
- pathPrefix: '/sys'
|
|
||||||
readOnly: false
|
|
||||||
- pathPrefix: '/lib/modules'
|
|
||||||
readOnly: true
|
|
||||||
|
|
||||||
---
|
|
||||||
kind: Role
|
|
||||||
apiVersion: rbac.authorization.k8s.io/v1
|
|
||||||
metadata:
|
|
||||||
name: cephfs-csi-provisioner-psp
|
|
||||||
# replace with non-default namespace name
|
|
||||||
namespace: default
|
|
||||||
rules:
|
|
||||||
- apiGroups: ['policy']
|
|
||||||
resources: ['podsecuritypolicies']
|
|
||||||
verbs: ['use']
|
|
||||||
resourceNames: ['cephfs-csi-provisioner-psp']
|
|
||||||
|
|
||||||
---
|
|
||||||
kind: RoleBinding
|
|
||||||
apiVersion: rbac.authorization.k8s.io/v1
|
|
||||||
metadata:
|
|
||||||
name: cephfs-csi-provisioner-psp
|
|
||||||
# replace with non-default namespace name
|
|
||||||
namespace: default
|
|
||||||
subjects:
|
|
||||||
- kind: ServiceAccount
|
|
||||||
name: cephfs-csi-provisioner
|
|
||||||
# replace with non-default namespace name
|
|
||||||
namespace: default
|
|
||||||
roleRef:
|
|
||||||
kind: Role
|
|
||||||
name: cephfs-csi-provisioner-psp
|
|
||||||
apiGroup: rbac.authorization.k8s.io
|
|
@ -2,154 +2,134 @@
|
|||||||
apiVersion: apps/v1
|
apiVersion: apps/v1
|
||||||
kind: DaemonSet
|
kind: DaemonSet
|
||||||
metadata:
|
metadata:
|
||||||
name: csi-nfs-node
|
name: csi-nfsplugin
|
||||||
spec:
|
spec:
|
||||||
selector:
|
selector:
|
||||||
matchLabels:
|
matchLabels:
|
||||||
app: csi-nfs-node
|
app: csi-nfsplugin
|
||||||
template:
|
template:
|
||||||
metadata:
|
metadata:
|
||||||
labels:
|
labels:
|
||||||
app: csi-nfs-node
|
app: csi-nfsplugin
|
||||||
spec:
|
spec:
|
||||||
|
serviceAccountName: nfs-csi-nodeplugin
|
||||||
|
priorityClassName: system-node-critical
|
||||||
|
hostNetwork: true
|
||||||
|
hostPID: true
|
||||||
|
# to use e.g. Rook orchestrated cluster, and mons' FQDN is
|
||||||
|
# resolved through k8s service, set dns policy to cluster first
|
||||||
|
dnsPolicy: ClusterFirstWithHostNet
|
||||||
containers:
|
containers:
|
||||||
- args:
|
- name: driver-registrar
|
||||||
- --csi-address=/csi/csi.sock
|
# This is necessary only for systems with SELinux, where
|
||||||
- --probe-timeout=3s
|
# non-privileged sidecar containers cannot access unix domain socket
|
||||||
- --health-port=29653
|
# created by privileged CSI driver container.
|
||||||
- --v=2
|
securityContext:
|
||||||
image: registry.k8s.io/sig-storage/livenessprobe:v2.7.0
|
privileged: true
|
||||||
imagePullPolicy: IfNotPresent
|
allowPrivilegeEscalation: true
|
||||||
name: liveness-probe
|
image: registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.5.1
|
||||||
resources:
|
args:
|
||||||
limits:
|
- "--v=1"
|
||||||
memory: 100Mi
|
- "--csi-address=/csi/csi.sock"
|
||||||
requests:
|
- "--kubelet-registration-path=/var/lib/kubelet/plugins/nfs.csi.ceph.com/csi.sock"
|
||||||
cpu: 10m
|
|
||||||
memory: 20Mi
|
|
||||||
terminationMessagePath: /dev/termination-log
|
|
||||||
terminationMessagePolicy: File
|
|
||||||
volumeMounts:
|
|
||||||
- mountPath: /csi
|
|
||||||
name: socket-dir
|
|
||||||
- args:
|
|
||||||
- --v=1
|
|
||||||
- --csi-address=/csi/csi.sock
|
|
||||||
- --kubelet-registration-path=$(DRIVER_REG_SOCK_PATH)
|
|
||||||
env:
|
env:
|
||||||
- name: DRIVER_REG_SOCK_PATH
|
|
||||||
value: /var/lib/kubelet/plugins/nfs.csi.ceph.com/csi.sock
|
|
||||||
- name: KUBE_NODE_NAME
|
- name: KUBE_NODE_NAME
|
||||||
valueFrom:
|
valueFrom:
|
||||||
fieldRef:
|
fieldRef:
|
||||||
apiVersion: v1
|
|
||||||
fieldPath: spec.nodeName
|
fieldPath: spec.nodeName
|
||||||
image: registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.5.1
|
volumeMounts:
|
||||||
imagePullPolicy: IfNotPresent
|
- name: socket-dir
|
||||||
livenessProbe:
|
mountPath: /csi
|
||||||
exec:
|
- name: registration-dir
|
||||||
command:
|
mountPath: /registration
|
||||||
- /csi-node-driver-registrar
|
- name: csi-nfsplugin
|
||||||
- --kubelet-registration-path=$(DRIVER_REG_SOCK_PATH)
|
|
||||||
- --mode=kubelet-registration-probe
|
|
||||||
failureThreshold: 3
|
|
||||||
initialDelaySeconds: 30
|
|
||||||
periodSeconds: 10
|
|
||||||
successThreshold: 1
|
|
||||||
timeoutSeconds: 15
|
|
||||||
name: node-driver-registrar
|
|
||||||
resources:
|
|
||||||
limits:
|
|
||||||
memory: 100Mi
|
|
||||||
requests:
|
|
||||||
cpu: 10m
|
|
||||||
memory: 20Mi
|
|
||||||
securityContext:
|
securityContext:
|
||||||
privileged: true
|
privileged: true
|
||||||
terminationMessagePath: /dev/termination-log
|
capabilities:
|
||||||
terminationMessagePolicy: File
|
add: ["SYS_ADMIN"]
|
||||||
volumeMounts:
|
allowPrivilegeEscalation: true
|
||||||
- mountPath: /csi
|
# for stable functionality replace canary with latest release version
|
||||||
name: socket-dir
|
image: quay.io/cephcsi/cephcsi:canary
|
||||||
- mountPath: /registration
|
args:
|
||||||
name: registration-dir
|
- "--nodeid=$(NODE_ID)"
|
||||||
- args:
|
- "--type=nfs"
|
||||||
- -v=1
|
- "--nodeserver=true"
|
||||||
- --drivername=nfs.csi.ceph.com
|
- "--endpoint=$(CSI_ENDPOINT)"
|
||||||
- --nodeid=$(NODE_ID)
|
- "--v=5"
|
||||||
- --endpoint=$(CSI_ENDPOINT)
|
- "--drivername=nfs.csi.ceph.com"
|
||||||
|
- "--enableprofiling=false"
|
||||||
env:
|
env:
|
||||||
|
- name: POD_IP
|
||||||
|
valueFrom:
|
||||||
|
fieldRef:
|
||||||
|
fieldPath: status.podIP
|
||||||
- name: NODE_ID
|
- name: NODE_ID
|
||||||
valueFrom:
|
valueFrom:
|
||||||
fieldRef:
|
fieldRef:
|
||||||
apiVersion: v1
|
|
||||||
fieldPath: spec.nodeName
|
fieldPath: spec.nodeName
|
||||||
- name: CSI_ENDPOINT
|
- name: CSI_ENDPOINT
|
||||||
value: unix:///csi/csi.sock
|
value: unix:///csi/csi.sock
|
||||||
image: registry.k8s.io/sig-storage/nfsplugin:v4.0.0
|
imagePullPolicy: "IfNotPresent"
|
||||||
imagePullPolicy: IfNotPresent
|
|
||||||
livenessProbe:
|
|
||||||
failureThreshold: 5
|
|
||||||
httpGet:
|
|
||||||
path: /healthz
|
|
||||||
port: healthz
|
|
||||||
scheme: HTTP
|
|
||||||
initialDelaySeconds: 30
|
|
||||||
periodSeconds: 30
|
|
||||||
successThreshold: 1
|
|
||||||
timeoutSeconds: 10
|
|
||||||
name: nfs
|
|
||||||
ports:
|
|
||||||
- containerPort: 29653
|
|
||||||
hostPort: 29653
|
|
||||||
name: healthz
|
|
||||||
protocol: TCP
|
|
||||||
resources:
|
|
||||||
limits:
|
|
||||||
memory: 300Mi
|
|
||||||
requests:
|
|
||||||
cpu: 10m
|
|
||||||
memory: 20Mi
|
|
||||||
securityContext:
|
|
||||||
allowPrivilegeEscalation: true
|
|
||||||
capabilities:
|
|
||||||
add:
|
|
||||||
- SYS_ADMIN
|
|
||||||
privileged: true
|
|
||||||
terminationMessagePath: /dev/termination-log
|
|
||||||
terminationMessagePolicy: File
|
|
||||||
volumeMounts:
|
volumeMounts:
|
||||||
- mountPath: /csi
|
- name: socket-dir
|
||||||
name: socket-dir
|
mountPath: /csi
|
||||||
- mountPath: /var/lib/kubelet/pods
|
- name: mountpoint-dir
|
||||||
|
mountPath: /var/lib/kubelet/pods
|
||||||
mountPropagation: Bidirectional
|
mountPropagation: Bidirectional
|
||||||
name: pods-mount-dir
|
- name: plugin-dir
|
||||||
dnsPolicy: ClusterFirstWithHostNet
|
mountPath: /var/lib/kubelet/plugins
|
||||||
hostNetwork: true
|
mountPropagation: "Bidirectional"
|
||||||
nodeSelector:
|
- name: host-sys
|
||||||
kubernetes.io/os: linux
|
mountPath: /sys
|
||||||
restartPolicy: Always
|
- name: etc-selinux
|
||||||
schedulerName: default-scheduler
|
mountPath: /etc/selinux
|
||||||
securityContext: {}
|
readOnly: true
|
||||||
serviceAccountName: nfs-csi-nodeplugin
|
- name: lib-modules
|
||||||
terminationGracePeriodSeconds: 30
|
mountPath: /lib/modules
|
||||||
tolerations:
|
readOnly: true
|
||||||
- operator: Exists
|
- name: host-dev
|
||||||
|
mountPath: /dev
|
||||||
|
- name: host-mount
|
||||||
|
mountPath: /run/mount
|
||||||
|
- name: ceph-config
|
||||||
|
mountPath: /etc/ceph/
|
||||||
|
- name: ceph-csi-config
|
||||||
|
mountPath: /etc/ceph-csi-config/
|
||||||
volumes:
|
volumes:
|
||||||
- hostPath:
|
- name: socket-dir
|
||||||
path: /var/lib/kubelet/plugins/nfs.csi.ceph.com
|
hostPath:
|
||||||
|
path: /var/lib/kubelet/plugins/nfs.csi.ceph.com/
|
||||||
type: DirectoryOrCreate
|
type: DirectoryOrCreate
|
||||||
name: socket-dir
|
- name: registration-dir
|
||||||
- hostPath:
|
hostPath:
|
||||||
|
path: /var/lib/kubelet/plugins_registry/
|
||||||
|
type: Directory
|
||||||
|
- name: mountpoint-dir
|
||||||
|
hostPath:
|
||||||
path: /var/lib/kubelet/pods
|
path: /var/lib/kubelet/pods
|
||||||
|
type: DirectoryOrCreate
|
||||||
|
- name: plugin-dir
|
||||||
|
hostPath:
|
||||||
|
path: /var/lib/kubelet/plugins
|
||||||
type: Directory
|
type: Directory
|
||||||
name: pods-mount-dir
|
- name: host-sys
|
||||||
- hostPath:
|
hostPath:
|
||||||
path: /var/lib/kubelet/plugins_registry
|
path: /sys
|
||||||
type: Directory
|
- name: etc-selinux
|
||||||
name: registration-dir
|
hostPath:
|
||||||
updateStrategy:
|
path: /etc/selinux
|
||||||
rollingUpdate:
|
- name: lib-modules
|
||||||
maxSurge: 0
|
hostPath:
|
||||||
maxUnavailable: 1
|
path: /lib/modules
|
||||||
type: RollingUpdate
|
- name: host-dev
|
||||||
|
hostPath:
|
||||||
|
path: /dev
|
||||||
|
- name: host-mount
|
||||||
|
hostPath:
|
||||||
|
path: /run/mount
|
||||||
|
- name: ceph-config
|
||||||
|
configMap:
|
||||||
|
name: ceph-config
|
||||||
|
- name: ceph-csi-config
|
||||||
|
configMap:
|
||||||
|
name: ceph-csi-config
|
||||||
|
@ -1,77 +0,0 @@
|
|||||||
---
|
|
||||||
apiVersion: policy/v1beta1
|
|
||||||
kind: PodSecurityPolicy
|
|
||||||
metadata:
|
|
||||||
name: nfs-csi-nodeplugin-psp
|
|
||||||
spec:
|
|
||||||
allowPrivilegeEscalation: true
|
|
||||||
allowedCapabilities:
|
|
||||||
- 'SYS_ADMIN'
|
|
||||||
fsGroup:
|
|
||||||
rule: RunAsAny
|
|
||||||
privileged: true
|
|
||||||
hostNetwork: true
|
|
||||||
hostPID: true
|
|
||||||
runAsUser:
|
|
||||||
rule: RunAsAny
|
|
||||||
seLinux:
|
|
||||||
rule: RunAsAny
|
|
||||||
supplementalGroups:
|
|
||||||
rule: RunAsAny
|
|
||||||
volumes:
|
|
||||||
- 'configMap'
|
|
||||||
- 'emptyDir'
|
|
||||||
- 'projected'
|
|
||||||
- 'secret'
|
|
||||||
- 'hostPath'
|
|
||||||
allowedHostPaths:
|
|
||||||
- pathPrefix: '/dev'
|
|
||||||
readOnly: false
|
|
||||||
- pathPrefix: '/run/mount'
|
|
||||||
readOnly: false
|
|
||||||
- pathPrefix: '/sys'
|
|
||||||
readOnly: false
|
|
||||||
- pathPrefix: '/etc/selinux'
|
|
||||||
readOnly: true
|
|
||||||
- pathPrefix: '/lib/modules'
|
|
||||||
readOnly: true
|
|
||||||
- pathPrefix: '/var/lib/kubelet/pods'
|
|
||||||
readOnly: false
|
|
||||||
- pathPrefix: '/var/lib/kubelet/plugins/nfs.csi.ceph.com'
|
|
||||||
readOnly: false
|
|
||||||
- pathPrefix: '/var/lib/kubelet/plugins_registry'
|
|
||||||
readOnly: false
|
|
||||||
- pathPrefix: '/var/lib/kubelet/plugins'
|
|
||||||
readOnly: false
|
|
||||||
hostPorts:
|
|
||||||
- min: 29653
|
|
||||||
max: 29653
|
|
||||||
---
|
|
||||||
kind: Role
|
|
||||||
apiVersion: rbac.authorization.k8s.io/v1
|
|
||||||
metadata:
|
|
||||||
name: nfs-csi-nodeplugin-psp
|
|
||||||
# replace with non-default namespace name
|
|
||||||
namespace: default
|
|
||||||
rules:
|
|
||||||
- apiGroups: ['policy']
|
|
||||||
resources: ['podsecuritypolicies']
|
|
||||||
verbs: ['use']
|
|
||||||
resourceNames: ['nfs-csi-nodeplugin-psp']
|
|
||||||
|
|
||||||
---
|
|
||||||
kind: RoleBinding
|
|
||||||
apiVersion: rbac.authorization.k8s.io/v1
|
|
||||||
metadata:
|
|
||||||
name: nfs-csi-nodeplugin-psp
|
|
||||||
# replace with non-default namespace name
|
|
||||||
namespace: default
|
|
||||||
subjects:
|
|
||||||
- kind: ServiceAccount
|
|
||||||
name: nfs-csi-nodeplugin
|
|
||||||
# replace with non-default namespace name
|
|
||||||
namespace: default
|
|
||||||
roleRef:
|
|
||||||
kind: Role
|
|
||||||
name: nfs-csi-nodeplugin-psp
|
|
||||||
apiGroup: rbac.authorization.k8s.io
|
|
@ -1,55 +0,0 @@
|
|||||||
---
|
|
||||||
apiVersion: policy/v1beta1
|
|
||||||
kind: PodSecurityPolicy
|
|
||||||
metadata:
|
|
||||||
name: nfs-csi-provisioner-psp
|
|
||||||
spec:
|
|
||||||
fsGroup:
|
|
||||||
rule: RunAsAny
|
|
||||||
runAsUser:
|
|
||||||
rule: RunAsAny
|
|
||||||
seLinux:
|
|
||||||
rule: RunAsAny
|
|
||||||
supplementalGroups:
|
|
||||||
rule: RunAsAny
|
|
||||||
volumes:
|
|
||||||
- 'configMap'
|
|
||||||
- 'emptyDir'
|
|
||||||
- 'projected'
|
|
||||||
- 'secret'
|
|
||||||
- 'hostPath'
|
|
||||||
allowedHostPaths:
|
|
||||||
- pathPrefix: '/dev'
|
|
||||||
readOnly: false
|
|
||||||
- pathPrefix: '/sys'
|
|
||||||
readOnly: false
|
|
||||||
- pathPrefix: '/lib/modules'
|
|
||||||
readOnly: true
|
|
||||||
---
|
|
||||||
kind: Role
|
|
||||||
apiVersion: rbac.authorization.k8s.io/v1
|
|
||||||
metadata:
|
|
||||||
name: nfs-csi-provisioner-psp
|
|
||||||
# replace with non-default namespace name
|
|
||||||
namespace: default
|
|
||||||
rules:
|
|
||||||
- apiGroups: ['policy']
|
|
||||||
resources: ['podsecuritypolicies']
|
|
||||||
verbs: ['use']
|
|
||||||
resourceNames: ['nfs-csi-provisioner-psp']
|
|
||||||
---
|
|
||||||
kind: RoleBinding
|
|
||||||
apiVersion: rbac.authorization.k8s.io/v1
|
|
||||||
metadata:
|
|
||||||
name: nfs-csi-provisioner-psp
|
|
||||||
# replace with non-default namespace name
|
|
||||||
namespace: default
|
|
||||||
subjects:
|
|
||||||
- kind: ServiceAccount
|
|
||||||
name: nfs-csi-provisioner
|
|
||||||
# replace with non-default namespace name
|
|
||||||
namespace: default
|
|
||||||
roleRef:
|
|
||||||
kind: Role
|
|
||||||
name: nfs-csi-provisioner-psp
|
|
||||||
apiGroup: rbac.authorization.k8s.io
|
|
@ -14,3 +14,4 @@ spec:
|
|||||||
attachRequired: false
|
attachRequired: false
|
||||||
volumeLifecycleModes:
|
volumeLifecycleModes:
|
||||||
- Persistent
|
- Persistent
|
||||||
|
fsGroupPolicy: File
|
||||||
|
@ -1,77 +0,0 @@
|
|||||||
---
|
|
||||||
apiVersion: policy/v1beta1
|
|
||||||
kind: PodSecurityPolicy
|
|
||||||
metadata:
|
|
||||||
name: rbd-csi-nodeplugin-psp
|
|
||||||
spec:
|
|
||||||
allowPrivilegeEscalation: true
|
|
||||||
allowedCapabilities:
|
|
||||||
- 'SYS_ADMIN'
|
|
||||||
fsGroup:
|
|
||||||
rule: RunAsAny
|
|
||||||
privileged: true
|
|
||||||
hostNetwork: true
|
|
||||||
hostPID: true
|
|
||||||
runAsUser:
|
|
||||||
rule: RunAsAny
|
|
||||||
seLinux:
|
|
||||||
rule: RunAsAny
|
|
||||||
supplementalGroups:
|
|
||||||
rule: RunAsAny
|
|
||||||
volumes:
|
|
||||||
- 'configMap'
|
|
||||||
- 'emptyDir'
|
|
||||||
- 'projected'
|
|
||||||
- 'hostPath'
|
|
||||||
- 'secret'
|
|
||||||
allowedHostPaths:
|
|
||||||
- pathPrefix: '/dev'
|
|
||||||
readOnly: false
|
|
||||||
- pathPrefix: '/run/mount'
|
|
||||||
readOnly: false
|
|
||||||
- pathPrefix: '/sys'
|
|
||||||
readOnly: false
|
|
||||||
- pathPrefix: '/etc/selinux'
|
|
||||||
readOnly: true
|
|
||||||
- pathPrefix: '/lib/modules'
|
|
||||||
readOnly: true
|
|
||||||
- pathPrefix: '/var/lib/kubelet/pods'
|
|
||||||
readOnly: false
|
|
||||||
- pathPrefix: '/var/log/ceph'
|
|
||||||
readOnly: false
|
|
||||||
- pathPrefix: '/var/lib/kubelet/plugins/rbd.csi.ceph.com'
|
|
||||||
readOnly: false
|
|
||||||
- pathPrefix: '/var/lib/kubelet/plugins_registry'
|
|
||||||
readOnly: false
|
|
||||||
- pathPrefix: '/var/lib/kubelet/plugins'
|
|
||||||
readOnly: false
|
|
||||||
|
|
||||||
---
|
|
||||||
kind: Role
|
|
||||||
apiVersion: rbac.authorization.k8s.io/v1
|
|
||||||
metadata:
|
|
||||||
name: rbd-csi-nodeplugin-psp
|
|
||||||
# replace with non-default namespace name
|
|
||||||
namespace: default
|
|
||||||
rules:
|
|
||||||
- apiGroups: ['policy']
|
|
||||||
resources: ['podsecuritypolicies']
|
|
||||||
verbs: ['use']
|
|
||||||
resourceNames: ['rbd-csi-nodeplugin-psp']
|
|
||||||
|
|
||||||
---
|
|
||||||
kind: RoleBinding
|
|
||||||
apiVersion: rbac.authorization.k8s.io/v1
|
|
||||||
metadata:
|
|
||||||
name: rbd-csi-nodeplugin-psp
|
|
||||||
# replace with non-default namespace name
|
|
||||||
namespace: default
|
|
||||||
subjects:
|
|
||||||
- kind: ServiceAccount
|
|
||||||
name: rbd-csi-nodeplugin
|
|
||||||
# replace with non-default namespace name
|
|
||||||
namespace: default
|
|
||||||
roleRef:
|
|
||||||
kind: Role
|
|
||||||
name: rbd-csi-nodeplugin-psp
|
|
||||||
apiGroup: rbac.authorization.k8s.io
|
|
@ -1,57 +0,0 @@
|
|||||||
---
|
|
||||||
apiVersion: policy/v1beta1
|
|
||||||
kind: PodSecurityPolicy
|
|
||||||
metadata:
|
|
||||||
name: rbd-csi-provisioner-psp
|
|
||||||
spec:
|
|
||||||
fsGroup:
|
|
||||||
rule: RunAsAny
|
|
||||||
runAsUser:
|
|
||||||
rule: RunAsAny
|
|
||||||
seLinux:
|
|
||||||
rule: RunAsAny
|
|
||||||
supplementalGroups:
|
|
||||||
rule: RunAsAny
|
|
||||||
volumes:
|
|
||||||
- 'configMap'
|
|
||||||
- 'emptyDir'
|
|
||||||
- 'projected'
|
|
||||||
- 'secret'
|
|
||||||
- 'hostPath'
|
|
||||||
allowedHostPaths:
|
|
||||||
- pathPrefix: '/dev'
|
|
||||||
readOnly: false
|
|
||||||
- pathPrefix: '/sys'
|
|
||||||
readOnly: false
|
|
||||||
- pathPrefix: '/lib/modules'
|
|
||||||
readOnly: true
|
|
||||||
|
|
||||||
---
|
|
||||||
kind: Role
|
|
||||||
apiVersion: rbac.authorization.k8s.io/v1
|
|
||||||
metadata:
|
|
||||||
# replace with non-default namespace name
|
|
||||||
namespace: default
|
|
||||||
name: rbd-csi-provisioner-psp
|
|
||||||
rules:
|
|
||||||
- apiGroups: ['policy']
|
|
||||||
resources: ['podsecuritypolicies']
|
|
||||||
verbs: ['use']
|
|
||||||
resourceNames: ['rbd-csi-provisioner-psp']
|
|
||||||
|
|
||||||
---
|
|
||||||
kind: RoleBinding
|
|
||||||
apiVersion: rbac.authorization.k8s.io/v1
|
|
||||||
metadata:
|
|
||||||
name: rbd-csi-provisioner-psp
|
|
||||||
# replace with non-default namespace name
|
|
||||||
namespace: default
|
|
||||||
subjects:
|
|
||||||
- kind: ServiceAccount
|
|
||||||
name: rbd-csi-provisioner
|
|
||||||
# replace with non-default namespace name
|
|
||||||
namespace: default
|
|
||||||
roleRef:
|
|
||||||
kind: Role
|
|
||||||
name: rbd-csi-provisioner-psp
|
|
||||||
apiGroup: rbac.authorization.k8s.io
|
|
@ -8,6 +8,7 @@
|
|||||||
- [Upgrading from v3.3 to v3.4](#upgrading-from-v33-to-v34)
|
- [Upgrading from v3.3 to v3.4](#upgrading-from-v33-to-v34)
|
||||||
- [Upgrading from v3.4 to v3.5](#upgrading-from-v34-to-v35)
|
- [Upgrading from v3.4 to v3.5](#upgrading-from-v34-to-v35)
|
||||||
- [Upgrading from v3.5 to v3.6](#upgrading-from-v35-to-v36)
|
- [Upgrading from v3.5 to v3.6](#upgrading-from-v35-to-v36)
|
||||||
|
- [Upgrading from v3.6 to v3.7](#upgrading-from-v36-to-v37)
|
||||||
- [Upgrading CephFS](#upgrading-cephfs)
|
- [Upgrading CephFS](#upgrading-cephfs)
|
||||||
- [1. Upgrade CephFS Provisioner resources](#1-upgrade-cephfs-provisioner-resources)
|
- [1. Upgrade CephFS Provisioner resources](#1-upgrade-cephfs-provisioner-resources)
|
||||||
- [1.1 Update the CephFS Provisioner RBAC](#11-update-the-cephfs-provisioner-rbac)
|
- [1.1 Update the CephFS Provisioner RBAC](#11-update-the-cephfs-provisioner-rbac)
|
||||||
@ -16,6 +17,7 @@
|
|||||||
- [2.1 Update the CephFS Nodeplugin RBAC](#21-update-the-cephfs-nodeplugin-rbac)
|
- [2.1 Update the CephFS Nodeplugin RBAC](#21-update-the-cephfs-nodeplugin-rbac)
|
||||||
- [2.2 Update the CephFS Nodeplugin daemonset](#22-update-the-cephfs-nodeplugin-daemonset)
|
- [2.2 Update the CephFS Nodeplugin daemonset](#22-update-the-cephfs-nodeplugin-daemonset)
|
||||||
- [2.3 Manual deletion of CephFS Nodeplugin daemonset pods](#23-manual-deletion-of-cephfs-nodeplugin-daemonset-pods)
|
- [2.3 Manual deletion of CephFS Nodeplugin daemonset pods](#23-manual-deletion-of-cephfs-nodeplugin-daemonset-pods)
|
||||||
|
- [Delete removed CephFS PSP, Role and RoleBinding](#delete-removed-cephfs-psp-role-and-rolebinding)
|
||||||
- [Upgrading RBD](#upgrading-rbd)
|
- [Upgrading RBD](#upgrading-rbd)
|
||||||
- [3. Upgrade RBD Provisioner resources](#3-upgrade-rbd-provisioner-resources)
|
- [3. Upgrade RBD Provisioner resources](#3-upgrade-rbd-provisioner-resources)
|
||||||
- [3.1 Update the RBD Provisioner RBAC](#31-update-the-rbd-provisioner-rbac)
|
- [3.1 Update the RBD Provisioner RBAC](#31-update-the-rbd-provisioner-rbac)
|
||||||
@ -23,6 +25,15 @@
|
|||||||
- [4. Upgrade RBD Nodeplugin resources](#4-upgrade-rbd-nodeplugin-resources)
|
- [4. Upgrade RBD Nodeplugin resources](#4-upgrade-rbd-nodeplugin-resources)
|
||||||
- [4.1 Update the RBD Nodeplugin RBAC](#41-update-the-rbd-nodeplugin-rbac)
|
- [4.1 Update the RBD Nodeplugin RBAC](#41-update-the-rbd-nodeplugin-rbac)
|
||||||
- [4.2 Update the RBD Nodeplugin daemonset](#42-update-the-rbd-nodeplugin-daemonset)
|
- [4.2 Update the RBD Nodeplugin daemonset](#42-update-the-rbd-nodeplugin-daemonset)
|
||||||
|
- [Delete removed RBD PSP, Role and RoleBinding](#delete-removed-rbd-psp-role-and-rolebinding)
|
||||||
|
- [Upgrading NFS](#upgrading-nfs)
|
||||||
|
- [5. Upgrade NFS Provisioner resources](#5-upgrade-nfs-provisioner-resources)
|
||||||
|
- [5.1 Update the NFS Provisioner RBAC](#51-update-the-nfs-provisioner-rbac)
|
||||||
|
- [5.2 Update the NFS Provisioner deployment](#52-update-the-nfs-provisioner-deployment)
|
||||||
|
- [6. Upgrade NFS Nodeplugin resources](#6-upgrade-nfs-nodeplugin-resources)
|
||||||
|
- [6.1 Update the NFS Nodeplugin RBAC](#61-update-the-nfs-nodeplugin-rbac)
|
||||||
|
- [6.2 Update the NFS Nodeplugin daemonset](#62-update-the-nfs-nodeplugin-daemonset)
|
||||||
|
- [6.3 Delete the old NFS Nodeplugin daemonset](#63-delete-the-old-nfs-nodeplugin-daemonset)
|
||||||
- [CSI Sidecar containers consideration](#csi-sidecar-containers-consideration)
|
- [CSI Sidecar containers consideration](#csi-sidecar-containers-consideration)
|
||||||
|
|
||||||
## Pre-upgrade considerations
|
## Pre-upgrade considerations
|
||||||
@ -79,6 +90,11 @@ to upgrade from cephcsi v3.4 to v3.5
|
|||||||
|
|
||||||
## Upgrading from v3.5 to v3.6
|
## Upgrading from v3.5 to v3.6
|
||||||
|
|
||||||
|
Refer [upgrade-from-v3.5-v3.6](https://github.com/ceph/ceph-csi/blob/v3.6.1/docs/ceph-csi-upgrade.md)
|
||||||
|
to upgrade from cephcsi v3.5 to v3.6
|
||||||
|
|
||||||
|
## Upgrading from v3.6 to v3.7
|
||||||
|
|
||||||
**Ceph-csi releases from devel are expressly unsupported.** It is strongly
|
**Ceph-csi releases from devel are expressly unsupported.** It is strongly
|
||||||
recommended that you use [official
|
recommended that you use [official
|
||||||
releases](https://github.com/ceph/ceph-csi/releases) of Ceph-csi. Unreleased
|
releases](https://github.com/ceph/ceph-csi/releases) of Ceph-csi. Unreleased
|
||||||
@ -87,15 +103,15 @@ that will not be supported in the official releases. Builds from the devel
|
|||||||
branch can have functionality changed and even removed at any time without
|
branch can have functionality changed and even removed at any time without
|
||||||
compatibility support and without prior notice.
|
compatibility support and without prior notice.
|
||||||
|
|
||||||
**Also, we do not recommend any direct upgrades to 3.6 except from 3.5 to 3.6.**
|
**Also, we do not recommend any direct upgrades to 3.7 except from 3.6 to 3.7.**
|
||||||
For example, upgrading from 3.4 to 3.6 is not recommended.
|
For example, upgrading from 3.5 to 3.7 is not recommended.
|
||||||
|
|
||||||
git checkout v3.6.1 tag
|
git checkout v3.7.0 tag
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone https://github.com/ceph/ceph-csi.git
|
git clone https://github.com/ceph/ceph-csi.git
|
||||||
cd ./ceph-csi
|
cd ./ceph-csi
|
||||||
git checkout v3.6.1
|
git checkout v3.7.0
|
||||||
```
|
```
|
||||||
|
|
||||||
```console
|
```console
|
||||||
@ -217,7 +233,21 @@ For each node:
|
|||||||
- The pod deletion causes the pods to be restarted and updated automatically
|
- The pod deletion causes the pods to be restarted and updated automatically
|
||||||
on the node.
|
on the node.
|
||||||
|
|
||||||
we have successfully upgraded cephfs csi from v3.5 to v3.6
|
#### Delete removed CephFS PSP, Role and RoleBinding
|
||||||
|
|
||||||
|
As PSP is deprecated in Kubernetes v1.21.0. Delete PSP related objects as PSP
|
||||||
|
support for CephFS is removed.
|
||||||
|
|
||||||
|
```console
|
||||||
|
kubectl delete psp cephfs-csi-provisioner-psp --ignore-not-found
|
||||||
|
kubectl delete role cephfs-csi-provisioner-psp --ignore-not-found
|
||||||
|
kubectl delete rolebinding cephfs-csi-provisioner-psp --ignore-not-found
|
||||||
|
kubectl delete psp cephfs-csi-nodeplugin-psp --ignore-not-found
|
||||||
|
kubectl delete role cephfs-csi-nodeplugin-psp --ignore-not-found
|
||||||
|
kubectl delete rolebinding cephfs-csi-nodeplugin-psp --ignore-not-found
|
||||||
|
```
|
||||||
|
|
||||||
|
we have successfully upgraded cephfs csi from v3.6 to v3.7
|
||||||
|
|
||||||
### Upgrading RBD
|
### Upgrading RBD
|
||||||
|
|
||||||
@ -283,7 +313,93 @@ daemonset.apps/csi-rbdplugin configured
|
|||||||
service/csi-metrics-rbdplugin configured
|
service/csi-metrics-rbdplugin configured
|
||||||
```
|
```
|
||||||
|
|
||||||
we have successfully upgraded RBD csi from v3.5 to v3.6
|
#### Delete removed RBD PSP, Role and RoleBinding
|
||||||
|
|
||||||
|
As PSP is deprecated in Kubernetes v1.21.0. Delete PSP related objects as PSP
|
||||||
|
support for RBD is removed.
|
||||||
|
|
||||||
|
```console
|
||||||
|
kubectl delete psp rbd-csi-provisioner-psp --ignore-not-found
|
||||||
|
kubectl delete role rbd-csi-provisioner-psp --ignore-not-found
|
||||||
|
kubectl delete rolebinding rbd-csi-provisioner-psp --ignore-not-found
|
||||||
|
kubectl delete psp rbd-csi-nodeplugin-psp --ignore-not-found
|
||||||
|
kubectl delete role rbd-csi-nodeplugin-psp --ignore-not-found
|
||||||
|
kubectl delete rolebinding rbd-csi-nodeplugin-psp --ignore-not-found
|
||||||
|
kubectl delete psp rbd-csi-vault-token-review-psp --ignore-not-found
|
||||||
|
kubectl delete role rbd-csi-vault-token-review-psp --ignore-not-found
|
||||||
|
kubectl delete rolebinding rbd-csi-vault-token-review-psp --ignore-not-found
|
||||||
|
```
|
||||||
|
|
||||||
|
we have successfully upgraded RBD csi from v3.6 to v3.7
|
||||||
|
|
||||||
|
### Upgrading NFS
|
||||||
|
|
||||||
|
Upgrading nfs csi includes upgrade of nfs driver and as well as
|
||||||
|
kubernetes sidecar containers and also the permissions required for the
|
||||||
|
kubernetes sidecar containers, lets upgrade the things one by one
|
||||||
|
|
||||||
|
#### 5. Upgrade NFS Provisioner resources
|
||||||
|
|
||||||
|
Upgrade provisioner resources include updating the provisioner RBAC and
|
||||||
|
Provisioner deployment
|
||||||
|
|
||||||
|
##### 5.1 Update the NFS Provisioner RBAC
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl apply -f deploy/nfs/kubernetes/csi-provisioner-rbac.yaml
|
||||||
|
serviceaccount/nfs-csi-provisioner configured
|
||||||
|
clusterrole.rbac.authorization.k8s.io/nfs-external-provisioner-runner configured
|
||||||
|
clusterrolebinding.rbac.authorization.k8s.io/nfs-csi-provisioner-role configured
|
||||||
|
role.rbac.authorization.k8s.io/nfs-external-provisioner-cfg configured
|
||||||
|
rolebinding.rbac.authorization.k8s.io/nfs-csi-provisioner-role-cfg configured
|
||||||
|
```
|
||||||
|
|
||||||
|
##### 5.2 Update the NFS Provisioner deployment
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl apply -f deploy/nfs/kubernetes/csi-nfsplugin-provisioner.yaml
|
||||||
|
service/csi-nfsplugin-provisioner configured
|
||||||
|
deployment.apps/csi-nfsplugin-provisioner configured
|
||||||
|
```
|
||||||
|
|
||||||
|
wait for the deployment to complete
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl get deployment
|
||||||
|
NAME READY UP-TO-DATE AVAILABLE AGE
|
||||||
|
csi-nfsplugin-provisioner 5/5 1 5 104m
|
||||||
|
```
|
||||||
|
|
||||||
|
deployment UP-TO-DATE value must be same as READY
|
||||||
|
|
||||||
|
#### 6. Upgrade NFS Nodeplugin resources
|
||||||
|
|
||||||
|
Upgrading nodeplugin resources include updating the nodeplugin RBAC and
|
||||||
|
nodeplugin daemonset
|
||||||
|
|
||||||
|
##### 6.1 Update the NFS Nodeplugin RBAC
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl apply -f deploy/nfs/kubernetes/csi-nodeplugin-rbac.yaml
|
||||||
|
serviceaccount/nfs-csi-nodeplugin configured
|
||||||
|
```
|
||||||
|
|
||||||
|
##### 6.2 Update the NFS Nodeplugin daemonset
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl apply -f deploy/nfs/kubernetes/csi-nfsplugin.yaml
|
||||||
|
daemonset.apps/csi-nfsplugin configured
|
||||||
|
service/csi-metrics-nfsplugin configured
|
||||||
|
```
|
||||||
|
|
||||||
|
##### 6.3 Delete the old NFS Nodeplugin daemonset
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ kubectl delete daemonsets.apps csi-nfs-node
|
||||||
|
daemonset.apps "csi-nfs-node" deleted
|
||||||
|
```
|
||||||
|
|
||||||
|
we have successfully upgraded nfs csi from v3.6 to v3.7
|
||||||
|
|
||||||
### CSI Sidecar containers consideration
|
### CSI Sidecar containers consideration
|
||||||
|
|
||||||
|
@ -140,16 +140,6 @@ Those manifests deploy service accounts, cluster roles and cluster role
|
|||||||
bindings. These are shared for both RBD and CephFS CSI plugins, as they require
|
bindings. These are shared for both RBD and CephFS CSI plugins, as they require
|
||||||
the same permissions.
|
the same permissions.
|
||||||
|
|
||||||
**Deploy PodSecurityPolicy resources for sidecar containers and node plugins:**
|
|
||||||
|
|
||||||
**NOTE:** These manifests are required only if [PodSecurityPolicy](https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/#podsecuritypolicy)
|
|
||||||
admission controller is active on your cluster.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
kubectl create -f csi-provisioner-psp.yaml
|
|
||||||
kubectl create -f csi-nodeplugin-psp.yaml
|
|
||||||
```
|
|
||||||
|
|
||||||
**Deploy ConfigMap for CSI plugins:**
|
**Deploy ConfigMap for CSI plugins:**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
@ -109,16 +109,6 @@ Those manifests deploy service accounts, cluster roles and cluster role
|
|||||||
bindings. These are shared for both RBD and CephFS CSI plugins, as they require
|
bindings. These are shared for both RBD and CephFS CSI plugins, as they require
|
||||||
the same permissions.
|
the same permissions.
|
||||||
|
|
||||||
**Deploy PodSecurityPolicy resources for sidecar containers and node plugins:**
|
|
||||||
|
|
||||||
**NOTE:** These manifests are required only if [PodSecurityPolicy](https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/#podsecuritypolicy)
|
|
||||||
admission controller is active on your cluster.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
kubectl create -f csi-provisioner-psp.yaml
|
|
||||||
kubectl create -f csi-nodeplugin-psp.yaml
|
|
||||||
```
|
|
||||||
|
|
||||||
**Deploy ConfigMap for CSI plugins:**
|
**Deploy ConfigMap for CSI plugins:**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
@ -415,6 +405,38 @@ the AWS KMS is expected to contain:
|
|||||||
This Secret is expected to be created by the tenant/user in each namespace where
|
This Secret is expected to be created by the tenant/user in each namespace where
|
||||||
Ceph-CSI is used to create encrypted rbd volumes.
|
Ceph-CSI is used to create encrypted rbd volumes.
|
||||||
|
|
||||||
|
#### Configuring KMIP KMS
|
||||||
|
|
||||||
|
The Key Management Interoperability Protocol (KMIP) is an extensible
|
||||||
|
communication protocol that defines message formats for the manipulation
|
||||||
|
of cryptographic keys on a key management server.
|
||||||
|
Ceph-CSI can be configured to connect to various KMS servers using
|
||||||
|
[KMIP](https://en.wikipedia.org/wiki/Key_Management_Interoperability_Protocol)
|
||||||
|
for encrypting RBD volumes.
|
||||||
|
|
||||||
|
There are a few settings that need to be included in the [KMS configuration
|
||||||
|
file](../examples/kms/vault/kms-config.yaml):
|
||||||
|
|
||||||
|
1. `KMS_PROVIDER`: should be set to `kmip`.
|
||||||
|
1. `KMIP_ENDPOINT` KMIP endpoint address.
|
||||||
|
1. `KMIP_SECRET_NAME`(optional): name of the Kubernetes Secret which contains
|
||||||
|
the credentials for communicating with KMIP server, defaults to
|
||||||
|
`ceph-csi-kmip-credentials`.
|
||||||
|
1. `TLS_SERVER_NAME`(optional): The endpoint server name. Useful when the
|
||||||
|
KMIP endpoint does not have a DNS entry.
|
||||||
|
1. `READ_TIMEOUT`(optional): Network read timeout, in seconds. The default
|
||||||
|
value is 10.
|
||||||
|
1. `WRITE_TIMEOUT`(optional): Network write timeout, in seconds. The default
|
||||||
|
value is 10.
|
||||||
|
|
||||||
|
The [Secret with credentials](../examples/kms/vault/kmip-credentials.yaml) for
|
||||||
|
the KMIP KMS is expected to contain:
|
||||||
|
|
||||||
|
1. `CA_CERT`: CA certificate that will be used to connect to KMIP server.
|
||||||
|
1. `CLIENT_CERT`: Client certificate that will be used to connect to KMIP server.
|
||||||
|
1. `CLIENT_KEY`: Client key that will be used to connect to KMIP server.
|
||||||
|
1. `UNIQUE_IDENTIFIER`: Unique ID of the key to use for encrypting/decrypting.
|
||||||
|
|
||||||
### Encryption prerequisites
|
### Encryption prerequisites
|
||||||
|
|
||||||
In order for encryption to work you need to make sure that `dm-crypt` kernel
|
In order for encryption to work you need to make sure that `dm-crypt` kernel
|
||||||
|
@ -61,7 +61,7 @@ storageclass yaml
|
|||||||
```
|
```
|
||||||
|
|
||||||
- For standard templates edit [csi-rbdplugin.yaml](../deploy/rbd/kubernetes/csi-rbdplugin.yaml)
|
- For standard templates edit [csi-rbdplugin.yaml](../deploy/rbd/kubernetes/csi-rbdplugin.yaml)
|
||||||
to update `hostPath` for `ceph-logdir`, also edit psp [csi-nodeplugin-psp.yaml](../deploy/rbd/kubernetes/csi-nodeplugin-psp.yaml)
|
to update `hostPath` for `ceph-logdir`.
|
||||||
to update `pathPrefix` spec entries.
|
to update `pathPrefix` spec entries.
|
||||||
- Update the StorageClass with the customized log directory path
|
- Update the StorageClass with the customized log directory path
|
||||||
- Now update rbd StorageClass for `cephLogDir`, for example
|
- Now update rbd StorageClass for `cephLogDir`, for example
|
||||||
|
@ -10,16 +10,16 @@
|
|||||||
|
|
||||||
## Introduction
|
## Introduction
|
||||||
|
|
||||||
End-to-end (e2e) in cephcsi provides a mechanism to test the end-to-end
|
End-to-end (e2e) in cephcsi provides a mechanism to test the end-to-end behavior
|
||||||
behavior of the system, These tests will interact with live instances of ceph
|
of the system, These tests will interact with live instances of ceph cluster
|
||||||
cluster just like how a user would.
|
just like how a user would.
|
||||||
|
|
||||||
The primary objectives of the e2e tests are to ensure a consistent and reliable
|
The primary objectives of the e2e tests are to ensure a consistent and reliable
|
||||||
behavior of the cephcsi code base and to catch hard-to-test bugs before
|
behavior of the cephcsi code base and to catch hard-to-test bugs before users do
|
||||||
users do when unit and integration tests are insufficient.
|
when unit and integration tests are insufficient.
|
||||||
|
|
||||||
The Test framework is designed
|
The Test framework is designed to install Rook, run cephcsi tests, and uninstall
|
||||||
to install Rook, run cephcsi tests, and uninstall Rook.
|
Rook.
|
||||||
|
|
||||||
The e2e test are built on top of [Ginkgo](http://onsi.github.io/ginkgo/) and
|
The e2e test are built on top of [Ginkgo](http://onsi.github.io/ginkgo/) and
|
||||||
[Gomega](http://onsi.github.io/gomega/)
|
[Gomega](http://onsi.github.io/gomega/)
|
||||||
@ -45,7 +45,8 @@ the following parameters are available to configure kubernetes cluster
|
|||||||
| cephcsi | Copy built docker images to kubernetes cluster |
|
| cephcsi | Copy built docker images to kubernetes cluster |
|
||||||
| k8s-sidecar | Copy kubernetes sidecar docker images to kubernetes cluster |
|
| k8s-sidecar | Copy kubernetes sidecar docker images to kubernetes cluster |
|
||||||
|
|
||||||
following environment variables can be exported to customize kubernetes deployment
|
following environment variables can be exported to customize kubernetes
|
||||||
|
deployment
|
||||||
|
|
||||||
| ENV | Description | Default |
|
| ENV | Description | Default |
|
||||||
|----------------------|--------------------------------------------------|--------------------------------------------------------------------|
|
|----------------------|--------------------------------------------------|--------------------------------------------------------------------|
|
||||||
@ -74,9 +75,11 @@ following environment variables can be exported to customize kubernetes deployme
|
|||||||
|
|
||||||
## Deploy Rook
|
## Deploy Rook
|
||||||
|
|
||||||
The cephcsi E2E tests expects that you already have rook running in your cluster.
|
The cephcsi E2E tests expects that you already have rook running in your
|
||||||
|
cluster.
|
||||||
|
|
||||||
Thanks to [minikube](../scripts/minikube.sh) script for the handy `deploy-rook` option.
|
Thanks to [minikube](../scripts/minikube.sh) script for the handy `deploy-rook`
|
||||||
|
option.
|
||||||
|
|
||||||
```console
|
```console
|
||||||
./scripts/minikube.sh deploy-rook
|
./scripts/minikube.sh deploy-rook
|
||||||
@ -84,8 +87,8 @@ Thanks to [minikube](../scripts/minikube.sh) script for the handy `deploy-rook`
|
|||||||
|
|
||||||
## Test parameters
|
## Test parameters
|
||||||
|
|
||||||
In addition to standard go tests parameters, the following custom parameters
|
In addition to standard go tests parameters, the following custom parameters are
|
||||||
are available while running tests:
|
available while running tests:
|
||||||
|
|
||||||
| flag | description |
|
| flag | description |
|
||||||
| ----------------- | ------------------------------------------------------------------------------------------------- |
|
| ----------------- | ------------------------------------------------------------------------------------------------- |
|
||||||
@ -108,8 +111,8 @@ are available while running tests:
|
|||||||
|
|
||||||
## E2E for snapshot
|
## E2E for snapshot
|
||||||
|
|
||||||
After the support for snapshot/clone has been added to ceph-csi,
|
After the support for snapshot/clone has been added to ceph-csi, you need to
|
||||||
you need to follow these steps before running e2e.
|
follow these steps before running e2e.
|
||||||
|
|
||||||
- Install snapshot controller and snapshot CRD
|
- Install snapshot controller and snapshot CRD
|
||||||
|
|
||||||
@ -126,9 +129,9 @@ you need to follow these steps before running e2e.
|
|||||||
## Running E2E
|
## Running E2E
|
||||||
|
|
||||||
`
|
`
|
||||||
Note:- Prior to running the tests, you may need to copy the kubernetes configuration
|
Note:- Prior to running the tests, you may need to copy the kubernetes
|
||||||
file to `$HOME/.kube/config` which is required to communicate with kubernetes
|
configuration file to `$HOME/.kube/config` which is required to communicate with
|
||||||
cluster or you can pass `kubeconfig`flag while running tests.
|
kubernetes cluster or you can pass `kubeconfig` flag while running tests.
|
||||||
`
|
`
|
||||||
|
|
||||||
Functional tests are run by the `go test` command.
|
Functional tests are run by the `go test` command.
|
||||||
|
@ -23,7 +23,7 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
snapapi "github.com/kubernetes-csi/external-snapshotter/client/v6/apis/volumesnapshot/v1"
|
snapapi "github.com/kubernetes-csi/external-snapshotter/client/v6/apis/volumesnapshot/v1"
|
||||||
. "github.com/onsi/ginkgo" // nolint
|
. "github.com/onsi/ginkgo/v2" // nolint
|
||||||
v1 "k8s.io/api/core/v1"
|
v1 "k8s.io/api/core/v1"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
clientset "k8s.io/client-go/kubernetes"
|
clientset "k8s.io/client-go/kubernetes"
|
||||||
@ -34,10 +34,8 @@ import (
|
|||||||
var (
|
var (
|
||||||
cephFSProvisioner = "csi-cephfsplugin-provisioner.yaml"
|
cephFSProvisioner = "csi-cephfsplugin-provisioner.yaml"
|
||||||
cephFSProvisionerRBAC = "csi-provisioner-rbac.yaml"
|
cephFSProvisionerRBAC = "csi-provisioner-rbac.yaml"
|
||||||
cephFSProvisionerPSP = "csi-provisioner-psp.yaml"
|
|
||||||
cephFSNodePlugin = "csi-cephfsplugin.yaml"
|
cephFSNodePlugin = "csi-cephfsplugin.yaml"
|
||||||
cephFSNodePluginRBAC = "csi-nodeplugin-rbac.yaml"
|
cephFSNodePluginRBAC = "csi-nodeplugin-rbac.yaml"
|
||||||
cephFSNodePluginPSP = "csi-nodeplugin-psp.yaml"
|
|
||||||
cephFSDeploymentName = "csi-cephfsplugin-provisioner"
|
cephFSDeploymentName = "csi-cephfsplugin-provisioner"
|
||||||
cephFSDeamonSetName = "csi-cephfsplugin"
|
cephFSDeamonSetName = "csi-cephfsplugin"
|
||||||
cephFSContainerName = "csi-cephfsplugin"
|
cephFSContainerName = "csi-cephfsplugin"
|
||||||
@ -83,10 +81,6 @@ func createORDeleteCephfsResources(action kubectlAction) {
|
|||||||
filename: cephFSDirPath + cephFSProvisionerRBAC,
|
filename: cephFSDirPath + cephFSProvisionerRBAC,
|
||||||
namespace: cephCSINamespace,
|
namespace: cephCSINamespace,
|
||||||
},
|
},
|
||||||
&yamlResourceNamespaced{
|
|
||||||
filename: cephFSDirPath + cephFSProvisionerPSP,
|
|
||||||
namespace: cephCSINamespace,
|
|
||||||
},
|
|
||||||
// the provisioner itself
|
// the provisioner itself
|
||||||
&yamlResourceNamespaced{
|
&yamlResourceNamespaced{
|
||||||
filename: cephFSDirPath + cephFSProvisioner,
|
filename: cephFSDirPath + cephFSProvisioner,
|
||||||
@ -98,10 +92,6 @@ func createORDeleteCephfsResources(action kubectlAction) {
|
|||||||
filename: cephFSDirPath + cephFSNodePluginRBAC,
|
filename: cephFSDirPath + cephFSNodePluginRBAC,
|
||||||
namespace: cephCSINamespace,
|
namespace: cephCSINamespace,
|
||||||
},
|
},
|
||||||
&yamlResourceNamespaced{
|
|
||||||
filename: cephFSDirPath + cephFSNodePluginPSP,
|
|
||||||
namespace: cephCSINamespace,
|
|
||||||
},
|
|
||||||
// the node-plugin itself
|
// the node-plugin itself
|
||||||
&yamlResourceNamespaced{
|
&yamlResourceNamespaced{
|
||||||
filename: cephFSDirPath + cephFSNodePlugin,
|
filename: cephFSDirPath + cephFSNodePlugin,
|
||||||
|
@ -30,7 +30,6 @@ import (
|
|||||||
var (
|
var (
|
||||||
vaultExamplePath = "../examples/kms/vault/"
|
vaultExamplePath = "../examples/kms/vault/"
|
||||||
vaultServicePath = "vault.yaml"
|
vaultServicePath = "vault.yaml"
|
||||||
vaultPSPPath = "vault-psp.yaml"
|
|
||||||
vaultRBACPath = "csi-vaulttokenreview-rbac.yaml"
|
vaultRBACPath = "csi-vaulttokenreview-rbac.yaml"
|
||||||
vaultConfigPath = "kms-config.yaml"
|
vaultConfigPath = "kms-config.yaml"
|
||||||
vaultTenantPath = "tenant-sa.yaml"
|
vaultTenantPath = "tenant-sa.yaml"
|
||||||
@ -99,15 +98,6 @@ func createORDeleteVault(action kubectlAction) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
e2elog.Failf("failed to %s vault configmap %v", action, err)
|
e2elog.Failf("failed to %s vault configmap %v", action, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
data, err = replaceNamespaceInTemplate(vaultExamplePath + vaultPSPPath)
|
|
||||||
if err != nil {
|
|
||||||
e2elog.Failf("failed to read content from %s %v", vaultExamplePath+vaultPSPPath, err)
|
|
||||||
}
|
|
||||||
err = retryKubectlInput(cephCSINamespace, action, data, deployTimeout)
|
|
||||||
if err != nil {
|
|
||||||
e2elog.Failf("failed to %s vault psp %v", action, err)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// createTenantServiceAccount uses the tenant-sa.yaml example file to create
|
// createTenantServiceAccount uses the tenant-sa.yaml example file to create
|
||||||
|
@ -24,7 +24,7 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
. "github.com/onsi/ginkgo"
|
. "github.com/onsi/ginkgo/v2"
|
||||||
. "github.com/onsi/gomega"
|
. "github.com/onsi/gomega"
|
||||||
"k8s.io/kubernetes/test/e2e/framework"
|
"k8s.io/kubernetes/test/e2e/framework"
|
||||||
"k8s.io/kubernetes/test/e2e/framework/config"
|
"k8s.io/kubernetes/test/e2e/framework/config"
|
||||||
|
18
e2e/nfs.go
18
e2e/nfs.go
@ -24,7 +24,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
snapapi "github.com/kubernetes-csi/external-snapshotter/client/v6/apis/volumesnapshot/v1"
|
snapapi "github.com/kubernetes-csi/external-snapshotter/client/v6/apis/volumesnapshot/v1"
|
||||||
. "github.com/onsi/ginkgo" // nolint
|
. "github.com/onsi/ginkgo/v2" // nolint
|
||||||
v1 "k8s.io/api/core/v1"
|
v1 "k8s.io/api/core/v1"
|
||||||
apierrs "k8s.io/apimachinery/pkg/api/errors"
|
apierrs "k8s.io/apimachinery/pkg/api/errors"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
@ -37,13 +37,11 @@ import (
|
|||||||
var (
|
var (
|
||||||
nfsProvisioner = "csi-nfsplugin-provisioner.yaml"
|
nfsProvisioner = "csi-nfsplugin-provisioner.yaml"
|
||||||
nfsProvisionerRBAC = "csi-provisioner-rbac.yaml"
|
nfsProvisionerRBAC = "csi-provisioner-rbac.yaml"
|
||||||
nfsProvisionerPSP = "csi-provisioner-psp.yaml"
|
|
||||||
nfsNodePlugin = "csi-nfsplugin.yaml"
|
nfsNodePlugin = "csi-nfsplugin.yaml"
|
||||||
nfsNodePluginRBAC = "csi-nodeplugin-rbac.yaml"
|
nfsNodePluginRBAC = "csi-nodeplugin-rbac.yaml"
|
||||||
nfsNodePluginPSP = "csi-nodeplugin-psp.yaml"
|
|
||||||
nfsRookCephNFS = "rook-nfs.yaml"
|
nfsRookCephNFS = "rook-nfs.yaml"
|
||||||
nfsDeploymentName = "csi-nfsplugin-provisioner"
|
nfsDeploymentName = "csi-nfsplugin-provisioner"
|
||||||
nfsDeamonSetName = "csi-nfs-node"
|
nfsDeamonSetName = "csi-nfsplugin"
|
||||||
nfsDirPath = "../deploy/nfs/kubernetes/"
|
nfsDirPath = "../deploy/nfs/kubernetes/"
|
||||||
nfsExamplePath = examplePath + "nfs/"
|
nfsExamplePath = examplePath + "nfs/"
|
||||||
nfsPoolName = ".nfs"
|
nfsPoolName = ".nfs"
|
||||||
@ -95,10 +93,6 @@ func createORDeleteNFSResources(f *framework.Framework, action kubectlAction) {
|
|||||||
filename: nfsDirPath + nfsProvisionerRBAC,
|
filename: nfsDirPath + nfsProvisionerRBAC,
|
||||||
namespace: cephCSINamespace,
|
namespace: cephCSINamespace,
|
||||||
},
|
},
|
||||||
&yamlResourceNamespaced{
|
|
||||||
filename: nfsDirPath + nfsProvisionerPSP,
|
|
||||||
namespace: cephCSINamespace,
|
|
||||||
},
|
|
||||||
// the provisioner itself
|
// the provisioner itself
|
||||||
&yamlResourceNamespaced{
|
&yamlResourceNamespaced{
|
||||||
filename: nfsDirPath + nfsProvisioner,
|
filename: nfsDirPath + nfsProvisioner,
|
||||||
@ -110,10 +104,6 @@ func createORDeleteNFSResources(f *framework.Framework, action kubectlAction) {
|
|||||||
filename: nfsDirPath + nfsNodePluginRBAC,
|
filename: nfsDirPath + nfsNodePluginRBAC,
|
||||||
namespace: cephCSINamespace,
|
namespace: cephCSINamespace,
|
||||||
},
|
},
|
||||||
&yamlResourceNamespaced{
|
|
||||||
filename: nfsDirPath + nfsNodePluginPSP,
|
|
||||||
namespace: cephCSINamespace,
|
|
||||||
},
|
|
||||||
// the node-plugin itself
|
// the node-plugin itself
|
||||||
&yamlResourceNamespaced{
|
&yamlResourceNamespaced{
|
||||||
filename: nfsDirPath + nfsNodePlugin,
|
filename: nfsDirPath + nfsNodePlugin,
|
||||||
@ -235,7 +225,7 @@ func unmountNFSVolume(f *framework.Framework, appName, pvcName string) error {
|
|||||||
cmd,
|
cmd,
|
||||||
nfsDeamonSetName,
|
nfsDeamonSetName,
|
||||||
pod.Spec.NodeName,
|
pod.Spec.NodeName,
|
||||||
"nfs", // name of the container
|
"csi-nfsplugin", // name of the container
|
||||||
cephCSINamespace)
|
cephCSINamespace)
|
||||||
if stdErr != "" {
|
if stdErr != "" {
|
||||||
e2elog.Logf("StdErr occurred: %s", stdErr)
|
e2elog.Logf("StdErr occurred: %s", stdErr)
|
||||||
@ -299,7 +289,7 @@ var _ = Describe("nfs", func() {
|
|||||||
// log provisioner
|
// log provisioner
|
||||||
logsCSIPods("app=csi-nfsplugin-provisioner", c)
|
logsCSIPods("app=csi-nfsplugin-provisioner", c)
|
||||||
// log node plugin
|
// log node plugin
|
||||||
logsCSIPods("app=csi-nfs-node", c)
|
logsCSIPods("app=csi-nfsplugin", c)
|
||||||
|
|
||||||
// log all details from the namespace where Ceph-CSI is deployed
|
// log all details from the namespace where Ceph-CSI is deployed
|
||||||
framework.DumpAllNamespaceInfo(c, cephCSINamespace)
|
framework.DumpAllNamespaceInfo(c, cephCSINamespace)
|
||||||
|
12
e2e/rbd.go
12
e2e/rbd.go
@ -25,7 +25,7 @@ import (
|
|||||||
|
|
||||||
"github.com/ceph/ceph-csi/internal/util"
|
"github.com/ceph/ceph-csi/internal/util"
|
||||||
|
|
||||||
. "github.com/onsi/ginkgo" // nolint
|
. "github.com/onsi/ginkgo/v2" // nolint
|
||||||
v1 "k8s.io/api/core/v1"
|
v1 "k8s.io/api/core/v1"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/types"
|
"k8s.io/apimachinery/pkg/types"
|
||||||
@ -38,10 +38,8 @@ import (
|
|||||||
var (
|
var (
|
||||||
rbdProvisioner = "csi-rbdplugin-provisioner.yaml"
|
rbdProvisioner = "csi-rbdplugin-provisioner.yaml"
|
||||||
rbdProvisionerRBAC = "csi-provisioner-rbac.yaml"
|
rbdProvisionerRBAC = "csi-provisioner-rbac.yaml"
|
||||||
rbdProvisionerPSP = "csi-provisioner-psp.yaml"
|
|
||||||
rbdNodePlugin = "csi-rbdplugin.yaml"
|
rbdNodePlugin = "csi-rbdplugin.yaml"
|
||||||
rbdNodePluginRBAC = "csi-nodeplugin-rbac.yaml"
|
rbdNodePluginRBAC = "csi-nodeplugin-rbac.yaml"
|
||||||
rbdNodePluginPSP = "csi-nodeplugin-psp.yaml"
|
|
||||||
configMap = "csi-config-map.yaml"
|
configMap = "csi-config-map.yaml"
|
||||||
cephConfconfigMap = "ceph-conf.yaml"
|
cephConfconfigMap = "ceph-conf.yaml"
|
||||||
csiDriverObject = "csidriver.yaml"
|
csiDriverObject = "csidriver.yaml"
|
||||||
@ -145,10 +143,6 @@ func createORDeleteRbdResources(action kubectlAction) {
|
|||||||
filename: rbdDirPath + rbdProvisionerRBAC,
|
filename: rbdDirPath + rbdProvisionerRBAC,
|
||||||
namespace: cephCSINamespace,
|
namespace: cephCSINamespace,
|
||||||
},
|
},
|
||||||
&yamlResourceNamespaced{
|
|
||||||
filename: rbdDirPath + rbdProvisionerPSP,
|
|
||||||
namespace: cephCSINamespace,
|
|
||||||
},
|
|
||||||
// the provisioner itself
|
// the provisioner itself
|
||||||
&yamlResourceNamespaced{
|
&yamlResourceNamespaced{
|
||||||
filename: rbdDirPath + rbdProvisioner,
|
filename: rbdDirPath + rbdProvisioner,
|
||||||
@ -161,10 +155,6 @@ func createORDeleteRbdResources(action kubectlAction) {
|
|||||||
filename: rbdDirPath + rbdNodePluginRBAC,
|
filename: rbdDirPath + rbdNodePluginRBAC,
|
||||||
namespace: cephCSINamespace,
|
namespace: cephCSINamespace,
|
||||||
},
|
},
|
||||||
&yamlResourceNamespaced{
|
|
||||||
filename: rbdDirPath + rbdNodePluginPSP,
|
|
||||||
namespace: cephCSINamespace,
|
|
||||||
},
|
|
||||||
// the node-plugin itself
|
// the node-plugin itself
|
||||||
&yamlResourceNamespaced{
|
&yamlResourceNamespaced{
|
||||||
filename: rbdDirPath + rbdNodePlugin,
|
filename: rbdDirPath + rbdNodePlugin,
|
||||||
|
@ -23,7 +23,7 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
. "github.com/onsi/ginkgo" // nolint
|
. "github.com/onsi/ginkgo/v2" // nolint
|
||||||
v1 "k8s.io/api/core/v1"
|
v1 "k8s.io/api/core/v1"
|
||||||
"k8s.io/apimachinery/pkg/api/resource"
|
"k8s.io/apimachinery/pkg/api/resource"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
@ -23,7 +23,7 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
. "github.com/onsi/ginkgo" // nolint
|
. "github.com/onsi/ginkgo/v2" // nolint
|
||||||
v1 "k8s.io/api/core/v1"
|
v1 "k8s.io/api/core/v1"
|
||||||
"k8s.io/apimachinery/pkg/api/resource"
|
"k8s.io/apimachinery/pkg/api/resource"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
@ -52,15 +52,15 @@ option `clusterID`, can now be created on the cluster.
|
|||||||
|
|
||||||
## Running CephCSI with pod networking
|
## Running CephCSI with pod networking
|
||||||
|
|
||||||
The current problem with Pod Networking, is when a CephFS/RBD volume is mounted
|
The current problem with Pod Networking, is when a CephFS/RBD/NFS volume is mounted
|
||||||
in a pod using Ceph CSI and then the CSI CephFS/RBD plugin is restarted or
|
in a pod using Ceph CSI and then the CSI CephFS/RBD/NFS plugin is restarted or
|
||||||
terminated (e.g. by restarting or deleting its DaemonSet), all operations on
|
terminated (e.g. by restarting or deleting its DaemonSet), all operations on
|
||||||
the volume become blocked, even after restarting the CSI pods.
|
the volume become blocked, even after restarting the CSI pods.
|
||||||
|
|
||||||
The only workaround is to restart the node where the Ceph CSI plugin pod was
|
The only workaround is to restart the node where the Ceph CSI plugin pod was
|
||||||
restarted. This can be mitigated by running the `rbd map`/`mount -t` commands
|
restarted. This can be mitigated by running the `rbd map`/`mount -t` commands
|
||||||
in a different network namespace which does not get deleted when the CSI
|
in a different network namespace which does not get deleted when the CSI
|
||||||
CephFS/RBD plugin is restarted or terminated.
|
CephFS/RBD/NFS plugin is restarted or terminated.
|
||||||
|
|
||||||
If someone wants to run the CephCSI with the pod networking they can still do
|
If someone wants to run the CephCSI with the pod networking they can still do
|
||||||
by setting the `netNamespaceFilePath`. If this path is set CephCSI will execute
|
by setting the `netNamespaceFilePath`. If this path is set CephCSI will execute
|
||||||
|
@ -24,6 +24,10 @@ kind: ConfigMap
|
|||||||
# path for the Ceph cluster identified by the <cluster-id>, This will be used
|
# path for the Ceph cluster identified by the <cluster-id>, This will be used
|
||||||
# by the CephFS CSI plugin to execute the mount -t in the
|
# by the CephFS CSI plugin to execute the mount -t in the
|
||||||
# network namespace specified by the "cephFS.netNamespaceFilePath".
|
# network namespace specified by the "cephFS.netNamespaceFilePath".
|
||||||
|
# The "nfs.netNamespaceFilePath" fields are the various network namespace
|
||||||
|
# path for the Ceph cluster identified by the <cluster-id>, This will be used
|
||||||
|
# by the NFS CSI plugin to execute the mount -t in the
|
||||||
|
# network namespace specified by the "nfs.netNamespaceFilePath".
|
||||||
# The "rbd.netNamespaceFilePath" fields are the various network namespace
|
# The "rbd.netNamespaceFilePath" fields are the various network namespace
|
||||||
# path for the Ceph cluster identified by the <cluster-id>, This will be used
|
# path for the Ceph cluster identified by the <cluster-id>, This will be used
|
||||||
# by the RBD CSI plugin to execute the rbd map/unmap in the
|
# by the RBD CSI plugin to execute the rbd map/unmap in the
|
||||||
@ -60,6 +64,9 @@ data:
|
|||||||
"subvolumeGroup": "<subvolumegroup for cephFS volumes>"
|
"subvolumeGroup": "<subvolumegroup for cephFS volumes>"
|
||||||
"netNamespaceFilePath": "<kubeletRootPath>/plugins/cephfs.csi.ceph.com/net",
|
"netNamespaceFilePath": "<kubeletRootPath>/plugins/cephfs.csi.ceph.com/net",
|
||||||
}
|
}
|
||||||
|
"nfs": {
|
||||||
|
"netNamespaceFilePath": "<kubeletRootPath>/plugins/nfs.csi.ceph.com/net",
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
cluster-mapping.json: |-
|
cluster-mapping.json: |-
|
||||||
|
@ -74,5 +74,14 @@ data:
|
|||||||
"encryptionKMSType": "aws-sts-metadata",
|
"encryptionKMSType": "aws-sts-metadata",
|
||||||
"secretName": "ceph-csi-aws-credentials"
|
"secretName": "ceph-csi-aws-credentials"
|
||||||
}
|
}
|
||||||
|
kmip-test: |-
|
||||||
|
{
|
||||||
|
"KMS_PROVIDER": "kmip",
|
||||||
|
"KMIP_ENDPOINT": "kmip:5696",
|
||||||
|
"KMIP_SECRET_NAME": "ceph-csi-kmip-credentials",
|
||||||
|
"TLS_SERVER_NAME": "kmip.ciphertrustmanager.local",
|
||||||
|
"READ_TIMEOUT": 10,
|
||||||
|
"WRITE_TIMEOUT": 10
|
||||||
|
}
|
||||||
metadata:
|
metadata:
|
||||||
name: csi-kms-connection-details
|
name: csi-kms-connection-details
|
||||||
|
13
examples/kms/vault/kmip-credentials.yaml
Normal file
13
examples/kms/vault/kmip-credentials.yaml
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
---
|
||||||
|
# This is an example Kubernetes Secret that can be created in the Kubernetes
|
||||||
|
# Namespace where Ceph-CSI is deployed. The contents of this Secret will be
|
||||||
|
# used to connect to the KMS using KMIP.
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Secret
|
||||||
|
metadata:
|
||||||
|
name: ceph-csi-kmip-credentials
|
||||||
|
stringData:
|
||||||
|
CA_CERT: ""
|
||||||
|
CLIENT_CERT: ""
|
||||||
|
CLIENT_KEY: ""
|
||||||
|
UNIQUE_IDENTIFIER: ""
|
@ -100,6 +100,14 @@ data:
|
|||||||
"aws-sts-metadata-test": {
|
"aws-sts-metadata-test": {
|
||||||
"encryptionKMSType": "aws-sts-metadata",
|
"encryptionKMSType": "aws-sts-metadata",
|
||||||
"secretName": "ceph-csi-aws-credentials"
|
"secretName": "ceph-csi-aws-credentials"
|
||||||
|
},
|
||||||
|
"kmip-test": {
|
||||||
|
"KMS_PROVIDER": "kmip",
|
||||||
|
"KMIP_ENDPOINT": "kmip:5696",
|
||||||
|
"KMIP_SECRET_NAME": "ceph-csi-kmip-credentials",
|
||||||
|
"TLS_SERVER_NAME": "kmip.ciphertrustmanager.local",
|
||||||
|
"READ_TIMEOUT": 10,
|
||||||
|
"WRITE_TIMEOUT": 10
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
metadata:
|
metadata:
|
||||||
|
@ -1,47 +0,0 @@
|
|||||||
---
|
|
||||||
apiVersion: policy/v1beta1
|
|
||||||
kind: PodSecurityPolicy
|
|
||||||
metadata:
|
|
||||||
name: rbd-csi-vault-token-review-psp
|
|
||||||
spec:
|
|
||||||
fsGroup:
|
|
||||||
rule: RunAsAny
|
|
||||||
runAsUser:
|
|
||||||
rule: RunAsAny
|
|
||||||
seLinux:
|
|
||||||
rule: RunAsAny
|
|
||||||
supplementalGroups:
|
|
||||||
rule: RunAsAny
|
|
||||||
volumes:
|
|
||||||
- 'configMap'
|
|
||||||
- 'secret'
|
|
||||||
|
|
||||||
---
|
|
||||||
kind: Role
|
|
||||||
apiVersion: rbac.authorization.k8s.io/v1
|
|
||||||
metadata:
|
|
||||||
# replace with non-default namespace name
|
|
||||||
namespace: default
|
|
||||||
name: rbd-csi-vault-token-review-psp
|
|
||||||
rules:
|
|
||||||
- apiGroups: ['policy']
|
|
||||||
resources: ['podsecuritypolicies']
|
|
||||||
verbs: ['use']
|
|
||||||
resourceNames: ['rbd-csi-vault-token-review-psp']
|
|
||||||
|
|
||||||
---
|
|
||||||
kind: RoleBinding
|
|
||||||
apiVersion: rbac.authorization.k8s.io/v1
|
|
||||||
metadata:
|
|
||||||
name: rbd-csi-vault-token-review-psp
|
|
||||||
# replace with non-default namespace name
|
|
||||||
namespace: default
|
|
||||||
subjects:
|
|
||||||
- kind: ServiceAccount
|
|
||||||
name: rbd-csi-vault-token-review
|
|
||||||
# replace with non-default namespace name
|
|
||||||
namespace: default
|
|
||||||
roleRef:
|
|
||||||
kind: Role
|
|
||||||
name: rbd-csi-vault-token-review-psp
|
|
||||||
apiGroup: rbac.authorization.k8s.io
|
|
123
go.mod
123
go.mod
@ -4,40 +4,42 @@ go 1.17
|
|||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/IBM/keyprotect-go-client v0.8.0
|
github.com/IBM/keyprotect-go-client v0.8.0
|
||||||
github.com/aws/aws-sdk-go v1.44.62
|
github.com/aws/aws-sdk-go v1.44.82
|
||||||
github.com/aws/aws-sdk-go-v2/service/sts v1.16.9
|
github.com/aws/aws-sdk-go-v2/service/sts v1.16.13
|
||||||
github.com/ceph/ceph-csi/api v0.0.0-00010101000000-000000000000
|
github.com/ceph/ceph-csi/api v0.0.0-00010101000000-000000000000
|
||||||
// TODO: API for managing subvolume metadata and snapshot metadata requires `ceph_ci_untested` build-tag
|
// TODO: API for managing subvolume metadata and snapshot metadata requires `ceph_ci_untested` build-tag
|
||||||
github.com/ceph/go-ceph v0.16.0
|
github.com/ceph/go-ceph v0.17.0
|
||||||
github.com/container-storage-interface/spec v1.6.0
|
github.com/container-storage-interface/spec v1.6.0
|
||||||
github.com/csi-addons/replication-lib-utils v0.2.0
|
github.com/csi-addons/replication-lib-utils v0.2.0
|
||||||
github.com/csi-addons/spec v0.1.2-0.20211220115741-32fa508dadbe
|
github.com/csi-addons/spec v0.1.2-0.20220829042231-b27a0d84b50b
|
||||||
|
github.com/gemalto/kmip-go v0.0.8-0.20220721195433-3fe83e2d3f26
|
||||||
github.com/golang/protobuf v1.5.2
|
github.com/golang/protobuf v1.5.2
|
||||||
|
github.com/google/uuid v1.3.0
|
||||||
github.com/grpc-ecosystem/go-grpc-middleware v1.3.0
|
github.com/grpc-ecosystem/go-grpc-middleware v1.3.0
|
||||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0
|
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0
|
||||||
github.com/hashicorp/vault/api v1.7.2
|
github.com/hashicorp/vault/api v1.7.2
|
||||||
github.com/kubernetes-csi/csi-lib-utils v0.11.0
|
github.com/kubernetes-csi/csi-lib-utils v0.11.0
|
||||||
github.com/kubernetes-csi/external-snapshotter/client/v6 v6.0.1
|
github.com/kubernetes-csi/external-snapshotter/client/v6 v6.0.1
|
||||||
github.com/libopenstorage/secrets v0.0.0-20210908194121-a1d19aa9713a
|
github.com/libopenstorage/secrets v0.0.0-20210908194121-a1d19aa9713a
|
||||||
github.com/onsi/ginkgo v1.16.5
|
github.com/onsi/ginkgo/v2 v2.1.4
|
||||||
github.com/onsi/gomega v1.19.0
|
github.com/onsi/gomega v1.20.0
|
||||||
github.com/pborman/uuid v1.2.1
|
|
||||||
github.com/prometheus/client_golang v1.12.2
|
github.com/prometheus/client_golang v1.12.2
|
||||||
github.com/stretchr/testify v1.8.0
|
github.com/stretchr/testify v1.8.0
|
||||||
golang.org/x/crypto v0.0.0-20220214200702-86341886e292
|
golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd
|
||||||
golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8
|
golang.org/x/net v0.0.0-20220722155237-a158d28d115b
|
||||||
|
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f
|
||||||
google.golang.org/grpc v1.48.0
|
google.golang.org/grpc v1.48.0
|
||||||
google.golang.org/protobuf v1.28.0
|
google.golang.org/protobuf v1.28.0
|
||||||
k8s.io/api v0.24.3
|
k8s.io/api v0.25.0
|
||||||
k8s.io/apimachinery v0.24.3
|
k8s.io/apimachinery v0.25.0
|
||||||
k8s.io/client-go v12.0.0+incompatible
|
k8s.io/client-go v12.0.0+incompatible
|
||||||
k8s.io/cloud-provider v0.24.3
|
k8s.io/cloud-provider v0.25.0
|
||||||
k8s.io/klog/v2 v2.70.1
|
k8s.io/klog/v2 v2.70.1
|
||||||
//
|
//
|
||||||
// when updating k8s.io/kubernetes, make sure to update the replace section too
|
// when updating k8s.io/kubernetes, make sure to update the replace section too
|
||||||
//
|
//
|
||||||
k8s.io/kubernetes v1.24.3
|
k8s.io/kubernetes v1.25.0
|
||||||
k8s.io/mount-utils v0.24.3
|
k8s.io/mount-utils v0.25.0
|
||||||
k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed
|
k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed
|
||||||
sigs.k8s.io/controller-runtime v0.11.0-beta.0.0.20211208212546-f236f0345ad2
|
sigs.k8s.io/controller-runtime v0.11.0-beta.0.0.20211208212546-f236f0345ad2
|
||||||
)
|
)
|
||||||
@ -45,24 +47,27 @@ require (
|
|||||||
require (
|
require (
|
||||||
github.com/PuerkitoBio/purell v1.1.1 // indirect
|
github.com/PuerkitoBio/purell v1.1.1 // indirect
|
||||||
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect
|
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect
|
||||||
|
github.com/ansel1/merry v1.6.2 // indirect
|
||||||
|
github.com/ansel1/merry/v2 v2.0.1 // indirect
|
||||||
github.com/armon/go-metrics v0.3.9 // indirect
|
github.com/armon/go-metrics v0.3.9 // indirect
|
||||||
github.com/armon/go-radix v1.0.0 // indirect
|
github.com/armon/go-radix v1.0.0 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2 v1.16.7 // indirect
|
github.com/aws/aws-sdk-go-v2 v1.16.11 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.14 // indirect
|
github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.18 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.8 // indirect
|
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.12 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.8 // indirect
|
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.12 // indirect
|
||||||
github.com/aws/smithy-go v1.12.0 // indirect
|
github.com/aws/smithy-go v1.12.1 // indirect
|
||||||
github.com/beorn7/perks v1.0.1 // indirect
|
github.com/beorn7/perks v1.0.1 // indirect
|
||||||
github.com/blang/semver/v4 v4.0.0 // indirect
|
github.com/blang/semver/v4 v4.0.0 // indirect
|
||||||
github.com/cenkalti/backoff/v3 v3.0.0 // indirect
|
github.com/cenkalti/backoff/v3 v3.0.0 // indirect
|
||||||
github.com/cespare/xxhash/v2 v2.1.2 // indirect
|
github.com/cespare/xxhash/v2 v2.1.2 // indirect
|
||||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||||
github.com/docker/distribution v2.8.1+incompatible // indirect
|
github.com/docker/distribution v2.8.1+incompatible // indirect
|
||||||
github.com/emicklei/go-restful v2.9.5+incompatible // indirect
|
github.com/emicklei/go-restful/v3 v3.8.0 // indirect
|
||||||
github.com/evanphx/json-patch v4.12.0+incompatible // indirect
|
github.com/evanphx/json-patch v4.12.0+incompatible // indirect
|
||||||
github.com/fatih/color v1.9.0 // indirect
|
github.com/fatih/color v1.9.0 // indirect
|
||||||
github.com/felixge/httpsnoop v1.0.1 // indirect
|
github.com/felixge/httpsnoop v1.0.1 // indirect
|
||||||
github.com/fsnotify/fsnotify v1.5.1 // indirect
|
github.com/fsnotify/fsnotify v1.5.1 // indirect
|
||||||
|
github.com/gemalto/flume v0.13.0 // indirect
|
||||||
github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 // indirect
|
github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 // indirect
|
||||||
github.com/go-logr/logr v1.2.3 // indirect
|
github.com/go-logr/logr v1.2.3 // indirect
|
||||||
github.com/go-openapi/jsonpointer v0.19.5 // indirect
|
github.com/go-openapi/jsonpointer v0.19.5 // indirect
|
||||||
@ -75,7 +80,6 @@ require (
|
|||||||
github.com/google/gnostic v0.5.7-v3refs // indirect
|
github.com/google/gnostic v0.5.7-v3refs // indirect
|
||||||
github.com/google/go-cmp v0.5.8 // indirect
|
github.com/google/go-cmp v0.5.8 // indirect
|
||||||
github.com/google/gofuzz v1.1.0 // indirect
|
github.com/google/gofuzz v1.1.0 // indirect
|
||||||
github.com/google/uuid v1.3.0 // indirect
|
|
||||||
github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect
|
github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect
|
||||||
github.com/hashicorp/errwrap v1.1.0 // indirect
|
github.com/hashicorp/errwrap v1.1.0 // indirect
|
||||||
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
|
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
|
||||||
@ -101,10 +105,12 @@ require (
|
|||||||
github.com/jmespath/go-jmespath v0.4.0 // indirect
|
github.com/jmespath/go-jmespath v0.4.0 // indirect
|
||||||
github.com/josharian/intern v1.0.0 // indirect
|
github.com/josharian/intern v1.0.0 // indirect
|
||||||
github.com/json-iterator/go v1.1.12 // indirect
|
github.com/json-iterator/go v1.1.12 // indirect
|
||||||
|
github.com/kr/pretty v0.2.1 // indirect
|
||||||
github.com/mailru/easyjson v0.7.6 // indirect
|
github.com/mailru/easyjson v0.7.6 // indirect
|
||||||
github.com/mattn/go-colorable v0.1.6 // indirect
|
github.com/mattn/go-colorable v0.1.12 // indirect
|
||||||
github.com/mattn/go-isatty v0.0.12 // indirect
|
github.com/mattn/go-isatty v0.0.14 // indirect
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect
|
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect
|
||||||
|
github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect
|
||||||
github.com/mitchellh/copystructure v1.0.0 // indirect
|
github.com/mitchellh/copystructure v1.0.0 // indirect
|
||||||
github.com/mitchellh/go-homedir v1.1.0 // indirect
|
github.com/mitchellh/go-homedir v1.1.0 // indirect
|
||||||
github.com/mitchellh/go-testing-interface v1.0.0 // indirect
|
github.com/mitchellh/go-testing-interface v1.0.0 // indirect
|
||||||
@ -115,7 +121,6 @@ require (
|
|||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||||
github.com/modern-go/reflect2 v1.0.2 // indirect
|
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
|
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
|
||||||
github.com/nxadm/tail v1.4.8 // indirect
|
|
||||||
github.com/oklog/run v1.0.0 // indirect
|
github.com/oklog/run v1.0.0 // indirect
|
||||||
github.com/opencontainers/go-digest v1.0.0 // indirect
|
github.com/opencontainers/go-digest v1.0.0 // indirect
|
||||||
github.com/opencontainers/selinux v1.10.0 // indirect
|
github.com/opencontainers/selinux v1.10.0 // indirect
|
||||||
@ -140,30 +145,30 @@ require (
|
|||||||
go.opentelemetry.io/otel/trace v0.20.0 // indirect
|
go.opentelemetry.io/otel/trace v0.20.0 // indirect
|
||||||
go.opentelemetry.io/proto/otlp v0.7.0 // indirect
|
go.opentelemetry.io/proto/otlp v0.7.0 // indirect
|
||||||
go.uber.org/atomic v1.9.0 // indirect
|
go.uber.org/atomic v1.9.0 // indirect
|
||||||
golang.org/x/net v0.0.0-20220225172249-27dd8689420f // indirect
|
go.uber.org/multierr v1.8.0 // indirect
|
||||||
|
go.uber.org/zap v1.21.0 // indirect
|
||||||
golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 // indirect
|
golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 // indirect
|
||||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect
|
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect
|
||||||
golang.org/x/text v0.3.7 // indirect
|
golang.org/x/text v0.3.7 // indirect
|
||||||
golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 // indirect
|
golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 // indirect
|
||||||
gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect
|
gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect
|
||||||
google.golang.org/appengine v1.6.7 // indirect
|
google.golang.org/appengine v1.6.7 // indirect
|
||||||
google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368 // indirect
|
google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21 // indirect
|
||||||
gopkg.in/inf.v0 v0.9.1 // indirect
|
gopkg.in/inf.v0 v0.9.1 // indirect
|
||||||
gopkg.in/square/go-jose.v2 v2.5.1 // indirect
|
gopkg.in/square/go-jose.v2 v2.5.1 // indirect
|
||||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect
|
|
||||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
k8s.io/apiextensions-apiserver v0.24.3 // indirect
|
k8s.io/apiextensions-apiserver v0.25.0 // indirect
|
||||||
k8s.io/apiserver v0.24.3 // indirect
|
k8s.io/apiserver v0.25.0 // indirect
|
||||||
k8s.io/component-base v0.24.3 // indirect
|
k8s.io/component-base v0.25.0 // indirect
|
||||||
k8s.io/component-helpers v0.24.3 // indirect
|
k8s.io/component-helpers v0.25.0 // indirect
|
||||||
k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42 // indirect
|
k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1 // indirect
|
||||||
k8s.io/kubectl v0.0.0 // indirect
|
k8s.io/kubectl v0.0.0 // indirect
|
||||||
k8s.io/kubelet v0.0.0 // indirect
|
k8s.io/kubelet v0.0.0 // indirect
|
||||||
k8s.io/pod-security-admission v0.0.0 // indirect
|
k8s.io/pod-security-admission v0.0.0 // indirect
|
||||||
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30 // indirect
|
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.32 // indirect
|
||||||
sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect
|
sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect
|
||||||
sigs.k8s.io/structured-merge-diff/v4 v4.2.1 // indirect
|
sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect
|
||||||
sigs.k8s.io/yaml v1.3.0 // indirect
|
sigs.k8s.io/yaml v1.3.0 // indirect
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -176,31 +181,31 @@ replace (
|
|||||||
//
|
//
|
||||||
// k8s.io/kubernetes depends on these k8s.io packages, but unversioned
|
// k8s.io/kubernetes depends on these k8s.io packages, but unversioned
|
||||||
//
|
//
|
||||||
k8s.io/api => k8s.io/api v0.24.3
|
k8s.io/api => k8s.io/api v0.25.0
|
||||||
k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.24.3
|
k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.25.0
|
||||||
k8s.io/apimachinery => k8s.io/apimachinery v0.24.3
|
k8s.io/apimachinery => k8s.io/apimachinery v0.25.0
|
||||||
k8s.io/apiserver => k8s.io/apiserver v0.24.3
|
k8s.io/apiserver => k8s.io/apiserver v0.25.0
|
||||||
k8s.io/cli-runtime => k8s.io/cli-runtime v0.24.3
|
k8s.io/cli-runtime => k8s.io/cli-runtime v0.25.0
|
||||||
k8s.io/client-go => k8s.io/client-go v0.24.3
|
k8s.io/client-go => k8s.io/client-go v0.25.0
|
||||||
k8s.io/cloud-provider => k8s.io/cloud-provider v0.24.3
|
k8s.io/cloud-provider => k8s.io/cloud-provider v0.25.0
|
||||||
k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.24.3
|
k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.25.0
|
||||||
k8s.io/code-generator => k8s.io/code-generator v0.24.3
|
k8s.io/code-generator => k8s.io/code-generator v0.25.0
|
||||||
k8s.io/component-base => k8s.io/component-base v0.24.3
|
k8s.io/component-base => k8s.io/component-base v0.25.0
|
||||||
k8s.io/component-helpers => k8s.io/component-helpers v0.24.3
|
k8s.io/component-helpers => k8s.io/component-helpers v0.25.0
|
||||||
k8s.io/controller-manager => k8s.io/controller-manager v0.24.3
|
k8s.io/controller-manager => k8s.io/controller-manager v0.25.0
|
||||||
k8s.io/cri-api => k8s.io/cri-api v0.24.3
|
k8s.io/cri-api => k8s.io/cri-api v0.25.0
|
||||||
k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.24.3
|
k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.25.0
|
||||||
k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.24.3
|
k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.25.0
|
||||||
k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.24.3
|
k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.25.0
|
||||||
k8s.io/kube-proxy => k8s.io/kube-proxy v0.24.3
|
k8s.io/kube-proxy => k8s.io/kube-proxy v0.25.0
|
||||||
k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.24.3
|
k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.25.0
|
||||||
k8s.io/kubectl => k8s.io/kubectl v0.24.3
|
k8s.io/kubectl => k8s.io/kubectl v0.25.0
|
||||||
k8s.io/kubelet => k8s.io/kubelet v0.24.3
|
k8s.io/kubelet => k8s.io/kubelet v0.25.0
|
||||||
k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.24.3
|
k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.25.0
|
||||||
k8s.io/metrics => k8s.io/metrics v0.24.3
|
k8s.io/metrics => k8s.io/metrics v0.25.0
|
||||||
k8s.io/mount-utils => k8s.io/mount-utils v0.25.0-alpha.3.0.20220801203918-ff562e546084
|
k8s.io/mount-utils => k8s.io/mount-utils v0.25.0-alpha.3.0.20220801203918-ff562e546084
|
||||||
k8s.io/pod-security-admission => k8s.io/pod-security-admission v0.24.3
|
k8s.io/pod-security-admission => k8s.io/pod-security-admission v0.25.0
|
||||||
k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.24.3
|
k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.25.0
|
||||||
// layeh.com seems to be misbehaving
|
// layeh.com seems to be misbehaving
|
||||||
layeh.com/radius => github.com/layeh/radius v0.0.0-20190322222518-890bc1058917
|
layeh.com/radius => github.com/layeh/radius v0.0.0-20190322222518-890bc1058917
|
||||||
)
|
)
|
||||||
|
369
go.sum
369
go.sum
@ -1,5 +1,5 @@
|
|||||||
bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8=
|
bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8=
|
||||||
bitbucket.org/bertimus9/systemstat v0.0.0-20180207000608-0eeff89b0690/go.mod h1:Ulb78X89vxKYgdL24HMTiXYHlyHEvruOj1ZPlqeNEZM=
|
bitbucket.org/bertimus9/systemstat v0.5.0/go.mod h1:EkUWPp8lKFPMXP8vnbpT5JDI0W/sTiLZAvN8ONWErHY=
|
||||||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||||
cloud.google.com/go v0.34.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.37.4/go.mod h1:NHPJ89PdicEuT9hdPXMROBD91xc5uRDxsMtSB16k7hw=
|
cloud.google.com/go v0.37.4/go.mod h1:NHPJ89PdicEuT9hdPXMROBD91xc5uRDxsMtSB16k7hw=
|
||||||
@ -22,6 +22,13 @@ cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmW
|
|||||||
cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg=
|
cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg=
|
||||||
cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8=
|
cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8=
|
||||||
cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0=
|
cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0=
|
||||||
|
cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY=
|
||||||
|
cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM=
|
||||||
|
cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY=
|
||||||
|
cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ=
|
||||||
|
cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI=
|
||||||
|
cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4=
|
||||||
|
cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc=
|
||||||
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
|
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.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
|
||||||
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
|
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
|
||||||
@ -50,11 +57,12 @@ github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg6
|
|||||||
github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
|
github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
|
||||||
github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI=
|
github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI=
|
||||||
github.com/Azure/go-autorest/autorest v0.9.2/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI=
|
github.com/Azure/go-autorest/autorest v0.9.2/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI=
|
||||||
github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA=
|
github.com/Azure/go-autorest/autorest v0.11.27/go.mod h1:7l8ybrIdUmGqZMTD0sRtAr8NvbHjfofbf8RSP2q7w7U=
|
||||||
github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0=
|
github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0=
|
||||||
github.com/Azure/go-autorest/autorest/adal v0.6.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc=
|
github.com/Azure/go-autorest/autorest/adal v0.6.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc=
|
||||||
github.com/Azure/go-autorest/autorest/adal v0.7.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc=
|
github.com/Azure/go-autorest/autorest/adal v0.7.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc=
|
||||||
github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M=
|
github.com/Azure/go-autorest/autorest/adal v0.9.18/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ=
|
||||||
|
github.com/Azure/go-autorest/autorest/adal v0.9.20/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ=
|
||||||
github.com/Azure/go-autorest/autorest/azure/auth v0.4.0/go.mod h1:Oo5cRhLvZteXzI2itUm5ziqsoIxRkzrt3t61FeZaS18=
|
github.com/Azure/go-autorest/autorest/azure/auth v0.4.0/go.mod h1:Oo5cRhLvZteXzI2itUm5ziqsoIxRkzrt3t61FeZaS18=
|
||||||
github.com/Azure/go-autorest/autorest/azure/cli v0.3.0/go.mod h1:rNYMNAefZMRowqCV0cVhr/YDW5dD7afFq9nXAXL4ykE=
|
github.com/Azure/go-autorest/autorest/azure/cli v0.3.0/go.mod h1:rNYMNAefZMRowqCV0cVhr/YDW5dD7afFq9nXAXL4ykE=
|
||||||
github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA=
|
github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA=
|
||||||
@ -64,6 +72,7 @@ github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxB
|
|||||||
github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
|
github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
|
||||||
github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM=
|
github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM=
|
||||||
github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=
|
github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=
|
||||||
|
github.com/Azure/go-autorest/autorest/mocks v0.4.2/go.mod h1:Vy7OitM9Kei0i1Oj+LvyAWMXJHeKH1MVlzFugfVrmyU=
|
||||||
github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA=
|
github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA=
|
||||||
github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE=
|
github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE=
|
||||||
github.com/Azure/go-autorest/autorest/validation v0.1.0/go.mod h1:Ha3z/SqBeaalWQvokg3NZAlQTalVMtOIAs1aGK7G6u8=
|
github.com/Azure/go-autorest/autorest/validation v0.1.0/go.mod h1:Ha3z/SqBeaalWQvokg3NZAlQTalVMtOIAs1aGK7G6u8=
|
||||||
@ -77,14 +86,14 @@ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym
|
|||||||
github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
|
github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
|
||||||
github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
|
github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
|
||||||
github.com/DataDog/zstd v1.4.4/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo=
|
github.com/DataDog/zstd v1.4.4/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo=
|
||||||
github.com/GoogleCloudPlatform/k8s-cloud-provider v1.16.1-0.20210702024009-ea6160c1d0e3/go.mod h1:8XasY4ymP2V/tn2OOV9ZadmiTE1FIB/h3W+yNlPttKw=
|
github.com/GoogleCloudPlatform/k8s-cloud-provider v1.18.1-0.20220218231025-f11817397a1b/go.mod h1:FNj4KYEAAHfYu68kRYolGoxkaJn+6mdEsaM12VTwuI0=
|
||||||
github.com/IBM/keyprotect-go-client v0.5.1/go.mod h1:5TwDM/4FRJq1ZOlwQL1xFahLWQ3TveR88VmL1u3njyI=
|
github.com/IBM/keyprotect-go-client v0.5.1/go.mod h1:5TwDM/4FRJq1ZOlwQL1xFahLWQ3TveR88VmL1u3njyI=
|
||||||
github.com/IBM/keyprotect-go-client v0.8.0 h1:IgLKSigHRpCCl5cZjBkOYziUZ9zxn6w9iRh+KA8Siww=
|
github.com/IBM/keyprotect-go-client v0.8.0 h1:IgLKSigHRpCCl5cZjBkOYziUZ9zxn6w9iRh+KA8Siww=
|
||||||
github.com/IBM/keyprotect-go-client v0.8.0/go.mod h1:yr8h2noNgU8vcbs+vhqoXp3Lmv73PI0zAc6VMgFvWwM=
|
github.com/IBM/keyprotect-go-client v0.8.0/go.mod h1:yr8h2noNgU8vcbs+vhqoXp3Lmv73PI0zAc6VMgFvWwM=
|
||||||
github.com/JeffAshton/win_pdh v0.0.0-20161109143554-76bb4ee9f0ab/go.mod h1:3VYc5hodBMJ5+l/7J4xAyMeuM2PNuepvHlGs8yilUCA=
|
github.com/JeffAshton/win_pdh v0.0.0-20161109143554-76bb4ee9f0ab/go.mod h1:3VYc5hodBMJ5+l/7J4xAyMeuM2PNuepvHlGs8yilUCA=
|
||||||
github.com/Jeffail/gabs v1.1.1 h1:V0uzR08Hj22EX8+8QMhyI9sX2hwRu+/RJhJUmnwda/E=
|
github.com/Jeffail/gabs v1.1.1 h1:V0uzR08Hj22EX8+8QMhyI9sX2hwRu+/RJhJUmnwda/E=
|
||||||
github.com/Jeffail/gabs v1.1.1/go.mod h1:6xMvQMK4k33lb7GUUpaAPh6nKMmemQeg5d4gn7/bOXc=
|
github.com/Jeffail/gabs v1.1.1/go.mod h1:6xMvQMK4k33lb7GUUpaAPh6nKMmemQeg5d4gn7/bOXc=
|
||||||
github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E=
|
github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE=
|
||||||
github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y=
|
github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y=
|
||||||
github.com/Microsoft/go-winio v0.4.13/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA=
|
github.com/Microsoft/go-winio v0.4.13/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA=
|
||||||
github.com/Microsoft/go-winio v0.4.15/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw=
|
github.com/Microsoft/go-winio v0.4.15/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw=
|
||||||
@ -115,8 +124,17 @@ github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk5
|
|||||||
github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190412020505-60e2075261b6/go.mod h1:T9M45xf79ahXVelWoOBmH0y4aC1t5kXO5BxwyakgIGA=
|
github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190412020505-60e2075261b6/go.mod h1:T9M45xf79ahXVelWoOBmH0y4aC1t5kXO5BxwyakgIGA=
|
||||||
github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190620160927-9418d7b0cd0f/go.mod h1:myCDvQSzCW+wB1WAlocEru4wMGJxy+vlxHdhegi1CDQ=
|
github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190620160927-9418d7b0cd0f/go.mod h1:myCDvQSzCW+wB1WAlocEru4wMGJxy+vlxHdhegi1CDQ=
|
||||||
github.com/aliyun/aliyun-oss-go-sdk v0.0.0-20190307165228-86c17b95fcd5/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8=
|
github.com/aliyun/aliyun-oss-go-sdk v0.0.0-20190307165228-86c17b95fcd5/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8=
|
||||||
|
github.com/ansel1/merry v1.5.0/go.mod h1:wUy/yW0JX0ix9GYvUbciq+bi3jW/vlKPlbpI7qdZpOw=
|
||||||
|
github.com/ansel1/merry v1.5.1/go.mod h1:wUy/yW0JX0ix9GYvUbciq+bi3jW/vlKPlbpI7qdZpOw=
|
||||||
|
github.com/ansel1/merry v1.6.1/go.mod h1:ioJjPJ/IsjxH+cC0lpf5TmbKnbcGa9qTk0fDbeRfnGQ=
|
||||||
|
github.com/ansel1/merry v1.6.2 h1:0xr40haRrfVzmOH/JVOu7KOKGEI1c/7q5EmgTEbn+Ng=
|
||||||
|
github.com/ansel1/merry v1.6.2/go.mod h1:pAcMW+2uxIgpzEON021vMtFsrymREY6faJWiiz1QGVQ=
|
||||||
|
github.com/ansel1/merry/v2 v2.0.0-beta.10/go.mod h1:OUvUYh4KLVhf3+sR9Hk8QxCukijznkpheEd837b7vLg=
|
||||||
|
github.com/ansel1/merry/v2 v2.0.1 h1:WeiKZdslHPAPFYxTtgX7clC2Vh75NCoWs5OjCZbIA0A=
|
||||||
|
github.com/ansel1/merry/v2 v2.0.1/go.mod h1:dD5OhpiPrVkvgseRYd+xgYlx7s6ytU3v9BTTJlDA7FM=
|
||||||
|
github.com/ansel1/vespucci/v4 v4.1.1/go.mod h1:zzdrO4IgBfgcGMbGTk/qNGL8JPslmW3nPpcBHKReFYY=
|
||||||
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
|
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
|
||||||
github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY=
|
github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220418222510-f25a4f6275ed/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY=
|
||||||
github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
|
github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
|
||||||
github.com/apple/foundationdb/bindings/go v0.0.0-20190411004307-cd5c9d91fad2/go.mod h1:OMVSB21p9+xQUIqlGizHPZfjK+SHws1ht+ZytVDoz9U=
|
github.com/apple/foundationdb/bindings/go v0.0.0-20190411004307-cd5c9d91fad2/go.mod h1:OMVSB21p9+xQUIqlGizHPZfjK+SHws1ht+ZytVDoz9U=
|
||||||
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
|
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
|
||||||
@ -141,22 +159,23 @@ github.com/aws/aws-sdk-go v1.25.37/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpi
|
|||||||
github.com/aws/aws-sdk-go v1.25.41/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
|
github.com/aws/aws-sdk-go v1.25.41/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
|
||||||
github.com/aws/aws-sdk-go v1.35.24/go.mod h1:tlPOdRjfxPBpNIwqDj61rmsnA85v9jc0Ps9+muhnW+k=
|
github.com/aws/aws-sdk-go v1.35.24/go.mod h1:tlPOdRjfxPBpNIwqDj61rmsnA85v9jc0Ps9+muhnW+k=
|
||||||
github.com/aws/aws-sdk-go v1.38.49/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro=
|
github.com/aws/aws-sdk-go v1.38.49/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro=
|
||||||
github.com/aws/aws-sdk-go v1.44.28/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo=
|
github.com/aws/aws-sdk-go v1.44.67/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo=
|
||||||
github.com/aws/aws-sdk-go v1.44.62 h1:N8qOPnBhl2ZCIFiqyB640Xt5CeX9D8CEVhG/Vj7jGJU=
|
github.com/aws/aws-sdk-go v1.44.82 h1:Miji7nHIMxTWfa831nZf8XAcMWGLaT+PvsS6CdbMG7M=
|
||||||
github.com/aws/aws-sdk-go v1.44.62/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo=
|
github.com/aws/aws-sdk-go v1.44.82/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo=
|
||||||
github.com/aws/aws-sdk-go-v2 v1.16.7 h1:zfBwXus3u14OszRxGcqCDS4MfMCv10e8SMJ2r8Xm0Ns=
|
github.com/aws/aws-sdk-go-v2 v1.16.11 h1:xM1ZPSvty3xVmdxiGr7ay/wlqv+MWhH0rMlyLdbC0YQ=
|
||||||
github.com/aws/aws-sdk-go-v2 v1.16.7/go.mod h1:6CpKuLXg2w7If3ABZCl/qZ6rEgwtjZTn4eAf4RcEyuw=
|
github.com/aws/aws-sdk-go-v2 v1.16.11/go.mod h1:WTACcleLz6VZTp7fak4EO5b9Q4foxbn+8PIz3PmyKlo=
|
||||||
github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.14 h1:2C0pYHcUBmdzPj+EKNC4qj97oK6yjrUhc1KoSodglvk=
|
github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.18 h1:OmiwoVyLKEqqD5GvB683dbSqxiOfvx4U2lDZhG2Esc4=
|
||||||
github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.14/go.mod h1:kdjrMwHwrC3+FsKhNcCMJ7tUVj/8uSD5CZXeQ4wV6fM=
|
github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.18/go.mod h1:348MLhzV1GSlZSMusdwQpXKbhD7X2gbI/TxwAPKkYZQ=
|
||||||
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.8 h1:2J+jdlBJWEmTyAwC82Ym68xCykIvnSnIN18b8xHGlcc=
|
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.12 h1:5mvQDtNWtI6H56+E4LUnLWEmATMB7oEh+Z9RurtIuC0=
|
||||||
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.8/go.mod h1:ZIV8GYoC6WLBW5KGs+o4rsc65/ozd+eQ0L31XF5VDwk=
|
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.12/go.mod h1:ckaCVTEdGAxO6KwTGzgskxR1xM+iJW4lxMyDFVda2Fc=
|
||||||
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.8 h1:oKnAXxSF2FUvfgw8uzU/v9OTYorJJZ8eBmWhr9TWVVQ=
|
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.12 h1:7iPTTX4SAI2U2VOogD7/gmHlsgnYSgoNHt7MSQXtG2M=
|
||||||
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.8/go.mod h1:rDVhIMAX9N2r8nWxDUlbubvvaFMnfsm+3jAV7q+rpM4=
|
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.12/go.mod h1:1TODGhheLWjpQWSuhYuAUWYTCKwEjx2iblIFKDHjeTc=
|
||||||
github.com/aws/aws-sdk-go-v2/service/sts v1.16.9 h1:yOfILxyjmtr2ubRkRJldlHDFBhf5vw4CzhbwWIBmimQ=
|
github.com/aws/aws-sdk-go-v2/service/sts v1.16.13 h1:dl8T0PJlN92rvEGOEUiD0+YPYdPEaCZK0TqHukvSfII=
|
||||||
github.com/aws/aws-sdk-go-v2/service/sts v1.16.9/go.mod h1:O1IvkYxr+39hRf960Us6j0x1P8pDqhTX+oXM5kQNl/Y=
|
github.com/aws/aws-sdk-go-v2/service/sts v1.16.13/go.mod h1:Ru3QVMLygVs/07UQ3YDur1AQZZp2tUNje8wfloFttC0=
|
||||||
github.com/aws/smithy-go v1.12.0 h1:gXpeZel/jPoWQ7OEmLIgCUnhkFftqNfwWUwAHSlp1v0=
|
github.com/aws/smithy-go v1.12.1 h1:yQRC55aXN/y1W10HgwHle01DRuV9Dpf31iGkotjt3Ag=
|
||||||
github.com/aws/smithy-go v1.12.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA=
|
github.com/aws/smithy-go v1.12.1/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA=
|
||||||
github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc=
|
github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc=
|
||||||
|
github.com/baum/kmip-go v0.0.0-20220714190649-7b37ecf92eb2/go.mod h1:5WlKRqL5dfI68V56W+4ZmlPSL+TSfqQrKJYI8CSJz+E=
|
||||||
github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=
|
github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=
|
||||||
github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
|
github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
|
||||||
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
|
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
|
||||||
@ -168,7 +187,6 @@ github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQ
|
|||||||
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
|
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
|
||||||
github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k=
|
github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k=
|
||||||
github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
|
github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
|
||||||
github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM=
|
|
||||||
github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ=
|
github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ=
|
||||||
github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
|
github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
|
||||||
github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM=
|
github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM=
|
||||||
@ -183,8 +201,8 @@ github.com/cenkalti/backoff/v3 v3.0.0 h1:ske+9nBpD9qZsTBoF41nW5L+AIuFBKMeze18XQ3
|
|||||||
github.com/cenkalti/backoff/v3 v3.0.0/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs=
|
github.com/cenkalti/backoff/v3 v3.0.0/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs=
|
||||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||||
github.com/centrify/cloud-golang-sdk v0.0.0-20190214225812-119110094d0f/go.mod h1:C0rtzmGXgN78pYR0tGJFhtHgkbAs0lIbHwkB81VxDQE=
|
github.com/centrify/cloud-golang-sdk v0.0.0-20190214225812-119110094d0f/go.mod h1:C0rtzmGXgN78pYR0tGJFhtHgkbAs0lIbHwkB81VxDQE=
|
||||||
github.com/ceph/go-ceph v0.16.0 h1:hEhVfEFsLoGJF+i3r7Wwh4QlMN+MnWqNxfic9v6GV04=
|
github.com/ceph/go-ceph v0.17.0 h1:2McqHPqvAU+qgROJ+A5/eK70Lt7WsKizkTasDEOZa/Q=
|
||||||
github.com/ceph/go-ceph v0.16.0/go.mod h1:SzhpLdyU+ixxJ68bbqoEa481P5N5d5lv5jVMxcRMLfU=
|
github.com/ceph/go-ceph v0.17.0/go.mod h1:WV8DzlYPtW3SQ/HiT3Dz6ia0+v8dPKWtYY/dWl6BqPg=
|
||||||
github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
|
github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
|
||||||
github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
|
github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
|
||||||
github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
|
github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
|
||||||
@ -192,7 +210,7 @@ github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghf
|
|||||||
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||||
github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
|
github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
|
||||||
github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||||
github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw=
|
github.com/chai2010/gettext-go v1.0.2/go.mod h1:y+wnP2cHYaVj19NZhYKAwEMH2CI1gNHeQQ+5AjwawxA=
|
||||||
github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E=
|
github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E=
|
||||||
github.com/chrismalek/oktasdk-go v0.0.0-20181212195951-3430665dfaa0/go.mod h1:5d8DqS60xkj9k3aXfL3+mXBH0DPYO0FQjcKosxl+b/Q=
|
github.com/chrismalek/oktasdk-go v0.0.0-20181212195951-3430665dfaa0/go.mod h1:5d8DqS60xkj9k3aXfL3+mXBH0DPYO0FQjcKosxl+b/Q=
|
||||||
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
|
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
|
||||||
@ -205,7 +223,6 @@ github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp
|
|||||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||||
github.com/cloudfoundry-community/go-cfclient v0.0.0-20190201205600-f136f9222381/go.mod h1:e5+USP2j8Le2M0Jo3qKPFnNhuo1wueU4nWHCXBOfQ14=
|
github.com/cloudfoundry-community/go-cfclient v0.0.0-20190201205600-f136f9222381/go.mod h1:e5+USP2j8Le2M0Jo3qKPFnNhuo1wueU4nWHCXBOfQ14=
|
||||||
github.com/cloudfoundry/gofileutils v0.0.0-20170111115228-4d0c80011a0f/go.mod h1:Zv7xtAh/T/tmfZlxpESaWWiWOdiJz2GfbBYxImuI6T4=
|
github.com/cloudfoundry/gofileutils v0.0.0-20170111115228-4d0c80011a0f/go.mod h1:Zv7xtAh/T/tmfZlxpESaWWiWOdiJz2GfbBYxImuI6T4=
|
||||||
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-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
||||||
github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
||||||
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
||||||
@ -230,7 +247,6 @@ github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4q
|
|||||||
github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ=
|
github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ=
|
||||||
github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U=
|
github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U=
|
||||||
github.com/containerd/containerd v1.4.9/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
|
github.com/containerd/containerd v1.4.9/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
|
||||||
github.com/containerd/containerd v1.4.12/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
|
|
||||||
github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
|
github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
|
||||||
github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM=
|
github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM=
|
||||||
github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4=
|
github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4=
|
||||||
@ -238,7 +254,7 @@ github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDX
|
|||||||
github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y=
|
github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y=
|
||||||
github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s=
|
github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s=
|
||||||
github.com/coredns/caddy v1.1.0/go.mod h1:A6ntJQlAWuQfFlsd9hvigKbo2WS0VUs2l1e2F+BawD4=
|
github.com/coredns/caddy v1.1.0/go.mod h1:A6ntJQlAWuQfFlsd9hvigKbo2WS0VUs2l1e2F+BawD4=
|
||||||
github.com/coredns/corefile-migration v1.0.14/go.mod h1:XnhgULOEouimnzgn0t4WPuFDN2/PJQcTxdWKC5eXNGE=
|
github.com/coredns/corefile-migration v1.0.17/go.mod h1:XnhgULOEouimnzgn0t4WPuFDN2/PJQcTxdWKC5eXNGE=
|
||||||
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
|
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.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
||||||
github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
||||||
@ -262,8 +278,8 @@ github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ
|
|||||||
github.com/csi-addons/replication-lib-utils v0.2.0 h1:tGs42wfjkObbBo/98a3uxTFWEJ1dq5PIMqPWtdLd040=
|
github.com/csi-addons/replication-lib-utils v0.2.0 h1:tGs42wfjkObbBo/98a3uxTFWEJ1dq5PIMqPWtdLd040=
|
||||||
github.com/csi-addons/replication-lib-utils v0.2.0/go.mod h1:ROQlEsc2EerVtc/K/C+6Hx8pqaQ9MVy9xFFpyKfI9lc=
|
github.com/csi-addons/replication-lib-utils v0.2.0/go.mod h1:ROQlEsc2EerVtc/K/C+6Hx8pqaQ9MVy9xFFpyKfI9lc=
|
||||||
github.com/csi-addons/spec v0.1.0/go.mod h1:Mwq4iLiUV4s+K1bszcWU6aMsR5KPsbIYzzszJ6+56vI=
|
github.com/csi-addons/spec v0.1.0/go.mod h1:Mwq4iLiUV4s+K1bszcWU6aMsR5KPsbIYzzszJ6+56vI=
|
||||||
github.com/csi-addons/spec v0.1.2-0.20211220115741-32fa508dadbe h1:Q2sxgtdRV4Je1R2eLCUPrR/KQZxkSbesGrpCjl0/mU4=
|
github.com/csi-addons/spec v0.1.2-0.20220829042231-b27a0d84b50b h1:C5KgryC4RwQVSF8L/pgcKftgn7Z1zHFZlACJukPlCxs=
|
||||||
github.com/csi-addons/spec v0.1.2-0.20211220115741-32fa508dadbe/go.mod h1:Mwq4iLiUV4s+K1bszcWU6aMsR5KPsbIYzzszJ6+56vI=
|
github.com/csi-addons/spec v0.1.2-0.20220829042231-b27a0d84b50b/go.mod h1:Mwq4iLiUV4s+K1bszcWU6aMsR5KPsbIYzzszJ6+56vI=
|
||||||
github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4=
|
github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4=
|
||||||
github.com/dave/dst v0.26.2/go.mod h1:UMDJuIRPfyUCC78eFuB+SV/WI8oDeyFDvM/JR6NI3IU=
|
github.com/dave/dst v0.26.2/go.mod h1:UMDJuIRPfyUCC78eFuB+SV/WI8oDeyFDvM/JR6NI3IU=
|
||||||
github.com/dave/gopackages v0.0.0-20170318123100-46e7023ec56e/go.mod h1:i00+b/gKdIDIxuLDFob7ustLAVqhsZRk2qVZrArELGQ=
|
github.com/dave/gopackages v0.0.0-20170318123100-46e7023ec56e/go.mod h1:i00+b/gKdIDIxuLDFob7ustLAVqhsZRk2qVZrArELGQ=
|
||||||
@ -273,16 +289,15 @@ github.com/dave/rebecca v0.9.1/go.mod h1:N6XYdMD/OKw3lkF3ywh8Z6wPGuwNFDNtWYEMFWE
|
|||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.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/daviddengcn/go-colortext v1.0.0/go.mod h1:zDqEI5NVUop5QPpVJUxE9UO10hRnmkD5G4Pmri9+m4c=
|
||||||
github.com/denisenkom/go-mssqldb v0.0.0-20190412130859-3b1d194e553a/go.mod h1:zAg7JM8CkOJ43xKXIj7eRO9kmWm/TW578qo+oDO6tuM=
|
github.com/denisenkom/go-mssqldb v0.0.0-20190412130859-3b1d194e553a/go.mod h1:zAg7JM8CkOJ43xKXIj7eRO9kmWm/TW578qo+oDO6tuM=
|
||||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
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/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
|
||||||
github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8=
|
github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8=
|
||||||
github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E=
|
github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E=
|
||||||
github.com/docker/distribution v2.8.0+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
|
|
||||||
github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68=
|
github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68=
|
||||||
github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
|
github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
|
||||||
github.com/docker/docker v20.10.12+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
|
github.com/docker/docker v20.10.17+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
|
||||||
github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
|
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.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/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
|
||||||
@ -306,6 +321,9 @@ github.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2/go.mod h1:gNh8
|
|||||||
github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
|
github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
|
||||||
github.com/emicklei/go-restful v2.9.5+incompatible h1:spTtZBk5DYEvbxMVutUuTyh1Ao2r4iyvLdACqsl/Ljk=
|
github.com/emicklei/go-restful v2.9.5+incompatible h1:spTtZBk5DYEvbxMVutUuTyh1Ao2r4iyvLdACqsl/Ljk=
|
||||||
github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
|
github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
|
||||||
|
github.com/emicklei/go-restful/v3 v3.5.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
|
||||||
|
github.com/emicklei/go-restful/v3 v3.8.0 h1:eCZ8ulSerjdAiaNpF7GxXIE7ZCMo1moN1qX+S609eVw=
|
||||||
|
github.com/emicklei/go-restful/v3 v3.8.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
github.com/envoyproxy/go-control-plane v0.9.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.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.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
|
||||||
@ -351,6 +369,10 @@ github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXt
|
|||||||
github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0=
|
github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0=
|
||||||
github.com/gammazero/deque v0.0.0-20190130191400-2afb3858e9c7/go.mod h1:GeIq9qoE43YdGnDXURnmKTnGg15pQz4mYkXSTChbneI=
|
github.com/gammazero/deque v0.0.0-20190130191400-2afb3858e9c7/go.mod h1:GeIq9qoE43YdGnDXURnmKTnGg15pQz4mYkXSTChbneI=
|
||||||
github.com/gammazero/workerpool v0.0.0-20190406235159-88d534f22b56/go.mod h1:w9RqFVO2BM3xwWEcAB8Fwp0OviTBBEiRmSBDfbXnd3w=
|
github.com/gammazero/workerpool v0.0.0-20190406235159-88d534f22b56/go.mod h1:w9RqFVO2BM3xwWEcAB8Fwp0OviTBBEiRmSBDfbXnd3w=
|
||||||
|
github.com/gemalto/flume v0.13.0 h1:EEeQvAxyFys3BH8IxEU7ZpM6Kr1sYn20HuZq6dgyMR8=
|
||||||
|
github.com/gemalto/flume v0.13.0/go.mod h1:3iOEZiK/HD8SnFTqHCQoOHQKaHlBY0b6z55P8SLaOzk=
|
||||||
|
github.com/gemalto/kmip-go v0.0.8-0.20220721195433-3fe83e2d3f26 h1:AGbIx+qTKLkYrrxL6QuwjAR5MvbuX06uMHJFb8mG+ro=
|
||||||
|
github.com/gemalto/kmip-go v0.0.8-0.20220721195433-3fe83e2d3f26/go.mod h1:7bAnjuzri8yGoJMwngnAd0HdXMRDQU+l1Zaiz12Tr68=
|
||||||
github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg=
|
github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg=
|
||||||
github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ=
|
github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ=
|
||||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||||
@ -358,6 +380,8 @@ github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 h1:Mn26/9ZMNWSw9C9ER
|
|||||||
github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32/go.mod h1:GIjDIg/heH5DOkXY3YJ/wNhfHsQHoXGjl8G8amsYQ1I=
|
github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32/go.mod h1:GIjDIg/heH5DOkXY3YJ/wNhfHsQHoXGjl8G8amsYQ1I=
|
||||||
github.com/go-asn1-ber/asn1-ber v1.3.1/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0=
|
github.com/go-asn1-ber/asn1-ber v1.3.1/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0=
|
||||||
github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q=
|
github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q=
|
||||||
|
github.com/go-errors/errors v1.1.1 h1:ljK/pL5ltg3qoN+OtN6yCv9HWSfMwxSx90GJCZQxYNg=
|
||||||
|
github.com/go-errors/errors v1.1.1/go.mod h1:psDX2osz5VnTOnFWbDeWwS7yejl+uV3FEWEp4lssFEs=
|
||||||
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
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-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-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||||
@ -374,11 +398,13 @@ github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7
|
|||||||
github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
|
github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
|
||||||
github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
|
github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
|
||||||
github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||||
|
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||||
github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
|
github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
|
||||||
github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||||
github.com/go-logr/zapr v0.1.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk=
|
github.com/go-logr/zapr v0.1.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk=
|
||||||
github.com/go-logr/zapr v1.2.0 h1:n4JnPI1T3Qq1SFEi/F8rwLrZERp2bso19PJZDB9dayk=
|
|
||||||
github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro=
|
github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro=
|
||||||
|
github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A=
|
||||||
|
github.com/go-logr/zapr v1.2.3/go.mod h1:eIauM6P8qSvTw5o2ez6UEAfGjQKrxQTl5EoK+Qa2oG4=
|
||||||
github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8=
|
github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8=
|
||||||
github.com/go-ole/go-ole v1.2.1 h1:2lOsA72HgjxAuMlKpFiCbHTvu44PIVkZ5hqm3RSdI/E=
|
github.com/go-ole/go-ole v1.2.1 h1:2lOsA72HgjxAuMlKpFiCbHTvu44PIVkZ5hqm3RSdI/E=
|
||||||
github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8=
|
github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8=
|
||||||
@ -409,6 +435,7 @@ github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5x
|
|||||||
github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
|
github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
|
||||||
github.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZgBrnJfGa0=
|
github.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZgBrnJfGa0=
|
||||||
github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
|
github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
|
||||||
|
github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4=
|
||||||
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||||
github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||||
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
|
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
|
||||||
@ -416,6 +443,8 @@ github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP
|
|||||||
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
||||||
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
||||||
github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A=
|
github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A=
|
||||||
|
github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
|
||||||
|
github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
|
||||||
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
|
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
|
||||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||||
github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4=
|
github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4=
|
||||||
@ -442,17 +471,20 @@ github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw
|
|||||||
github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||||
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||||
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||||
|
github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||||
github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
|
github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
|
||||||
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||||
github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk=
|
github.com/golangplus/bytes v0.0.0-20160111154220-45c989fe5450/go.mod h1:Bk6SMAONeMXrxql8uvOKuAZSu8aM5RUGv+1C6IJaEho=
|
||||||
|
github.com/golangplus/bytes v1.0.0/go.mod h1:AdRaCFwmc/00ZzELMWb01soso6W1R/++O1XL80yAn+A=
|
||||||
|
github.com/golangplus/fmt v1.0.0/go.mod h1:zpM0OfbMCjPtd2qkTD/jX2MgiFCqklhSUFyDW44gVQE=
|
||||||
|
github.com/golangplus/testing v1.0.0/go.mod h1:ZDreixUV3YzhoVraIDyOzHrr76p6NUh6k/pPg/Q3gYA=
|
||||||
github.com/gomodules/jsonpatch/v2 v2.2.0 h1:QBjDK/nX43P4z/Os3gnk8VeFdLDgBuMns1Wljyo607U=
|
github.com/gomodules/jsonpatch/v2 v2.2.0 h1:QBjDK/nX43P4z/Os3gnk8VeFdLDgBuMns1Wljyo607U=
|
||||||
github.com/gomodules/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY=
|
github.com/gomodules/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY=
|
||||||
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||||
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||||
github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=
|
github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=
|
||||||
github.com/google/cadvisor v0.44.1/go.mod h1:GQ9KQfz0iNHQk3D6ftzJWK4TXabfIgM10Oy3FkR+Gzg=
|
github.com/google/cadvisor v0.45.0/go.mod h1:vsMT3Uv2XjQ8M7WUtKARV74mU/HN64C4XtM1bJhUKcU=
|
||||||
github.com/google/cel-go v0.10.1/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w=
|
github.com/google/cel-go v0.12.4/go.mod h1:Av7CU6r6X3YmcHR9GXqVDaEJYfEtSxl6wvIjUQTriCw=
|
||||||
github.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA=
|
|
||||||
github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54=
|
github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54=
|
||||||
github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ=
|
github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ=
|
||||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||||
@ -479,6 +511,7 @@ github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/
|
|||||||
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
||||||
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
|
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
|
||||||
github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
|
github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
|
||||||
|
github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk=
|
||||||
github.com/google/pprof v0.0.0-20181127221834-b4f47329b966/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
github.com/google/pprof v0.0.0-20181127221834-b4f47329b966/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||||
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
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-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||||
@ -492,6 +525,9 @@ github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLe
|
|||||||
github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||||
github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||||
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||||
|
github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||||
|
github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||||
|
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||||
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
||||||
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
|
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
|
||||||
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
@ -501,6 +537,8 @@ github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
|
|||||||
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.3.0/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.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
|
||||||
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
|
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
|
||||||
|
github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0=
|
||||||
|
github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM=
|
||||||
github.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU=
|
github.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU=
|
||||||
github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU=
|
github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU=
|
||||||
github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA=
|
github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA=
|
||||||
@ -689,7 +727,6 @@ github.com/heketi/tests v0.0.0-20151005000721-f3775cbcefd6/go.mod h1:xGMAM8JLi7U
|
|||||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||||
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
||||||
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
||||||
github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
|
|
||||||
github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
|
github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
|
||||||
github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
|
github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
|
||||||
github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
|
github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
|
||||||
@ -740,6 +777,8 @@ github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfV
|
|||||||
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
||||||
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
|
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
|
||||||
github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
|
github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
|
||||||
|
github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k=
|
||||||
|
github.com/k0kubun/pp v2.3.0+incompatible/go.mod h1:GWse8YhT0p8pT4ir3ZgBbfZild3tgzSScAn6HmfYukg=
|
||||||
github.com/karrick/godirwalk v1.16.1/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk=
|
github.com/karrick/godirwalk v1.16.1/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk=
|
||||||
github.com/kelseyhightower/envconfig v1.3.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg=
|
github.com/kelseyhightower/envconfig v1.3.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg=
|
||||||
github.com/keybase/go-crypto v0.0.0-20190403132359-d65b6b94177f h1:Gsc9mVHLRqBjMgdQCghN9NObCcRncDqxJvBvEaIIQEo=
|
github.com/keybase/go-crypto v0.0.0-20190403132359-d65b6b94177f h1:Gsc9mVHLRqBjMgdQCghN9NObCcRncDqxJvBvEaIIQEo=
|
||||||
@ -783,30 +822,34 @@ github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z
|
|||||||
github.com/lpabon/godbc v0.1.1/go.mod h1:Jo9QV0cf3U6jZABgiJ2skINAXb9j8m51r07g4KI92ZA=
|
github.com/lpabon/godbc v0.1.1/go.mod h1:Jo9QV0cf3U6jZABgiJ2skINAXb9j8m51r07g4KI92ZA=
|
||||||
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||||
github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||||
github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
|
|
||||||
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/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.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
||||||
github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs=
|
|
||||||
github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA=
|
github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA=
|
||||||
github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
|
github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
|
||||||
github.com/martini-contrib/render v0.0.0-20150707142108-ec18f8345a11/go.mod h1:Ah2dBMoxZEqk118as2T4u4fjfXarE0pPnMJaArZQZsI=
|
github.com/martini-contrib/render v0.0.0-20150707142108-ec18f8345a11/go.mod h1:Ah2dBMoxZEqk118as2T4u4fjfXarE0pPnMJaArZQZsI=
|
||||||
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
|
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
|
||||||
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
|
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
|
||||||
github.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE=
|
|
||||||
github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
|
github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
|
||||||
|
github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
|
||||||
|
github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=
|
||||||
|
github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
|
||||||
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
||||||
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
||||||
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||||
github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=
|
github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=
|
||||||
github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=
|
github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=
|
||||||
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
|
|
||||||
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
|
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
|
||||||
|
github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
|
||||||
|
github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
|
||||||
|
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
|
||||||
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
||||||
github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
|
github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
|
||||||
github.com/mattn/go-shellwords v1.0.5/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o=
|
github.com/mattn/go-shellwords v1.0.5/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o=
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI=
|
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI=
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
|
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
|
||||||
|
github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI=
|
||||||
|
github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
|
||||||
github.com/mholt/archiver v3.1.1+incompatible/go.mod h1:Dh2dOXnSdiLxRiPoVfIr/fI1TwETms9B8CTWfeh7ROU=
|
github.com/mholt/archiver v3.1.1+incompatible/go.mod h1:Dh2dOXnSdiLxRiPoVfIr/fI1TwETms9B8CTWfeh7ROU=
|
||||||
github.com/michaelklishin/rabbit-hole v0.0.0-20191008194146-93d9988f0cd5/go.mod h1:+pmbihVqjC3GPdfWv1V2TnRSuVvwrWLKfEP/MZVB/Wc=
|
github.com/michaelklishin/rabbit-hole v0.0.0-20191008194146-93d9988f0cd5/go.mod h1:+pmbihVqjC3GPdfWv1V2TnRSuVvwrWLKfEP/MZVB/Wc=
|
||||||
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
|
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
|
||||||
@ -885,12 +928,12 @@ github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W
|
|||||||
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||||
github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||||
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
|
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
|
||||||
github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
|
|
||||||
github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
|
github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
|
||||||
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
|
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
|
||||||
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
|
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
|
||||||
github.com/onsi/ginkgo/v2 v2.1.3 h1:e/3Cwtogj0HA+25nMP1jCMDIf8RtRYbGwGGuBIFztkc=
|
|
||||||
github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
|
github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
|
||||||
|
github.com/onsi/ginkgo/v2 v2.1.4 h1:GNapqRSid3zijZ9H77KrgVG4/8KqiyRsxcSxe+7ApXY=
|
||||||
|
github.com/onsi/ginkgo/v2 v2.1.4/go.mod h1:um6tUpWM/cxCK3/FK8BXqEiUMUwRgSM4JXG47RKZmLU=
|
||||||
github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
|
github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
|
||||||
github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||||
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||||
@ -898,16 +941,16 @@ github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1Cpa
|
|||||||
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
|
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
|
||||||
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
|
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
|
||||||
github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
|
github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
|
||||||
github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw=
|
|
||||||
github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro=
|
github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro=
|
||||||
|
github.com/onsi/gomega v1.20.0 h1:8W0cWlwFkflGPLltQvLRB7ZVD5HuP6ng320w2IS245Q=
|
||||||
|
github.com/onsi/gomega v1.20.0/go.mod h1:DtrZpjmvpn2mPm4YWQa0/ALMDj9v4YxLgojwPeREyVo=
|
||||||
github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
|
github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
|
||||||
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
|
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
|
||||||
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
|
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/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
|
||||||
github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
|
github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
|
||||||
github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
|
github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
|
||||||
github.com/opencontainers/runc v1.1.0/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc=
|
github.com/opencontainers/runc v1.1.3/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg=
|
||||||
github.com/opencontainers/runc v1.1.1/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc=
|
|
||||||
github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
|
github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
|
||||||
github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
|
github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
|
||||||
github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
|
github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
|
||||||
@ -935,10 +978,7 @@ github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaR
|
|||||||
github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ=
|
github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ=
|
||||||
github.com/pborman/uuid v0.0.0-20170612153648-e790cca94e6c/go.mod h1:VyrYX9gd7irzKovcSS6BIIEwPRkP2Wm2m9ufcdFSJ34=
|
github.com/pborman/uuid v0.0.0-20170612153648-e790cca94e6c/go.mod h1:VyrYX9gd7irzKovcSS6BIIEwPRkP2Wm2m9ufcdFSJ34=
|
||||||
github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
|
github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
|
||||||
github.com/pborman/uuid v1.2.1 h1:+ZZIw58t/ozdjRaXh/3awHfmWRbzYxJoAdNJxe/3pvw=
|
|
||||||
github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
|
|
||||||
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
||||||
github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
|
|
||||||
github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
|
github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
|
||||||
github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
|
github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
|
||||||
github.com/pierrec/lz4 v2.2.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
|
github.com/pierrec/lz4 v2.2.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
|
||||||
@ -959,8 +999,8 @@ github.com/portworx/talisman v0.0.0-20191007232806-837747f38224/go.mod h1:OjpMH9
|
|||||||
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
|
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
|
||||||
github.com/posener/complete v1.2.1 h1:LrvDIY//XNo65Lq84G/akBuMGlawHvGBABv8f/ZN6DI=
|
github.com/posener/complete v1.2.1 h1:LrvDIY//XNo65Lq84G/akBuMGlawHvGBABv8f/ZN6DI=
|
||||||
github.com/posener/complete v1.2.1/go.mod h1:6gapUrK/U1TAN7ciCoNRIdVC5sbdBTUh1DKN0g6uH7E=
|
github.com/posener/complete v1.2.1/go.mod h1:6gapUrK/U1TAN7ciCoNRIdVC5sbdBTUh1DKN0g6uH7E=
|
||||||
github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA=
|
|
||||||
github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA=
|
github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA=
|
||||||
|
github.com/pquerna/cachecontrol v0.1.0/go.mod h1:NrUG3Z7Rdu85UNR3vm7SOsl1nFIeSiQnrHV5K9mBcUI=
|
||||||
github.com/pquerna/otp v1.2.1-0.20191009055518-468c2dd2b58d/go.mod h1:dkJfzwRKNiegxyNb54X/3fLwhCynbMspSyWKnvi1AEg=
|
github.com/pquerna/otp v1.2.1-0.20191009055518-468c2dd2b58d/go.mod h1:dkJfzwRKNiegxyNb54X/3fLwhCynbMspSyWKnvi1AEg=
|
||||||
github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.44.1/go.mod h1:3WYi4xqXxGGXWDdQIITnLNmuDzO5n6wYva9spVhR4fg=
|
github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.44.1/go.mod h1:3WYi4xqXxGGXWDdQIITnLNmuDzO5n6wYva9spVhR4fg=
|
||||||
github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.46.0/go.mod h1:3WYi4xqXxGGXWDdQIITnLNmuDzO5n6wYva9spVhR4fg=
|
github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.46.0/go.mod h1:3WYi4xqXxGGXWDdQIITnLNmuDzO5n6wYva9spVhR4fg=
|
||||||
@ -974,6 +1014,7 @@ github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5Fsn
|
|||||||
github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=
|
github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=
|
||||||
github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
|
github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
|
||||||
github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
|
github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
|
||||||
|
github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
|
||||||
github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
|
github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
|
||||||
github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34=
|
github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34=
|
||||||
github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
|
github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
|
||||||
@ -1008,7 +1049,6 @@ github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1
|
|||||||
github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU=
|
github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU=
|
||||||
github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
|
github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
|
||||||
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
|
github.com/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/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
|
github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
|
||||||
github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M=
|
github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M=
|
||||||
github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
|
github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
|
||||||
@ -1027,7 +1067,7 @@ github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIH
|
|||||||
github.com/samuel/go-zookeeper v0.0.0-20180130194729-c4fab1ac1bec/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E=
|
github.com/samuel/go-zookeeper v0.0.0-20180130194729-c4fab1ac1bec/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E=
|
||||||
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
|
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/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
|
||||||
github.com/seccomp/libseccomp-golang v0.9.2-0.20210429002308-3879420cc921/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg=
|
github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg=
|
||||||
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
|
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
|
||||||
github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
|
github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
|
||||||
github.com/shirou/gopsutil v2.19.9+incompatible h1:IrPVlK4nfwW10DF7pW+7YJKws9NkgNzWozwwWv9FsgY=
|
github.com/shirou/gopsutil v2.19.9+incompatible h1:IrPVlK4nfwW10DF7pW+7YJKws9NkgNzWozwwWv9FsgY=
|
||||||
@ -1056,16 +1096,12 @@ github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTd
|
|||||||
github.com/spf13/afero v1.6.0 h1:xoax2sJ2DT8S8xA2paPFjDCScCNeWsg75VG0DLRreiY=
|
github.com/spf13/afero v1.6.0 h1:xoax2sJ2DT8S8xA2paPFjDCScCNeWsg75VG0DLRreiY=
|
||||||
github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
|
github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
|
||||||
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
|
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
|
||||||
github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
|
|
||||||
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
|
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.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE=
|
||||||
github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo=
|
github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo=
|
||||||
github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk=
|
|
||||||
github.com/spf13/cobra v1.4.0 h1:y+wJpx64xcgO1V+RcnwW0LEHxTKRi2ZDPSBjWnrg88Q=
|
github.com/spf13/cobra v1.4.0 h1:y+wJpx64xcgO1V+RcnwW0LEHxTKRi2ZDPSBjWnrg88Q=
|
||||||
github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g=
|
github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g=
|
||||||
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
|
github.com/spf13/jwalterweatherman v1.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.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||||
github.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
github.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||||
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||||
@ -1073,9 +1109,7 @@ github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
|||||||
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
github.com/spf13/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.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
|
||||||
github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
|
github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
|
||||||
github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns=
|
|
||||||
github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8=
|
github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8=
|
||||||
github.com/storageos/go-api v2.2.0+incompatible/go.mod h1:ZrLn+e0ZuF3Y65PNF6dIwbJPZqfmtCXxFm9ckv0agOY=
|
|
||||||
github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
|
github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
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.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
@ -1089,7 +1123,6 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5
|
|||||||
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
|
|
||||||
github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
|
github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
|
||||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||||
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
|
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
|
||||||
@ -1113,7 +1146,7 @@ github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhe
|
|||||||
github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y=
|
github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y=
|
||||||
github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos=
|
github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos=
|
||||||
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
|
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
|
||||||
github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg=
|
github.com/xlab/treeprint v1.1.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0=
|
||||||
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
|
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
|
||||||
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
@ -1122,21 +1155,19 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec
|
|||||||
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
||||||
github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
||||||
github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
||||||
|
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
||||||
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
|
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
|
||||||
go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
|
go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
|
||||||
go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU=
|
go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU=
|
||||||
go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4=
|
go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4=
|
||||||
go.etcd.io/etcd v0.5.0-alpha.5.0.20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg=
|
go.etcd.io/etcd v0.5.0-alpha.5.0.20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg=
|
||||||
go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=
|
go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A=
|
||||||
go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=
|
go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
|
||||||
go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
|
go.etcd.io/etcd/client/v2 v2.305.4/go.mod h1:Ud+VUwIi9/uQHOMA+4ekToJ12lTxlv0zB/+DHwTGEbU=
|
||||||
go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
|
go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY=
|
||||||
go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ=
|
go.etcd.io/etcd/pkg/v3 v3.5.4/go.mod h1:OI+TtO+Aa3nhQSppMbwE4ld3uF1/fqqwbpfndbbrEe0=
|
||||||
go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0=
|
go.etcd.io/etcd/raft/v3 v3.5.4/go.mod h1:SCuunjYvZFC0fBX0vxMSPjuZmpcSk+XaAcMrD6Do03w=
|
||||||
go.etcd.io/etcd/client/v3 v3.5.1/go.mod h1:OnjH4M8OnAotwaB2l9bVgZzRFKru7/ZMoS46OtKyd3Q=
|
go.etcd.io/etcd/server/v3 v3.5.4/go.mod h1:S5/YTU15KxymM5l3T6b09sNOHPXqGYIZStpuuGbb65c=
|
||||||
go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE=
|
|
||||||
go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc=
|
|
||||||
go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4=
|
|
||||||
go.mongodb.org/mongo-driver v1.2.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
|
go.mongodb.org/mongo-driver v1.2.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
|
||||||
go.opencensus.io v0.19.1/go.mod h1:gug0GbSHa8Pafr0d2urOSgoXHZ6x/RUlaiT0d9pqb4A=
|
go.opencensus.io v0.19.1/go.mod h1:gug0GbSHa8Pafr0d2urOSgoXHZ6x/RUlaiT0d9pqb4A=
|
||||||
go.opencensus.io v0.19.2/go.mod h1:NO/8qkisMZLZ1FCsKNqtJPwc8/TaclWyY0B6wcYNg9M=
|
go.opencensus.io v0.19.2/go.mod h1:NO/8qkisMZLZ1FCsKNqtJPwc8/TaclWyY0B6wcYNg9M=
|
||||||
@ -1150,9 +1181,11 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
|
|||||||
go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
|
go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
|
||||||
go.opentelemetry.io/contrib v0.20.0 h1:ubFQUn0VCZ0gPwIoJfBJVpeBlyRMxu8Mm/huKWYd9p0=
|
go.opentelemetry.io/contrib v0.20.0 h1:ubFQUn0VCZ0gPwIoJfBJVpeBlyRMxu8Mm/huKWYd9p0=
|
||||||
go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc=
|
go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc=
|
||||||
|
go.opentelemetry.io/contrib/instrumentation/github.com/emicklei/go-restful/otelrestful v0.20.0/go.mod h1:oQkZOyq61qZBItEFqhfpobK6X/oDPR7/Qr+MXjVSTks=
|
||||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E=
|
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E=
|
||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0 h1:Q3C9yzW6I9jqEc8sawxzxZmY48fs9u220KXq6d5s3XU=
|
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0 h1:Q3C9yzW6I9jqEc8sawxzxZmY48fs9u220KXq6d5s3XU=
|
||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4=
|
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4=
|
||||||
|
go.opentelemetry.io/contrib/propagators v0.20.0/go.mod h1:yLmt93MeSiARUwrK57bOZ4FBruRN4taLiW1lcGfnOes=
|
||||||
go.opentelemetry.io/otel v0.20.0 h1:eaP0Fqu7SXHwvjiqDq83zImeehOHX8doTvU9AwXON8g=
|
go.opentelemetry.io/otel v0.20.0 h1:eaP0Fqu7SXHwvjiqDq83zImeehOHX8doTvU9AwXON8g=
|
||||||
go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo=
|
go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo=
|
||||||
go.opentelemetry.io/otel/exporters/otlp v0.20.0 h1:PTNgq9MRmQqqJY0REVbZFvwkYOA85vbdQU/nVfxDyqg=
|
go.opentelemetry.io/otel/exporters/otlp v0.20.0 h1:PTNgq9MRmQqqJY0REVbZFvwkYOA85vbdQU/nVfxDyqg=
|
||||||
@ -1179,17 +1212,22 @@ go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
|
|||||||
go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
||||||
go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=
|
go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=
|
||||||
go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
|
go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
|
||||||
|
go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
|
||||||
go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA=
|
go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA=
|
||||||
go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
|
go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
|
||||||
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
|
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
|
||||||
go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4=
|
|
||||||
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
|
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
|
||||||
|
go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak=
|
||||||
|
go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8=
|
||||||
|
go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak=
|
||||||
go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
|
go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
|
||||||
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
|
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
|
||||||
go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
|
go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
|
||||||
|
go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI=
|
||||||
go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI=
|
go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI=
|
||||||
go.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI=
|
|
||||||
go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI=
|
go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI=
|
||||||
|
go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8=
|
||||||
|
go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw=
|
||||||
golang.org/x/arch v0.0.0-20180920145803-b19384d3c130/go.mod h1:cYlCBUl1MsqxdiKgmc4uh7TxZfWSFLOGSRR090WDxt8=
|
golang.org/x/arch v0.0.0-20180920145803-b19384d3c130/go.mod h1:cYlCBUl1MsqxdiKgmc4uh7TxZfWSFLOGSRR090WDxt8=
|
||||||
golang.org/x/crypto v0.0.0-20180820150726-614d502a4dac/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
golang.org/x/crypto v0.0.0-20180820150726-614d502a4dac/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
@ -1206,12 +1244,13 @@ golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8U
|
|||||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20200117160349-530e935923ad/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200117160349-530e935923ad/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
|
||||||
golang.org/x/crypto v0.0.0-20201208171446-5f87f3452ae9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
|
golang.org/x/crypto v0.0.0-20201208171446-5f87f3452ae9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
|
||||||
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||||
golang.org/x/crypto v0.0.0-20220214200702-86341886e292 h1:f+lwQ+GtmgoY+A2YaQxlSOnDjXcQ7ZRLWOHbC6HtRqE=
|
golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||||
golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
golang.org/x/crypto v0.0.0-20220131195533-30dcbda58838/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||||
|
golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd h1:XcWmESyNjXJMLahc3mqVQJcgSTDxFxhETVlfk9uGc38=
|
||||||
|
golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||||
golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
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-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-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
@ -1260,6 +1299,7 @@ golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
|||||||
golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY=
|
golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY=
|
||||||
|
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||||
golang.org/x/net v0.0.0-20180530234432-1e491301e022/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180530234432-1e491301e022/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-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-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
@ -1319,8 +1359,10 @@ golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qx
|
|||||||
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
||||||
golang.org/x/net v0.0.0-20220225172249-27dd8689420f h1:oA4XRj0qtSt8Yo1Zms0CUlsT3KG69V2UGQWPBxujDmc=
|
|
||||||
golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
||||||
|
golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
||||||
|
golang.org/x/net v0.0.0-20220722155237-a158d28d115b h1:PxfKdU9lEEDYjdIzOtC4qFWgkU2rGHdKlKowJSMN9h0=
|
||||||
|
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
golang.org/x/oauth2 v0.0.0-20190130055435-99b60b757ec1/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20190130055435-99b60b757ec1/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
@ -1336,10 +1378,11 @@ golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ
|
|||||||
golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||||
golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||||
golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||||
golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
|
||||||
golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
|
||||||
golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||||
|
golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||||
|
golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||||
golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||||
|
golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||||
golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 h1:RerP+noqYHUQ8CMRcPlC2nvTa4dcBIjegkuWdcUDuqg=
|
golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 h1:RerP+noqYHUQ8CMRcPlC2nvTa4dcBIjegkuWdcUDuqg=
|
||||||
golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
@ -1353,6 +1396,7 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ
|
|||||||
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20180903190138-2b024373dcd9/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180903190138-2b024373dcd9/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
@ -1408,7 +1452,6 @@ golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||||||
golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
@ -1431,24 +1474,32 @@ golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||||||
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20211029165221-6e7872819dc8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20211029165221-6e7872819dc8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8 h1:OH54vjqzRWmbJ62fjuhxy7AxFFgoHN0/DPc/UrL8cAs=
|
|
||||||
golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f h1:v4INt8xihDGvnrfjMDVXGxw9wrfxYyCjk0KbXjhR55s=
|
||||||
|
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||||
@ -1541,9 +1592,13 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f
|
|||||||
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
|
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
|
||||||
golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||||
golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||||
|
golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||||
|
golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||||
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||||
golang.org/x/tools v0.1.6-0.20210820212750-d4cc65f0b2ff/go.mod h1:YD9qOF0M9xpSpdWTBbzEl5e/RnCefISl8E5Noe10jFM=
|
golang.org/x/tools v0.1.6-0.20210820212750-d4cc65f0b2ff/go.mod h1:YD9qOF0M9xpSpdWTBbzEl5e/RnCefISl8E5Noe10jFM=
|
||||||
golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E=
|
golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E=
|
||||||
|
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||||
|
golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
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-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-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
@ -1581,8 +1636,15 @@ google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34q
|
|||||||
google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8=
|
google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8=
|
||||||
google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU=
|
google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU=
|
||||||
google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94=
|
google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94=
|
||||||
google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8=
|
google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo=
|
||||||
google.golang.org/api v0.46.0/go.mod h1:ceL4oozhkAiTID8XMmJBsIxID/9wMXJVVFXPg4ylg3I=
|
google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4=
|
||||||
|
google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw=
|
||||||
|
google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU=
|
||||||
|
google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k=
|
||||||
|
google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE=
|
||||||
|
google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE=
|
||||||
|
google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI=
|
||||||
|
google.golang.org/api v0.60.0/go.mod h1:d7rl65NZAkEQ90JFzqBjcRq1TVeG5ZoGV3sSpEnnVb4=
|
||||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||||
google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||||
@ -1632,21 +1694,36 @@ google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6D
|
|||||||
google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
google.golang.org/genproto v0.0.0-20201102152239-715cce707fb0/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
|
||||||
google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
|
google.golang.org/genproto v0.0.0-20210224155714-063164c882e6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
|
google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
|
||||||
google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=
|
google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=
|
||||||
google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
|
google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
|
||||||
|
google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
|
||||||
|
google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
|
||||||
|
google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24=
|
||||||
|
google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k=
|
||||||
|
google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k=
|
||||||
|
google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48=
|
||||||
|
google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48=
|
||||||
|
google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w=
|
||||||
|
google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
|
||||||
|
google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
|
||||||
google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
|
google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
|
||||||
google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368 h1:Et6SkiuvnBn+SgrSYXs/BrUpGB4mbdwt4R3vaPIlicA=
|
google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
|
||||||
google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
|
||||||
|
google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
||||||
|
google.golang.org/genproto v0.0.0-20211021150943-2b146023228c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
||||||
|
google.golang.org/genproto v0.0.0-20220208230804-65c12eb4c068/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
|
||||||
|
google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21 h1:hrbNEivu7Zn1pxvHk6MBrq9iE22woVILTHqexqBxe6I=
|
||||||
|
google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
|
||||||
google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
|
google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
|
||||||
google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
|
google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
|
||||||
google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio=
|
google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio=
|
||||||
@ -1675,11 +1752,18 @@ google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG
|
|||||||
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
|
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
|
||||||
google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
|
google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
|
||||||
google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
|
google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
|
||||||
|
google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
|
||||||
google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
|
google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
|
||||||
|
google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=
|
||||||
|
google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=
|
||||||
google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
|
google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
|
||||||
google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k=
|
google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k=
|
||||||
|
google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
|
||||||
|
google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
|
||||||
|
google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
|
||||||
google.golang.org/grpc v1.48.0 h1:rQOsyJ/8+ufEDJd/Gdsz7HG220Mh9HAhFHRGnIjda0w=
|
google.golang.org/grpc v1.48.0 h1:rQOsyJ/8+ufEDJd/Gdsz7HG220Mh9HAhFHRGnIjda0w=
|
||||||
google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
|
google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
|
||||||
|
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
|
||||||
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
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.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.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||||
@ -1708,7 +1792,6 @@ gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
|
|||||||
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
|
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
|
||||||
gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
||||||
gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
||||||
gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
|
||||||
gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4=
|
gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4=
|
||||||
gopkg.in/ldap.v3 v3.0.3/go.mod h1:oxD7NyBuxchC+SgJDE1Q5Od05eGt29SDQVBmV+HYbzw=
|
gopkg.in/ldap.v3 v3.0.3/go.mod h1:oxD7NyBuxchC+SgJDE1Q5Od05eGt29SDQVBmV+HYbzw=
|
||||||
gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
|
gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
|
||||||
@ -1752,29 +1835,28 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh
|
|||||||
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
|
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
|
||||||
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
||||||
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
||||||
k8s.io/api v0.24.3 h1:tt55QEmKd6L2k5DP6G/ZzdMQKvG5ro4H4teClqm0sTY=
|
k8s.io/api v0.25.0 h1:H+Q4ma2U/ww0iGB78ijZx6DRByPz6/733jIuFpX70e0=
|
||||||
k8s.io/api v0.24.3/go.mod h1:elGR/XSZrS7z7cSZPzVWaycpJuGIw57j9b95/1PdJNI=
|
k8s.io/api v0.25.0/go.mod h1:ttceV1GyV1i1rnmvzT3BST08N6nGt+dudGrquzVQWPk=
|
||||||
k8s.io/apiextensions-apiserver v0.24.3 h1:kyx+Tmro1qEsTUr07ZGQOfvTsF61yn+AxnxytBWq8As=
|
k8s.io/apiextensions-apiserver v0.25.0 h1:CJ9zlyXAbq0FIW8CD7HHyozCMBpDSiH7EdrSTCZcZFY=
|
||||||
k8s.io/apiextensions-apiserver v0.24.3/go.mod h1:cL0xkmUefpYM4f6IuOau+6NMFEIh6/7wXe/O4vPVJ8A=
|
k8s.io/apiextensions-apiserver v0.25.0/go.mod h1:3pAjZiN4zw7R8aZC5gR0y3/vCkGlAjCazcg1me8iB/E=
|
||||||
k8s.io/apimachinery v0.24.3 h1:hrFiNSA2cBZqllakVYyH/VyEh4B581bQRmqATJSeQTg=
|
k8s.io/apimachinery v0.25.0 h1:MlP0r6+3XbkUG2itd6vp3oxbtdQLQI94fD5gCS+gnoU=
|
||||||
k8s.io/apimachinery v0.24.3/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM=
|
k8s.io/apimachinery v0.25.0/go.mod h1:qMx9eAk0sZQGsXGu86fab8tZdffHbwUfsvzqKn4mfB0=
|
||||||
k8s.io/apiserver v0.24.3 h1:J8CKjUaZopT0hSgxjzUyp3T1GK78iixxOuFpEC0MI3k=
|
k8s.io/apiserver v0.25.0 h1:8kl2ifbNffD440MyvHtPaIz1mw4mGKVgWqM0nL+oyu4=
|
||||||
k8s.io/apiserver v0.24.3/go.mod h1:aXfwtIn4U27B7lYs5f2BKgz6DRbgWy+HJeYReN1jLJ8=
|
k8s.io/apiserver v0.25.0/go.mod h1:BKwsE+PTC+aZK+6OJQDPr0v6uS91/HWxX7evElAH6xo=
|
||||||
k8s.io/cli-runtime v0.24.3/go.mod h1:In84wauoMOqa7JDvDSXGbf8lTNlr70fOGpYlYfJtSqA=
|
k8s.io/cli-runtime v0.25.0/go.mod h1:bHOI5ZZInRHhbq12OdUiYZQN8ml8aKZLwQgt9QlLINw=
|
||||||
k8s.io/client-go v0.24.3 h1:Nl1840+6p4JqkFWEW2LnMKU667BUxw03REfLAVhuKQY=
|
k8s.io/client-go v0.25.0 h1:CVWIaCETLMBNiTUta3d5nzRbXvY5Hy9Dpl+VvREpu5E=
|
||||||
k8s.io/client-go v0.24.3/go.mod h1:AAovolf5Z9bY1wIg2FZ8LPQlEdKHjLI7ZD4rw920BJw=
|
k8s.io/client-go v0.25.0/go.mod h1:lxykvypVfKilxhTklov0wz1FoaUZ8X4EwbhS6rpRfN8=
|
||||||
k8s.io/cloud-provider v0.24.3 h1:Z4O3AiuFxGRPn1ilzaeWS2uBnW8LsH5MbniCTf1xAgs=
|
k8s.io/cloud-provider v0.25.0 h1:ONX5BON6f1Mxa2GWvPyKn+QsZXaLauPUte7MZxfWUro=
|
||||||
k8s.io/cloud-provider v0.24.3/go.mod h1:CRIMwnR4e6FpGO5g81nofNuKGQcpJx8El2JEU+BsH9M=
|
k8s.io/cloud-provider v0.25.0/go.mod h1:afVfVCIYOUER914WmSp0QpAtJn12gv4qu9NMT4XBxZo=
|
||||||
k8s.io/cluster-bootstrap v0.24.3/go.mod h1:plud10KCFfNjsf2FNalENFGvJWVtcKa0KbKie5wQAvA=
|
k8s.io/cluster-bootstrap v0.25.0/go.mod h1:x/TCtY3EiuR/rODkA3SvVQT3uSssQLf9cXcmSjdDTe0=
|
||||||
k8s.io/code-generator v0.24.3/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w=
|
k8s.io/code-generator v0.25.0/go.mod h1:B6jZgI3DvDFAualltPitbYMQ74NjaCFxum3YeKZZ+3w=
|
||||||
k8s.io/component-base v0.24.3 h1:u99WjuHYCRJjS1xeLOx72DdRaghuDnuMgueiGMFy1ec=
|
k8s.io/component-base v0.25.0 h1:haVKlLkPCFZhkcqB6WCvpVxftrg6+FK5x1ZuaIDaQ5Y=
|
||||||
k8s.io/component-base v0.24.3/go.mod h1:bqom2IWN9Lj+vwAkPNOv2TflsP1PeVDIwIN0lRthxYY=
|
k8s.io/component-base v0.25.0/go.mod h1:F2Sumv9CnbBlqrpdf7rKZTmmd2meJq0HizeyY/yAFxk=
|
||||||
k8s.io/component-helpers v0.24.3 h1:HKZTNf77K96StY2+FAgKvsXvHwoLvexeGDJatyuWlyI=
|
k8s.io/component-helpers v0.25.0 h1:vNzYfqnVXj7f+CPksduKVv2Z9kC+IDsOs9yaOyxZrj0=
|
||||||
k8s.io/component-helpers v0.24.3/go.mod h1:/1WNW8TfBOijQ1ED2uCHb4wtXYWDVNMqUll8h36iNVo=
|
k8s.io/component-helpers v0.25.0/go.mod h1:auaFj2bvb5Zmy0mLk4WJNmwP0w4e7Zk+/Tu9FFBGA20=
|
||||||
k8s.io/controller-manager v0.24.3/go.mod h1:qU/ZC8qmKxiVlRwLUfqXAzgsBi3q44E8Xn8qHs/MiVY=
|
k8s.io/controller-manager v0.25.0/go.mod h1:QElCivPrZ64NP1Y976pkgyViZUqn6UcvjlXHiAAUGd0=
|
||||||
k8s.io/cri-api v0.24.3/go.mod h1:t3tImFtGeStN+ES69bQUX9sFg67ek38BM9YIJhMmuig=
|
k8s.io/cri-api v0.25.0/go.mod h1:J1rAyQkSJ2Q6I+aBMOVgg2/cbbebso6FNa0UagiR0kc=
|
||||||
k8s.io/csi-translation-lib v0.24.3/go.mod h1:PfajTaauPYSL4hWKDRBVbUfO611Uv+h3w1YA9Twmzjk=
|
k8s.io/csi-translation-lib v0.25.0/go.mod h1:Wb80CDywP4753F6wWkIyOuJIQtQAbhgw985veSgAn/4=
|
||||||
k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
|
|
||||||
k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
|
k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
|
||||||
k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
|
k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
|
||||||
k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
|
k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
|
||||||
@ -1785,31 +1867,30 @@ k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
|
|||||||
k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
|
k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
|
||||||
k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec=
|
k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec=
|
||||||
k8s.io/klog/v2 v2.30.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
|
k8s.io/klog/v2 v2.30.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
|
||||||
k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
|
|
||||||
k8s.io/klog/v2 v2.70.1 h1:7aaoSdahviPmR+XkS7FyxlkkXs6tHISSG03RxleQAVQ=
|
k8s.io/klog/v2 v2.70.1 h1:7aaoSdahviPmR+XkS7FyxlkkXs6tHISSG03RxleQAVQ=
|
||||||
k8s.io/klog/v2 v2.70.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
|
k8s.io/klog/v2 v2.70.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
|
||||||
k8s.io/kube-aggregator v0.24.3/go.mod h1:oMjdwraZtb0CtIxrzrAt/4GJxbivAM8AesZhYVmXZ54=
|
k8s.io/kube-aggregator v0.25.0/go.mod h1:dfdl4aQkleiWK/U++UDLdDC8g2rsonhkB23zzUeBCgM=
|
||||||
k8s.io/kube-controller-manager v0.24.3/go.mod h1:c7YN1XesvesxKM5uO5JqmcecnUsitFos1sIyt0eOprE=
|
k8s.io/kube-controller-manager v0.25.0/go.mod h1:SjL1hKSG2z9wajnvjRHZv1zOsdDHjmbZd1ykmaYO6J8=
|
||||||
k8s.io/kube-openapi v0.0.0-20180731170545-e3762e86a74c/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc=
|
k8s.io/kube-openapi v0.0.0-20180731170545-e3762e86a74c/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc=
|
||||||
k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw=
|
|
||||||
k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk=
|
k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk=
|
||||||
k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42 h1:Gii5eqf+GmIEwGNKQYQClCayuJCe2/4fZUvF7VG99sU=
|
k8s.io/kube-openapi v0.0.0-20220401212409-b28bf2818661/go.mod h1:daOouuuwd9JXpv1L7Y34iV3yf6nxzipkKMWWlqlvK9M=
|
||||||
k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk=
|
k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1 h1:MQ8BAZPZlWk3S9K4a9NCkIFQtZShWqoha7snGixVgEA=
|
||||||
k8s.io/kube-proxy v0.24.3/go.mod h1:zJ+koqfBkRUAzUfXlBtFfyfH3InqM38t5ELGlTlPwO0=
|
k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1/go.mod h1:C/N6wCaBHeBHkHUesQOQy2/MZqGgMAFPqGsGQLdbZBU=
|
||||||
k8s.io/kube-scheduler v0.24.3/go.mod h1:myFLGrPy8rcwPz6qg9L3rMRDT2eNIpizq+MXOzMjX/8=
|
k8s.io/kube-proxy v0.25.0/go.mod h1:uHv1HwMVDYgl1pU2PTDKLRlxtNOf4z2M5YPYC6NP1CU=
|
||||||
k8s.io/kubectl v0.24.3 h1:PqY8ho/S/KuE2/hCC3Iee7X+lOtARYo0LQsNzvV/edE=
|
k8s.io/kube-scheduler v0.25.0/go.mod h1:cwiyJeImgFbhmbnImzvuhbiJayNngRNEe3FJkZDPw9Y=
|
||||||
k8s.io/kubectl v0.24.3/go.mod h1:PYLcvw96sC1NLbxZEDbdlOEd6/C76VIWjGmWV5QjSk0=
|
k8s.io/kubectl v0.25.0 h1:/Wn1cFqo8ik3iee1EvpxYre3bkWsGLXzLQI6uCCAkQc=
|
||||||
k8s.io/kubelet v0.24.3 h1:6fqhHuUWkMpsGulIticCLUlDIhc30sypVVJjGVVKYzw=
|
k8s.io/kubectl v0.25.0/go.mod h1:n16ULWsOl2jmQpzt2o7Dud1t4o0+Y186ICb4O+GwKAU=
|
||||||
k8s.io/kubelet v0.24.3/go.mod h1:vIdQ8bybBvLeMysTyj37QZNKNnCGVfWqpbsLaMT7wTE=
|
k8s.io/kubelet v0.25.0 h1:eTS5B1u1o63ndExAHKLJytzz/GBy86ROcxYtu0VK3RA=
|
||||||
k8s.io/kubernetes v1.24.3 h1:RVuivOFTujzUDYZV8UFXCeD05US8DowBbxV+97JWEFg=
|
k8s.io/kubelet v0.25.0/go.mod h1:J6aQxrZdSsGPrskYrhZdEn6PCnGha+GNvF0g9aWfQnw=
|
||||||
k8s.io/kubernetes v1.24.3/go.mod h1:8e8maMiZzBR2/8Po5Uulx+MXZUYJuN3vtKwD4Ct1Xi0=
|
k8s.io/kubernetes v1.25.0 h1:NwTRyLrdXTORd5V7DLlUltxDbl/KZjYDiRgwI+pBYGE=
|
||||||
k8s.io/legacy-cloud-providers v0.24.3/go.mod h1:G548jzl58czqsrebwY1XXFKEkCEcJhX8tnPUCFv/uMo=
|
k8s.io/kubernetes v1.25.0/go.mod h1:UdtILd5Zg1vGZvShiO1EYOqmjzM2kZOG1hzwQnM5JxY=
|
||||||
k8s.io/metrics v0.24.3/go.mod h1:p1M0lhMySWfhISkSd3HEj8xIgrVnJTK3PPhFq2rA3To=
|
k8s.io/legacy-cloud-providers v0.25.0/go.mod h1:bnmUgHHeBmK3M9JgQzu+ne6UCUVURDzkpF0Y7VeypVE=
|
||||||
|
k8s.io/metrics v0.25.0/go.mod h1:HZZrbhuRX+fsDcRc3u59o2FbrKhqD67IGnoFECNmovc=
|
||||||
k8s.io/mount-utils v0.25.0-alpha.3.0.20220801203918-ff562e546084 h1:MBVsRiLUuVn8PX7je4jjBfHfRs65QwEtgM//Te1mFpQ=
|
k8s.io/mount-utils v0.25.0-alpha.3.0.20220801203918-ff562e546084 h1:MBVsRiLUuVn8PX7je4jjBfHfRs65QwEtgM//Te1mFpQ=
|
||||||
k8s.io/mount-utils v0.25.0-alpha.3.0.20220801203918-ff562e546084/go.mod h1:dHX0bJ3b1Mvh/OHsBV9r559Mdrf5Lcjxyoc7FHUtnBg=
|
k8s.io/mount-utils v0.25.0-alpha.3.0.20220801203918-ff562e546084/go.mod h1:dHX0bJ3b1Mvh/OHsBV9r559Mdrf5Lcjxyoc7FHUtnBg=
|
||||||
k8s.io/pod-security-admission v0.24.3 h1:Uy9jh3rp0T6WK68WSgnGhBoSLQUOB//G09TYTeJtAfo=
|
k8s.io/pod-security-admission v0.25.0 h1:Sceq45pO7E7RTaYAr3Br94ZMDISJIngvXXcAfcZJufk=
|
||||||
k8s.io/pod-security-admission v0.24.3/go.mod h1:l862a6t98GO7IIIGIe/lh01TTq9fWu6ylTb7CLDrXkY=
|
k8s.io/pod-security-admission v0.25.0/go.mod h1:b/UC586Th2LijoNV+ssyyAryUvmaTrEWms5ZzBEkVsA=
|
||||||
k8s.io/sample-apiserver v0.24.3/go.mod h1:ZDr71tBj39HgTEFPugVn5v32aZ5z7XCu2kLWoygiBp0=
|
k8s.io/sample-apiserver v0.25.0/go.mod h1:Wyy/yKmXCrWLcc+082Vsn6fxAuwraRw5FQpekHg3go8=
|
||||||
k8s.io/system-validators v1.7.0/go.mod h1:gP1Ky+R9wtrSiFbrpEPwWMeYz9yqyy1S/KOh0Vci7WI=
|
k8s.io/system-validators v1.7.0/go.mod h1:gP1Ky+R9wtrSiFbrpEPwWMeYz9yqyy1S/KOh0Vci7WI=
|
||||||
k8s.io/utils v0.0.0-20190506122338-8fab8cb257d5/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew=
|
k8s.io/utils v0.0.0-20190506122338-8fab8cb257d5/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew=
|
||||||
k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
|
k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
|
||||||
@ -1827,23 +1908,23 @@ 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/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
|
||||||
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
|
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
|
||||||
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
|
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
|
||||||
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30 h1:dUk62HQ3ZFhD48Qr8MIXCiKA8wInBQCtuE4QGfFW7yA=
|
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.32 h1:2WjukG7txtEsbXsSKWtTibCdsyYAhcu6KFnttyDdZOQ=
|
||||||
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw=
|
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.32/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw=
|
||||||
sigs.k8s.io/controller-runtime v0.2.2/go.mod h1:9dyohw3ZtoXQuV1e766PHUn+cmrRCIcBh6XIMFNMZ+I=
|
sigs.k8s.io/controller-runtime v0.2.2/go.mod h1:9dyohw3ZtoXQuV1e766PHUn+cmrRCIcBh6XIMFNMZ+I=
|
||||||
sigs.k8s.io/controller-runtime v0.11.0-beta.0.0.20211208212546-f236f0345ad2 h1:+ReKrjTrd57mtAU19BJkxSAaWRIQkFlaWcO6dGFVP1g=
|
sigs.k8s.io/controller-runtime v0.11.0-beta.0.0.20211208212546-f236f0345ad2 h1:+ReKrjTrd57mtAU19BJkxSAaWRIQkFlaWcO6dGFVP1g=
|
||||||
sigs.k8s.io/controller-runtime v0.11.0-beta.0.0.20211208212546-f236f0345ad2/go.mod h1:KKwLiTooNGu+JmLZGn9Sl3Gjmfj66eMbCQznLP5zcqA=
|
sigs.k8s.io/controller-runtime v0.11.0-beta.0.0.20211208212546-f236f0345ad2/go.mod h1:KKwLiTooNGu+JmLZGn9Sl3Gjmfj66eMbCQznLP5zcqA=
|
||||||
sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6/go.mod h1:p4QtZmO4uMYipTQNzagwnNoseA6OxSUutVw05NhYDRs=
|
sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6/go.mod h1:p4QtZmO4uMYipTQNzagwnNoseA6OxSUutVw05NhYDRs=
|
||||||
sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y=
|
sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k=
|
||||||
sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY=
|
sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
|
||||||
sigs.k8s.io/kustomize/api v0.11.4/go.mod h1:k+8RsqYbgpkIrJ4p9jcdPqe8DprLxFUUO0yNOq8C+xI=
|
sigs.k8s.io/kustomize/api v0.12.1/go.mod h1:y3JUhimkZkR6sbLNwfJHxvo1TCLwuwm14sCYnkH6S1s=
|
||||||
sigs.k8s.io/kustomize/cmd/config v0.10.6/go.mod h1:/S4A4nUANUa4bZJ/Edt7ZQTyKOY9WCER0uBS1SW2Rco=
|
sigs.k8s.io/kustomize/cmd/config v0.10.9/go.mod h1:T0s850zPV3wKfBALA0dyeP/K74jlJcoP8Pr9ZWwE3MQ=
|
||||||
sigs.k8s.io/kustomize/kustomize/v4 v4.5.4/go.mod h1:Zo/Xc5FKD6sHl0lilbrieeGeZHVYCA4BzxeAaLI05Bg=
|
sigs.k8s.io/kustomize/kustomize/v4 v4.5.7/go.mod h1:VSNKEH9D9d9bLiWEGbS6Xbg/Ih0tgQalmPvntzRxZ/Q=
|
||||||
sigs.k8s.io/kustomize/kyaml v0.13.6/go.mod h1:yHP031rn1QX1lr/Xd934Ri/xdVNG8BE2ECa78Ht/kEg=
|
sigs.k8s.io/kustomize/kyaml v0.13.9/go.mod h1:QsRbD0/KcU+wdk0/L0fIp2KLnohkVzs6fQ85/nOXac4=
|
||||||
sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
|
sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
|
||||||
sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4=
|
sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4=
|
||||||
sigs.k8s.io/structured-merge-diff/v4 v4.2.0/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4=
|
sigs.k8s.io/structured-merge-diff/v4 v4.2.0/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4=
|
||||||
sigs.k8s.io/structured-merge-diff/v4 v4.2.1 h1:bKCqE9GvQ5tiVHn5rfn1r+yao3aLQEaLzkkmAkf+A6Y=
|
sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE=
|
||||||
sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4=
|
sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E=
|
||||||
sigs.k8s.io/testing_frameworks v0.1.1/go.mod h1:VVBKrHmJ6Ekkfz284YKhQePcdycOzNH9qL6ht1zEr/U=
|
sigs.k8s.io/testing_frameworks v0.1.1/go.mod h1:VVBKrHmJ6Ekkfz284YKhQePcdycOzNH9qL6ht1zEr/U=
|
||||||
sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
|
sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
|
||||||
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
|
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
|
||||||
|
@ -90,6 +90,12 @@ func (is *IdentityServer) GetCapabilities(
|
|||||||
Type: identity.Capability_NetworkFence_NETWORK_FENCE,
|
Type: identity.Capability_NetworkFence_NETWORK_FENCE,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
}, &identity.Capability{
|
||||||
|
Type: &identity.Capability_VolumeReplication_{
|
||||||
|
VolumeReplication: &identity.Capability_VolumeReplication{
|
||||||
|
Type: identity.Capability_VolumeReplication_VOLUME_REPLICATION,
|
||||||
|
},
|
||||||
|
},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -29,6 +29,7 @@ import (
|
|||||||
|
|
||||||
// DefaultNodeServer stores driver object.
|
// DefaultNodeServer stores driver object.
|
||||||
type DefaultNodeServer struct {
|
type DefaultNodeServer struct {
|
||||||
|
csi.UnimplementedNodeServer
|
||||||
Driver *CSIDriver
|
Driver *CSIDriver
|
||||||
Type string
|
Type string
|
||||||
Mounter mount.Interface
|
Mounter mount.Interface
|
||||||
|
@ -193,12 +193,18 @@ func logGRPC(
|
|||||||
handler grpc.UnaryHandler,
|
handler grpc.UnaryHandler,
|
||||||
) (interface{}, error) {
|
) (interface{}, error) {
|
||||||
log.ExtendedLog(ctx, "GRPC call: %s", info.FullMethod)
|
log.ExtendedLog(ctx, "GRPC call: %s", info.FullMethod)
|
||||||
|
// TODO: remove the following check for next release
|
||||||
|
// refer to https://github.com/ceph/ceph-csi/issues/3314.
|
||||||
if isReplicationRequest(req) {
|
if isReplicationRequest(req) {
|
||||||
log.TraceLog(ctx, "GRPC request: %s", rp.StripReplicationSecrets(req))
|
strippedMessage := protosanitizer.StripSecrets(req).String()
|
||||||
|
if !strings.Contains(strippedMessage, "***stripped***") {
|
||||||
|
strippedMessage = rp.StripReplicationSecrets(req).String()
|
||||||
|
}
|
||||||
|
|
||||||
|
log.TraceLog(ctx, "GRPC request: %s", strippedMessage)
|
||||||
} else {
|
} else {
|
||||||
log.TraceLog(ctx, "GRPC request: %s", protosanitizer.StripSecrets(req))
|
log.TraceLog(ctx, "GRPC request: %s", protosanitizer.StripSecrets(req))
|
||||||
}
|
}
|
||||||
|
|
||||||
resp, err := handler(ctx, req)
|
resp, err := handler(ctx, req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
klog.Errorf(log.Log(ctx, "GRPC error: %v"), err)
|
klog.Errorf(log.Log(ctx, "GRPC error: %v"), err)
|
||||||
|
@ -27,7 +27,7 @@ import (
|
|||||||
"github.com/ceph/ceph-csi/internal/util"
|
"github.com/ceph/ceph-csi/internal/util"
|
||||||
"github.com/ceph/ceph-csi/internal/util/log"
|
"github.com/ceph/ceph-csi/internal/util/log"
|
||||||
|
|
||||||
"github.com/pborman/uuid"
|
"github.com/google/uuid"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Length of string representation of uuid, xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx is 36 bytes.
|
// Length of string representation of uuid, xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx is 36 bytes.
|
||||||
@ -431,8 +431,8 @@ func (conn *Connection) UndoReservation(ctx context.Context,
|
|||||||
}
|
}
|
||||||
|
|
||||||
imageUUID := volName[len(volName)-36:]
|
imageUUID := volName[len(volName)-36:]
|
||||||
if valid := uuid.Parse(imageUUID); valid == nil {
|
if _, err := uuid.Parse(imageUUID); err != nil {
|
||||||
return fmt.Errorf("failed parsing UUID in %s", volName)
|
return fmt.Errorf("failed parsing UUID in %s: %w", volName, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err := util.RemoveObject(
|
err := util.RemoveObject(
|
||||||
@ -484,7 +484,7 @@ func reserveOMapName(
|
|||||||
iterUUID = volUUID
|
iterUUID = volUUID
|
||||||
} else {
|
} else {
|
||||||
// generate a uuid for the image name
|
// generate a uuid for the image name
|
||||||
iterUUID = uuid.NewUUID().String()
|
iterUUID = uuid.New().String()
|
||||||
}
|
}
|
||||||
|
|
||||||
err := util.CreateObject(ctx, monitors, cr, pool, namespace, oMapNamePrefix+iterUUID)
|
err := util.CreateObject(ctx, monitors, cr, pool, namespace, oMapNamePrefix+iterUUID)
|
||||||
|
530
internal/kms/kmip.go
Normal file
530
internal/kms/kmip.go
Normal file
@ -0,0 +1,530 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2022 The Ceph-CSI Authors.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package kms
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"bytes"
|
||||||
|
"context"
|
||||||
|
"crypto/tls"
|
||||||
|
"crypto/x509"
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/ceph/ceph-csi/internal/util/k8s"
|
||||||
|
|
||||||
|
kmip "github.com/gemalto/kmip-go"
|
||||||
|
"github.com/gemalto/kmip-go/kmip14"
|
||||||
|
"github.com/gemalto/kmip-go/ttlv"
|
||||||
|
"github.com/google/uuid"
|
||||||
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
kmsTypeKMIP = "kmip"
|
||||||
|
|
||||||
|
// kmipDefaulfReadTimeout is the default read network timeout.
|
||||||
|
kmipDefaulfReadTimeout = 10
|
||||||
|
|
||||||
|
// kmipDefaultWriteTimeout is the default write network timeout.
|
||||||
|
kmipDefaultWriteTimeout = 10
|
||||||
|
|
||||||
|
// KMIP version.
|
||||||
|
protocolMajor = 1
|
||||||
|
protocolMinor = 4
|
||||||
|
|
||||||
|
// nonceSize is required to generate nonce for encrypting DEK.
|
||||||
|
nonceSize = 16
|
||||||
|
|
||||||
|
// kmipDefaultSecretsName is the default name of the Kubernetes Secret
|
||||||
|
// that contains the credentials to access the KMIP server. The name of
|
||||||
|
// the Secret can be configured by setting the `KMIP_SECRET_NAME`
|
||||||
|
// option.
|
||||||
|
//
|
||||||
|
// #nosec:G101, value not credential, just references token.
|
||||||
|
kmipDefaultSecretsName = "ceph-csi-kmip-credentials"
|
||||||
|
|
||||||
|
kmipEndpoint = "KMIP_ENDPOINT"
|
||||||
|
kmipTLSServerName = "TLS_SERVER_NAME"
|
||||||
|
kmipReadTimeOut = "READ_TIMEOUT"
|
||||||
|
kmipWriteTimeOut = "WRITE_TIMEOUT"
|
||||||
|
|
||||||
|
// The following options are part of the Kubernetes Secrets.
|
||||||
|
//
|
||||||
|
// #nosec:G101, value not credential, just configuration keys.
|
||||||
|
kmipSecretNameKey = "KMIP_SECRET_NAME"
|
||||||
|
kmipCACert = "CA_CERT"
|
||||||
|
kmipCLientCert = "CLIENT_CERT"
|
||||||
|
kmipClientKey = "CLIENT_KEY"
|
||||||
|
kmipUniqueIdentifier = "UNIQUE_IDENTIFIER"
|
||||||
|
)
|
||||||
|
|
||||||
|
var _ = RegisterProvider(Provider{
|
||||||
|
UniqueID: kmsTypeKMIP,
|
||||||
|
Initializer: initKMIPKMS,
|
||||||
|
})
|
||||||
|
|
||||||
|
type kmipKMS struct {
|
||||||
|
// basic options to get the secret
|
||||||
|
secretName string
|
||||||
|
namespace string
|
||||||
|
|
||||||
|
// standard KMIP configuration options
|
||||||
|
endpoint string
|
||||||
|
tlsConfig *tls.Config
|
||||||
|
uniqueIdentifier string
|
||||||
|
readTimeout uint8
|
||||||
|
writeTimeout uint8
|
||||||
|
}
|
||||||
|
|
||||||
|
func initKMIPKMS(args ProviderInitArgs) (EncryptionKMS, error) {
|
||||||
|
kms := &kmipKMS{
|
||||||
|
namespace: args.Namespace,
|
||||||
|
}
|
||||||
|
|
||||||
|
// get secret name if set, else use default.
|
||||||
|
err := setConfigString(&kms.secretName, args.Config, kmipSecretNameKey)
|
||||||
|
if errors.Is(err, errConfigOptionInvalid) {
|
||||||
|
return nil, err
|
||||||
|
} else if errors.Is(err, errConfigOptionMissing) {
|
||||||
|
kms.secretName = kmipDefaultSecretsName
|
||||||
|
}
|
||||||
|
|
||||||
|
err = setConfigString(&kms.endpoint, args.Config, kmipEndpoint)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// optional
|
||||||
|
serverName := ""
|
||||||
|
err = setConfigString(&serverName, args.Config, kmipTLSServerName)
|
||||||
|
if errors.Is(err, errConfigOptionInvalid) {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// optional
|
||||||
|
timeout := kmipDefaulfReadTimeout
|
||||||
|
err = setConfigInt(&timeout, args.Config, kmipReadTimeOut)
|
||||||
|
if errors.Is(err, errConfigOptionInvalid) {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
kms.readTimeout = uint8(timeout)
|
||||||
|
|
||||||
|
// optional
|
||||||
|
timeout = kmipDefaultWriteTimeout
|
||||||
|
err = setConfigInt(&timeout, args.Config, kmipWriteTimeOut)
|
||||||
|
if errors.Is(err, errConfigOptionInvalid) {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
kms.writeTimeout = uint8(timeout)
|
||||||
|
|
||||||
|
// read the Kubernetes Secret with CA cert, client cert, client key
|
||||||
|
// & key unique identifier.
|
||||||
|
secrets, err := kms.getSecrets()
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to get secrets: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
caCert, found := secrets[kmipCACert]
|
||||||
|
if !found {
|
||||||
|
return nil, fmt.Errorf("%w: %s", errConfigOptionMissing, kmipCACert)
|
||||||
|
}
|
||||||
|
|
||||||
|
clientCert, found := secrets[kmipCLientCert]
|
||||||
|
if !found {
|
||||||
|
return nil, fmt.Errorf("%w: %s", errConfigOptionMissing, kmipCLientCert)
|
||||||
|
}
|
||||||
|
|
||||||
|
clientKey, found := secrets[kmipClientKey]
|
||||||
|
if !found {
|
||||||
|
return nil, fmt.Errorf("%w: %s", errConfigOptionMissing, kmipCLientCert)
|
||||||
|
}
|
||||||
|
|
||||||
|
kms.uniqueIdentifier, found = secrets[kmipUniqueIdentifier]
|
||||||
|
if !found {
|
||||||
|
return nil, fmt.Errorf("%w: %s", errConfigOptionMissing, kmipUniqueIdentifier)
|
||||||
|
}
|
||||||
|
|
||||||
|
caCertPool := x509.NewCertPool()
|
||||||
|
caCertPool.AppendCertsFromPEM([]byte(caCert))
|
||||||
|
cert, err := tls.X509KeyPair([]byte(clientCert), []byte(clientKey))
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("invalid X509 key pair: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
kms.tlsConfig = &tls.Config{
|
||||||
|
MinVersion: tls.VersionTLS12,
|
||||||
|
ServerName: serverName,
|
||||||
|
RootCAs: caCertPool,
|
||||||
|
Certificates: []tls.Certificate{cert},
|
||||||
|
}
|
||||||
|
|
||||||
|
return kms, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// EncryptDEK uses the KMIP encrypt operation to encrypt the DEK.
|
||||||
|
func (kms *kmipKMS) EncryptDEK(_, plainDEK string) (string, error) {
|
||||||
|
conn, err := kms.connect()
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
defer conn.Close()
|
||||||
|
|
||||||
|
emd := encryptedMetedataDEK{}
|
||||||
|
emd.Nonce, err = generateNonce(nonceSize)
|
||||||
|
if err != nil {
|
||||||
|
return "", fmt.Errorf("failed to generated nonce: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
respMsg, decoder, uniqueBatchItemID, err := kms.send(conn,
|
||||||
|
kmip14.OperationEncrypt,
|
||||||
|
EncryptRequestPayload{
|
||||||
|
UniqueIdentifier: kms.uniqueIdentifier,
|
||||||
|
Data: []byte(plainDEK),
|
||||||
|
CryptographicParameters: kmip.CryptographicParameters{
|
||||||
|
PaddingMethod: kmip14.PaddingMethodPKCS5,
|
||||||
|
CryptographicAlgorithm: kmip14.CryptographicAlgorithmAES,
|
||||||
|
BlockCipherMode: kmip14.BlockCipherModeCBC,
|
||||||
|
},
|
||||||
|
IVCounterNonce: emd.Nonce,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
batchItem, err := kms.verifyResponse(respMsg, kmip14.OperationEncrypt, uniqueBatchItemID)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
ttlvPayload, ok := batchItem.ResponsePayload.(ttlv.TTLV)
|
||||||
|
if !ok {
|
||||||
|
return "", errors.New("failed to parse responsePayload")
|
||||||
|
}
|
||||||
|
|
||||||
|
var encryptRespPayload EncryptResponsePayload
|
||||||
|
err = decoder.DecodeValue(&encryptRespPayload, ttlvPayload)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
emd.DEK = encryptRespPayload.Data
|
||||||
|
emdData, err := json.Marshal(&emd)
|
||||||
|
if err != nil {
|
||||||
|
return "", fmt.Errorf("failed to convert "+
|
||||||
|
"encryptedMetedataDEK to JSON: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return string(emdData), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DecryptDEK uses the KMIP decrypt operation to decrypt the DEK.
|
||||||
|
func (kms *kmipKMS) DecryptDEK(_, encryptedDEK string) (string, error) {
|
||||||
|
conn, err := kms.connect()
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
defer conn.Close()
|
||||||
|
|
||||||
|
emd := encryptedMetedataDEK{}
|
||||||
|
err = json.Unmarshal([]byte(encryptedDEK), &emd)
|
||||||
|
if err != nil {
|
||||||
|
return "", fmt.Errorf("failed to convert data to "+
|
||||||
|
"encryptedMetedataDEK: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
respMsg, decoder, uniqueBatchItemID, err := kms.send(conn,
|
||||||
|
kmip14.OperationDecrypt,
|
||||||
|
DecryptRequestPayload{
|
||||||
|
UniqueIdentifier: kms.uniqueIdentifier,
|
||||||
|
Data: emd.DEK,
|
||||||
|
IVCounterNonce: emd.Nonce,
|
||||||
|
CryptographicParameters: kmip.CryptographicParameters{
|
||||||
|
PaddingMethod: kmip14.PaddingMethodPKCS5,
|
||||||
|
CryptographicAlgorithm: kmip14.CryptographicAlgorithmAES,
|
||||||
|
BlockCipherMode: kmip14.BlockCipherModeCBC,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
batchItem, err := kms.verifyResponse(respMsg, kmip14.OperationDecrypt, uniqueBatchItemID)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
ttlvPayload, ok := batchItem.ResponsePayload.(ttlv.TTLV)
|
||||||
|
if !ok {
|
||||||
|
return "", errors.New("failed to parse responsePayload")
|
||||||
|
}
|
||||||
|
|
||||||
|
var decryptRespPayload DecryptRequestPayload
|
||||||
|
err = decoder.DecodeValue(&decryptRespPayload, ttlvPayload)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
return string(decryptRespPayload.Data), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (kms *kmipKMS) Destroy() {
|
||||||
|
// Nothing to do.
|
||||||
|
}
|
||||||
|
|
||||||
|
func (kms *kmipKMS) RequiresDEKStore() DEKStoreType {
|
||||||
|
return DEKStoreMetadata
|
||||||
|
}
|
||||||
|
|
||||||
|
// getSecrets returns required options from the Kubernetes Secret.
|
||||||
|
func (kms *kmipKMS) getSecrets() (map[string]string, error) {
|
||||||
|
c, err := k8s.NewK8sClient()
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to connect to Kubernetes to "+
|
||||||
|
"get Secret %s/%s: %w", kms.namespace, kms.secretName, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
secret, err := c.CoreV1().Secrets(kms.namespace).Get(context.TODO(),
|
||||||
|
kms.secretName, metav1.GetOptions{})
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to get Secret %s/%s: %w",
|
||||||
|
kms.namespace, kms.secretName, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
config := make(map[string]string)
|
||||||
|
for k, v := range secret.Data {
|
||||||
|
switch k {
|
||||||
|
case kmipClientKey, kmipCLientCert, kmipCACert, kmipUniqueIdentifier:
|
||||||
|
config[k] = string(v)
|
||||||
|
default:
|
||||||
|
return nil, fmt.Errorf("unsupported option for KMS "+
|
||||||
|
"provider %q: %s", kmsTypeKMIP, k)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return config, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// connect to the kmip endpoint, perform TLS and KMIP handshakes.
|
||||||
|
func (kms *kmipKMS) connect() (*tls.Conn, error) {
|
||||||
|
conn, err := tls.Dial("tcp", kms.endpoint, kms.tlsConfig)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to dial kmip connection endpoint: %w", err)
|
||||||
|
}
|
||||||
|
if kms.readTimeout != 0 {
|
||||||
|
err = conn.SetReadDeadline(time.Now().Add(time.Second * time.Duration(kms.readTimeout)))
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to set read deadline: %w", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if kms.writeTimeout != 0 {
|
||||||
|
err = conn.SetReadDeadline(time.Now().Add(time.Second * time.Duration(kms.writeTimeout)))
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to set write deadline: %w", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
defer func() {
|
||||||
|
if err != nil {
|
||||||
|
conn.Close()
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
err = conn.Handshake()
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to perform connection handshake: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = kms.discover(conn)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return conn, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// discover performs KMIP discover operation.
|
||||||
|
// https://docs.oasis-open.org/kmip/spec/v1.4/kmip-spec-v1.4.html
|
||||||
|
// chapter 4.26.
|
||||||
|
func (kms *kmipKMS) discover(conn io.ReadWriter) error {
|
||||||
|
respMsg, decoder, uniqueBatchItemID, err := kms.send(conn,
|
||||||
|
kmip14.OperationDiscoverVersions,
|
||||||
|
kmip.DiscoverVersionsRequestPayload{
|
||||||
|
ProtocolVersion: []kmip.ProtocolVersion{
|
||||||
|
{
|
||||||
|
ProtocolVersionMajor: protocolMajor,
|
||||||
|
ProtocolVersionMinor: protocolMinor,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
batchItem, err := kms.verifyResponse(
|
||||||
|
respMsg,
|
||||||
|
kmip14.OperationDiscoverVersions,
|
||||||
|
uniqueBatchItemID)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
ttlvPayload, ok := batchItem.ResponsePayload.(ttlv.TTLV)
|
||||||
|
if !ok {
|
||||||
|
return errors.New("failed to parse responsePayload")
|
||||||
|
}
|
||||||
|
|
||||||
|
var respDiscoverVersionsPayload kmip.DiscoverVersionsResponsePayload
|
||||||
|
err = decoder.DecodeValue(&respDiscoverVersionsPayload, ttlvPayload)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(respDiscoverVersionsPayload.ProtocolVersion) != 1 {
|
||||||
|
return fmt.Errorf("invalid len of discovered protocol versions %v expected 1",
|
||||||
|
len(respDiscoverVersionsPayload.ProtocolVersion))
|
||||||
|
}
|
||||||
|
pv := respDiscoverVersionsPayload.ProtocolVersion[0]
|
||||||
|
if pv.ProtocolVersionMajor != protocolMajor || pv.ProtocolVersionMinor != protocolMinor {
|
||||||
|
return fmt.Errorf("invalid discovered protocol version %v.%v expected %v.%v",
|
||||||
|
pv.ProtocolVersionMajor, pv.ProtocolVersionMinor, protocolMajor, protocolMinor)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// send sends KMIP operation over tls connection, returns
|
||||||
|
// kmip response message,
|
||||||
|
// ttlv Decoder to decode message into desired format,
|
||||||
|
// batchItem ID,
|
||||||
|
// and error.
|
||||||
|
func (kms *kmipKMS) send(
|
||||||
|
conn io.ReadWriter,
|
||||||
|
operation kmip14.Operation,
|
||||||
|
payload interface{},
|
||||||
|
) (*kmip.ResponseMessage, *ttlv.Decoder, []byte, error) {
|
||||||
|
biID := uuid.New()
|
||||||
|
|
||||||
|
msg := kmip.RequestMessage{
|
||||||
|
RequestHeader: kmip.RequestHeader{
|
||||||
|
ProtocolVersion: kmip.ProtocolVersion{
|
||||||
|
ProtocolVersionMajor: protocolMajor,
|
||||||
|
ProtocolVersionMinor: protocolMinor,
|
||||||
|
},
|
||||||
|
BatchCount: 1,
|
||||||
|
},
|
||||||
|
BatchItem: []kmip.RequestBatchItem{
|
||||||
|
{
|
||||||
|
UniqueBatchItemID: biID[:],
|
||||||
|
Operation: operation,
|
||||||
|
RequestPayload: payload,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
req, err := ttlv.Marshal(msg)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, nil,
|
||||||
|
fmt.Errorf("failed to ttlv marshal message: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = conn.Write(req)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, nil,
|
||||||
|
fmt.Errorf("failed to write request onto connection: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
decoder := ttlv.NewDecoder(bufio.NewReader(conn))
|
||||||
|
resp, err := decoder.NextTTLV()
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, nil,
|
||||||
|
fmt.Errorf("failed to read ttlv KMIP value: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var respMsg kmip.ResponseMessage
|
||||||
|
err = decoder.DecodeValue(&respMsg, resp)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, nil,
|
||||||
|
fmt.Errorf("failed to decode response value: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return &respMsg, decoder, biID[:], nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// verifyResponse verifies the response success and return the batch item.
|
||||||
|
func (kms *kmipKMS) verifyResponse(
|
||||||
|
respMsg *kmip.ResponseMessage,
|
||||||
|
operation kmip14.Operation,
|
||||||
|
uniqueBatchItemID []byte,
|
||||||
|
) (*kmip.ResponseBatchItem, error) {
|
||||||
|
if respMsg.ResponseHeader.BatchCount != 1 {
|
||||||
|
return nil, fmt.Errorf("batch count %q should be \"1\"",
|
||||||
|
respMsg.ResponseHeader.BatchCount)
|
||||||
|
}
|
||||||
|
if len(respMsg.BatchItem) != 1 {
|
||||||
|
return nil, fmt.Errorf("batch Intems list len %q should be \"1\"",
|
||||||
|
len(respMsg.BatchItem))
|
||||||
|
}
|
||||||
|
batchItem := respMsg.BatchItem[0]
|
||||||
|
if operation != batchItem.Operation {
|
||||||
|
return nil, fmt.Errorf("unexpected operation, real %q expected %q",
|
||||||
|
batchItem.Operation, operation)
|
||||||
|
}
|
||||||
|
if !bytes.Equal(uniqueBatchItemID, batchItem.UniqueBatchItemID) {
|
||||||
|
return nil, fmt.Errorf("unexpected uniqueBatchItemID, real %q expected %q",
|
||||||
|
batchItem.UniqueBatchItemID, uniqueBatchItemID)
|
||||||
|
}
|
||||||
|
if kmip14.ResultStatusSuccess != batchItem.ResultStatus {
|
||||||
|
return nil, fmt.Errorf("unexpected result status %q expected success %q,"+
|
||||||
|
"result reason %q, result message %q",
|
||||||
|
batchItem.ResultStatus, kmip14.ResultStatusSuccess,
|
||||||
|
batchItem.ResultReason, batchItem.ResultMessage)
|
||||||
|
}
|
||||||
|
|
||||||
|
return &batchItem, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: use the following structs from https://github.com/gemalto/kmip-go
|
||||||
|
// when https://github.com/ThalesGroup/kmip-go/issues/21 is resolved.
|
||||||
|
// refer: https://docs.oasis-open.org/kmip/spec/v1.4/kmip-spec-v1.4.html.
|
||||||
|
type EncryptRequestPayload struct {
|
||||||
|
UniqueIdentifier string
|
||||||
|
CryptographicParameters kmip.CryptographicParameters
|
||||||
|
Data []byte
|
||||||
|
IVCounterNonce []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
type EncryptResponsePayload struct {
|
||||||
|
UniqueIdentifier string
|
||||||
|
Data []byte
|
||||||
|
IVCounterNonce []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
type DecryptRequestPayload struct {
|
||||||
|
UniqueIdentifier string
|
||||||
|
CryptographicParameters kmip.CryptographicParameters
|
||||||
|
Data []byte
|
||||||
|
IVCounterNonce []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
type DecryptResponsePayload struct {
|
||||||
|
UniqueIdentifier string
|
||||||
|
Data []byte
|
||||||
|
IVCounterNonce []byte
|
||||||
|
}
|
29
internal/kms/kmip_test.go
Normal file
29
internal/kms/kmip_test.go
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2022 The Ceph-CSI Authors.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package kms
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestKMIPKMSRegistered(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
_, ok := kmsManager.providers[kmsTypeKMIP]
|
||||||
|
assert.True(t, ok)
|
||||||
|
}
|
43
internal/kms/kms_util.go
Normal file
43
internal/kms/kms_util.go
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2022 The Ceph-CSI Authors.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package kms
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
// setConfigInt fetches a value from a configuration map and converts it to
|
||||||
|
// a integer.
|
||||||
|
//
|
||||||
|
// If the value is not available, *option is not adjusted and
|
||||||
|
// errConfigOptionMissing is returned.
|
||||||
|
// In case the value is available, but can not be converted to a string,
|
||||||
|
// errConfigOptionInvalid is returned.
|
||||||
|
func setConfigInt(option *int, config map[string]interface{}, key string) error {
|
||||||
|
value, ok := config[key]
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("%w: %s", errConfigOptionMissing, key)
|
||||||
|
}
|
||||||
|
|
||||||
|
s, ok := value.(float64)
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("%w: expected float64 for %q, but got %T",
|
||||||
|
errConfigOptionInvalid, key, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
*option = int(s)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
88
internal/kms/kms_util_test.go
Normal file
88
internal/kms/kms_util_test.go
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2022 The Ceph-CSI Authors.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package kms
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestSetConfigInt(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
type args struct {
|
||||||
|
option *int
|
||||||
|
config map[string]interface{}
|
||||||
|
key string
|
||||||
|
}
|
||||||
|
option := 1
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
err error
|
||||||
|
value int
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "valid value",
|
||||||
|
args: args{
|
||||||
|
option: &option,
|
||||||
|
config: map[string]interface{}{
|
||||||
|
"a": 1.0,
|
||||||
|
},
|
||||||
|
key: "a",
|
||||||
|
},
|
||||||
|
err: nil,
|
||||||
|
value: 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "invalid value",
|
||||||
|
args: args{
|
||||||
|
option: &option,
|
||||||
|
config: map[string]interface{}{
|
||||||
|
"a": "abc",
|
||||||
|
},
|
||||||
|
key: "a",
|
||||||
|
},
|
||||||
|
err: errConfigOptionInvalid,
|
||||||
|
value: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "missing value",
|
||||||
|
args: args{
|
||||||
|
option: &option,
|
||||||
|
config: map[string]interface{}{},
|
||||||
|
key: "a",
|
||||||
|
},
|
||||||
|
err: errConfigOptionMissing,
|
||||||
|
value: 0,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
currentTT := tt
|
||||||
|
t.Run(currentTT.name, func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
err := setConfigInt(currentTT.args.option, currentTT.args.config, currentTT.args.key)
|
||||||
|
if !errors.Is(err, currentTT.err) {
|
||||||
|
t.Errorf("setConfigInt() error = %v, wantErr %v", err, currentTT.err)
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
assert.NotEqual(t, currentTT.value, currentTT.args.option)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
@ -20,6 +20,7 @@ import (
|
|||||||
csicommon "github.com/ceph/ceph-csi/internal/csi-common"
|
csicommon "github.com/ceph/ceph-csi/internal/csi-common"
|
||||||
"github.com/ceph/ceph-csi/internal/nfs/controller"
|
"github.com/ceph/ceph-csi/internal/nfs/controller"
|
||||||
"github.com/ceph/ceph-csi/internal/nfs/identity"
|
"github.com/ceph/ceph-csi/internal/nfs/identity"
|
||||||
|
"github.com/ceph/ceph-csi/internal/nfs/nodeserver"
|
||||||
"github.com/ceph/ceph-csi/internal/util"
|
"github.com/ceph/ceph-csi/internal/util"
|
||||||
"github.com/ceph/ceph-csi/internal/util/log"
|
"github.com/ceph/ceph-csi/internal/util/log"
|
||||||
|
|
||||||
@ -43,6 +44,7 @@ func (fs *Driver) Run(conf *util.Config) {
|
|||||||
log.FatalLogMsg("failed to initialize CSI driver")
|
log.FatalLogMsg("failed to initialize CSI driver")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if conf.IsControllerServer || !conf.IsNodeServer {
|
||||||
cd.AddControllerServiceCapabilities([]csi.ControllerServiceCapability_RPC_Type{
|
cd.AddControllerServiceCapabilities([]csi.ControllerServiceCapability_RPC_Type{
|
||||||
csi.ControllerServiceCapability_RPC_CREATE_DELETE_VOLUME,
|
csi.ControllerServiceCapability_RPC_CREATE_DELETE_VOLUME,
|
||||||
csi.ControllerServiceCapability_RPC_SINGLE_NODE_MULTI_WRITER,
|
csi.ControllerServiceCapability_RPC_SINGLE_NODE_MULTI_WRITER,
|
||||||
@ -57,13 +59,24 @@ func (fs *Driver) Run(conf *util.Config) {
|
|||||||
csi.VolumeCapability_AccessMode_SINGLE_NODE_MULTI_WRITER,
|
csi.VolumeCapability_AccessMode_SINGLE_NODE_MULTI_WRITER,
|
||||||
csi.VolumeCapability_AccessMode_SINGLE_NODE_SINGLE_WRITER,
|
csi.VolumeCapability_AccessMode_SINGLE_NODE_SINGLE_WRITER,
|
||||||
})
|
})
|
||||||
|
}
|
||||||
|
|
||||||
// Create gRPC servers
|
// Create gRPC servers
|
||||||
server := csicommon.NewNonBlockingGRPCServer()
|
server := csicommon.NewNonBlockingGRPCServer()
|
||||||
srv := csicommon.Servers{
|
srv := csicommon.Servers{
|
||||||
IS: identity.NewIdentityServer(cd),
|
IS: identity.NewIdentityServer(cd),
|
||||||
CS: controller.NewControllerServer(cd),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch {
|
||||||
|
case conf.IsNodeServer:
|
||||||
|
srv.NS = nodeserver.NewNodeServer(cd, conf.Vtype)
|
||||||
|
case conf.IsControllerServer:
|
||||||
|
srv.CS = controller.NewControllerServer(cd)
|
||||||
|
default:
|
||||||
|
srv.NS = nodeserver.NewNodeServer(cd, conf.Vtype)
|
||||||
|
srv.CS = controller.NewControllerServer(cd)
|
||||||
|
}
|
||||||
|
|
||||||
server.Start(conf.Endpoint, conf.HistogramOption, srv, conf.EnableGRPCMetrics)
|
server.Start(conf.Endpoint, conf.HistogramOption, srv, conf.EnableGRPCMetrics)
|
||||||
if conf.EnableGRPCMetrics {
|
if conf.EnableGRPCMetrics {
|
||||||
log.WarningLogMsg("EnableGRPCMetrics is deprecated")
|
log.WarningLogMsg("EnableGRPCMetrics is deprecated")
|
||||||
|
284
internal/nfs/nodeserver/nodeserver.go
Normal file
284
internal/nfs/nodeserver/nodeserver.go
Normal file
@ -0,0 +1,284 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2022 The Ceph-CSI Authors.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package nodeserver
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
csicommon "github.com/ceph/ceph-csi/internal/csi-common"
|
||||||
|
"github.com/ceph/ceph-csi/internal/util"
|
||||||
|
"github.com/ceph/ceph-csi/internal/util/log"
|
||||||
|
|
||||||
|
"github.com/container-storage-interface/spec/lib/go/csi"
|
||||||
|
"golang.org/x/net/context"
|
||||||
|
"google.golang.org/grpc/codes"
|
||||||
|
"google.golang.org/grpc/status"
|
||||||
|
mount "k8s.io/mount-utils"
|
||||||
|
netutil "k8s.io/utils/net"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
defaultMountPermission = os.FileMode(0o777)
|
||||||
|
// Address of the NFS server.
|
||||||
|
paramServer = "server"
|
||||||
|
paramShare = "share"
|
||||||
|
paramClusterID = "clusterID"
|
||||||
|
)
|
||||||
|
|
||||||
|
// NodeServer struct of ceph CSI driver with supported methods of CSI
|
||||||
|
// node server spec.
|
||||||
|
type NodeServer struct {
|
||||||
|
csicommon.DefaultNodeServer
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewNodeServer initialize a node server for ceph CSI driver.
|
||||||
|
func NewNodeServer(
|
||||||
|
d *csicommon.CSIDriver,
|
||||||
|
t string,
|
||||||
|
) *NodeServer {
|
||||||
|
return &NodeServer{
|
||||||
|
DefaultNodeServer: *csicommon.NewDefaultNodeServer(d, t, map[string]string{}),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NodePublishVolume mount the volume.
|
||||||
|
func (ns *NodeServer) NodePublishVolume(
|
||||||
|
ctx context.Context,
|
||||||
|
req *csi.NodePublishVolumeRequest,
|
||||||
|
) (*csi.NodePublishVolumeResponse, error) {
|
||||||
|
err := validateNodePublishVolumeRequest(req)
|
||||||
|
if err != nil {
|
||||||
|
return nil, status.Error(codes.InvalidArgument, err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
volumeID := req.GetVolumeId()
|
||||||
|
volCap := req.GetVolumeCapability()
|
||||||
|
targetPath := req.GetTargetPath()
|
||||||
|
mountOptions := volCap.GetMount().GetMountFlags()
|
||||||
|
if req.GetReadonly() {
|
||||||
|
mountOptions = append(mountOptions, "ro")
|
||||||
|
}
|
||||||
|
|
||||||
|
source, err := getSource(req.GetVolumeContext())
|
||||||
|
if err != nil {
|
||||||
|
return nil, status.Error(codes.InvalidArgument, err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
clusterID := req.GetVolumeContext()[paramClusterID]
|
||||||
|
netNamespaceFilePath := ""
|
||||||
|
if clusterID != "" {
|
||||||
|
netNamespaceFilePath, err = util.GetNFSNetNamespaceFilePath(
|
||||||
|
util.CsiConfigFile,
|
||||||
|
clusterID)
|
||||||
|
if err != nil {
|
||||||
|
return nil, status.Error(codes.Internal, err.Error())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
err = ns.mountNFS(ctx,
|
||||||
|
volumeID,
|
||||||
|
source,
|
||||||
|
targetPath,
|
||||||
|
netNamespaceFilePath,
|
||||||
|
mountOptions)
|
||||||
|
if err != nil {
|
||||||
|
if os.IsPermission(err) {
|
||||||
|
return nil, status.Error(codes.PermissionDenied, err.Error())
|
||||||
|
}
|
||||||
|
if strings.Contains(err.Error(), "invalid argument") {
|
||||||
|
return nil, status.Error(codes.InvalidArgument, err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, status.Error(codes.Internal, err.Error())
|
||||||
|
}
|
||||||
|
log.DebugLog(ctx, "nfs: successfully mounted volume %q mount %q to %q succeeded",
|
||||||
|
volumeID, source, targetPath)
|
||||||
|
|
||||||
|
return &csi.NodePublishVolumeResponse{}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// NodeUnpublishVolume unmount the volume.
|
||||||
|
func (ns *NodeServer) NodeUnpublishVolume(
|
||||||
|
ctx context.Context,
|
||||||
|
req *csi.NodeUnpublishVolumeRequest,
|
||||||
|
) (*csi.NodeUnpublishVolumeResponse, error) {
|
||||||
|
err := util.ValidateNodeUnpublishVolumeRequest(req)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
volumeID := req.GetVolumeId()
|
||||||
|
targetPath := req.GetTargetPath()
|
||||||
|
log.DebugLog(ctx, "nfs: unmounting volume %s on %s", volumeID, targetPath)
|
||||||
|
err = mount.CleanupMountPoint(targetPath, ns.Mounter, true)
|
||||||
|
if err != nil {
|
||||||
|
return nil, status.Errorf(codes.Internal, "failed to unmount target %q: %v",
|
||||||
|
targetPath, err)
|
||||||
|
}
|
||||||
|
log.DebugLog(ctx, "nfs: successfully unbounded volume %q from %q",
|
||||||
|
volumeID, targetPath)
|
||||||
|
|
||||||
|
return &csi.NodeUnpublishVolumeResponse{}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// NodeGetCapabilities returns the supported capabilities of the node server.
|
||||||
|
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{
|
||||||
|
Type: csi.NodeServiceCapability_RPC_GET_VOLUME_STATS,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Type: &csi.NodeServiceCapability_Rpc{
|
||||||
|
Rpc: &csi.NodeServiceCapability_RPC{
|
||||||
|
Type: csi.NodeServiceCapability_RPC_SINGLE_NODE_MULTI_WRITER,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// NodeGetVolumeStats get volume stats.
|
||||||
|
func (ns *NodeServer) NodeGetVolumeStats(
|
||||||
|
ctx context.Context,
|
||||||
|
req *csi.NodeGetVolumeStatsRequest,
|
||||||
|
) (*csi.NodeGetVolumeStatsResponse, error) {
|
||||||
|
var err error
|
||||||
|
targetPath := req.GetVolumePath()
|
||||||
|
if targetPath == "" {
|
||||||
|
return nil, status.Error(codes.InvalidArgument,
|
||||||
|
fmt.Sprintf("targetpath %v is empty", targetPath))
|
||||||
|
}
|
||||||
|
|
||||||
|
stat, err := os.Stat(targetPath)
|
||||||
|
if err != nil {
|
||||||
|
return nil, status.Errorf(codes.InvalidArgument,
|
||||||
|
"failed to get stat for targetpath %q: %v", targetPath, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if stat.Mode().IsDir() {
|
||||||
|
return csicommon.FilesystemNodeGetVolumeStats(ctx, ns.Mounter, targetPath)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, status.Errorf(codes.InvalidArgument,
|
||||||
|
"targetpath %q is not a directory or device", targetPath)
|
||||||
|
}
|
||||||
|
|
||||||
|
// mountNFS mounts nfs volumes.
|
||||||
|
func (ns *NodeServer) mountNFS(
|
||||||
|
ctx context.Context,
|
||||||
|
volumeID, source, mountPoint, netNamespaceFilePath string,
|
||||||
|
mountOptions []string,
|
||||||
|
) error {
|
||||||
|
var (
|
||||||
|
stderr string
|
||||||
|
err error
|
||||||
|
)
|
||||||
|
|
||||||
|
notMnt, err := ns.Mounter.IsLikelyNotMountPoint(mountPoint)
|
||||||
|
if err != nil {
|
||||||
|
if os.IsNotExist(err) {
|
||||||
|
err = os.MkdirAll(mountPoint, defaultMountPermission)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
notMnt = true
|
||||||
|
} else {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !notMnt {
|
||||||
|
log.DebugLog(ctx, "nfs: volume is already mounted to %s", mountPoint)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
args := []string{
|
||||||
|
"-t", "nfs",
|
||||||
|
source,
|
||||||
|
mountPoint,
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(mountOptions) > 0 {
|
||||||
|
args = append(append(args, "-o"), mountOptions...)
|
||||||
|
}
|
||||||
|
|
||||||
|
log.DefaultLog("nfs: mounting volumeID(%v) source(%s) targetPath(%s) mountflags(%v)",
|
||||||
|
volumeID, source, mountPoint, mountOptions)
|
||||||
|
if netNamespaceFilePath != "" {
|
||||||
|
_, stderr, err = util.ExecuteCommandWithNSEnter(
|
||||||
|
ctx, netNamespaceFilePath, "mount", args[:]...)
|
||||||
|
} else {
|
||||||
|
err = ns.Mounter.Mount(source, mountPoint, "nfs", mountOptions)
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("nfs: failed to mount %q to %q : %w stderr: %q",
|
||||||
|
source, mountPoint, err, stderr)
|
||||||
|
}
|
||||||
|
if stderr != "" {
|
||||||
|
return fmt.Errorf("nfs: failed to mount %q to %q : stderr %q",
|
||||||
|
source, mountPoint, stderr)
|
||||||
|
}
|
||||||
|
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// validateNodePublishVolumeRequest validates node publish volume request.
|
||||||
|
func validateNodePublishVolumeRequest(req *csi.NodePublishVolumeRequest) error {
|
||||||
|
switch {
|
||||||
|
case req.GetVolumeId() == "":
|
||||||
|
return errors.New("volume ID missing in request")
|
||||||
|
case req.GetVolumeCapability() == nil:
|
||||||
|
return errors.New("volume capability missing in request")
|
||||||
|
case req.GetTargetPath() == "":
|
||||||
|
return errors.New("target path missing in request")
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// getSource validates volume context, extracts and returns source.
|
||||||
|
// This function expects `server` and `share` parameters to be set
|
||||||
|
// and validates for the same.
|
||||||
|
func getSource(volContext map[string]string) (string, error) {
|
||||||
|
server := volContext[paramServer]
|
||||||
|
if server == "" {
|
||||||
|
return "", fmt.Errorf("%v missing in request", paramServer)
|
||||||
|
}
|
||||||
|
baseDir := volContext[paramShare]
|
||||||
|
if baseDir == "" {
|
||||||
|
return "", fmt.Errorf("%v missing in request", paramShare)
|
||||||
|
}
|
||||||
|
|
||||||
|
if netutil.IsIPv6String(server) {
|
||||||
|
// if server is IPv6, format to [IPv6].
|
||||||
|
server = fmt.Sprintf("[%s]", server)
|
||||||
|
}
|
||||||
|
|
||||||
|
return fmt.Sprintf("%s:%s", server, baseDir), nil
|
||||||
|
}
|
174
internal/nfs/nodeserver/nodeserver_test.go
Normal file
174
internal/nfs/nodeserver/nodeserver_test.go
Normal file
@ -0,0 +1,174 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2022 The Ceph-CSI Authors.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package nodeserver
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/container-storage-interface/spec/lib/go/csi"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Test_validateNodePublishVolumeRequest(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
type args struct {
|
||||||
|
req *csi.NodePublishVolumeRequest
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
wantErr bool
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "passing testcase",
|
||||||
|
args: args{
|
||||||
|
req: &csi.NodePublishVolumeRequest{
|
||||||
|
VolumeId: "123",
|
||||||
|
TargetPath: "/target",
|
||||||
|
VolumeCapability: &csi.VolumeCapability{},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
wantErr: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "missing VolumeId",
|
||||||
|
args: args{
|
||||||
|
req: &csi.NodePublishVolumeRequest{
|
||||||
|
VolumeId: "",
|
||||||
|
TargetPath: "/target",
|
||||||
|
VolumeCapability: &csi.VolumeCapability{},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
wantErr: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "missing TargetPath",
|
||||||
|
args: args{
|
||||||
|
req: &csi.NodePublishVolumeRequest{
|
||||||
|
VolumeId: "123",
|
||||||
|
TargetPath: "",
|
||||||
|
VolumeCapability: &csi.VolumeCapability{},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
wantErr: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "missing VolumeCapability",
|
||||||
|
args: args{
|
||||||
|
req: &csi.NodePublishVolumeRequest{
|
||||||
|
VolumeId: "123",
|
||||||
|
TargetPath: "/target",
|
||||||
|
VolumeCapability: nil,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
wantErr: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
currentTT := tt
|
||||||
|
t.Run(currentTT.name, func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
err := validateNodePublishVolumeRequest(currentTT.args.req)
|
||||||
|
if (err != nil) != currentTT.wantErr {
|
||||||
|
t.Errorf("validateNodePublishVoluemRequest() error = %v, wantErr %v", err, currentTT.wantErr)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func Test_getSource(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
type args struct {
|
||||||
|
volContext map[string]string
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
want string
|
||||||
|
wantErr bool
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "hostname as address",
|
||||||
|
args: args{
|
||||||
|
volContext: map[string]string{
|
||||||
|
paramServer: "example.io",
|
||||||
|
paramShare: "/a",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
want: "example.io:/a",
|
||||||
|
wantErr: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "ipv4 address",
|
||||||
|
args: args{
|
||||||
|
volContext: map[string]string{
|
||||||
|
paramServer: "10.12.1.0",
|
||||||
|
paramShare: "/a",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
want: "10.12.1.0:/a",
|
||||||
|
wantErr: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "ipv6 address",
|
||||||
|
args: args{
|
||||||
|
volContext: map[string]string{
|
||||||
|
paramServer: "2001:0db8:3c4d:0015:0000:0000:1a2f:1a2b",
|
||||||
|
paramShare: "/a",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
want: "[2001:0db8:3c4d:0015:0000:0000:1a2f:1a2b]:/a",
|
||||||
|
wantErr: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "missing server parameter",
|
||||||
|
args: args{
|
||||||
|
volContext: map[string]string{
|
||||||
|
paramServer: "",
|
||||||
|
paramShare: "/a",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
want: "",
|
||||||
|
wantErr: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "missing share parameter",
|
||||||
|
args: args{
|
||||||
|
volContext: map[string]string{
|
||||||
|
paramServer: "10.12.1.0",
|
||||||
|
paramShare: "",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
want: "",
|
||||||
|
wantErr: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
currentTT := tt
|
||||||
|
t.Run(currentTT.name, func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
got, err := getSource(currentTT.args.volContext)
|
||||||
|
if (err != nil) != currentTT.wantErr {
|
||||||
|
t.Errorf("getSource() error = %v, wantErr %v", err, currentTT.wantErr)
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if got != currentTT.want {
|
||||||
|
t.Errorf("getSource() = %v, want %v", got, currentTT.want)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
@ -159,6 +159,8 @@ func (r *Driver) Run(conf *util.Config) {
|
|||||||
r.cs = NewControllerServer(r.cd)
|
r.cs = NewControllerServer(r.cd)
|
||||||
r.cs.ClusterName = conf.ClusterName
|
r.cs.ClusterName = conf.ClusterName
|
||||||
r.cs.SetMetadata = conf.SetMetadata
|
r.cs.SetMetadata = conf.SetMetadata
|
||||||
|
log.WarningLogMsg("replication service running on controller server is deprecated " +
|
||||||
|
"and replaced by CSI-Addons, see https://github.com/ceph/ceph-csi/issues/3314 for more details")
|
||||||
r.rs = NewReplicationServer(r.cs)
|
r.rs = NewReplicationServer(r.cs)
|
||||||
}
|
}
|
||||||
if !conf.IsControllerServer && !conf.IsNodeServer {
|
if !conf.IsControllerServer && !conf.IsNodeServer {
|
||||||
@ -223,6 +225,9 @@ func (r *Driver) setupCSIAddonsServer(conf *util.Config) error {
|
|||||||
|
|
||||||
fcs := casrbd.NewFenceControllerServer()
|
fcs := casrbd.NewFenceControllerServer()
|
||||||
r.cas.RegisterService(fcs)
|
r.cas.RegisterService(fcs)
|
||||||
|
|
||||||
|
rcs := NewReplicationServer(NewControllerServer(r.cd))
|
||||||
|
r.cas.RegisterService(rcs)
|
||||||
}
|
}
|
||||||
|
|
||||||
if conf.IsNodeServer {
|
if conf.IsNodeServer {
|
||||||
|
@ -32,6 +32,7 @@ import (
|
|||||||
librbd "github.com/ceph/go-ceph/rbd"
|
librbd "github.com/ceph/go-ceph/rbd"
|
||||||
"github.com/ceph/go-ceph/rbd/admin"
|
"github.com/ceph/go-ceph/rbd/admin"
|
||||||
"github.com/csi-addons/spec/lib/go/replication"
|
"github.com/csi-addons/spec/lib/go/replication"
|
||||||
|
"google.golang.org/grpc"
|
||||||
"google.golang.org/grpc/codes"
|
"google.golang.org/grpc/codes"
|
||||||
"google.golang.org/grpc/status"
|
"google.golang.org/grpc/status"
|
||||||
)
|
)
|
||||||
@ -91,6 +92,10 @@ type ReplicationServer struct {
|
|||||||
*ControllerServer
|
*ControllerServer
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (rs *ReplicationServer) RegisterService(server grpc.ServiceRegistrar) {
|
||||||
|
replication.RegisterControllerServer(server, rs)
|
||||||
|
}
|
||||||
|
|
||||||
// getForceOption extracts the force option from the GRPC request parameters.
|
// getForceOption extracts the force option from the GRPC request parameters.
|
||||||
// If not set, the default will be set to false.
|
// If not set, the default will be set to false.
|
||||||
func getForceOption(ctx context.Context, parameters map[string]string) (bool, error) {
|
func getForceOption(ctx context.Context, parameters map[string]string) (bool, error) {
|
||||||
|
@ -59,6 +59,11 @@ type ClusterInfo struct {
|
|||||||
// RadosNamespace is a rados namespace in the pool
|
// RadosNamespace is a rados namespace in the pool
|
||||||
RadosNamespace string `json:"radosNamespace"`
|
RadosNamespace string `json:"radosNamespace"`
|
||||||
} `json:"rbd"`
|
} `json:"rbd"`
|
||||||
|
// NFS contains NFS specific options
|
||||||
|
NFS struct {
|
||||||
|
// symlink filepath for the network namespace where we need to execute commands.
|
||||||
|
NetNamespaceFilePath string `json:"netNamespaceFilePath"`
|
||||||
|
} `json:"nfs"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Expected JSON structure in the passed in config file is,
|
// Expected JSON structure in the passed in config file is,
|
||||||
@ -95,9 +100,9 @@ func readClusterInfo(pathToConfig, clusterID string) (*ClusterInfo, error) {
|
|||||||
err, string(content))
|
err, string(content))
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, cluster := range config {
|
for i := range config {
|
||||||
if cluster.ClusterID == clusterID {
|
if config[i].ClusterID == clusterID {
|
||||||
return &cluster, nil
|
return &config[i], nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -194,3 +199,13 @@ func GetCephFSNetNamespaceFilePath(pathToConfig, clusterID string) (string, erro
|
|||||||
|
|
||||||
return cluster.CephFS.NetNamespaceFilePath, nil
|
return cluster.CephFS.NetNamespaceFilePath, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetNFSNetNamespaceFilePath returns the netNamespaceFilePath for NFS volumes.
|
||||||
|
func GetNFSNetNamespaceFilePath(pathToConfig, clusterID string) (string, error) {
|
||||||
|
cluster, err := readClusterInfo(pathToConfig, clusterID)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
return cluster.NFS.NetNamespaceFilePath, nil
|
||||||
|
}
|
||||||
|
@ -291,3 +291,77 @@ func TestGetCephFSNetNamespaceFilePath(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGetNFSNetNamespaceFilePath(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
clusterID string
|
||||||
|
want string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "get NFS specific NetNamespaceFilePath for cluster-1",
|
||||||
|
clusterID: "cluster-1",
|
||||||
|
want: "/var/lib/kubelet/plugins/nfs.ceph.csi.com/cluster1-net",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "get NFS specific NetNamespaceFilePath for cluster-2",
|
||||||
|
clusterID: "cluster-2",
|
||||||
|
want: "/var/lib/kubelet/plugins/nfs.ceph.csi.com/cluster2-net",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "when NFS specific NetNamespaceFilePath is empty",
|
||||||
|
clusterID: "cluster-3",
|
||||||
|
want: "",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
csiConfig := []ClusterInfo{
|
||||||
|
{
|
||||||
|
ClusterID: "cluster-1",
|
||||||
|
Monitors: []string{"ip-1", "ip-2"},
|
||||||
|
NFS: struct {
|
||||||
|
NetNamespaceFilePath string `json:"netNamespaceFilePath"`
|
||||||
|
}{
|
||||||
|
NetNamespaceFilePath: "/var/lib/kubelet/plugins/nfs.ceph.csi.com/cluster1-net",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ClusterID: "cluster-2",
|
||||||
|
Monitors: []string{"ip-3", "ip-4"},
|
||||||
|
NFS: struct {
|
||||||
|
NetNamespaceFilePath string `json:"netNamespaceFilePath"`
|
||||||
|
}{
|
||||||
|
NetNamespaceFilePath: "/var/lib/kubelet/plugins/nfs.ceph.csi.com/cluster2-net",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ClusterID: "cluster-3",
|
||||||
|
Monitors: []string{"ip-5", "ip-6"},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
csiConfigFileContent, err := json.Marshal(csiConfig)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("failed to marshal csi config info %v", err)
|
||||||
|
}
|
||||||
|
tmpConfPath := t.TempDir() + "/ceph-csi.json"
|
||||||
|
err = os.WriteFile(tmpConfPath, csiConfigFileContent, 0o600)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("failed to write %s file content: %v", CsiConfigFile, err)
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
ts := tt
|
||||||
|
t.Run(ts.name, func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
got, err := GetNFSNetNamespaceFilePath(tmpConfPath, ts.clusterID)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("GetNFSNetNamespaceFilePath() error = %v", err)
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if got != ts.want {
|
||||||
|
t.Errorf("GetNFSNetNamespaceFilePath() = %v, want %v", got, ts.want)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -169,6 +169,7 @@ linters:
|
|||||||
- funlen
|
- funlen
|
||||||
- testpackage
|
- testpackage
|
||||||
- exhaustivestruct
|
- exhaustivestruct
|
||||||
|
- nosnakecase
|
||||||
# This requires extra addition of unnecessary code. Hence, we
|
# This requires extra addition of unnecessary code. Hence, we
|
||||||
# prefer to disable this linter. But, it can be enabled if we
|
# prefer to disable this linter. But, it can be enabled if we
|
||||||
# have better resolution. For more details check the
|
# have better resolution. For more details check the
|
||||||
|
@ -169,7 +169,7 @@ install_cephcsi_helm_charts() {
|
|||||||
fi
|
fi
|
||||||
# install ceph-csi-cephfs and ceph-csi-rbd charts
|
# install ceph-csi-cephfs and ceph-csi-rbd charts
|
||||||
# shellcheck disable=SC2086
|
# shellcheck disable=SC2086
|
||||||
"${HELM}" install --namespace ${NAMESPACE} --set provisioner.fullnameOverride=csi-cephfsplugin-provisioner --set nodeplugin.fullnameOverride=csi-cephfsplugin --set configMapName=ceph-csi-config --set provisioner.podSecurityPolicy.enabled=true --set nodeplugin.podSecurityPolicy.enabled=true --set provisioner.replicaCount=1 ${SET_SC_TEMPLATE_VALUES} ${CEPHFS_SECRET_TEMPLATE_VALUES} ${CEPHFS_CHART_NAME} "${SCRIPT_DIR}"/../charts/ceph-csi-cephfs
|
"${HELM}" install --namespace ${NAMESPACE} --set provisioner.fullnameOverride=csi-cephfsplugin-provisioner --set nodeplugin.fullnameOverride=csi-cephfsplugin --set configMapName=ceph-csi-config --set provisioner.replicaCount=1 ${SET_SC_TEMPLATE_VALUES} ${CEPHFS_SECRET_TEMPLATE_VALUES} ${CEPHFS_CHART_NAME} "${SCRIPT_DIR}"/../charts/ceph-csi-cephfs
|
||||||
check_deployment_status app=ceph-csi-cephfs ${NAMESPACE}
|
check_deployment_status app=ceph-csi-cephfs ${NAMESPACE}
|
||||||
check_daemonset_status app=ceph-csi-cephfs ${NAMESPACE}
|
check_daemonset_status app=ceph-csi-cephfs ${NAMESPACE}
|
||||||
|
|
||||||
@ -179,7 +179,7 @@ install_cephcsi_helm_charts() {
|
|||||||
kubectl_retry delete cm ceph-config --namespace ${NAMESPACE}
|
kubectl_retry delete cm ceph-config --namespace ${NAMESPACE}
|
||||||
|
|
||||||
# shellcheck disable=SC2086
|
# shellcheck disable=SC2086
|
||||||
"${HELM}" install --namespace ${NAMESPACE} --set provisioner.fullnameOverride=csi-rbdplugin-provisioner --set nodeplugin.fullnameOverride=csi-rbdplugin --set configMapName=ceph-csi-config --set provisioner.podSecurityPolicy.enabled=true --set nodeplugin.podSecurityPolicy.enabled=true --set provisioner.replicaCount=1 ${SET_SC_TEMPLATE_VALUES} ${RBD_SECRET_TEMPLATE_VALUES} ${RBD_CHART_NAME} "${SCRIPT_DIR}"/../charts/ceph-csi-rbd --set topology.enabled=true --set topology.domainLabels="{${NODE_LABEL_REGION},${NODE_LABEL_ZONE}}" --set provisioner.maxSnapshotsOnImage=3 --set provisioner.minSnapshotsOnImage=2
|
"${HELM}" install --namespace ${NAMESPACE} --set provisioner.fullnameOverride=csi-rbdplugin-provisioner --set nodeplugin.fullnameOverride=csi-rbdplugin --set configMapName=ceph-csi-config --set provisioner.replicaCount=1 ${SET_SC_TEMPLATE_VALUES} ${RBD_SECRET_TEMPLATE_VALUES} ${RBD_CHART_NAME} "${SCRIPT_DIR}"/../charts/ceph-csi-rbd --set topology.enabled=true --set topology.domainLabels="{${NODE_LABEL_REGION},${NODE_LABEL_ZONE}}" --set provisioner.maxSnapshotsOnImage=3 --set provisioner.minSnapshotsOnImage=2
|
||||||
|
|
||||||
check_deployment_status app=ceph-csi-rbd ${NAMESPACE}
|
check_deployment_status app=ceph-csi-rbd ${NAMESPACE}
|
||||||
check_daemonset_status app=ceph-csi-rbd ${NAMESPACE}
|
check_daemonset_status app=ceph-csi-rbd ${NAMESPACE}
|
||||||
|
@ -61,17 +61,14 @@ function create_or_delete_resource() {
|
|||||||
local namespace=$2
|
local namespace=$2
|
||||||
temp_rbac=${TEMP_DIR}/snapshot-rbac.yaml
|
temp_rbac=${TEMP_DIR}/snapshot-rbac.yaml
|
||||||
temp_snap_controller=${TEMP_DIR}/snapshot-controller.yaml
|
temp_snap_controller=${TEMP_DIR}/snapshot-controller.yaml
|
||||||
snapshotter_psp="${SCRIPT_DIR}/snapshot-controller-psp.yaml"
|
|
||||||
mkdir -p "${TEMP_DIR}"
|
mkdir -p "${TEMP_DIR}"
|
||||||
curl -o "${temp_rbac}" "${SNAPSHOT_RBAC}"
|
curl -o "${temp_rbac}" "${SNAPSHOT_RBAC}"
|
||||||
curl -o "${temp_snap_controller}" "${SNAPSHOT_CONTROLLER}"
|
curl -o "${temp_snap_controller}" "${SNAPSHOT_CONTROLLER}"
|
||||||
sed -i "s/namespace: kube-system/namespace: ${namespace}/g" "${temp_rbac}"
|
sed -i "s/namespace: kube-system/namespace: ${namespace}/g" "${temp_rbac}"
|
||||||
sed -i "s/namespace: kube-system/namespace: ${namespace}/g" "${temp_snap_controller}"
|
sed -i "s/namespace: kube-system/namespace: ${namespace}/g" "${temp_snap_controller}"
|
||||||
sed -i "s/namespace: kube-system/namespace: ${namespace}/g" "${snapshotter_psp}"
|
|
||||||
sed -i "s/canary/${SNAPSHOT_VERSION}/g" "${temp_snap_controller}"
|
sed -i "s/canary/${SNAPSHOT_VERSION}/g" "${temp_snap_controller}"
|
||||||
|
|
||||||
kubectl "${operation}" -f "${temp_rbac}"
|
kubectl "${operation}" -f "${temp_rbac}"
|
||||||
kubectl "${operation}" -f "${snapshotter_psp}"
|
|
||||||
kubectl "${operation}" -f "${temp_snap_controller}" -n "${namespace}"
|
kubectl "${operation}" -f "${temp_snap_controller}" -n "${namespace}"
|
||||||
kubectl "${operation}" -f "${SNAPSHOTCLASS}"
|
kubectl "${operation}" -f "${SNAPSHOTCLASS}"
|
||||||
kubectl "${operation}" -f "${VOLUME_SNAPSHOT_CONTENT}"
|
kubectl "${operation}" -f "${VOLUME_SNAPSHOT_CONTENT}"
|
||||||
|
@ -182,9 +182,6 @@ CSI_IMAGE_VERSION=${CSI_IMAGE_VERSION:-"canary"}
|
|||||||
#feature-gates for kube
|
#feature-gates for kube
|
||||||
K8S_FEATURE_GATES=${K8S_FEATURE_GATES:-""}
|
K8S_FEATURE_GATES=${K8S_FEATURE_GATES:-""}
|
||||||
|
|
||||||
#extra-config for kube https://minikube.sigs.k8s.io/docs/reference/configuration/kubernetes/
|
|
||||||
EXTRA_CONFIG_PSP="--extra-config=apiserver.enable-admission-plugins=PodSecurityPolicy --addons=pod-security-policy"
|
|
||||||
|
|
||||||
# kubelet.resolv-conf needs to point to a file, not a symlink
|
# kubelet.resolv-conf needs to point to a file, not a symlink
|
||||||
# the default minikube VM has /etc/resolv.conf -> /run/systemd/resolve/resolv.conf
|
# the default minikube VM has /etc/resolv.conf -> /run/systemd/resolve/resolv.conf
|
||||||
RESOLV_CONF='/run/systemd/resolve/resolv.conf'
|
RESOLV_CONF='/run/systemd/resolve/resolv.conf'
|
||||||
@ -233,7 +230,7 @@ up)
|
|||||||
K8S_FEATURE_GATES="${K8S_FEATURE_GATES},RecoverVolumeExpansionFailure=true"
|
K8S_FEATURE_GATES="${K8S_FEATURE_GATES},RecoverVolumeExpansionFailure=true"
|
||||||
fi
|
fi
|
||||||
# shellcheck disable=SC2086
|
# shellcheck disable=SC2086
|
||||||
${minikube} start --force --memory="${MEMORY}" --cpus="${CPUS}" -b kubeadm --kubernetes-version="${KUBE_VERSION}" --driver="${VM_DRIVER}" --feature-gates="${K8S_FEATURE_GATES}" --cni="${CNI}" ${EXTRA_CONFIG} ${EXTRA_CONFIG_PSP} --wait-timeout="${MINIKUBE_WAIT_TIMEOUT}" --wait="${MINIKUBE_WAIT}" --delete-on-failure ${DISK_CONFIG}
|
${minikube} start --force --memory="${MEMORY}" --cpus="${CPUS}" -b kubeadm --kubernetes-version="${KUBE_VERSION}" --driver="${VM_DRIVER}" --feature-gates="${K8S_FEATURE_GATES}" --cni="${CNI}" ${EXTRA_CONFIG} --wait-timeout="${MINIKUBE_WAIT_TIMEOUT}" --wait="${MINIKUBE_WAIT}" --delete-on-failure ${DISK_CONFIG}
|
||||||
|
|
||||||
# create a link so the default dataDirHostPath will work for this
|
# create a link so the default dataDirHostPath will work for this
|
||||||
# environment
|
# environment
|
||||||
|
135
scripts/psp.yaml
135
scripts/psp.yaml
@ -1,135 +0,0 @@
|
|||||||
# Required PodSecurityPolicies, Roles and RoleBindings
|
|
||||||
# for minikube to bootstrap when PSPs are enabled
|
|
||||||
# https://minikube.sigs.k8s.io/docs/tutorials/using_psp/
|
|
||||||
---
|
|
||||||
apiVersion: policy/v1beta1
|
|
||||||
kind: PodSecurityPolicy
|
|
||||||
metadata:
|
|
||||||
name: privileged
|
|
||||||
annotations:
|
|
||||||
seccomp.security.alpha.kubernetes.io/allowedProfileNames: "*"
|
|
||||||
labels:
|
|
||||||
addonmanager.kubernetes.io/mode: EnsureExists
|
|
||||||
spec:
|
|
||||||
privileged: true
|
|
||||||
allowPrivilegeEscalation: true
|
|
||||||
allowedCapabilities:
|
|
||||||
- "*"
|
|
||||||
volumes:
|
|
||||||
- "*"
|
|
||||||
hostNetwork: true
|
|
||||||
hostPorts:
|
|
||||||
- min: 0
|
|
||||||
max: 65535
|
|
||||||
hostIPC: true
|
|
||||||
hostPID: true
|
|
||||||
runAsUser:
|
|
||||||
rule: 'RunAsAny'
|
|
||||||
seLinux:
|
|
||||||
rule: 'RunAsAny'
|
|
||||||
supplementalGroups:
|
|
||||||
rule: 'RunAsAny'
|
|
||||||
fsGroup:
|
|
||||||
rule: 'RunAsAny'
|
|
||||||
---
|
|
||||||
apiVersion: policy/v1beta1
|
|
||||||
kind: PodSecurityPolicy
|
|
||||||
metadata:
|
|
||||||
name: restricted
|
|
||||||
labels:
|
|
||||||
addonmanager.kubernetes.io/mode: EnsureExists
|
|
||||||
spec:
|
|
||||||
privileged: false
|
|
||||||
allowPrivilegeEscalation: false
|
|
||||||
requiredDropCapabilities:
|
|
||||||
- ALL
|
|
||||||
volumes:
|
|
||||||
- 'configMap'
|
|
||||||
- 'emptyDir'
|
|
||||||
- 'projected'
|
|
||||||
- 'secret'
|
|
||||||
- 'downwardAPI'
|
|
||||||
- 'persistentVolumeClaim'
|
|
||||||
hostNetwork: false
|
|
||||||
hostIPC: false
|
|
||||||
hostPID: false
|
|
||||||
runAsUser:
|
|
||||||
rule: 'MustRunAsNonRoot'
|
|
||||||
seLinux:
|
|
||||||
rule: 'RunAsAny'
|
|
||||||
supplementalGroups:
|
|
||||||
rule: 'MustRunAs'
|
|
||||||
ranges:
|
|
||||||
# Forbid adding the root group.
|
|
||||||
- min: 1
|
|
||||||
max: 65535
|
|
||||||
fsGroup:
|
|
||||||
rule: 'MustRunAs'
|
|
||||||
ranges:
|
|
||||||
# Forbid adding the root group.
|
|
||||||
- min: 1
|
|
||||||
max: 65535
|
|
||||||
readOnlyRootFilesystem: false
|
|
||||||
---
|
|
||||||
apiVersion: rbac.authorization.k8s.io/v1
|
|
||||||
kind: ClusterRole
|
|
||||||
metadata:
|
|
||||||
name: psp:privileged
|
|
||||||
labels:
|
|
||||||
addonmanager.kubernetes.io/mode: EnsureExists
|
|
||||||
rules:
|
|
||||||
- apiGroups: ['policy']
|
|
||||||
resources: ['podsecuritypolicies']
|
|
||||||
verbs: ['use']
|
|
||||||
resourceNames:
|
|
||||||
- privileged
|
|
||||||
---
|
|
||||||
apiVersion: rbac.authorization.k8s.io/v1
|
|
||||||
kind: ClusterRole
|
|
||||||
metadata:
|
|
||||||
name: psp:restricted
|
|
||||||
labels:
|
|
||||||
addonmanager.kubernetes.io/mode: EnsureExists
|
|
||||||
rules:
|
|
||||||
- apiGroups: ['policy']
|
|
||||||
resources: ['podsecuritypolicies']
|
|
||||||
verbs: ['use']
|
|
||||||
resourceNames:
|
|
||||||
- restricted
|
|
||||||
---
|
|
||||||
apiVersion: rbac.authorization.k8s.io/v1
|
|
||||||
kind: ClusterRoleBinding
|
|
||||||
metadata:
|
|
||||||
name: default:restricted
|
|
||||||
labels:
|
|
||||||
addonmanager.kubernetes.io/mode: EnsureExists
|
|
||||||
roleRef:
|
|
||||||
apiGroup: rbac.authorization.k8s.io
|
|
||||||
kind: ClusterRole
|
|
||||||
name: psp:restricted
|
|
||||||
subjects:
|
|
||||||
- kind: Group
|
|
||||||
name: system:authenticated
|
|
||||||
apiGroup: rbac.authorization.k8s.io
|
|
||||||
---
|
|
||||||
apiVersion: rbac.authorization.k8s.io/v1
|
|
||||||
kind: RoleBinding
|
|
||||||
metadata:
|
|
||||||
name: default:privileged
|
|
||||||
namespace: kube-system
|
|
||||||
labels:
|
|
||||||
addonmanager.kubernetes.io/mode: EnsureExists
|
|
||||||
roleRef:
|
|
||||||
apiGroup: rbac.authorization.k8s.io
|
|
||||||
kind: ClusterRole
|
|
||||||
name: psp:privileged
|
|
||||||
subjects:
|
|
||||||
- kind: Group
|
|
||||||
name: system:masters
|
|
||||||
apiGroup: rbac.authorization.k8s.io
|
|
||||||
- kind: Group
|
|
||||||
name: system:nodes
|
|
||||||
apiGroup: rbac.authorization.k8s.io
|
|
||||||
- kind: Group
|
|
||||||
name: system:serviceaccounts:kube-system
|
|
||||||
apiGroup: rbac.authorization.k8s.io
|
|
@ -1,55 +0,0 @@
|
|||||||
---
|
|
||||||
apiVersion: policy/v1beta1
|
|
||||||
kind: PodSecurityPolicy
|
|
||||||
metadata:
|
|
||||||
name: csi-snapshotter-psp
|
|
||||||
namespace: kube-system
|
|
||||||
spec:
|
|
||||||
allowPrivilegeEscalation: true
|
|
||||||
allowedCapabilities:
|
|
||||||
- "SYS_ADMIN"
|
|
||||||
fsGroup:
|
|
||||||
rule: RunAsAny
|
|
||||||
privileged: true
|
|
||||||
runAsUser:
|
|
||||||
rule: RunAsAny
|
|
||||||
seLinux:
|
|
||||||
rule: RunAsAny
|
|
||||||
supplementalGroups:
|
|
||||||
rule: RunAsAny
|
|
||||||
volumes:
|
|
||||||
- "configMap"
|
|
||||||
- "emptyDir"
|
|
||||||
- "secret"
|
|
||||||
- "projected"
|
|
||||||
- "hostPath"
|
|
||||||
|
|
||||||
---
|
|
||||||
kind: Role
|
|
||||||
apiVersion: rbac.authorization.k8s.io/v1
|
|
||||||
metadata:
|
|
||||||
name: csi-snapshotter-psp
|
|
||||||
# replace with non-kube-system namespace name
|
|
||||||
namespace: kube-system
|
|
||||||
rules:
|
|
||||||
- apiGroups: ["policy"]
|
|
||||||
resources: ["podsecuritypolicies"]
|
|
||||||
verbs: ["use"]
|
|
||||||
resourceNames: ["csi-snapshotter-psp"]
|
|
||||||
|
|
||||||
---
|
|
||||||
kind: RoleBinding
|
|
||||||
apiVersion: rbac.authorization.k8s.io/v1
|
|
||||||
metadata:
|
|
||||||
name: csi-snapshotter-psp
|
|
||||||
# replace with non-kube-system namespace name
|
|
||||||
namespace: kube-system
|
|
||||||
subjects:
|
|
||||||
- kind: ServiceAccount
|
|
||||||
name: snapshot-controller
|
|
||||||
# replace with non-kube-system namespace name
|
|
||||||
namespace: kube-system
|
|
||||||
roleRef:
|
|
||||||
kind: Role
|
|
||||||
name: csi-snapshotter-psp
|
|
||||||
apiGroup: rbac.authorization.k8s.io
|
|
50
vendor/github.com/ansel1/merry/.gitignore
generated
vendored
Normal file
50
vendor/github.com/ansel1/merry/.gitignore
generated
vendored
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
# Created by .ignore support plugin (hsz.mobi)
|
||||||
|
### JetBrains template
|
||||||
|
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion
|
||||||
|
|
||||||
|
*.iml
|
||||||
|
|
||||||
|
## Directory-based project format:
|
||||||
|
.idea/
|
||||||
|
# if you remove the above rule, at least ignore the following:
|
||||||
|
|
||||||
|
# User-specific stuff:
|
||||||
|
# .idea/workspace.xml
|
||||||
|
# .idea/tasks.xml
|
||||||
|
# .idea/dictionaries
|
||||||
|
|
||||||
|
# Sensitive or high-churn files:
|
||||||
|
# .idea/dataSources.ids
|
||||||
|
# .idea/dataSources.xml
|
||||||
|
# .idea/sqlDataSources.xml
|
||||||
|
# .idea/dynamic.xml
|
||||||
|
# .idea/uiDesigner.xml
|
||||||
|
|
||||||
|
# Gradle:
|
||||||
|
# .idea/gradle.xml
|
||||||
|
# .idea/libraries
|
||||||
|
|
||||||
|
# Mongo Explorer plugin:
|
||||||
|
# .idea/mongoSettings.xml
|
||||||
|
|
||||||
|
## File-based project format:
|
||||||
|
*.ipr
|
||||||
|
*.iws
|
||||||
|
|
||||||
|
## Plugin-specific files:
|
||||||
|
|
||||||
|
# IntelliJ
|
||||||
|
/out/
|
||||||
|
|
||||||
|
# mpeltonen/sbt-idea plugin
|
||||||
|
.idea_modules/
|
||||||
|
|
||||||
|
# JIRA plugin
|
||||||
|
atlassian-ide-plugin.xml
|
||||||
|
|
||||||
|
# Crashlytics plugin (for Android Studio and IntelliJ)
|
||||||
|
com_crashlytics_export_strings.xml
|
||||||
|
crashlytics.properties
|
||||||
|
crashlytics-build.properties
|
||||||
|
|
||||||
|
vendor/
|
@ -1,6 +1,6 @@
|
|||||||
The MIT License (MIT)
|
The MIT License (MIT)
|
||||||
|
|
||||||
Copyright (c) 2016 Yasuhiro Matsumoto
|
Copyright (c) 2015 Russ Egan
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
44
vendor/github.com/ansel1/merry/Makefile
generated
vendored
Normal file
44
vendor/github.com/ansel1/merry/Makefile
generated
vendored
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
# Expands to list this project's go packages, excluding the vendor folder
|
||||||
|
SHELL = bash
|
||||||
|
|
||||||
|
all: fmt build test lint v2
|
||||||
|
|
||||||
|
v2:
|
||||||
|
$(MAKE) -C v2
|
||||||
|
|
||||||
|
build:
|
||||||
|
go build
|
||||||
|
|
||||||
|
|
||||||
|
lint:
|
||||||
|
golint -set_exit_status
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -rf build
|
||||||
|
|
||||||
|
fmt:
|
||||||
|
go fmt ./...
|
||||||
|
|
||||||
|
test:
|
||||||
|
go test ./...
|
||||||
|
|
||||||
|
testall:
|
||||||
|
go test -count 1 ./...
|
||||||
|
|
||||||
|
coverage:
|
||||||
|
@if [ ! -d build ]; then mkdir build; fi
|
||||||
|
# runs go test and generate coverage report
|
||||||
|
go test -covermode=count -coverprofile=build/coverage.out ./...
|
||||||
|
go tool cover -html=build/coverage.out -o build/coverage.html
|
||||||
|
|
||||||
|
bench:
|
||||||
|
go test -bench ./...
|
||||||
|
|
||||||
|
### TOOLS
|
||||||
|
|
||||||
|
tools:
|
||||||
|
go get -u golang.org/x/tools/cmd/cover
|
||||||
|
go get -u golang.org/x/lint/golint
|
||||||
|
|
||||||
|
.PHONY: all build lint clean fmt test coverage tools v2
|
||||||
|
|
255
vendor/github.com/ansel1/merry/README.md
generated
vendored
Normal file
255
vendor/github.com/ansel1/merry/README.md
generated
vendored
Normal file
@ -0,0 +1,255 @@
|
|||||||
|
merry [![Build](https://github.com/ansel1/merry/workflows/Build/badge.svg)](https://github.com/ansel1/merry/actions?query=branch%3Amaster+workflow%3ABuild+) [![GoDoc](https://godoc.org/github.com/ansel1/merry?status.png)](https://godoc.org/github.com/ansel1/merry) [![Go Report Card](https://goreportcard.com/badge/github.com/ansel1/merry)](https://goreportcard.com/report/github.com/ansel1/merry)
|
||||||
|
=====
|
||||||
|
|
||||||
|
Add context to errors, including automatic stack capture, cause chains, HTTP status code, user
|
||||||
|
messages, and arbitrary values.
|
||||||
|
|
||||||
|
The package is largely based on http://github.com/go-errors/errors, with additional
|
||||||
|
inspiration from https://github.com/go-errgo/errgo and https://github.com/amattn/deeperror.
|
||||||
|
|
||||||
|
V2
|
||||||
|
--
|
||||||
|
|
||||||
|
[github.com/ansel1/merry/v2](https://github.com/ansel1/merry/tree/master/v2) now replaces v1. v1 will continue to be supported. v1 has been re-implemented
|
||||||
|
in terms of v2, and the two packages can be used together and interchangeably.
|
||||||
|
|
||||||
|
There are some small enhancements and changes to v1 with the introduction of v2:
|
||||||
|
|
||||||
|
- err.Error() now *always* just prints out the basic error message. It no longer prints out details,
|
||||||
|
user message, or cause. VerboseDefault() and SetVerboseDefault() no longer have any effect. To
|
||||||
|
print more detailed error information, you must use fmt:
|
||||||
|
|
||||||
|
// print err message and cause chain
|
||||||
|
fmt.Printf("%v", err) // %s works too
|
||||||
|
|
||||||
|
// print details, same as Details(err)
|
||||||
|
fmt.Printf("%v+", err)
|
||||||
|
|
||||||
|
- MaxStackDepth is no longer supported. Setting it has no effect. It has been replaced with
|
||||||
|
GetMaxStackDepth() and SetMaxStackDepth(), which delegate to corresponding v2 functions.
|
||||||
|
- New, Errorf, Wrap, and WrapSkipping now accept v2.Wrapper arguments, allowing a mixture of
|
||||||
|
v1's fluent API style and v2's option-func API style.
|
||||||
|
- Compatibility with other error wrapping libraries is improved. All functions which extract
|
||||||
|
a value from an error will now search the entire chain of errors, even if errors created by
|
||||||
|
other libraries are inserted in the middle of the chain, so long as those errors implement
|
||||||
|
Unwrap().
|
||||||
|
|
||||||
|
Installation
|
||||||
|
------------
|
||||||
|
|
||||||
|
go get github.com/ansel1/merry
|
||||||
|
|
||||||
|
Features
|
||||||
|
--------
|
||||||
|
|
||||||
|
Merry errors work a lot like google's golang.org/x/net/context package.
|
||||||
|
Merry errors wrap normal errors with a context of key/value pairs.
|
||||||
|
Like contexts, merry errors are immutable: adding a key/value to an error
|
||||||
|
always creates a new error which wraps the original.
|
||||||
|
|
||||||
|
`merry` comes with built-in support for adding information to errors:
|
||||||
|
|
||||||
|
* stacktraces
|
||||||
|
* overriding the error message
|
||||||
|
* HTTP status codes
|
||||||
|
* End user error messages
|
||||||
|
|
||||||
|
You can also add your own additional information.
|
||||||
|
|
||||||
|
The stack capturing feature can be turned off for better performance, though it's pretty fast. Benchmarks
|
||||||
|
on an 2017 MacBook Pro, with go 1.10:
|
||||||
|
|
||||||
|
BenchmarkNew_withStackCapture-8 2000000 749 ns/op
|
||||||
|
BenchmarkNew_withoutStackCapture-8 20000000 64.1 ns/op
|
||||||
|
|
||||||
|
Details
|
||||||
|
-------
|
||||||
|
|
||||||
|
* Support for go 2's errors.Is and errors.As functions
|
||||||
|
* New errors have a stacktrace captured where they are created
|
||||||
|
* Add a stacktrace to existing errors (captured where they are wrapped)
|
||||||
|
|
||||||
|
```go
|
||||||
|
err := lib.Read()
|
||||||
|
return merry.Wrap(err) // no-op if err is already merry
|
||||||
|
```
|
||||||
|
|
||||||
|
* Add a stacktrace to a sentinel error
|
||||||
|
|
||||||
|
```go
|
||||||
|
var ParseError = merry.New("parse error")
|
||||||
|
|
||||||
|
func Parse() error {
|
||||||
|
// ...
|
||||||
|
return ParseError.Here() // captures a stacktrace here
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
* The golang idiom for testing errors against sentinel values or type checking them
|
||||||
|
doesn't work with merry errors, since they are wrapped. Use Is() for sentinel value
|
||||||
|
checks, or the new go 2 errors.As() function for testing error types.
|
||||||
|
|
||||||
|
```go
|
||||||
|
err := Parse()
|
||||||
|
|
||||||
|
// sentinel value check
|
||||||
|
if merry.Is(err, ParseError) {
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
|
||||||
|
// type check
|
||||||
|
if serr, ok := merry.Unwrap(err).(*SyntaxError); ok {
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
|
||||||
|
// these only work in go1.13
|
||||||
|
|
||||||
|
// sentinel value check
|
||||||
|
if errors.Is(err, ParseError) {}
|
||||||
|
|
||||||
|
// type check
|
||||||
|
var serr *SyntaxError
|
||||||
|
if errors.As(err, &serr) {}
|
||||||
|
```
|
||||||
|
|
||||||
|
* Add to the message on an error.
|
||||||
|
|
||||||
|
```go
|
||||||
|
err := merry.Prepend(ParseError, "reading config").Append("bad input")
|
||||||
|
fmt.Println(err.Error()) // reading config: parse error: bad input
|
||||||
|
```
|
||||||
|
|
||||||
|
* Hierarchies of errors
|
||||||
|
|
||||||
|
```go
|
||||||
|
var ParseError = merry.New("Parse error")
|
||||||
|
var InvalidCharSet = merry.WithMessage(ParseError, "Invalid char set")
|
||||||
|
var InvalidSyntax = merry.WithMessage(ParseError, "Invalid syntax")
|
||||||
|
|
||||||
|
func Parse(s string) error {
|
||||||
|
// use chainable methods to add context
|
||||||
|
return InvalidCharSet.Here().WithMessagef("Invalid char set: %s", "UTF-8")
|
||||||
|
// or functions
|
||||||
|
// return merry.WithMessagef(merry.Here(InvalidCharSet), "Invalid char set: %s", "UTF-8")
|
||||||
|
}
|
||||||
|
|
||||||
|
func Check() {
|
||||||
|
err := Parse("fields")
|
||||||
|
merry.Is(err, ParseError) // yup
|
||||||
|
merry.Is(err, InvalidCharSet) // yup
|
||||||
|
merry.Is(err, InvalidSyntax) // nope
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
* Add an HTTP status code
|
||||||
|
|
||||||
|
```go
|
||||||
|
merry.HTTPCode(errors.New("regular error")) // 500
|
||||||
|
merry.HTTPCode(merry.New("merry error").WithHTTPCode(404)) // 404
|
||||||
|
```
|
||||||
|
|
||||||
|
* Set an alternate error message for end users
|
||||||
|
|
||||||
|
```go
|
||||||
|
e := merry.New("crash").WithUserMessage("nothing to see here")
|
||||||
|
merry.UserMessage(e) // returns "nothing to see here"
|
||||||
|
```
|
||||||
|
|
||||||
|
* Functions for printing error details
|
||||||
|
|
||||||
|
```go
|
||||||
|
err := merry.New("boom")
|
||||||
|
m := merry.Stacktrace(err) // just the stacktrace
|
||||||
|
m = merry.Details(err) // error message and stacktrace
|
||||||
|
fmt.Sprintf("%+v", err) == merry.Details(err) // errors implement fmt.Formatter
|
||||||
|
```
|
||||||
|
|
||||||
|
* Add your own context info
|
||||||
|
|
||||||
|
```go
|
||||||
|
err := merry.New("boom").WithValue("explosive", "black powder")
|
||||||
|
```
|
||||||
|
|
||||||
|
Basic Usage
|
||||||
|
-----------
|
||||||
|
|
||||||
|
The package contains functions for creating new errors with stacks, or adding a stack to `error`
|
||||||
|
instances. Functions with add context (e.g. `WithValue()`) work on any `error`, and will
|
||||||
|
automatically convert them to merry errors (with a stack) if necessary.
|
||||||
|
|
||||||
|
Capturing the stack can be globally disabled with `SetStackCaptureEnabled(false)`
|
||||||
|
|
||||||
|
Functions which get context values from errors also accept `error`, and will return default
|
||||||
|
values if the error is not merry, or doesn't have that key attached.
|
||||||
|
|
||||||
|
All the functions which create or attach context return concrete instances of `*Error`. `*Error`
|
||||||
|
implements methods to add context to the error (they mirror the functions and do
|
||||||
|
the same thing). They allow for a chainable syntax for adding context.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/ansel1/merry"
|
||||||
|
"errors"
|
||||||
|
)
|
||||||
|
|
||||||
|
var InvalidInputs = errors.New("Input is invalid")
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
// create a new error, with a stacktrace attached
|
||||||
|
err := merry.New("bad stuff happened")
|
||||||
|
|
||||||
|
// create a new error with format string, like fmt.Errorf
|
||||||
|
err = merry.Errorf("bad input: %v", os.Args)
|
||||||
|
|
||||||
|
// capture a fresh stacktrace from this callsite
|
||||||
|
err = merry.Here(InvalidInputs)
|
||||||
|
|
||||||
|
// Make err merry if it wasn't already. The stacktrace will be captured here if the
|
||||||
|
// error didn't already have one. Also useful to cast to *Error
|
||||||
|
err = merry.Wrap(err, 0)
|
||||||
|
|
||||||
|
// override the original error's message
|
||||||
|
err.WithMessagef("Input is invalid: %v", os.Args)
|
||||||
|
|
||||||
|
// Use Is to compare errors against values, which is a common golang idiom
|
||||||
|
merry.Is(err, InvalidInputs) // will be true
|
||||||
|
|
||||||
|
// associated an http code
|
||||||
|
err.WithHTTPCode(400)
|
||||||
|
|
||||||
|
perr := parser.Parse("blah")
|
||||||
|
err = Wrap(perr, 0)
|
||||||
|
// Get the original error back
|
||||||
|
merry.Unwrap(err) == perr // will be true
|
||||||
|
|
||||||
|
// Print the error to a string, with the stacktrace, if it has one
|
||||||
|
s := merry.Details(err)
|
||||||
|
|
||||||
|
// Just print the stacktrace (empty string if err is not a RichError)
|
||||||
|
s := merry.Stacktrace(err)
|
||||||
|
|
||||||
|
// Get the location of the error (the first line in the stacktrace)
|
||||||
|
file, line := merry.Location(err)
|
||||||
|
|
||||||
|
// Get an HTTP status code for an error. Defaults to 500 for non-nil errors, and 200 if err is nil.
|
||||||
|
code := merry.HTTPCode(err)
|
||||||
|
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
See inline docs for more details.
|
||||||
|
|
||||||
|
Plugs
|
||||||
|
-----
|
||||||
|
|
||||||
|
- Check out my HTTP client library: [github.com/gemalto/requester](https://github.com/gemalto/requester)
|
||||||
|
- Check out my log library: [github.com/gemalto/flume](https://github.com/gemalto/flume)
|
||||||
|
|
||||||
|
License
|
||||||
|
-------
|
||||||
|
|
||||||
|
This package is licensed under the MIT license, see LICENSE.MIT for details.
|
152
vendor/github.com/ansel1/merry/chainable_api.go
generated
vendored
Normal file
152
vendor/github.com/ansel1/merry/chainable_api.go
generated
vendored
Normal file
@ -0,0 +1,152 @@
|
|||||||
|
package merry
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
v2 "github.com/ansel1/merry/v2"
|
||||||
|
"io"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Error extends the standard golang `error` interface with functions
|
||||||
|
// for attachment additional data to the error
|
||||||
|
type Error interface {
|
||||||
|
error
|
||||||
|
Appendf(format string, args ...interface{}) Error
|
||||||
|
Append(msg string) Error
|
||||||
|
Prepend(msg string) Error
|
||||||
|
Prependf(format string, args ...interface{}) Error
|
||||||
|
WithMessage(msg string) Error
|
||||||
|
WithMessagef(format string, args ...interface{}) Error
|
||||||
|
WithUserMessage(msg string) Error
|
||||||
|
WithUserMessagef(format string, args ...interface{}) Error
|
||||||
|
WithValue(key, value interface{}) Error
|
||||||
|
Here() Error
|
||||||
|
WithStackSkipping(skip int) Error
|
||||||
|
WithHTTPCode(code int) Error
|
||||||
|
WithCause(err error) Error
|
||||||
|
Cause() error
|
||||||
|
fmt.Formatter
|
||||||
|
}
|
||||||
|
|
||||||
|
// make sure errImpl implements Error
|
||||||
|
var _ Error = (*errImpl)(nil)
|
||||||
|
|
||||||
|
// WithValue is equivalent to WithValue(e, key, value).
|
||||||
|
func (e *errImpl) WithValue(key, value interface{}) Error {
|
||||||
|
return WrapSkipping(e, 1, v2.WithValue(key, value))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Here is equivalent to Here(e).
|
||||||
|
func (e *errImpl) Here() Error {
|
||||||
|
return HereSkipping(e, 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithStackSkipping is equivalent to HereSkipping(e, i).
|
||||||
|
func (e *errImpl) WithStackSkipping(skip int) Error {
|
||||||
|
return HereSkipping(e, skip+1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithHTTPCode is equivalent to WithHTTPCode(e, code).
|
||||||
|
func (e *errImpl) WithHTTPCode(code int) Error {
|
||||||
|
return WrapSkipping(e, 1, v2.WithHTTPCode(code))
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithMessage is equivalent to WithMessage(e, msg).
|
||||||
|
func (e *errImpl) WithMessage(msg string) Error {
|
||||||
|
return WrapSkipping(e, 1, v2.WithMessage(msg))
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithMessagef is equivalent to WithMessagef(e, format, args...).
|
||||||
|
func (e *errImpl) WithMessagef(format string, args ...interface{}) Error {
|
||||||
|
return WrapSkipping(e, 1, v2.WithMessagef(format, args...))
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithUserMessage is equivalent to WithUserMessage(e, msg).
|
||||||
|
func (e *errImpl) WithUserMessage(msg string) Error {
|
||||||
|
return WrapSkipping(e, 1, v2.WithUserMessage(msg))
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithUserMessagef is equivalent to WithUserMessagef(e, format, args...).
|
||||||
|
func (e *errImpl) WithUserMessagef(format string, args ...interface{}) Error {
|
||||||
|
return WrapSkipping(e, 1, v2.WithUserMessagef(format, args...))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Append is equivalent to Append(err, msg).
|
||||||
|
func (e *errImpl) Append(msg string) Error {
|
||||||
|
return WrapSkipping(e, 1, v2.AppendMessage(msg))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Appendf is equivalent to Appendf(err, format, msg).
|
||||||
|
func (e *errImpl) Appendf(format string, args ...interface{}) Error {
|
||||||
|
return WrapSkipping(e, 1, v2.AppendMessagef(format, args...))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prepend is equivalent to Prepend(err, msg).
|
||||||
|
func (e *errImpl) Prepend(msg string) Error {
|
||||||
|
return WrapSkipping(e, 1, v2.PrependMessage(msg))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prependf is equivalent to Prependf(err, format, args...).
|
||||||
|
func (e *errImpl) Prependf(format string, args ...interface{}) Error {
|
||||||
|
return WrapSkipping(e, 1, v2.PrependMessagef(format, args...))
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithCause is equivalent to WithCause(e, err).
|
||||||
|
func (e *errImpl) WithCause(err error) Error {
|
||||||
|
return WrapSkipping(e, 1, v2.WithCause(err))
|
||||||
|
}
|
||||||
|
|
||||||
|
// errImpl coerces an error to an Error
|
||||||
|
type errImpl struct {
|
||||||
|
err error
|
||||||
|
}
|
||||||
|
|
||||||
|
func coerce(err error) Error {
|
||||||
|
if err == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if e, ok := err.(Error); ok {
|
||||||
|
return e
|
||||||
|
}
|
||||||
|
|
||||||
|
return &errImpl{err}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Format implements fmt.Formatter.
|
||||||
|
func (e *errImpl) Format(s fmt.State, verb rune) {
|
||||||
|
// the inner err should always be an err produced
|
||||||
|
// by v2
|
||||||
|
if f, ok := e.err.(fmt.Formatter); ok {
|
||||||
|
f.Format(s, verb)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// should never happen, but fall back on something
|
||||||
|
switch verb {
|
||||||
|
case 'v':
|
||||||
|
if s.Flag('+') {
|
||||||
|
_, _ = io.WriteString(s, Details(e))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
fallthrough
|
||||||
|
case 's':
|
||||||
|
_, _ = io.WriteString(s, e.Error())
|
||||||
|
case 'q':
|
||||||
|
_, _ = fmt.Fprintf(s, "%q", e.Error())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Error implements the error interface.
|
||||||
|
func (e *errImpl) Error() string {
|
||||||
|
return e.err.Error()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unwrap returns the next wrapped error.
|
||||||
|
func (e *errImpl) Unwrap() error {
|
||||||
|
return e.err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cause implements Error.
|
||||||
|
func (e *errImpl) Cause() error {
|
||||||
|
return Cause(e.err)
|
||||||
|
}
|
90
vendor/github.com/ansel1/merry/doc.go
generated
vendored
Normal file
90
vendor/github.com/ansel1/merry/doc.go
generated
vendored
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
// Package merry provides enriched golang errors, with stacktraces
|
||||||
|
//
|
||||||
|
// merry creates errors with stacktraces, and can augment those errors with additional
|
||||||
|
// information.
|
||||||
|
//
|
||||||
|
// When you create a new merry error, or wrap an existing error in a merry error, merry attaches
|
||||||
|
// a stacktrace to the error:
|
||||||
|
//
|
||||||
|
// err := merry.New("an error occurred")
|
||||||
|
//
|
||||||
|
// err has a stacktrace attached. Alternately, you can wrap existing errors. merry will
|
||||||
|
// attach a stacktrace at the point of wrapping:
|
||||||
|
//
|
||||||
|
// _, err := ioutil.ReadAll(r)
|
||||||
|
// if err != nil {
|
||||||
|
// return merry.Wrap(err)
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// Capturing the stack can be globally disabled with `SetStackCaptureEnabled(false)`. Wrapping
|
||||||
|
// is idempotent: Wrap will only attach a stacktrace if the error doesn't already have one.
|
||||||
|
//
|
||||||
|
// Wrap() is the simplest way to attach a stacktrace to an error, but other functions can be
|
||||||
|
// used instead, with both add a stacktrace, and augment or modify the error. For example,
|
||||||
|
// Prepend() modifies the error's message (and also attaches a stacktrace):
|
||||||
|
//
|
||||||
|
// _, err := ioutil.ReadAll(r)
|
||||||
|
// if err != nil {
|
||||||
|
// return merry.Prepend(err, "reading from conn failed")
|
||||||
|
// // err.Error() would read something like "reading from conn failed: timeout"
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// See the other package functions for other ways to augment or modify errors, such as Append,
|
||||||
|
// WithUserMessage, WithHTTPCode, WithValue, etc. These functions all return a merry.Error interface, which
|
||||||
|
// has methods which mirror the package level functions, to allow simple chaining:
|
||||||
|
//
|
||||||
|
// return merry.New("object not found").WithHTTPCode(404)
|
||||||
|
//
|
||||||
|
// Here
|
||||||
|
//
|
||||||
|
// Wrap will not take a new stacktrace if an error already has one attached. Here will create
|
||||||
|
// a new error which replaces the stacktrace with a new one:
|
||||||
|
//
|
||||||
|
// var ErrOverflow = merry.New("overflowed")
|
||||||
|
//
|
||||||
|
// func Read() error {
|
||||||
|
// // ...
|
||||||
|
// return merry.Here(ErrOverflow)
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// Is
|
||||||
|
//
|
||||||
|
// The go idiom of exporting package-level error variables for comparison to errors returned
|
||||||
|
// by the package is broken by merry. For example:
|
||||||
|
//
|
||||||
|
// _, err := io.ReadAll(r)
|
||||||
|
// if err == io.EOF {
|
||||||
|
// // ...
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// If the error returned was a merry error, the equality comparison would always fail, because merry
|
||||||
|
// augments errors by wrapping them in layers. To compensate for this, merry has the Is() function.
|
||||||
|
//
|
||||||
|
// if merry.Is(err, io.EOF) {
|
||||||
|
//
|
||||||
|
// Is() will unwrap the err and compare each layer to the second argument.
|
||||||
|
//
|
||||||
|
// Cause
|
||||||
|
//
|
||||||
|
// You can add a cause to an error:
|
||||||
|
//
|
||||||
|
// if err == io.EOF {
|
||||||
|
// err = merry.New("reading failed"), err)
|
||||||
|
// fmt.Println(err.Error()) // reading failed: EOF
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// Cause(error) will return the cause of the argument. RootCause(error) returns the innermost cause.
|
||||||
|
// Is(err1, err2) is cause aware, and will return true if err2 is a cause (anywhere in the causal change)
|
||||||
|
// of err1.
|
||||||
|
//
|
||||||
|
// Formatting and printing
|
||||||
|
//
|
||||||
|
// To obtain an error's stacktrace, call Stack(). To get other information about the site
|
||||||
|
// of the error, or print the error's stacktrace, see Location(), SourceLine(), Stacktrace(), and Details().
|
||||||
|
//
|
||||||
|
// merry errors also implement the fmt.Formatter interface. errors support the following fmt flags:
|
||||||
|
//
|
||||||
|
// %+v print the equivalent of Details(err), which includes the user message, full stacktrace,
|
||||||
|
// and recursively prints the details of the cause chain.
|
||||||
|
//
|
||||||
|
package merry
|
304
vendor/github.com/ansel1/merry/errors.go
generated
vendored
Normal file
304
vendor/github.com/ansel1/merry/errors.go
generated
vendored
Normal file
@ -0,0 +1,304 @@
|
|||||||
|
package merry
|
||||||
|
|
||||||
|
// The merry package augments standard golang errors with stacktraces
|
||||||
|
// and other context information.
|
||||||
|
//
|
||||||
|
// You can add any context information to an error with `e = merry.WithValue(e, "code", 12345)`
|
||||||
|
// You can retrieve that value with `v, _ := merry.Value(e, "code").(int)`
|
||||||
|
//
|
||||||
|
// Any error augmented like this will automatically get a stacktrace attached, if it doesn't have one
|
||||||
|
// already. If you just want to add the stacktrace, use `Wrap(e)`
|
||||||
|
//
|
||||||
|
// It also providers a way to override an error's message:
|
||||||
|
//
|
||||||
|
// var InvalidInputs = errors.New("Bad inputs")
|
||||||
|
//
|
||||||
|
// `Here()` captures a new stacktrace, and WithMessagef() sets a new error message:
|
||||||
|
//
|
||||||
|
// return merry.Here(InvalidInputs).WithMessagef("Bad inputs: %v", inputs)
|
||||||
|
//
|
||||||
|
// Errors are immutable. All functions and methods which add context return new errors.
|
||||||
|
// But errors can still be compared to the originals with `Is()`
|
||||||
|
//
|
||||||
|
// if merry.Is(err, InvalidInputs) {
|
||||||
|
//
|
||||||
|
// Functions which add context to errors have equivalent methods on *Error, to allow
|
||||||
|
// convenient chaining:
|
||||||
|
//
|
||||||
|
// return merry.New("Invalid body").WithHTTPCode(400)
|
||||||
|
//
|
||||||
|
// merry.Errors also implement fmt.Formatter, similar to github.com/pkg/errors.
|
||||||
|
//
|
||||||
|
// fmt.Sprintf("%+v", e) == merry.Details(e)
|
||||||
|
//
|
||||||
|
// pkg/errors Cause() interface is not implemented (yet).
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
v2 "github.com/ansel1/merry/v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
// MaxStackDepth is no longer used. It remains here for backward compatibility.
|
||||||
|
// deprecated: See Set/GetMaxStackDepth.
|
||||||
|
var MaxStackDepth = 50
|
||||||
|
|
||||||
|
// StackCaptureEnabled returns whether stack capturing is enabled
|
||||||
|
func StackCaptureEnabled() bool {
|
||||||
|
return v2.StackCaptureEnabled()
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetStackCaptureEnabled sets stack capturing globally. Disabling stack capture can increase performance
|
||||||
|
func SetStackCaptureEnabled(enabled bool) {
|
||||||
|
v2.SetStackCaptureEnabled(enabled)
|
||||||
|
}
|
||||||
|
|
||||||
|
// VerboseDefault no longer has any effect.
|
||||||
|
// deprecated: see SetVerboseDefault
|
||||||
|
func VerboseDefault() bool {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetVerboseDefault used to control the behavior of the Error() function on errors
|
||||||
|
// processed by this package. Error() now always just returns the error's message.
|
||||||
|
// This setting no longer has any effect.
|
||||||
|
// deprecated: To print the details of an error, use Details(err), or format the
|
||||||
|
// error with the verbose flag: fmt.Sprintf("%+v", err)
|
||||||
|
func SetVerboseDefault(bool) {
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetMaxStackDepth returns the number of frames captured in stacks.
|
||||||
|
func GetMaxStackDepth() int {
|
||||||
|
return v2.MaxStackDepth()
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetMaxStackDepth sets the MaxStackDepth.
|
||||||
|
func SetMaxStackDepth(depth int) {
|
||||||
|
v2.SetMaxStackDepth(depth)
|
||||||
|
}
|
||||||
|
|
||||||
|
// New creates a new error, with a stack attached. The equivalent of golang's errors.New().
|
||||||
|
// Accepts v2 wrappers to apply to the error.
|
||||||
|
func New(msg string, wrappers ...v2.Wrapper) Error {
|
||||||
|
return WrapSkipping(errors.New(msg), 1, wrappers...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Errorf creates a new error with a formatted message and a stack. The equivalent of golang's fmt.Errorf().
|
||||||
|
// args can be format args, or v2 wrappers which will be applied to the error.
|
||||||
|
func Errorf(format string, args ...interface{}) Error {
|
||||||
|
var wrappers []v2.Wrapper
|
||||||
|
|
||||||
|
// pull out the args which are wrappers
|
||||||
|
n := 0
|
||||||
|
for _, arg := range args {
|
||||||
|
if w, ok := arg.(v2.Wrapper); ok {
|
||||||
|
wrappers = append(wrappers, w)
|
||||||
|
} else {
|
||||||
|
args[n] = arg
|
||||||
|
n++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
args = args[:n]
|
||||||
|
|
||||||
|
return WrapSkipping(fmt.Errorf(format, args...), 1, wrappers...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// UserError creates a new error with a message intended for display to an
|
||||||
|
// end user.
|
||||||
|
func UserError(msg string) Error {
|
||||||
|
return WrapSkipping(errors.New(msg), 1, v2.WithUserMessage(msg))
|
||||||
|
}
|
||||||
|
|
||||||
|
// UserErrorf is like UserError, but uses fmt.Sprintf()
|
||||||
|
func UserErrorf(format string, args ...interface{}) Error {
|
||||||
|
msg := fmt.Sprintf(format, args...)
|
||||||
|
return WrapSkipping(errors.New(msg), 1, v2.WithUserMessagef(msg))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wrap turns the argument into a merry.Error. If the argument already is a
|
||||||
|
// merry.Error, this is a no-op.
|
||||||
|
// If e == nil, return nil
|
||||||
|
func Wrap(err error, wrappers ...v2.Wrapper) Error {
|
||||||
|
return coerce(v2.WrapSkipping(err, 1, wrappers...))
|
||||||
|
}
|
||||||
|
|
||||||
|
// WrapSkipping turns the error arg into a merry.Error if the arg is not
|
||||||
|
// already a merry.Error.
|
||||||
|
// If e is nil, return nil.
|
||||||
|
// If a merry.Error is created by this call, the stack captured will skip
|
||||||
|
// `skip` frames (0 is the call site of `WrapSkipping()`)
|
||||||
|
func WrapSkipping(err error, skip int, wrappers ...v2.Wrapper) Error {
|
||||||
|
return coerce(v2.WrapSkipping(err, skip+1, wrappers...))
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithValue adds a context an error. If the key was already set on e,
|
||||||
|
// the new value will take precedence.
|
||||||
|
// If e is nil, returns nil.
|
||||||
|
func WithValue(err error, key, value interface{}) Error {
|
||||||
|
return WrapSkipping(err, 1, v2.WithValue(key, value))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Value returns the value for key, or nil if not set.
|
||||||
|
// If e is nil, returns nil.
|
||||||
|
func Value(err error, key interface{}) interface{} {
|
||||||
|
return v2.Value(err, key)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Values returns a map of all values attached to the error
|
||||||
|
// If a key has been attached multiple times, the map will
|
||||||
|
// contain the last value mapped
|
||||||
|
// If e is nil, returns nil.
|
||||||
|
func Values(err error) map[interface{}]interface{} {
|
||||||
|
return v2.Values(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// RegisteredDetails extracts details registered with RegisterDetailFunc from an error, and
|
||||||
|
// returns them as a map. Values may be nil.
|
||||||
|
//
|
||||||
|
// If err is nil or there are no registered details, nil is returned.
|
||||||
|
func RegisteredDetails(err error) map[string]interface{} {
|
||||||
|
return v2.RegisteredDetails(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Here returns an error with a new stacktrace, at the call site of Here().
|
||||||
|
// Useful when returning copies of exported package errors.
|
||||||
|
// If e is nil, returns nil.
|
||||||
|
func Here(err error) Error {
|
||||||
|
return WrapSkipping(err, 1, v2.CaptureStack(false))
|
||||||
|
}
|
||||||
|
|
||||||
|
// HereSkipping returns an error with a new stacktrace, at the call site
|
||||||
|
// of HereSkipping() - skip frames.
|
||||||
|
func HereSkipping(err error, skip int) Error {
|
||||||
|
return WrapSkipping(err, skip+1, v2.CaptureStack(false))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Message returns just returns err.Error(). It is here for
|
||||||
|
// historical reasons.
|
||||||
|
func Message(err error) string {
|
||||||
|
if err == nil {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
return err.Error()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Stack returns the stack attached to an error, or nil if one is not attached
|
||||||
|
// If e is nil, returns nil.
|
||||||
|
func Stack(err error) []uintptr {
|
||||||
|
return v2.Stack(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithHTTPCode returns an error with an http code attached.
|
||||||
|
// If e is nil, returns nil.
|
||||||
|
func WithHTTPCode(e error, code int) Error {
|
||||||
|
return WrapSkipping(e, 1, v2.WithHTTPCode(code))
|
||||||
|
}
|
||||||
|
|
||||||
|
// HTTPCode converts an error to an http status code. All errors
|
||||||
|
// map to 500, unless the error has an http code attached.
|
||||||
|
// If e is nil, returns 200.
|
||||||
|
func HTTPCode(err error) int {
|
||||||
|
return v2.HTTPCode(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// UserMessage returns the end-user safe message. Returns empty if not set.
|
||||||
|
// If e is nil, returns "".
|
||||||
|
func UserMessage(err error) string {
|
||||||
|
return v2.UserMessage(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cause returns the cause of the argument. If e is nil, or has no cause,
|
||||||
|
// nil is returned.
|
||||||
|
func Cause(err error) error {
|
||||||
|
return v2.Cause(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// RootCause returns the innermost cause of the argument (i.e. the last
|
||||||
|
// error in the cause chain)
|
||||||
|
func RootCause(err error) error {
|
||||||
|
for {
|
||||||
|
cause := Cause(err)
|
||||||
|
if cause == nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
err = cause
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithCause returns an error based on the first argument, with the cause
|
||||||
|
// set to the second argument. If e is nil, returns nil.
|
||||||
|
func WithCause(err error, cause error) Error {
|
||||||
|
return WrapSkipping(err, 1, v2.WithCause(cause))
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithMessage returns an error with a new message.
|
||||||
|
// The resulting error's Error() method will return
|
||||||
|
// the new message.
|
||||||
|
// If e is nil, returns nil.
|
||||||
|
func WithMessage(err error, msg string) Error {
|
||||||
|
return WrapSkipping(err, 1, v2.WithMessage(msg))
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithMessagef is the same as WithMessage(), using fmt.Sprintf().
|
||||||
|
func WithMessagef(err error, format string, args ...interface{}) Error {
|
||||||
|
return WrapSkipping(err, 1, v2.WithMessagef(format, args...))
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithUserMessage adds a message which is suitable for end users to see.
|
||||||
|
// If e is nil, returns nil.
|
||||||
|
func WithUserMessage(err error, msg string) Error {
|
||||||
|
return WrapSkipping(err, 1, v2.WithUserMessage(msg))
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithUserMessagef is the same as WithMessage(), using fmt.Sprintf()
|
||||||
|
func WithUserMessagef(err error, format string, args ...interface{}) Error {
|
||||||
|
return WrapSkipping(err, 1, v2.WithUserMessagef(format, args...))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Append a message after the current error message, in the format "original: new".
|
||||||
|
// If e == nil, return nil.
|
||||||
|
func Append(err error, msg string) Error {
|
||||||
|
return WrapSkipping(err, 1, v2.AppendMessage(msg))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Appendf is the same as Append, but uses fmt.Sprintf().
|
||||||
|
func Appendf(err error, format string, args ...interface{}) Error {
|
||||||
|
return WrapSkipping(err, 1, v2.AppendMessagef(format, args...))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prepend a message before the current error message, in the format "new: original".
|
||||||
|
// If e == nil, return nil.
|
||||||
|
func Prepend(err error, msg string) Error {
|
||||||
|
return WrapSkipping(err, 1, v2.PrependMessage(msg))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prependf is the same as Prepend, but uses fmt.Sprintf()
|
||||||
|
func Prependf(err error, format string, args ...interface{}) Error {
|
||||||
|
return WrapSkipping(err, 1, v2.PrependMessagef(format, args...))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Is is equivalent to errors.Is, but tests against multiple targets.
|
||||||
|
//
|
||||||
|
// merry.Is(err1, err2, err3) == errors.Is(err1, err2) || errors.Is(err1, err3)
|
||||||
|
func Is(e error, originals ...error) bool {
|
||||||
|
for _, o := range originals {
|
||||||
|
if errors.Is(e, o) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unwrap returns the innermost underlying error.
|
||||||
|
// This just calls errors.Unwrap() until if finds the deepest error.
|
||||||
|
// It isn't very useful, and only remains for historical purposes
|
||||||
|
//
|
||||||
|
// deprecated: use errors.Is() or errors.As() instead.
|
||||||
|
func Unwrap(e error) error {
|
||||||
|
for {
|
||||||
|
next := errors.Unwrap(e)
|
||||||
|
if next == nil {
|
||||||
|
return e
|
||||||
|
}
|
||||||
|
e = next
|
||||||
|
}
|
||||||
|
}
|
65
vendor/github.com/ansel1/merry/print.go
generated
vendored
Normal file
65
vendor/github.com/ansel1/merry/print.go
generated
vendored
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
package merry
|
||||||
|
|
||||||
|
import (
|
||||||
|
v2 "github.com/ansel1/merry/v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
// RegisterDetail registers an error property key in a global registry, with a label.
|
||||||
|
// The registry is used by the Details() function. Registered error properties will
|
||||||
|
// be included in Details() output, if the value of that error property is not nil.
|
||||||
|
// For example:
|
||||||
|
//
|
||||||
|
// err := New("boom")
|
||||||
|
// err = err.WithValue(colorKey, "red")
|
||||||
|
// fmt.Println(Details(err))
|
||||||
|
//
|
||||||
|
// // Output:
|
||||||
|
// // boom
|
||||||
|
// //
|
||||||
|
// // <stacktrace>
|
||||||
|
//
|
||||||
|
// RegisterDetail("Color", colorKey)
|
||||||
|
// fmt.Println(Details(err))
|
||||||
|
//
|
||||||
|
// // Output:
|
||||||
|
// // boom
|
||||||
|
// // Color: red
|
||||||
|
// //
|
||||||
|
// // <stacktrace>
|
||||||
|
//
|
||||||
|
// Error property keys are typically not exported by the packages which define them.
|
||||||
|
// Packages instead export functions which let callers access that property.
|
||||||
|
// It's therefore up to the package
|
||||||
|
// to register those properties which would make sense to include in the Details() output.
|
||||||
|
// In other words, it's up to the author of the package which generates the errors
|
||||||
|
// to publish printable error details, not the callers of the package.
|
||||||
|
func RegisterDetail(label string, key interface{}) {
|
||||||
|
v2.RegisterDetail(label, key)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Location returns zero values if e has no stacktrace
|
||||||
|
func Location(err error) (file string, line int) {
|
||||||
|
return v2.Location(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SourceLine returns the string representation of
|
||||||
|
// Location's result or an empty string if there's
|
||||||
|
// no stracktrace.
|
||||||
|
func SourceLine(err error) string {
|
||||||
|
return v2.SourceLine(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Stacktrace returns the error's stacktrace as a string formatted
|
||||||
|
// the same way as golangs runtime package.
|
||||||
|
// If e has no stacktrace, returns an empty string.
|
||||||
|
func Stacktrace(err error) string {
|
||||||
|
return v2.Stacktrace(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Details returns e.Error(), e's stacktrace, and any additional details which have
|
||||||
|
// be registered with RegisterDetail. User message and HTTP code are already registered.
|
||||||
|
//
|
||||||
|
// The details of each error in e's cause chain will also be printed.
|
||||||
|
func Details(err error) string {
|
||||||
|
return v2.Details(err)
|
||||||
|
}
|
6
vendor/github.com/nxadm/tail/LICENSE → vendor/github.com/ansel1/merry/v2/LICENSE
generated
vendored
6
vendor/github.com/nxadm/tail/LICENSE → vendor/github.com/ansel1/merry/v2/LICENSE
generated
vendored
@ -1,7 +1,6 @@
|
|||||||
# The MIT License (MIT)
|
The MIT License (MIT)
|
||||||
|
|
||||||
# © Copyright 2015 Hewlett Packard Enterprise Development LP
|
Copyright (c) 2015 Russ Egan
|
||||||
Copyright (c) 2014 ActiveState
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
@ -9,6 +8,7 @@ in the Software without restriction, including without limitation the rights
|
|||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
furnished to do so, subject to the following conditions:
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
The above copyright notice and this permission notice shall be included in all
|
||||||
copies or substantial portions of the Software.
|
copies or substantial portions of the Software.
|
||||||
|
|
41
vendor/github.com/ansel1/merry/v2/Makefile
generated
vendored
Normal file
41
vendor/github.com/ansel1/merry/v2/Makefile
generated
vendored
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
# Expands to list this project's go packages, excluding the vendor folder
|
||||||
|
SHELL = bash
|
||||||
|
|
||||||
|
all: fmt build test lint
|
||||||
|
|
||||||
|
build:
|
||||||
|
go build
|
||||||
|
|
||||||
|
|
||||||
|
lint:
|
||||||
|
golint -set_exit_status ./...
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -rf build
|
||||||
|
|
||||||
|
fmt:
|
||||||
|
go fmt ./...
|
||||||
|
|
||||||
|
test:
|
||||||
|
go test ./...
|
||||||
|
|
||||||
|
testall:
|
||||||
|
go test -count 1 ./...
|
||||||
|
|
||||||
|
coverage:
|
||||||
|
@if [ ! -d build ]; then mkdir build; fi
|
||||||
|
# runs go test and generate coverage report
|
||||||
|
go test -covermode=count -coverprofile=build/coverage.out ./...
|
||||||
|
go tool cover -html=build/coverage.out -o build/coverage.html
|
||||||
|
|
||||||
|
bench:
|
||||||
|
go test -bench ./...
|
||||||
|
|
||||||
|
### TOOLS
|
||||||
|
|
||||||
|
tools:
|
||||||
|
go get -u golang.org/x/tools/cmd/cover
|
||||||
|
go get -u golang.org/x/lint/golint
|
||||||
|
|
||||||
|
.PHONY: all build lint clean fmt test coverage tools
|
||||||
|
|
88
vendor/github.com/ansel1/merry/v2/README.md
generated
vendored
Normal file
88
vendor/github.com/ansel1/merry/v2/README.md
generated
vendored
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
merry [![Build](https://github.com/ansel1/merry/workflows/Build/badge.svg)](https://github.com/ansel1/merry/actions?query=branch%3Amaster+workflow%3ABuild+) [![GoDoc](https://godoc.org/github.com/ansel1/merry/v2?status.png)](https://godoc.org/github.com/ansel1/merry/v2) [![Go Report Card](https://goreportcard.com/badge/github.com/ansel1/merry/v2)](https://goreportcard.com/report/github.com/ansel1/merry/v2)
|
||||||
|
=====
|
||||||
|
|
||||||
|
Add context to errors, including automatic stack capture, cause chains, HTTP status code, user
|
||||||
|
messages, and arbitrary values.
|
||||||
|
|
||||||
|
The package is largely based on http://github.com/go-errors/errors, with additional
|
||||||
|
inspiration from https://github.com/go-errgo/errgo and https://github.com/amattn/deeperror.
|
||||||
|
|
||||||
|
Installation
|
||||||
|
------------
|
||||||
|
|
||||||
|
go get github.com/ansel1/merry/v2
|
||||||
|
|
||||||
|
Features
|
||||||
|
--------
|
||||||
|
|
||||||
|
Wrapped errors work a lot like google's golang.org/x/net/context package:
|
||||||
|
each wrapper error contains the inner error, a key, and a value.
|
||||||
|
Like contexts, errors are immutable: adding a key/value to an error
|
||||||
|
always creates a new error which wraps the original.
|
||||||
|
|
||||||
|
This package comes with built-in support for adding information to errors:
|
||||||
|
|
||||||
|
* stacktraces
|
||||||
|
* changing the error message
|
||||||
|
* HTTP status codes
|
||||||
|
* End user error messages
|
||||||
|
* causes
|
||||||
|
|
||||||
|
You can also add your own additional information.
|
||||||
|
|
||||||
|
The stack capturing feature can be turned off for better performance, though it's pretty fast. Benchmarks
|
||||||
|
on an 2017 MacBook Pro, with go 1.10:
|
||||||
|
|
||||||
|
BenchmarkNew_withStackCapture-8 2000000 749 ns/op
|
||||||
|
BenchmarkNew_withoutStackCapture-8 20000000 64.1 ns/op
|
||||||
|
|
||||||
|
Merry errors are fully compatible with errors.Is, As, and Unwrap.
|
||||||
|
|
||||||
|
Example
|
||||||
|
-------
|
||||||
|
|
||||||
|
To add a stacktrace, a user message, and an HTTP code to an error:
|
||||||
|
|
||||||
|
err = merry.Wrap(err, WithUserMessagef("Username %s not found.", username), WithHTTPCode(404))
|
||||||
|
|
||||||
|
To fetch context information from error:
|
||||||
|
|
||||||
|
userMsg := UserMessage(err)
|
||||||
|
statusCode := HTTPCode(err)
|
||||||
|
stacktrace := Stacktrace(err)
|
||||||
|
|
||||||
|
To print full details of the error:
|
||||||
|
|
||||||
|
log.Printf("%v+", err) // or log.Println(merry.Details(err))
|
||||||
|
|
||||||
|
v1 -> v2
|
||||||
|
--------
|
||||||
|
|
||||||
|
v1 used a fluent API style which proved awkward in some cases. In general, fluent APIs
|
||||||
|
don't work that well in go, because they interfere with how interfaces are typically used to
|
||||||
|
compose with other packages. v2 uses a functional options API style which more easily
|
||||||
|
allows other packages to augment this one.
|
||||||
|
|
||||||
|
This also fixed bad smell with v1's APIs: they mostly returned a big, ugly `merry.Error` interface,
|
||||||
|
instead of plain `error` instances. v2 has a smaller, simpler API, which exclusively uses plain
|
||||||
|
errors.
|
||||||
|
|
||||||
|
v2 also implements a simpler and more robust integration with errors.Is/As/Unwrap. v2's functions will
|
||||||
|
work with error wrapper chains even if those chains contain errors not created with this package, so
|
||||||
|
long as those errors conform to the Unwrap() convention.
|
||||||
|
|
||||||
|
v2 allows more granular control over stacktraces: stack capture can be turned on or off on individual errors,
|
||||||
|
overriding the global setting. External stacktraces can be used as well.
|
||||||
|
|
||||||
|
v1 has been reimplemented in terms of v2, and the versions are completely compatible, and can be mixed.
|
||||||
|
|
||||||
|
Plugs
|
||||||
|
-----
|
||||||
|
|
||||||
|
- Check out my HTTP client library: [github.com/gemalto/requester](https://github.com/gemalto/requester)
|
||||||
|
- Check out my log library: [github.com/gemalto/flume](https://github.com/gemalto/flume)
|
||||||
|
|
||||||
|
License
|
||||||
|
-------
|
||||||
|
|
||||||
|
This package is licensed under the MIT license, see LICENSE.MIT for details.
|
88
vendor/github.com/ansel1/merry/v2/config.go
generated
vendored
Normal file
88
vendor/github.com/ansel1/merry/v2/config.go
generated
vendored
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
package merry
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sync"
|
||||||
|
)
|
||||||
|
|
||||||
|
var maxStackDepth = 50
|
||||||
|
var captureStacks = true
|
||||||
|
|
||||||
|
// StackCaptureEnabled returns whether stack capturing is enabled.
|
||||||
|
func StackCaptureEnabled() bool {
|
||||||
|
return captureStacks
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetStackCaptureEnabled sets stack capturing globally. Disabling stack capture can increase performance.
|
||||||
|
// Capture can be forced or suppressed to override this global setting on a particular error.
|
||||||
|
func SetStackCaptureEnabled(enabled bool) {
|
||||||
|
captureStacks = enabled
|
||||||
|
}
|
||||||
|
|
||||||
|
// MaxStackDepth returns the number of frames captured in stacks.
|
||||||
|
func MaxStackDepth() int {
|
||||||
|
return maxStackDepth
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetMaxStackDepth sets the MaxStackDepth.
|
||||||
|
func SetMaxStackDepth(depth int) {
|
||||||
|
maxStackDepth = depth
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
RegisterDetail("User Message", errKeyUserMessage)
|
||||||
|
RegisterDetail("HTTP Code", errKeyHTTPCode)
|
||||||
|
}
|
||||||
|
|
||||||
|
var detailsLock sync.Mutex
|
||||||
|
var detailFields = map[string]func(err error) interface{}{}
|
||||||
|
|
||||||
|
// RegisterDetail registers an error property key in a global registry, with a label.
|
||||||
|
// See RegisterDetailFunc. This function just wraps a call to Value(key) and passes
|
||||||
|
// it to RegisterDetailFunc.
|
||||||
|
func RegisterDetail(label string, key interface{}) {
|
||||||
|
RegisterDetailFunc(label, func(err error) interface{} {
|
||||||
|
return Value(err, key)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// RegisterDetailFunc registers a label and a function for extracting a value from
|
||||||
|
// an error. When formatting errors produced by this package using the
|
||||||
|
// `%+v` placeholder, or when using Details(), these functions will be called
|
||||||
|
// on the error, and any non-nil values will be added to the text.
|
||||||
|
// For example:
|
||||||
|
//
|
||||||
|
// err := New("boom")
|
||||||
|
// err = err.WithValue(colorKey, "red")
|
||||||
|
// fmt.Println(Details(err))
|
||||||
|
//
|
||||||
|
// // Output:
|
||||||
|
// // boom
|
||||||
|
// //
|
||||||
|
// // <stacktrace>
|
||||||
|
//
|
||||||
|
// func Color(err) string {
|
||||||
|
// s, _ := Value(err, colorKey)
|
||||||
|
// return s
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// RegisterDetailFunc("color", Color)
|
||||||
|
// fmt.Println(Details(err))
|
||||||
|
//
|
||||||
|
// // Output:
|
||||||
|
// // boom
|
||||||
|
// // color: red
|
||||||
|
// //
|
||||||
|
// // <stacktrace>
|
||||||
|
//
|
||||||
|
// Error property keys are typically not exported by the packages which define them.
|
||||||
|
// Packages instead export functions which let callers access that property.
|
||||||
|
// It's therefore up to the package
|
||||||
|
// to register those properties which would make sense to include in the Details() output.
|
||||||
|
// In other words, it's up to the author of the package which generates the errors
|
||||||
|
// to publish printable error details, not the callers of the package.
|
||||||
|
func RegisterDetailFunc(label string, f func(err error) interface{}) {
|
||||||
|
detailsLock.Lock()
|
||||||
|
defer detailsLock.Unlock()
|
||||||
|
|
||||||
|
detailFields[label] = f
|
||||||
|
}
|
97
vendor/github.com/ansel1/merry/v2/doc.go
generated
vendored
Normal file
97
vendor/github.com/ansel1/merry/v2/doc.go
generated
vendored
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
// Package merry adds context to errors, including automatic stack capture, cause chains, HTTP status code, user
|
||||||
|
// messages, and arbitrary values.
|
||||||
|
//
|
||||||
|
// Wrapped errors work a lot like google's golang.org/x/net/context package:
|
||||||
|
// each wrapper error contains the inner error, a key, and a value.
|
||||||
|
// Like contexts, errors are immutable: adding a key/value to an error
|
||||||
|
// always creates a new error which wraps the original.
|
||||||
|
//
|
||||||
|
// This package comes with built-in support for adding information to errors:
|
||||||
|
//
|
||||||
|
// * stacktraces
|
||||||
|
// * changing the error message
|
||||||
|
// * HTTP status codes
|
||||||
|
// * End user error messages
|
||||||
|
// * causes
|
||||||
|
//
|
||||||
|
// You can also add your own additional information.
|
||||||
|
//
|
||||||
|
// The stack capturing feature can be turned off for better performance, though it's pretty fast. Benchmarks
|
||||||
|
// on an 2017 MacBook Pro, with go 1.10:
|
||||||
|
//
|
||||||
|
// BenchmarkNew_withStackCapture-8 2000000 749 ns/op
|
||||||
|
// BenchmarkNew_withoutStackCapture-8 20000000 64.1 ns/op
|
||||||
|
//
|
||||||
|
// Usage
|
||||||
|
//
|
||||||
|
// This package contains functions for creating errors, or wrapping existing errors. To create:
|
||||||
|
//
|
||||||
|
// err := New("boom!")
|
||||||
|
// err := Errorf("error fetching %s", filename)
|
||||||
|
//
|
||||||
|
// Additional context information can be attached to errors using functional options, called Wrappers:
|
||||||
|
//
|
||||||
|
// err := New("record not found", WithHTTPCode(404))
|
||||||
|
//
|
||||||
|
// Errorf() also accepts wrappers, mixed in with the format args:
|
||||||
|
//
|
||||||
|
// err := Errorf("user %s not found", username, WithHTTPCode(404))
|
||||||
|
//
|
||||||
|
// Wrappers can be applied to existing errors with Wrap():
|
||||||
|
//
|
||||||
|
// err = Wrap(err, WithHTTPCode(404))
|
||||||
|
//
|
||||||
|
// Wrap() will add a stacktrace to any error which doesn't already have one attached. WrapSkipping()
|
||||||
|
// can be used to control where the stacktrace starts.
|
||||||
|
//
|
||||||
|
// This package contains wrappers for adding specific context information to errors, such as an
|
||||||
|
// HTTPCode. You can create your own wrappers using the primitive Value(), WithValue(), and Set()
|
||||||
|
// functions.
|
||||||
|
//
|
||||||
|
// Errors produced by this package implement fmt.Formatter, to print additional information about the
|
||||||
|
// error:
|
||||||
|
//
|
||||||
|
// fmt.Printf("%v", err) // print error message and causes
|
||||||
|
// fmt.Printf("%s", err) // same as %s
|
||||||
|
// fmt.Printf("%q", err) // same as fmt.Printf("%q", err.Error())
|
||||||
|
// fmt.Printf("%v+", err) // print Details(err)
|
||||||
|
//
|
||||||
|
// Details() prints the error message, all causes, the stacktrace, and additional error
|
||||||
|
// values configured with RegisterDetailFunc(). By default, it will show the HTTP status
|
||||||
|
// code and user message.
|
||||||
|
//
|
||||||
|
// Stacktraces
|
||||||
|
//
|
||||||
|
// By default, any error created by or wrapped by this package will automatically have
|
||||||
|
// a stacktrace captured and attached to the error. This capture only happens if the
|
||||||
|
// error doesn't already have a stack attached to it, so wrapping the error with additional
|
||||||
|
// context won't capture additional stacks.
|
||||||
|
//
|
||||||
|
// When and how stacks are captured can be customized. SetMaxStackDepth() can globally configure
|
||||||
|
// how many frames to capture. SetStackCaptureEnabled() can globally configure whether
|
||||||
|
// stacks are captured by default.
|
||||||
|
//
|
||||||
|
// Wrap(err, NoStackCapture()) can be used to selectively suppress stack capture for a particular
|
||||||
|
// error.
|
||||||
|
//
|
||||||
|
// Wrap(err, CaptureStack(false)) will capture a new stack at the Wrap call site, even if the err
|
||||||
|
// already had an earlier stack attached. The new stack overrides the older stack.
|
||||||
|
//
|
||||||
|
// Wrap(err, CaptureStack(true)) will force a stack capture at the call site even if stack
|
||||||
|
// capture is disabled globally.
|
||||||
|
//
|
||||||
|
// Finally, Wrappers are passed a depth argument so they know how deep they are in the call stack
|
||||||
|
// from the call site where this package's API was called. This allows Wrappers to implement their
|
||||||
|
// own stack capturing logic.
|
||||||
|
//
|
||||||
|
// The package contains functions for creating new errors with stacks, or adding a stack to `error`
|
||||||
|
// instances. Functions with add context (e.g. `WithValue()`) work on any `error`, and will
|
||||||
|
// automatically convert them to merry errors (with a stack) if necessary.
|
||||||
|
//
|
||||||
|
// Hooks
|
||||||
|
//
|
||||||
|
// AddHooks() can install wrappers which are applied to all errors processed by this package. Hooks
|
||||||
|
// are applied before any other wrappers or processing takes place. They can be used to integrate
|
||||||
|
// with errors from other packages, normalizing errors (such as applying standard status codes to
|
||||||
|
// application errors), localizing user messages, or replacing the stack capturing mechanism.
|
||||||
|
package merry
|
334
vendor/github.com/ansel1/merry/v2/errors.go
generated
vendored
Normal file
334
vendor/github.com/ansel1/merry/v2/errors.go
generated
vendored
Normal file
@ -0,0 +1,334 @@
|
|||||||
|
package merry
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"runtime"
|
||||||
|
)
|
||||||
|
|
||||||
|
// New creates a new error, with a stack attached. The equivalent of golang's errors.New()
|
||||||
|
func New(msg string, wrappers ...Wrapper) error {
|
||||||
|
return WrapSkipping(errors.New(msg), 1, wrappers...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Errorf creates a new error with a formatted message and a stack. The equivalent of golang's fmt.Errorf().
|
||||||
|
// args may contain either arguments to format, or Wrapper options, which will be applied to the error.
|
||||||
|
func Errorf(format string, args ...interface{}) error {
|
||||||
|
fmtArgs, wrappers := splitWrappers(args)
|
||||||
|
|
||||||
|
return WrapSkipping(fmt.Errorf(format, fmtArgs...), 1, wrappers...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sentinel creates an error without running hooks or capturing a stack. It is intended
|
||||||
|
// to create sentinel errors, which will be wrapped with a stack later from where the
|
||||||
|
// error is returned. At that time, a stack will be captured and hooks will be run.
|
||||||
|
//
|
||||||
|
// var ErrNotFound = merry.Sentinel("not found", merry.WithHTTPCode(404))
|
||||||
|
//
|
||||||
|
// func FindUser(name string) (*User, error) {
|
||||||
|
// // some db code which fails to find a user
|
||||||
|
// return nil, merry.Wrap(ErrNotFound)
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// func main() {
|
||||||
|
// _, err := FindUser("bob")
|
||||||
|
// fmt.Println(errors.Is(err, ErrNotFound) // "true"
|
||||||
|
// fmt.Println(merry.Details(err)) // stacktrace will start at the return statement
|
||||||
|
// // in FindUser()
|
||||||
|
// }
|
||||||
|
func Sentinel(msg string, wrappers ...Wrapper) error {
|
||||||
|
return ApplySkipping(errors.New(msg), 1, wrappers...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sentinelf is like Sentinel, but takes a formatted message. args can be a mix of
|
||||||
|
// format arguments and Wrappers.
|
||||||
|
func Sentinelf(format string, args ...interface{}) error {
|
||||||
|
fmtArgs, wrappers := splitWrappers(args)
|
||||||
|
|
||||||
|
return ApplySkipping(fmt.Errorf(format, fmtArgs...), 1, wrappers...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func splitWrappers(args []interface{}) ([]interface{}, []Wrapper) {
|
||||||
|
var wrappers []Wrapper
|
||||||
|
|
||||||
|
// pull out the args which are wrappers
|
||||||
|
n := 0
|
||||||
|
for _, arg := range args {
|
||||||
|
if w, ok := arg.(Wrapper); ok {
|
||||||
|
wrappers = append(wrappers, w)
|
||||||
|
} else {
|
||||||
|
args[n] = arg
|
||||||
|
n++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
args = args[:n]
|
||||||
|
|
||||||
|
return args, wrappers
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wrap adds context to errors by applying Wrappers. See WithXXX() functions for Wrappers supplied
|
||||||
|
// by this package.
|
||||||
|
//
|
||||||
|
// If StackCaptureEnabled is true, a stack starting at the caller will be automatically captured
|
||||||
|
// and attached to the error. This behavior can be overridden with wrappers which either capture
|
||||||
|
// their own stacks, or suppress auto capture.
|
||||||
|
//
|
||||||
|
// If err is nil, returns nil.
|
||||||
|
func Wrap(err error, wrappers ...Wrapper) error {
|
||||||
|
return WrapSkipping(err, 1, wrappers...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// WrapSkipping is like Wrap, but the captured stacks will start `skip` frames
|
||||||
|
// further up the call stack. If skip is 0, it behaves the same as Wrap.
|
||||||
|
func WrapSkipping(err error, skip int, wrappers ...Wrapper) error {
|
||||||
|
if err == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(onceHooks) > 0 {
|
||||||
|
if _, ok := Lookup(err, errKeyHooked); !ok {
|
||||||
|
err = ApplySkipping(err, skip+1, onceHooks...)
|
||||||
|
err = ApplySkipping(err, skip+1, WithValue(errKeyHooked, err))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
err = ApplySkipping(err, skip+1, hooks...)
|
||||||
|
err = ApplySkipping(err, skip+1, wrappers...)
|
||||||
|
return captureStack(err, skip+1, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply is like Wrap, but does not execute hooks or do automatic stack capture. It just
|
||||||
|
// applies the wrappers to the error.
|
||||||
|
func Apply(err error, wrappers ...Wrapper) error {
|
||||||
|
return ApplySkipping(err, 1, wrappers...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ApplySkipping is like WrapSkipping, but does not execute hooks or do automatic stack capture. It just
|
||||||
|
// applies the wrappers to the error. It is useful in Wrapper implementations which
|
||||||
|
// // want to apply other Wrappers without starting an infinite recursion.
|
||||||
|
func ApplySkipping(err error, skip int, wrappers ...Wrapper) error {
|
||||||
|
if err == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, w := range wrappers {
|
||||||
|
err = w.Wrap(err, skip+1)
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prepend is a convenience function for the PrependMessage wrapper. It eases migration
|
||||||
|
// from merry v1. It accepts a varargs of additional Wrappers.
|
||||||
|
func Prepend(err error, msg string, wrappers ...Wrapper) error {
|
||||||
|
return WrapSkipping(err, 1, append(wrappers, PrependMessage(msg))...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prependf is a convenience function for the PrependMessagef wrapper. It eases migration
|
||||||
|
// from merry v1. The args can be format arguments mixed with Wrappers.
|
||||||
|
func Prependf(err error, format string, args ...interface{}) error {
|
||||||
|
fmtArgs, wrappers := splitWrappers(args)
|
||||||
|
|
||||||
|
return WrapSkipping(err, 1, append(wrappers, PrependMessagef(format, fmtArgs...))...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Append is a convenience function for the AppendMessage wrapper. It eases migration
|
||||||
|
// from merry v1. It accepts a varargs of additional Wrappers.
|
||||||
|
func Append(err error, msg string, wrappers ...Wrapper) error {
|
||||||
|
return WrapSkipping(err, 1, append(wrappers, AppendMessage(msg))...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Appendf is a convenience function for the AppendMessagef wrapper. It eases migration
|
||||||
|
// from merry v1. The args can be format arguments mixed with Wrappers.
|
||||||
|
func Appendf(err error, format string, args ...interface{}) error {
|
||||||
|
fmtArgs, wrappers := splitWrappers(args)
|
||||||
|
|
||||||
|
return WrapSkipping(err, 1, append(wrappers, AppendMessagef(format, fmtArgs...))...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Value returns the value for key, or nil if not set.
|
||||||
|
// If e is nil, returns nil. Will not search causes.
|
||||||
|
func Value(err error, key interface{}) interface{} {
|
||||||
|
v, _ := Lookup(err, key)
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
|
||||||
|
// Lookup returns the value for the key, and a boolean indicating
|
||||||
|
// whether the value was set. Will not search causes.
|
||||||
|
//
|
||||||
|
// if err is nil, returns nil and false.
|
||||||
|
func Lookup(err error, key interface{}) (interface{}, bool) {
|
||||||
|
var merr interface {
|
||||||
|
error
|
||||||
|
isMerryError()
|
||||||
|
}
|
||||||
|
|
||||||
|
// I've tried implementing this logic a few different ways. It's tricky:
|
||||||
|
//
|
||||||
|
// - Lookup should only search the current error, but not causes. errWithCause's
|
||||||
|
// Unwrap() will eventually unwrap to the cause, so we don't want to just
|
||||||
|
// search the entire stream of errors returned by Unwrap.
|
||||||
|
// - We need to handle cases where error implementations created outside
|
||||||
|
// this package are in the middle of the chain. We need to use Unwrap
|
||||||
|
// in these cases to traverse those errors and dig down to the next
|
||||||
|
// merry error.
|
||||||
|
// - Some error packages, including our own, do funky stuff with Unwrap(),
|
||||||
|
// returning shim types to control the unwrapping order, rather than
|
||||||
|
// the actual, raw wrapped error. Typically, these shims implement
|
||||||
|
// Is/As to delegate to the raw error they encapsulate, but implement
|
||||||
|
// Unwrap by encapsulating the raw error in another shim. So if we're looking
|
||||||
|
// for a raw error type, we can't just use Unwrap() and do type assertions
|
||||||
|
// against the result. We have to use errors.As(), to allow the shims to delegate
|
||||||
|
// the type assertion to the raw error correctly.
|
||||||
|
//
|
||||||
|
// Based on all these constraints, we use errors.As() with an internal interface
|
||||||
|
// that can only be implemented by our internal error types. When one is found,
|
||||||
|
// we handle each of our internal types as a special case. For errWithCause, we
|
||||||
|
// traverse to the wrapped error, ignoring the cause and the funky Unwrap logic.
|
||||||
|
// We could have just used errors.As(err, *errWithValue), but that would have
|
||||||
|
// traversed into the causes.
|
||||||
|
|
||||||
|
for {
|
||||||
|
switch t := err.(type) {
|
||||||
|
case *errWithValue:
|
||||||
|
if t.key == key {
|
||||||
|
return t.value, true
|
||||||
|
}
|
||||||
|
err = t.err
|
||||||
|
case *errWithCause:
|
||||||
|
err = t.err
|
||||||
|
default:
|
||||||
|
if errors.As(err, &merr) {
|
||||||
|
err = merr
|
||||||
|
} else {
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Values returns a map of all values attached to the error
|
||||||
|
// If a key has been attached multiple times, the map will
|
||||||
|
// contain the last value mapped
|
||||||
|
// If e is nil, returns nil.
|
||||||
|
func Values(err error) map[interface{}]interface{} {
|
||||||
|
var values map[interface{}]interface{}
|
||||||
|
|
||||||
|
for err != nil {
|
||||||
|
if e, ok := err.(*errWithValue); ok {
|
||||||
|
if _, ok := values[e.key]; !ok {
|
||||||
|
if values == nil {
|
||||||
|
values = map[interface{}]interface{}{}
|
||||||
|
}
|
||||||
|
values[e.key] = e.value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
err = errors.Unwrap(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return values
|
||||||
|
}
|
||||||
|
|
||||||
|
// Stack returns the stack attached to an error, or nil if one is not attached
|
||||||
|
// If e is nil, returns nil.
|
||||||
|
func Stack(err error) []uintptr {
|
||||||
|
stack, _ := Value(err, errKeyStack).([]uintptr)
|
||||||
|
return stack
|
||||||
|
}
|
||||||
|
|
||||||
|
// HTTPCode converts an error to an http status code. All errors
|
||||||
|
// map to 500, unless the error has an http code attached.
|
||||||
|
// If e is nil, returns 200.
|
||||||
|
func HTTPCode(err error) int {
|
||||||
|
if err == nil {
|
||||||
|
return 200
|
||||||
|
}
|
||||||
|
|
||||||
|
code, _ := Value(err, errKeyHTTPCode).(int)
|
||||||
|
if code == 0 {
|
||||||
|
return 500
|
||||||
|
}
|
||||||
|
|
||||||
|
return code
|
||||||
|
}
|
||||||
|
|
||||||
|
// UserMessage returns the end-user safe message. Returns empty if not set.
|
||||||
|
// If e is nil, returns "".
|
||||||
|
func UserMessage(err error) string {
|
||||||
|
msg, _ := Value(err, errKeyUserMessage).(string)
|
||||||
|
return msg
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cause returns the cause of the argument. If e is nil, or has no cause,
|
||||||
|
// nil is returned.
|
||||||
|
func Cause(err error) error {
|
||||||
|
var causer *errWithCause
|
||||||
|
if errors.As(err, &causer) {
|
||||||
|
return causer.cause
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// RegisteredDetails extracts details registered with RegisterDetailFunc from an error, and
|
||||||
|
// returns them as a map. Values may be nil.
|
||||||
|
//
|
||||||
|
// If err is nil or there are no registered details, nil is returned.
|
||||||
|
func RegisteredDetails(err error) map[string]interface{} {
|
||||||
|
detailsLock.Lock()
|
||||||
|
defer detailsLock.Unlock()
|
||||||
|
|
||||||
|
if len(detailFields) == 0 || err == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
dets := map[string]interface{}{}
|
||||||
|
|
||||||
|
for label, f := range detailFields {
|
||||||
|
dets[label] = f(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return dets
|
||||||
|
}
|
||||||
|
|
||||||
|
// captureStack: return an error with a stack attached. Stack will skip
|
||||||
|
// specified frames. skip = 0 will start at caller.
|
||||||
|
// If the err already has a stack, to auto-stack-capture is disabled globally,
|
||||||
|
// this is a no-op. Use force to override and force a stack capture
|
||||||
|
// in all cases.
|
||||||
|
func captureStack(err error, skip int, force bool) error {
|
||||||
|
if err == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var c interface {
|
||||||
|
Callers() []uintptr
|
||||||
|
}
|
||||||
|
|
||||||
|
switch {
|
||||||
|
case force:
|
||||||
|
// always capture
|
||||||
|
case HasStack(err):
|
||||||
|
return err
|
||||||
|
case errors.As(err, &c):
|
||||||
|
// if the go-errors already captured a stack
|
||||||
|
// reuse it
|
||||||
|
if stack := c.Callers(); len(stack) > 0 {
|
||||||
|
return Set(err, errKeyStack, stack)
|
||||||
|
}
|
||||||
|
case !captureStacks:
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
s := make([]uintptr, MaxStackDepth())
|
||||||
|
length := runtime.Callers(2+skip, s[:])
|
||||||
|
return Set(err, errKeyStack, s[:length])
|
||||||
|
}
|
||||||
|
|
||||||
|
// HasStack returns true if a stack is already attached to the err.
|
||||||
|
// If err == nil, returns false.
|
||||||
|
//
|
||||||
|
// If a stack capture was suppressed with NoCaptureStack(), this will
|
||||||
|
// still return true, indicating that stack capture processing has already
|
||||||
|
// occurred on this error.
|
||||||
|
func HasStack(err error) bool {
|
||||||
|
_, ok := Lookup(err, errKeyStack)
|
||||||
|
return ok
|
||||||
|
}
|
37
vendor/github.com/ansel1/merry/v2/hooks.go
generated
vendored
Normal file
37
vendor/github.com/ansel1/merry/v2/hooks.go
generated
vendored
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
package merry
|
||||||
|
|
||||||
|
var hooks []Wrapper
|
||||||
|
var onceHooks []Wrapper
|
||||||
|
|
||||||
|
// AddHooks installs a global set of Wrappers which are applied to every error processed
|
||||||
|
// by this package. They are applied before any other Wrappers or stack capturing are
|
||||||
|
// applied. Hooks can add additional wrappers to errors, or translate annotations added
|
||||||
|
// by other error libraries into merry annotations.
|
||||||
|
//
|
||||||
|
// Note that these hooks will be applied each time an err is passed to Wrap/Apply. If you
|
||||||
|
// only want your hook to run once per error, see AddOnceHooks.
|
||||||
|
//
|
||||||
|
// This function is not thread safe, and should only be called very early in program
|
||||||
|
// initialization.
|
||||||
|
func AddHooks(hook ...Wrapper) {
|
||||||
|
hooks = append(hooks, hook...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddOnceHooks is like AddHooks, but these hooks will only be applied once per error.
|
||||||
|
// Once hooks are applied to an error, the error is marked, and future Wrap/Apply calls
|
||||||
|
// on the error will not apply these hooks again.
|
||||||
|
//
|
||||||
|
// This function is not thread safe, and should only be called very early in program
|
||||||
|
// initialization.
|
||||||
|
func AddOnceHooks(hook ...Wrapper) {
|
||||||
|
onceHooks = append(onceHooks, hook...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ClearHooks removes all installed hooks.
|
||||||
|
//
|
||||||
|
// This function is not thread safe, and should only be called very early in program
|
||||||
|
// initialization.
|
||||||
|
func ClearHooks() {
|
||||||
|
hooks = nil
|
||||||
|
onceHooks = nil
|
||||||
|
}
|
167
vendor/github.com/ansel1/merry/v2/impl.go
generated
vendored
Normal file
167
vendor/github.com/ansel1/merry/v2/impl.go
generated
vendored
Normal file
@ -0,0 +1,167 @@
|
|||||||
|
package merry
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"reflect"
|
||||||
|
)
|
||||||
|
|
||||||
|
type errKey int
|
||||||
|
|
||||||
|
const (
|
||||||
|
errKeyNone errKey = iota
|
||||||
|
errKeyStack
|
||||||
|
errKeyMessage
|
||||||
|
errKeyHTTPCode
|
||||||
|
errKeyUserMessage
|
||||||
|
errKeyForceCapture
|
||||||
|
errKeyHooked
|
||||||
|
)
|
||||||
|
|
||||||
|
func (e errKey) String() string {
|
||||||
|
switch e {
|
||||||
|
case errKeyNone:
|
||||||
|
return "none"
|
||||||
|
case errKeyStack:
|
||||||
|
return "stack"
|
||||||
|
case errKeyMessage:
|
||||||
|
return "message"
|
||||||
|
case errKeyHTTPCode:
|
||||||
|
return "http status code"
|
||||||
|
case errKeyUserMessage:
|
||||||
|
return "user message"
|
||||||
|
case errKeyForceCapture:
|
||||||
|
return "force stack capture"
|
||||||
|
default:
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type errWithValue struct {
|
||||||
|
err error
|
||||||
|
key, value interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Format implements fmt.Formatter
|
||||||
|
func (e *errWithValue) Format(s fmt.State, verb rune) {
|
||||||
|
Format(s, verb, e)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Error implements golang's error interface
|
||||||
|
// returns the message value if set, otherwise
|
||||||
|
// delegates to inner error
|
||||||
|
func (e *errWithValue) Error() string {
|
||||||
|
if e.key == errKeyMessage {
|
||||||
|
if s, ok := e.value.(string); ok {
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return e.err.Error()
|
||||||
|
}
|
||||||
|
|
||||||
|
// String implements fmt.Stringer
|
||||||
|
func (e *errWithValue) String() string {
|
||||||
|
return e.Error()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unwrap returns the next wrapped error.
|
||||||
|
func (e *errWithValue) Unwrap() error {
|
||||||
|
return e.err
|
||||||
|
}
|
||||||
|
|
||||||
|
// isMerryError is a marker method for identifying error types implemented by this package.
|
||||||
|
func (e *errWithValue) isMerryError() {}
|
||||||
|
|
||||||
|
type errWithCause struct {
|
||||||
|
err error
|
||||||
|
cause error
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *errWithCause) Unwrap() error {
|
||||||
|
// skip through any directly nested errWithCauses.
|
||||||
|
// our implementation of Is/As already recursed through them,
|
||||||
|
// so we want to dig down to the first non-errWithCause.
|
||||||
|
|
||||||
|
nextErr := e.err
|
||||||
|
for {
|
||||||
|
if e, ok := nextErr.(*errWithCause); ok {
|
||||||
|
nextErr = e.err
|
||||||
|
} else {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// errWithCause.Is/As() also already checked nextErr, so we want to
|
||||||
|
// unwrap it and get to the next error down.
|
||||||
|
nextErr = errors.Unwrap(nextErr)
|
||||||
|
|
||||||
|
// we've reached the end of this wrapper chain. Return the cause.
|
||||||
|
if nextErr == nil {
|
||||||
|
return e.cause
|
||||||
|
}
|
||||||
|
|
||||||
|
// return a new errWithCause wrapper, wrapping next error, but bundling
|
||||||
|
// it will our cause, ignoring the causes of the errWithCauses we skip
|
||||||
|
// over above. This is how we carry the latest cause along as we unwrap
|
||||||
|
// the chain. When we get to the end of the chain, we'll return this latest
|
||||||
|
// cause.
|
||||||
|
return &errWithCause{err: nextErr, cause: e.cause}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *errWithCause) String() string {
|
||||||
|
return e.Error()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *errWithCause) Error() string {
|
||||||
|
return e.err.Error()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *errWithCause) Format(f fmt.State, verb rune) {
|
||||||
|
Format(f, verb, e)
|
||||||
|
}
|
||||||
|
|
||||||
|
// errWithCause needs to provide custome implementations of Is and As.
|
||||||
|
// errors.Is() doesn't work on errWithCause because error.Is() uses errors.Unwrap() to traverse the error
|
||||||
|
// chain. But errWithCause.Unwrap() doesn't return the next error in the chain. Instead,
|
||||||
|
// it wraps the next error in a shim. The standard Is/As tests would compare the shim to the target.
|
||||||
|
// We need to override Is/As to compare the target to the error inside the shim.
|
||||||
|
|
||||||
|
func (e *errWithCause) Is(target error) bool {
|
||||||
|
// This does most of what errors.Is() does, by delegating
|
||||||
|
// to the nested error. But it does not use Unwrap to recurse
|
||||||
|
// any further. This just compares target with next error in the stack.
|
||||||
|
isComparable := reflect.TypeOf(target).Comparable()
|
||||||
|
if isComparable && e.err == target {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// since errWithCause implements Is(), this will effectively recurse through
|
||||||
|
// any directly nested errWithCauses.
|
||||||
|
if x, ok := e.err.(interface{ Is(error) bool }); ok && x.Is(target) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *errWithCause) As(target interface{}) bool {
|
||||||
|
// This does most of what errors.As() does, by delegating
|
||||||
|
// to the nested error. But it does not use Unwrap to recurse
|
||||||
|
// any further. This just compares target with next error in the stack.
|
||||||
|
val := reflect.ValueOf(target)
|
||||||
|
typ := val.Type()
|
||||||
|
targetType := typ.Elem()
|
||||||
|
if reflect.TypeOf(e.err).AssignableTo(targetType) {
|
||||||
|
val.Elem().Set(reflect.ValueOf(e.err))
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// since errWithCause implements As(), this will effectively recurse through
|
||||||
|
// any directly nested errWithCauses.
|
||||||
|
if x, ok := e.err.(interface{ As(interface{}) bool }); ok && x.As(target) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// isMerryError is a marker method for identifying error types implemented by this package.
|
||||||
|
func (e *errWithCause) isMerryError() {}
|
144
vendor/github.com/ansel1/merry/v2/print.go
generated
vendored
Normal file
144
vendor/github.com/ansel1/merry/v2/print.go
generated
vendored
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
package merry
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"path"
|
||||||
|
"runtime"
|
||||||
|
"sort"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Location returns zero values if e has no stacktrace
|
||||||
|
func Location(err error) (file string, line int) {
|
||||||
|
s := Stack(err)
|
||||||
|
if len(s) > 0 {
|
||||||
|
fnc, _ := runtime.CallersFrames(s[:1]).Next()
|
||||||
|
return fnc.File, fnc.Line
|
||||||
|
}
|
||||||
|
return "", 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// SourceLine returns the string representation of
|
||||||
|
// Location's result or an empty string if there's
|
||||||
|
// no stracktrace.
|
||||||
|
func SourceLine(err error) string {
|
||||||
|
s := Stack(err)
|
||||||
|
if len(s) > 0 {
|
||||||
|
fnc, _ := runtime.CallersFrames(s[:1]).Next()
|
||||||
|
_, f := path.Split(fnc.File)
|
||||||
|
return fmt.Sprintf("%s (%s:%d)", fnc.Function, f, fnc.Line)
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
// FormattedStack returns the stack attached to an error, formatted as a slice of strings.
|
||||||
|
// Each string represents a frame in the stack, newest first. The strings may
|
||||||
|
// have internal newlines.
|
||||||
|
//
|
||||||
|
// Returns nil if no formatted stack and no stack is associated, or err is nil.
|
||||||
|
func FormattedStack(err error) []string {
|
||||||
|
formattedStack, _ := Value(err, errKeyStack).([]string)
|
||||||
|
if len(formattedStack) > 0 {
|
||||||
|
return formattedStack
|
||||||
|
}
|
||||||
|
|
||||||
|
s := Stack(err)
|
||||||
|
if len(s) > 0 {
|
||||||
|
lines := make([]string, 0, len(s))
|
||||||
|
|
||||||
|
frames := runtime.CallersFrames(s)
|
||||||
|
for {
|
||||||
|
frame, more := frames.Next()
|
||||||
|
lines = append(lines, fmt.Sprintf("%s\n\t%s:%d", frame.Function, frame.File, frame.Line))
|
||||||
|
if !more {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return lines
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Stacktrace returns the error's stacktrace as a string formatted.
|
||||||
|
// If e has no stacktrace, returns an empty string.
|
||||||
|
func Stacktrace(err error) string {
|
||||||
|
return strings.Join(FormattedStack(err), "\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Details returns e.Error(), e's stacktrace, and any additional details which have
|
||||||
|
// be registered with RegisterDetail. User message and HTTP code are already registered.
|
||||||
|
//
|
||||||
|
// The details of each error in e's cause chain will also be printed.
|
||||||
|
func Details(e error) string {
|
||||||
|
if e == nil {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
msg := e.Error()
|
||||||
|
var dets []string
|
||||||
|
|
||||||
|
detailsLock.Lock()
|
||||||
|
|
||||||
|
for label, f := range detailFields {
|
||||||
|
v := f(e)
|
||||||
|
if v != nil {
|
||||||
|
dets = append(dets, fmt.Sprintf("%s: %v", label, v))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
detailsLock.Unlock()
|
||||||
|
|
||||||
|
if len(dets) > 0 {
|
||||||
|
// sort so output is predictable
|
||||||
|
sort.Strings(dets)
|
||||||
|
msg += "\n" + strings.Join(dets, "\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
s := Stacktrace(e)
|
||||||
|
if s != "" {
|
||||||
|
msg += "\n\n" + s
|
||||||
|
}
|
||||||
|
|
||||||
|
if c := Cause(e); c != nil {
|
||||||
|
msg += "\n\nCaused By: " + Details(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
return msg
|
||||||
|
}
|
||||||
|
|
||||||
|
// Format adapts errors to fmt.Formatter interface. It's intended to be used
|
||||||
|
// help error impls implement fmt.Formatter, e.g.:
|
||||||
|
//
|
||||||
|
// func (e *myErr) Format(f fmt.State, verb rune) {
|
||||||
|
// Format(f, verb, e)
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
func Format(s fmt.State, verb rune, err error) {
|
||||||
|
switch verb {
|
||||||
|
case 'v':
|
||||||
|
if s.Flag('+') {
|
||||||
|
io.WriteString(s, Details(err))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
fallthrough
|
||||||
|
case 's':
|
||||||
|
io.WriteString(s, msgWithCauses(err))
|
||||||
|
case 'q':
|
||||||
|
fmt.Fprintf(s, "%q", err.Error())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func msgWithCauses(err error) string {
|
||||||
|
messages := make([]string, 0, 5)
|
||||||
|
|
||||||
|
for err != nil {
|
||||||
|
if ce := err.Error(); ce != "" {
|
||||||
|
messages = append(messages, ce)
|
||||||
|
}
|
||||||
|
err = Cause(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return strings.Join(messages, ": ")
|
||||||
|
}
|
183
vendor/github.com/ansel1/merry/v2/wrappers.go
generated
vendored
Normal file
183
vendor/github.com/ansel1/merry/v2/wrappers.go
generated
vendored
Normal file
@ -0,0 +1,183 @@
|
|||||||
|
package merry
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
// Wrapper knows how to wrap errors with context information.
|
||||||
|
type Wrapper interface {
|
||||||
|
// Wrap returns a new error, wrapping the argument, and typically adding some context information.
|
||||||
|
// skipCallers is how many callers to skip when capturing a stack to skip to the caller of the merry
|
||||||
|
// API surface. It's intended to make it possible to write wrappers which capture stacktraces. e.g.
|
||||||
|
//
|
||||||
|
// func CaptureStack() Wrapper {
|
||||||
|
// return WrapperFunc(func(err error, skipCallers int) error {
|
||||||
|
// s := make([]uintptr, 50)
|
||||||
|
// // Callers
|
||||||
|
// l := runtime.Callers(2+skipCallers, s[:])
|
||||||
|
// return WithStack(s[:l]).Wrap(err, skipCallers + 1)
|
||||||
|
// })
|
||||||
|
// }
|
||||||
|
Wrap(err error, skipCallers int) error
|
||||||
|
}
|
||||||
|
|
||||||
|
// WrapperFunc implements Wrapper.
|
||||||
|
type WrapperFunc func(error, int) error
|
||||||
|
|
||||||
|
// Wrap implements the Wrapper interface.
|
||||||
|
func (w WrapperFunc) Wrap(err error, callerDepth int) error {
|
||||||
|
return w(err, callerDepth+1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithValue associates a key/value pair with an error.
|
||||||
|
func WithValue(key, value interface{}) Wrapper {
|
||||||
|
return WrapperFunc(func(err error, _ int) error {
|
||||||
|
return Set(err, key, value)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithMessage overrides the value returned by err.Error().
|
||||||
|
func WithMessage(msg string) Wrapper {
|
||||||
|
return WithValue(errKeyMessage, msg)
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithMessagef overrides the value returned by err.Error().
|
||||||
|
func WithMessagef(format string, args ...interface{}) Wrapper {
|
||||||
|
return WrapperFunc(func(err error, _ int) error {
|
||||||
|
if err == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return Set(err, errKeyMessage, fmt.Sprintf(format, args...))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithUserMessage associates an end-user message with an error.
|
||||||
|
func WithUserMessage(msg string) Wrapper {
|
||||||
|
return WithValue(errKeyUserMessage, msg)
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithUserMessagef associates a formatted end-user message with an error.
|
||||||
|
func WithUserMessagef(format string, args ...interface{}) Wrapper {
|
||||||
|
return WrapperFunc(func(err error, _ int) error {
|
||||||
|
if err == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return Set(err, errKeyUserMessage, fmt.Sprintf(format, args...))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// AppendMessage a message after the current error message, in the format "original: new".
|
||||||
|
func AppendMessage(msg string) Wrapper {
|
||||||
|
return WrapperFunc(func(err error, _ int) error {
|
||||||
|
if err == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return Set(err, errKeyMessage, err.Error()+": "+msg)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// AppendMessagef is the same as AppendMessage, but with a formatted message.
|
||||||
|
func AppendMessagef(format string, args ...interface{}) Wrapper {
|
||||||
|
return WrapperFunc(func(err error, _ int) error {
|
||||||
|
if err == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return Set(err, errKeyMessage, err.Error()+": "+fmt.Sprintf(format, args...))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// PrependMessage a message before the current error message, in the format "new: original".
|
||||||
|
func PrependMessage(msg string) Wrapper {
|
||||||
|
return WrapperFunc(func(err error, _ int) error {
|
||||||
|
if err == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return Set(err, errKeyMessage, msg+": "+err.Error())
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// PrependMessagef is the same as PrependMessage, but with a formatted message.
|
||||||
|
func PrependMessagef(format string, args ...interface{}) Wrapper {
|
||||||
|
return WrapperFunc(func(err error, _ int) error {
|
||||||
|
if err == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return Set(err, errKeyMessage, fmt.Sprintf(format, args...)+": "+err.Error())
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithHTTPCode associates an HTTP status code with an error.
|
||||||
|
func WithHTTPCode(statusCode int) Wrapper {
|
||||||
|
return WithValue(errKeyHTTPCode, statusCode)
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithStack associates a stack of caller frames with an error. Generally, this package
|
||||||
|
// will automatically capture and associate a stack with errors which are created or
|
||||||
|
// wrapped by this package. But this allows the caller to associate an externally
|
||||||
|
// generated stack.
|
||||||
|
func WithStack(stack []uintptr) Wrapper {
|
||||||
|
return WithValue(errKeyStack, stack)
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithFormattedStack associates a stack of pre-formatted strings describing frames of a
|
||||||
|
// stacktrace. Generally, a formatted stack is generated from the raw []uintptr stack
|
||||||
|
// associated with the error, but a pre-formatted stack can be associated with the error
|
||||||
|
// instead, and takes precedence over the raw stack. This is useful if pre-formatted
|
||||||
|
// stack information is coming from some other source.
|
||||||
|
func WithFormattedStack(stack []string) Wrapper {
|
||||||
|
return WithValue(errKeyStack, stack)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NoCaptureStack will suppress capturing a stack, even if StackCaptureEnabled() == true.
|
||||||
|
func NoCaptureStack() Wrapper {
|
||||||
|
return WrapperFunc(func(err error, _ int) error {
|
||||||
|
// if this err already has a stack set, there is no need to set the
|
||||||
|
// stack property again, and we don't want to override the prior the stack
|
||||||
|
if HasStack(err) {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return Set(err, errKeyStack, nil)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// CaptureStack will override an earlier stack with a stack captured from the current
|
||||||
|
// call site. If StackCaptureEnabled() == false, this is a no-op.
|
||||||
|
//
|
||||||
|
// If force is set, StackCaptureEnabled() will be ignored: a stack will always be captured.
|
||||||
|
func CaptureStack(force bool) Wrapper {
|
||||||
|
return WrapperFunc(func(err error, callerDepth int) error {
|
||||||
|
return captureStack(err, callerDepth+1, force || StackCaptureEnabled())
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithCause sets one error as the cause of another error. This is useful for associating errors
|
||||||
|
// from lower API levels with sentinel errors in higher API levels. errors.Is() and errors.As()
|
||||||
|
// will traverse both the main chain of error wrappers, as well as down the chain of causes.
|
||||||
|
func WithCause(err error) Wrapper {
|
||||||
|
return WrapperFunc(func(nerr error, _ int) error {
|
||||||
|
if nerr == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return &errWithCause{err: nerr, cause: err}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set wraps an error with a key/value pair. This is the simplest form of associating
|
||||||
|
// a value with an error. It does not capture a stacktrace, invoke hooks, or do any
|
||||||
|
// other processing. It is mainly intended as a primitive for writing Wrapper implementations.
|
||||||
|
//
|
||||||
|
// if err is nil, returns nil.
|
||||||
|
//
|
||||||
|
// Keeping this private for now. If it proves useful, it may be made public later, but
|
||||||
|
// for now, external packages can get the same behavor with this:
|
||||||
|
//
|
||||||
|
// WithValue(key, value).Wrap(err)
|
||||||
|
//
|
||||||
|
func Set(err error, key, value interface{}) error {
|
||||||
|
if err == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return &errWithValue{
|
||||||
|
err: err,
|
||||||
|
key: key,
|
||||||
|
value: value,
|
||||||
|
}
|
||||||
|
}
|
4
vendor/github.com/aws/aws-sdk-go-v2/aws/credential_cache.go
generated
vendored
4
vendor/github.com/aws/aws-sdk-go-v2/aws/credential_cache.go
generated
vendored
@ -46,11 +46,11 @@ type CredentialsCacheOptions struct {
|
|||||||
// CredentialsCache will look for optional interfaces on the Provider to adjust
|
// CredentialsCache will look for optional interfaces on the Provider to adjust
|
||||||
// how the credential cache handles credentials caching.
|
// how the credential cache handles credentials caching.
|
||||||
//
|
//
|
||||||
// * HandleFailRefreshCredentialsCacheStrategy - Allows provider to handle
|
// - HandleFailRefreshCredentialsCacheStrategy - Allows provider to handle
|
||||||
// credential refresh failures. This could return an updated Credentials
|
// credential refresh failures. This could return an updated Credentials
|
||||||
// value, or attempt another means of retrieving credentials.
|
// value, or attempt another means of retrieving credentials.
|
||||||
//
|
//
|
||||||
// * AdjustExpiresByCredentialsCacheStrategy - Allows provider to adjust how
|
// - AdjustExpiresByCredentialsCacheStrategy - Allows provider to adjust how
|
||||||
// credentials Expires is modified. This could modify how the Credentials
|
// credentials Expires is modified. This could modify how the Credentials
|
||||||
// Expires is adjusted based on the CredentialsCache ExpiryWindow option.
|
// Expires is adjusted based on the CredentialsCache ExpiryWindow option.
|
||||||
// Such as providing a floor not to reduce the Expires below.
|
// Such as providing a floor not to reduce the Expires below.
|
||||||
|
4
vendor/github.com/aws/aws-sdk-go-v2/aws/doc.go
generated
vendored
4
vendor/github.com/aws/aws-sdk-go-v2/aws/doc.go
generated
vendored
@ -1,7 +1,7 @@
|
|||||||
// Package aws provides the core SDK's utilities and shared types. Use this package's
|
// Package aws provides the core SDK's utilities and shared types. Use this package's
|
||||||
// utilities to simplify setting and reading API operations parameters.
|
// utilities to simplify setting and reading API operations parameters.
|
||||||
//
|
//
|
||||||
// Value and Pointer Conversion Utilities
|
// # Value and Pointer Conversion Utilities
|
||||||
//
|
//
|
||||||
// This package includes a helper conversion utility for each scalar type the SDK's
|
// This package includes a helper conversion utility for each scalar type the SDK's
|
||||||
// API use. These utilities make getting a pointer of the scalar, and dereferencing
|
// API use. These utilities make getting a pointer of the scalar, and dereferencing
|
||||||
@ -42,7 +42,7 @@
|
|||||||
// // Convert []*string to []string
|
// // Convert []*string to []string
|
||||||
// strs = aws.ToStringSlice(strPtrs)
|
// strs = aws.ToStringSlice(strPtrs)
|
||||||
//
|
//
|
||||||
// SDK Default HTTP Client
|
// # SDK Default HTTP Client
|
||||||
//
|
//
|
||||||
// The SDK will use the http.DefaultClient if a HTTP client is not provided to
|
// The SDK will use the http.DefaultClient if a HTTP client is not provided to
|
||||||
// the SDK's Session, or service client constructor. This means that if the
|
// the SDK's Session, or service client constructor. This means that if the
|
||||||
|
2
vendor/github.com/aws/aws-sdk-go-v2/aws/go_module_metadata.go
generated
vendored
2
vendor/github.com/aws/aws-sdk-go-v2/aws/go_module_metadata.go
generated
vendored
@ -3,4 +3,4 @@
|
|||||||
package aws
|
package aws
|
||||||
|
|
||||||
// goModuleVersion is the tagged release for this module
|
// goModuleVersion is the tagged release for this module
|
||||||
const goModuleVersion = "1.16.7"
|
const goModuleVersion = "1.16.11"
|
||||||
|
2
vendor/github.com/aws/aws-sdk-go-v2/aws/logging.go
generated
vendored
2
vendor/github.com/aws/aws-sdk-go-v2/aws/logging.go
generated
vendored
@ -7,9 +7,11 @@ package aws
|
|||||||
// The entire 64-bit group is reserved for later expansion by the SDK.
|
// The entire 64-bit group is reserved for later expansion by the SDK.
|
||||||
//
|
//
|
||||||
// Example: Setting ClientLogMode to enable logging of retries and requests
|
// Example: Setting ClientLogMode to enable logging of retries and requests
|
||||||
|
//
|
||||||
// clientLogMode := aws.LogRetries | aws.LogRequest
|
// clientLogMode := aws.LogRetries | aws.LogRequest
|
||||||
//
|
//
|
||||||
// Example: Adding an additional log mode to an existing ClientLogMode value
|
// Example: Adding an additional log mode to an existing ClientLogMode value
|
||||||
|
//
|
||||||
// clientLogMode |= aws.LogResponse
|
// clientLogMode |= aws.LogResponse
|
||||||
type ClientLogMode uint64
|
type ClientLogMode uint64
|
||||||
|
|
||||||
|
2
vendor/github.com/aws/aws-sdk-go-v2/aws/middleware/user_agent.go
generated
vendored
2
vendor/github.com/aws/aws-sdk-go-v2/aws/middleware/user_agent.go
generated
vendored
@ -68,9 +68,11 @@ type requestUserAgent struct {
|
|||||||
// request.
|
// request.
|
||||||
//
|
//
|
||||||
// User-Agent example:
|
// User-Agent example:
|
||||||
|
//
|
||||||
// aws-sdk-go-v2/1.2.3
|
// aws-sdk-go-v2/1.2.3
|
||||||
//
|
//
|
||||||
// X-Amz-User-Agent example:
|
// X-Amz-User-Agent example:
|
||||||
|
//
|
||||||
// aws-sdk-go-v2/1.2.3 md/GOOS/linux md/GOARCH/amd64 lang/go/1.15
|
// aws-sdk-go-v2/1.2.3 md/GOOS/linux md/GOARCH/amd64 lang/go/1.15
|
||||||
func newRequestUserAgent() *requestUserAgent {
|
func newRequestUserAgent() *requestUserAgent {
|
||||||
userAgent, sdkAgent := smithyhttp.NewUserAgentBuilder(), smithyhttp.NewUserAgentBuilder()
|
userAgent, sdkAgent := smithyhttp.NewUserAgentBuilder(), smithyhttp.NewUserAgentBuilder()
|
||||||
|
6
vendor/github.com/aws/aws-sdk-go-v2/aws/retry/doc.go
generated
vendored
6
vendor/github.com/aws/aws-sdk-go-v2/aws/retry/doc.go
generated
vendored
@ -1,12 +1,12 @@
|
|||||||
// Package retry provides interfaces and implementations for SDK request retry behavior.
|
// Package retry provides interfaces and implementations for SDK request retry behavior.
|
||||||
//
|
//
|
||||||
// Retryer Interface and Implementations
|
// # Retryer Interface and Implementations
|
||||||
//
|
//
|
||||||
// This package defines Retryer interface that is used to either implement custom retry behavior
|
// This package defines Retryer interface that is used to either implement custom retry behavior
|
||||||
// or to extend the existing retry implementations provided by the SDK. This package provides a single
|
// or to extend the existing retry implementations provided by the SDK. This package provides a single
|
||||||
// retry implementation: Standard.
|
// retry implementation: Standard.
|
||||||
//
|
//
|
||||||
// Standard
|
// # Standard
|
||||||
//
|
//
|
||||||
// Standard is the default retryer implementation used by service clients. The standard retryer is a rate limited
|
// Standard is the default retryer implementation used by service clients. The standard retryer is a rate limited
|
||||||
// retryer that has a configurable max attempts to limit the number of retry attempts when a retryable error occurs.
|
// retryer that has a configurable max attempts to limit the number of retry attempts when a retryable error occurs.
|
||||||
@ -49,7 +49,7 @@
|
|||||||
// o.Retryer = customRetry
|
// o.Retryer = customRetry
|
||||||
// })
|
// })
|
||||||
//
|
//
|
||||||
// Utilities
|
// # Utilities
|
||||||
//
|
//
|
||||||
// A number of package functions have been provided to easily wrap retryer implementations in an implementation agnostic
|
// A number of package functions have been provided to easily wrap retryer implementations in an implementation agnostic
|
||||||
// way. These are:
|
// way. These are:
|
||||||
|
30
vendor/github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4/util.go
generated
vendored
30
vendor/github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4/util.go
generated
vendored
@ -46,19 +46,35 @@ func StripExcessSpaces(str string) string {
|
|||||||
return string(buf[:m])
|
return string(buf[:m])
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetURIPath returns the escaped URI component from the provided URL
|
// GetURIPath returns the escaped URI component from the provided URL.
|
||||||
func GetURIPath(u *url.URL) string {
|
func GetURIPath(u *url.URL) string {
|
||||||
var uri string
|
var uriPath string
|
||||||
|
|
||||||
if len(u.Opaque) > 0 {
|
if len(u.Opaque) > 0 {
|
||||||
uri = "/" + strings.Join(strings.Split(u.Opaque, "/")[3:], "/")
|
const schemeSep, pathSep, queryStart = "//", "/", "?"
|
||||||
|
|
||||||
|
opaque := u.Opaque
|
||||||
|
// Cut off the query string if present.
|
||||||
|
if idx := strings.Index(opaque, queryStart); idx >= 0 {
|
||||||
|
opaque = opaque[:idx]
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cutout the scheme separator if present.
|
||||||
|
if strings.Index(opaque, schemeSep) == 0 {
|
||||||
|
opaque = opaque[len(schemeSep):]
|
||||||
|
}
|
||||||
|
|
||||||
|
// capture URI path starting with first path separator.
|
||||||
|
if idx := strings.Index(opaque, pathSep); idx >= 0 {
|
||||||
|
uriPath = opaque[idx:]
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
uri = u.EscapedPath()
|
uriPath = u.EscapedPath()
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(uri) == 0 {
|
if len(uriPath) == 0 {
|
||||||
uri = "/"
|
uriPath = "/"
|
||||||
}
|
}
|
||||||
|
|
||||||
return uri
|
return uriPath
|
||||||
}
|
}
|
||||||
|
4
vendor/github.com/aws/aws-sdk-go-v2/aws/signer/v4/v4.go
generated
vendored
4
vendor/github.com/aws/aws-sdk-go-v2/aws/signer/v4/v4.go
generated
vendored
@ -3,10 +3,12 @@
|
|||||||
// Provides request signing for request that need to be signed with
|
// Provides request signing for request that need to be signed with
|
||||||
// AWS V4 Signatures.
|
// AWS V4 Signatures.
|
||||||
//
|
//
|
||||||
// Standalone Signer
|
// # Standalone Signer
|
||||||
//
|
//
|
||||||
// Generally using the signer outside of the SDK should not require any additional
|
// Generally using the signer outside of the SDK should not require any additional
|
||||||
|
//
|
||||||
// The signer does this by taking advantage of the URL.EscapedPath method. If your request URI requires
|
// The signer does this by taking advantage of the URL.EscapedPath method. If your request URI requires
|
||||||
|
//
|
||||||
// additional escaping you many need to use the URL.Opaque to define what the raw URI should be sent
|
// additional escaping you many need to use the URL.Opaque to define what the raw URI should be sent
|
||||||
// to the service as.
|
// to the service as.
|
||||||
//
|
//
|
||||||
|
16
vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/CHANGELOG.md
generated
vendored
16
vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/CHANGELOG.md
generated
vendored
@ -1,3 +1,19 @@
|
|||||||
|
# v1.1.18 (2022-08-11)
|
||||||
|
|
||||||
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
||||||
|
# v1.1.17 (2022-08-09)
|
||||||
|
|
||||||
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
||||||
|
# v1.1.16 (2022-08-08)
|
||||||
|
|
||||||
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
||||||
|
# v1.1.15 (2022-08-01)
|
||||||
|
|
||||||
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
||||||
# v1.1.14 (2022-07-05)
|
# v1.1.14 (2022-07-05)
|
||||||
|
|
||||||
* **Dependency Update**: Updated to the latest SDK module versions
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
2
vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/go_module_metadata.go
generated
vendored
2
vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/go_module_metadata.go
generated
vendored
@ -3,4 +3,4 @@
|
|||||||
package configsources
|
package configsources
|
||||||
|
|
||||||
// goModuleVersion is the tagged release for this module
|
// goModuleVersion is the tagged release for this module
|
||||||
const goModuleVersion = "1.1.14"
|
const goModuleVersion = "1.1.18"
|
||||||
|
16
vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/CHANGELOG.md
generated
vendored
16
vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/CHANGELOG.md
generated
vendored
@ -1,3 +1,19 @@
|
|||||||
|
# v2.4.12 (2022-08-11)
|
||||||
|
|
||||||
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
||||||
|
# v2.4.11 (2022-08-09)
|
||||||
|
|
||||||
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
||||||
|
# v2.4.10 (2022-08-08)
|
||||||
|
|
||||||
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
||||||
|
# v2.4.9 (2022-08-01)
|
||||||
|
|
||||||
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
||||||
# v2.4.8 (2022-07-05)
|
# v2.4.8 (2022-07-05)
|
||||||
|
|
||||||
* **Dependency Update**: Updated to the latest SDK module versions
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
2
vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/go_module_metadata.go
generated
vendored
2
vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/go_module_metadata.go
generated
vendored
@ -3,4 +3,4 @@
|
|||||||
package endpoints
|
package endpoints
|
||||||
|
|
||||||
// goModuleVersion is the tagged release for this module
|
// goModuleVersion is the tagged release for this module
|
||||||
const goModuleVersion = "2.4.8"
|
const goModuleVersion = "2.4.12"
|
||||||
|
16
vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/CHANGELOG.md
generated
vendored
16
vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/CHANGELOG.md
generated
vendored
@ -1,3 +1,19 @@
|
|||||||
|
# v1.9.12 (2022-08-11)
|
||||||
|
|
||||||
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
||||||
|
# v1.9.11 (2022-08-09)
|
||||||
|
|
||||||
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
||||||
|
# v1.9.10 (2022-08-08)
|
||||||
|
|
||||||
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
||||||
|
# v1.9.9 (2022-08-01)
|
||||||
|
|
||||||
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
||||||
# v1.9.8 (2022-07-05)
|
# v1.9.8 (2022-07-05)
|
||||||
|
|
||||||
* **Dependency Update**: Updated to the latest SDK module versions
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
@ -3,4 +3,4 @@
|
|||||||
package presignedurl
|
package presignedurl
|
||||||
|
|
||||||
// goModuleVersion is the tagged release for this module
|
// goModuleVersion is the tagged release for this module
|
||||||
const goModuleVersion = "1.9.8"
|
const goModuleVersion = "1.9.12"
|
||||||
|
16
vendor/github.com/aws/aws-sdk-go-v2/service/sts/CHANGELOG.md
generated
vendored
16
vendor/github.com/aws/aws-sdk-go-v2/service/sts/CHANGELOG.md
generated
vendored
@ -1,3 +1,19 @@
|
|||||||
|
# v1.16.13 (2022-08-11)
|
||||||
|
|
||||||
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
||||||
|
# v1.16.12 (2022-08-09)
|
||||||
|
|
||||||
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
||||||
|
# v1.16.11 (2022-08-08)
|
||||||
|
|
||||||
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
||||||
|
# v1.16.10 (2022-08-01)
|
||||||
|
|
||||||
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
||||||
# v1.16.9 (2022-07-05)
|
# v1.16.9 (2022-07-05)
|
||||||
|
|
||||||
* **Dependency Update**: Updated to the latest SDK module versions
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
2
vendor/github.com/aws/aws-sdk-go-v2/service/sts/go_module_metadata.go
generated
vendored
2
vendor/github.com/aws/aws-sdk-go-v2/service/sts/go_module_metadata.go
generated
vendored
@ -3,4 +3,4 @@
|
|||||||
package sts
|
package sts
|
||||||
|
|
||||||
// goModuleVersion is the tagged release for this module
|
// goModuleVersion is the tagged release for this module
|
||||||
const goModuleVersion = "1.16.9"
|
const goModuleVersion = "1.16.13"
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user