From 1302b4369687bb0a03633efa153f51985f69a7b4 Mon Sep 17 00:00:00 2001 From: Jan Wozniak Date: Fri, 17 Mar 2023 17:12:01 +0100 Subject: [PATCH 01/30] feat: add csi-snapshotter sidecar and external-snapshotter $ helm package charts/latest/csi-driver-nfs -d charts/latest/ --- charts/latest/csi-driver-nfs-v0.0.0.tgz | Bin 3804 -> 10237 bytes .../templates/csi-nfs-controller.yaml | 16 + .../templates/csi-snapshot-controller.yaml | 51 ++ .../templates/rbac-csi-nfs.yaml | 11 + .../templates/rbac-snapshot-controller.yaml | 93 ++++ ....storage.k8s.io_volumesnapshotclasses.yaml | 146 ++++++ ...storage.k8s.io_volumesnapshotcontents.yaml | 473 ++++++++++++++++++ ...apshot.storage.k8s.io_volumesnapshots.yaml | 387 ++++++++++++++ charts/latest/csi-driver-nfs/values.yaml | 14 + deploy/csi-nfs-controller.yaml | 14 + deploy/csi-snapshot-controller.yaml | 40 ++ deploy/install-driver.sh | 13 + deploy/rbac-csi-nfs.yaml | 9 + deploy/rbac-snapshot-controller.yaml | 82 +++ ....storage.k8s.io_volumesnapshotclasses.yaml | 144 ++++++ ...storage.k8s.io_volumesnapshotcontents.yaml | 471 +++++++++++++++++ ...apshot.storage.k8s.io_volumesnapshots.yaml | 385 ++++++++++++++ deploy/uninstall-driver.sh | 6 + hack/verify-helm-chart.sh | 8 +- test/external-e2e/run.sh | 5 +- test/external-e2e/testdriver.yaml | 3 + 21 files changed, 2368 insertions(+), 3 deletions(-) create mode 100644 charts/latest/csi-driver-nfs/templates/csi-snapshot-controller.yaml create mode 100644 charts/latest/csi-driver-nfs/templates/rbac-snapshot-controller.yaml create mode 100644 charts/latest/csi-driver-nfs/templates/snapshot.storage.k8s.io_volumesnapshotclasses.yaml create mode 100644 charts/latest/csi-driver-nfs/templates/snapshot.storage.k8s.io_volumesnapshotcontents.yaml create mode 100644 charts/latest/csi-driver-nfs/templates/snapshot.storage.k8s.io_volumesnapshots.yaml create mode 100644 deploy/csi-snapshot-controller.yaml create mode 100644 deploy/rbac-snapshot-controller.yaml create mode 100644 deploy/snapshot.storage.k8s.io_volumesnapshotclasses.yaml create mode 100644 deploy/snapshot.storage.k8s.io_volumesnapshotcontents.yaml create mode 100644 deploy/snapshot.storage.k8s.io_volumesnapshots.yaml diff --git a/charts/latest/csi-driver-nfs-v0.0.0.tgz b/charts/latest/csi-driver-nfs-v0.0.0.tgz index 0ef63816cffa7a70cb03f8a3ef1ee222c33b42c8..ea01024fa47be57cb2f54a76a184d03a9f865c49 100644 GIT binary patch literal 10237 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 delta 3781 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 diff --git a/charts/latest/csi-driver-nfs/templates/csi-nfs-controller.yaml b/charts/latest/csi-driver-nfs/templates/csi-nfs-controller.yaml index 255d93fe2..1f5b0c773 100644 --- a/charts/latest/csi-driver-nfs/templates/csi-nfs-controller.yaml +++ b/charts/latest/csi-driver-nfs/templates/csi-nfs-controller.yaml @@ -63,6 +63,22 @@ spec: resources: {{- toYaml .Values.controller.resources.csiProvisioner | nindent 12 }} securityContext: readOnlyRootFilesystem: true + {{- if .Values.externalSnapshotter.enabled }} + - name: csi-snapshotter + image: "{{ .Values.image.csiSnapshotter.repository }}:{{ .Values.image.csiSnapshotter.tag }}" + args: + - "--v=5" + - "--csi-address=$(ADDRESS)" + - "--leader-election-namespace={{ .Release.Namespace }}" + - "--leader-election" + env: + - name: ADDRESS + value: /csi/csi.sock + imagePullPolicy: {{ .Values.image.csiSnapshotter.pullPolicy }} + volumeMounts: + - name: socket-dir + mountPath: /csi + {{- end }} - name: liveness-probe image: "{{ .Values.image.livenessProbe.repository }}:{{ .Values.image.livenessProbe.tag }}" args: diff --git a/charts/latest/csi-driver-nfs/templates/csi-snapshot-controller.yaml b/charts/latest/csi-driver-nfs/templates/csi-snapshot-controller.yaml new file mode 100644 index 000000000..01ff7a60e --- /dev/null +++ b/charts/latest/csi-driver-nfs/templates/csi-snapshot-controller.yaml @@ -0,0 +1,51 @@ +{{- if .Values.externalSnapshotter.enabled -}} +# This YAML file shows how to deploy the snapshot controller + +# The snapshot controller implements the control loop for CSI snapshot functionality. +# It should be installed as part of the base Kubernetes distribution in an appropriate +# namespace for components implementing base system functionality. For installing with +# Vanilla Kubernetes, kube-system makes sense for the namespace. +--- +kind: Deployment +apiVersion: apps/v1 +metadata: + name: {{ .Values.externalSnapshotter.name }} + namespace: {{ .Release.Namespace }} +{{ include "nfs.labels" . | indent 2 }} + app: {{ .Values.externalSnapshotter.name }} +{{- with .Values.externalSnapshotter.labels }} +{{ . | toYaml | indent 4 }} +{{- end }} +{{- with .Values.externalSnapshotter.annotations }} + annotations: +{{ . | toYaml | indent 4 }} +{{- end }} +spec: + replicas: {{ .Values.externalSnapshotter.controller.replicas }} + selector: + matchLabels: + app: {{ .Values.externalSnapshotter.name }} + # the snapshot controller won't be marked as ready if the v1 CRDs are unavailable + # in #504 the snapshot-controller will exit after around 7.5 seconds if it + # can't find the v1 CRDs so this value should be greater than that + minReadySeconds: 15 + strategy: + rollingUpdate: + maxSurge: 0 + maxUnavailable: 1 + type: RollingUpdate + template: + metadata: + labels: + app: {{ .Values.externalSnapshotter.name }} + spec: + serviceAccountName: {{ .Values.externalSnapshotter.name }} + containers: + - name: {{ .Values.externalSnapshotter.name }} + image: {{ .Values.image.externalSnapshotter.repository }}:{{ .Values.image.externalSnapshotter.tag }} + args: + - "--v=5" + - "--leader-election=true" + - "--leader-election-namespace={{ .Release.Namespace }}" + imagePullPolicy: {{ .Values.image.externalSnapshotter.pullPolicy }} +{{- end -}} diff --git a/charts/latest/csi-driver-nfs/templates/rbac-csi-nfs.yaml b/charts/latest/csi-driver-nfs/templates/rbac-csi-nfs.yaml index bc94431d1..66c76ff72 100644 --- a/charts/latest/csi-driver-nfs/templates/rbac-csi-nfs.yaml +++ b/charts/latest/csi-driver-nfs/templates/rbac-csi-nfs.yaml @@ -32,6 +32,17 @@ rules: - apiGroups: ["storage.k8s.io"] resources: ["storageclasses"] verbs: ["get", "list", "watch"] + {{- if .Values.externalSnapshotter.enabled }} + - apiGroups: ["snapshot.storage.k8s.io"] + resources: ["volumesnapshotclasses", "volumesnapshots"] + verbs: ["get", "list", "watch"] + - apiGroups: ["snapshot.storage.k8s.io"] + resources: ["volumesnapshotcontents"] + verbs: ["get", "list", "watch", "update", "patch"] + - apiGroups: ["snapshot.storage.k8s.io"] + resources: ["volumesnapshotcontents/status"] + verbs: ["get", "update", "patch"] + {{- end }} - apiGroups: [""] resources: ["events"] verbs: ["get", "list", "watch", "create", "update", "patch"] diff --git a/charts/latest/csi-driver-nfs/templates/rbac-snapshot-controller.yaml b/charts/latest/csi-driver-nfs/templates/rbac-snapshot-controller.yaml new file mode 100644 index 000000000..f4fb5181b --- /dev/null +++ b/charts/latest/csi-driver-nfs/templates/rbac-snapshot-controller.yaml @@ -0,0 +1,93 @@ +{{- if .Values.externalSnapshotter.enabled -}} +# RBAC file for the snapshot controller. +# +# The snapshot controller implements the control loop for CSI snapshot functionality. +# It should be installed as part of the base Kubernetes distribution in an appropriate +# namespace for components implementing base system functionality. For installing with +# Vanilla Kubernetes, kube-system makes sense for the namespace. +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ .Values.externalSnapshotter.name }} + namespace: {{ .Release.Namespace }} +{{ include "nfs.labels" . | indent 2 }} + +--- +kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: {{ .Values.externalSnapshotter.name }}-runner +{{ include "nfs.labels" . | indent 2 }} +rules: + - apiGroups: [""] + resources: ["persistentvolumes"] + verbs: ["get", "list", "watch"] + - apiGroups: [""] + resources: ["persistentvolumeclaims"] + verbs: ["get", "list", "watch", "update"] + - apiGroups: [""] + resources: ["events"] + verbs: ["list", "watch", "create", "update", "patch"] + - apiGroups: ["snapshot.storage.k8s.io"] + resources: ["volumesnapshotclasses"] + verbs: ["get", "list", "watch"] + - apiGroups: ["snapshot.storage.k8s.io"] + resources: ["volumesnapshotcontents"] + verbs: ["create", "get", "list", "watch", "update", "delete", "patch"] + - apiGroups: ["snapshot.storage.k8s.io"] + resources: ["volumesnapshotcontents/status"] + verbs: ["patch"] + - apiGroups: ["snapshot.storage.k8s.io"] + resources: ["volumesnapshots"] + verbs: ["get", "list", "watch", "update", "patch"] + - apiGroups: ["snapshot.storage.k8s.io"] + resources: ["volumesnapshots/status"] + verbs: ["update", "patch"] +{{- if .Values.externalSnapshotter.enabledDistributedSnapshotting }} + - apiGroups: [""] + resources: ["nodes"] + verbs: ["get", "list", "watch"] +{{- end }} +--- +kind: ClusterRoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: {{ .Values.externalSnapshotter.name }}-role +{{ include "nfs.labels" . | indent 2 }} +subjects: + - kind: ServiceAccount + name: {{ .Values.externalSnapshotter.name }} + namespace: {{ .Release.Namespace }} +roleRef: + kind: ClusterRole + name: {{ .Values.externalSnapshotter.name }}-runner + apiGroup: rbac.authorization.k8s.io + +--- +kind: Role +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: {{ .Values.externalSnapshotter.name }}-leaderelection + namespace: {{ .Release.Namespace }} +{{ include "nfs.labels" . | indent 2 }} +rules: + - apiGroups: ["coordination.k8s.io"] + resources: ["leases"] + verbs: ["get", "watch", "list", "delete", "update", "create"] + +--- +kind: RoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: {{ .Values.externalSnapshotter.name }}-leaderelection + namespace: {{ .Release.Namespace }} +{{ include "nfs.labels" . | indent 2 }} +subjects: + - kind: ServiceAccount + name: {{ .Values.externalSnapshotter.name }} +roleRef: + kind: Role + name: {{ .Values.externalSnapshotter.name }}-leaderelection + apiGroup: rbac.authorization.k8s.io +{{- end -}} diff --git a/charts/latest/csi-driver-nfs/templates/snapshot.storage.k8s.io_volumesnapshotclasses.yaml b/charts/latest/csi-driver-nfs/templates/snapshot.storage.k8s.io_volumesnapshotclasses.yaml new file mode 100644 index 000000000..a4464c626 --- /dev/null +++ b/charts/latest/csi-driver-nfs/templates/snapshot.storage.k8s.io_volumesnapshotclasses.yaml @@ -0,0 +1,146 @@ +{{- if .Values.externalSnapshotter.enabled -}} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.8.0 + api-approved.kubernetes.io: https://github.com/kubernetes-csi/external-snapshotter/pull/665 + name: volumesnapshotclasses.snapshot.storage.k8s.io +spec: + group: snapshot.storage.k8s.io + names: + kind: VolumeSnapshotClass + listKind: VolumeSnapshotClassList + plural: volumesnapshotclasses + shortNames: [vsclass, vsclasses] + singular: volumesnapshotclass + scope: Cluster + versions: + - additionalPrinterColumns: + - jsonPath: .driver + name: Driver + type: string + - description: Determines whether a VolumeSnapshotContent created through + the VolumeSnapshotClass should be deleted when its bound VolumeSnapshot + is deleted. + jsonPath: .deletionPolicy + name: DeletionPolicy + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1 + schema: + openAPIV3Schema: + description: VolumeSnapshotClass specifies parameters that a underlying + storage system uses when creating a volume snapshot. A specific VolumeSnapshotClass + is used by specifying its name in a VolumeSnapshot object. VolumeSnapshotClasses + are non-namespaced + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + deletionPolicy: + description: deletionPolicy determines whether a VolumeSnapshotContent + created through the VolumeSnapshotClass should be deleted when its + bound VolumeSnapshot is deleted. Supported values are "Retain" and + "Delete". "Retain" means that the VolumeSnapshotContent and its physical + snapshot on underlying storage system are kept. "Delete" means that + the VolumeSnapshotContent and its physical snapshot on underlying + storage system are deleted. Required. + enum: [Delete, Retain] + type: string + driver: + description: driver is the name of the storage driver that handles this + VolumeSnapshotClass. Required. + type: string + kind: + description: 'Kind is a string value representing the REST resource + this object represents. Servers may infer this from the endpoint the + client submits requests to. Cannot be updated. In CamelCase. More + info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + parameters: + additionalProperties: + type: string + description: parameters is a key-value map with storage driver specific + parameters for creating snapshots. These values are opaque to Kubernetes. + type: object + required: [deletionPolicy, driver] + type: object + served: true + storage: true + subresources: {} + - additionalPrinterColumns: + - jsonPath: .driver + name: Driver + type: string + - description: Determines whether a VolumeSnapshotContent created through + the VolumeSnapshotClass should be deleted when its bound VolumeSnapshot + is deleted. + jsonPath: .deletionPolicy + name: DeletionPolicy + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + # This indicates the v1beta1 version of the custom resource is deprecated. + # API requests to this version receive a warning in the server response. + deprecated: true + # This overrides the default warning returned to clients making v1beta1 API requests. + deprecationWarning: snapshot.storage.k8s.io/v1beta1 VolumeSnapshotClass is deprecated; + use snapshot.storage.k8s.io/v1 VolumeSnapshotClass + schema: + openAPIV3Schema: + description: VolumeSnapshotClass specifies parameters that a underlying + storage system uses when creating a volume snapshot. A specific VolumeSnapshotClass + is used by specifying its name in a VolumeSnapshot object. VolumeSnapshotClasses + are non-namespaced + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + deletionPolicy: + description: deletionPolicy determines whether a VolumeSnapshotContent + created through the VolumeSnapshotClass should be deleted when its + bound VolumeSnapshot is deleted. Supported values are "Retain" and + "Delete". "Retain" means that the VolumeSnapshotContent and its physical + snapshot on underlying storage system are kept. "Delete" means that + the VolumeSnapshotContent and its physical snapshot on underlying + storage system are deleted. Required. + enum: [Delete, Retain] + type: string + driver: + description: driver is the name of the storage driver that handles this + VolumeSnapshotClass. Required. + type: string + kind: + description: 'Kind is a string value representing the REST resource + this object represents. Servers may infer this from the endpoint the + client submits requests to. Cannot be updated. In CamelCase. More + info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + parameters: + additionalProperties: + type: string + description: parameters is a key-value map with storage driver specific + parameters for creating snapshots. These values are opaque to Kubernetes. + type: object + required: [deletionPolicy, driver] + type: object + served: false + storage: false + subresources: {} +status: + acceptedNames: + kind: '' + plural: '' + conditions: [] + storedVersions: [] +{{- end -}} diff --git a/charts/latest/csi-driver-nfs/templates/snapshot.storage.k8s.io_volumesnapshotcontents.yaml b/charts/latest/csi-driver-nfs/templates/snapshot.storage.k8s.io_volumesnapshotcontents.yaml new file mode 100644 index 000000000..0ff8596e0 --- /dev/null +++ b/charts/latest/csi-driver-nfs/templates/snapshot.storage.k8s.io_volumesnapshotcontents.yaml @@ -0,0 +1,473 @@ +{{- if .Values.externalSnapshotter.enabled -}} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.8.0 + api-approved.kubernetes.io: https://github.com/kubernetes-csi/external-snapshotter/pull/665 + name: volumesnapshotcontents.snapshot.storage.k8s.io +spec: + group: snapshot.storage.k8s.io + names: + kind: VolumeSnapshotContent + listKind: VolumeSnapshotContentList + plural: volumesnapshotcontents + shortNames: [vsc, vscs] + singular: volumesnapshotcontent + scope: Cluster + versions: + - additionalPrinterColumns: + - description: Indicates if the snapshot is ready to be used to restore a + volume. + jsonPath: .status.readyToUse + name: ReadyToUse + type: boolean + - description: Represents the complete size of the snapshot in bytes + jsonPath: .status.restoreSize + name: RestoreSize + type: integer + - description: Determines whether this VolumeSnapshotContent and its physical + snapshot on the underlying storage system should be deleted when its bound + VolumeSnapshot is deleted. + jsonPath: .spec.deletionPolicy + name: DeletionPolicy + type: string + - description: Name of the CSI driver used to create the physical snapshot + on the underlying storage system. + jsonPath: .spec.driver + name: Driver + type: string + - description: Name of the VolumeSnapshotClass to which this snapshot belongs. + jsonPath: .spec.volumeSnapshotClassName + name: VolumeSnapshotClass + type: string + - description: Name of the VolumeSnapshot object to which this VolumeSnapshotContent + object is bound. + jsonPath: .spec.volumeSnapshotRef.name + name: VolumeSnapshot + type: string + - description: Namespace of the VolumeSnapshot object to which this VolumeSnapshotContent + object is bound. + jsonPath: .spec.volumeSnapshotRef.namespace + name: VolumeSnapshotNamespace + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1 + schema: + openAPIV3Schema: + description: VolumeSnapshotContent represents the actual "on-disk" snapshot + object in the underlying storage system + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource + this object represents. Servers may infer this from the endpoint the + client submits requests to. Cannot be updated. In CamelCase. More + info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + spec: + description: spec defines properties of a VolumeSnapshotContent created + by the underlying storage system. Required. + properties: + deletionPolicy: + description: deletionPolicy determines whether this VolumeSnapshotContent + and its physical snapshot on the underlying storage system should + be deleted when its bound VolumeSnapshot is deleted. Supported + values are "Retain" and "Delete". "Retain" means that the VolumeSnapshotContent + and its physical snapshot on underlying storage system are kept. + "Delete" means that the VolumeSnapshotContent and its physical + snapshot on underlying storage system are deleted. For dynamically + provisioned snapshots, this field will automatically be filled + in by the CSI snapshotter sidecar with the "DeletionPolicy" field + defined in the corresponding VolumeSnapshotClass. For pre-existing + snapshots, users MUST specify this field when creating the VolumeSnapshotContent + object. Required. + enum: [Delete, Retain] + type: string + driver: + description: driver is the name of the CSI driver used to create + the physical snapshot on the underlying storage system. This MUST + be the same as the name returned by the CSI GetPluginName() call + for that driver. Required. + type: string + source: + description: source specifies whether the snapshot is (or should + be) dynamically provisioned or already exists, and just requires + a Kubernetes object representation. This field is immutable after + creation. Required. + properties: + snapshotHandle: + description: snapshotHandle specifies the CSI "snapshot_id" + of a pre-existing snapshot on the underlying storage system + for which a Kubernetes object representation was (or should + be) created. This field is immutable. + type: string + volumeHandle: + description: volumeHandle specifies the CSI "volume_id" of the + volume from which a snapshot should be dynamically taken from. + This field is immutable. + type: string + type: object + oneOf: + - required: [snapshotHandle] + - required: [volumeHandle] + sourceVolumeMode: + description: SourceVolumeMode is the mode of the volume whose snapshot + is taken. Can be either “Filesystem” or “Block”. If not specified, + it indicates the source volume's mode is unknown. This field is + immutable. This field is an alpha field. + type: string + volumeSnapshotClassName: + description: name of the VolumeSnapshotClass from which this snapshot + was (or will be) created. Note that after provisioning, the VolumeSnapshotClass + may be deleted or recreated with different set of values, and + as such, should not be referenced post-snapshot creation. + type: string + volumeSnapshotRef: + description: volumeSnapshotRef specifies the VolumeSnapshot object + to which this VolumeSnapshotContent object is bound. VolumeSnapshot.Spec.VolumeSnapshotContentName + field must reference to this VolumeSnapshotContent's name for + the bidirectional binding to be valid. For a pre-existing VolumeSnapshotContent + object, name and namespace of the VolumeSnapshot object MUST be + provided for binding to happen. This field is immutable after + creation. Required. + properties: + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: 'If referring to a piece of an object instead of + an entire object, this string should contain a valid JSON/Go + field access statement, such as desiredState.manifest.containers[2]. + For example, if the object reference is to a container within + a pod, this would take on a value like: "spec.containers{name}" + (where "name" refers to the name of the container that triggered + the event) or if no container name is specified "spec.containers[2]" + (container with index 2 in this pod). This syntax is chosen + only to have some well-defined way of referencing a part of + an object. TODO: this design is not final and this field is + subject to change in the future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + type: string + resourceVersion: + description: 'Specific resourceVersion to which this reference + is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + type: object + required: [deletionPolicy, driver, source, volumeSnapshotRef] + type: object + status: + description: status represents the current information of a snapshot. + properties: + creationTime: + description: creationTime is the timestamp when the point-in-time + snapshot is taken by the underlying storage system. In dynamic + snapshot creation case, this field will be filled in by the CSI + snapshotter sidecar with the "creation_time" value returned from + CSI "CreateSnapshot" gRPC call. For a pre-existing snapshot, this + field will be filled with the "creation_time" value returned from + the CSI "ListSnapshots" gRPC call if the driver supports it. If + not specified, it indicates the creation time is unknown. The + format of this field is a Unix nanoseconds time encoded as an + int64. On Unix, the command `date +%s%N` returns the current time + in nanoseconds since 1970-01-01 00:00:00 UTC. + format: int64 + type: integer + error: + description: error is the last observed error during snapshot creation, + if any. Upon success after retry, this error field will be cleared. + properties: + message: + description: 'message is a string detailing the encountered + error during snapshot creation if specified. NOTE: message + may be logged, and it should not contain sensitive information.' + type: string + time: + description: time is the timestamp when the error was encountered. + format: date-time + type: string + type: object + readyToUse: + description: readyToUse indicates if a snapshot is ready to be used + to restore a volume. In dynamic snapshot creation case, this field + will be filled in by the CSI snapshotter sidecar with the "ready_to_use" + value returned from CSI "CreateSnapshot" gRPC call. For a pre-existing + snapshot, this field will be filled with the "ready_to_use" value + returned from the CSI "ListSnapshots" gRPC call if the driver + supports it, otherwise, this field will be set to "True". If not + specified, it means the readiness of a snapshot is unknown. + type: boolean + restoreSize: + description: restoreSize represents the complete size of the snapshot + in bytes. In dynamic snapshot creation case, this field will be + filled in by the CSI snapshotter sidecar with the "size_bytes" + value returned from CSI "CreateSnapshot" gRPC call. For a pre-existing + snapshot, this field will be filled with the "size_bytes" value + returned from the CSI "ListSnapshots" gRPC call if the driver + supports it. When restoring a volume from this snapshot, the size + of the volume MUST NOT be smaller than the restoreSize if it is + specified, otherwise the restoration will fail. If not specified, + it indicates that the size is unknown. + format: int64 + minimum: 0 + type: integer + snapshotHandle: + description: snapshotHandle is the CSI "snapshot_id" of a snapshot + on the underlying storage system. If not specified, it indicates + that dynamic snapshot creation has either failed or it is still + in progress. + type: string + type: object + required: [spec] + type: object + served: true + storage: true + subresources: + status: {} + - additionalPrinterColumns: + - description: Indicates if the snapshot is ready to be used to restore a + volume. + jsonPath: .status.readyToUse + name: ReadyToUse + type: boolean + - description: Represents the complete size of the snapshot in bytes + jsonPath: .status.restoreSize + name: RestoreSize + type: integer + - description: Determines whether this VolumeSnapshotContent and its physical + snapshot on the underlying storage system should be deleted when its bound + VolumeSnapshot is deleted. + jsonPath: .spec.deletionPolicy + name: DeletionPolicy + type: string + - description: Name of the CSI driver used to create the physical snapshot + on the underlying storage system. + jsonPath: .spec.driver + name: Driver + type: string + - description: Name of the VolumeSnapshotClass to which this snapshot belongs. + jsonPath: .spec.volumeSnapshotClassName + name: VolumeSnapshotClass + type: string + - description: Name of the VolumeSnapshot object to which this VolumeSnapshotContent + object is bound. + jsonPath: .spec.volumeSnapshotRef.name + name: VolumeSnapshot + type: string + - description: Namespace of the VolumeSnapshot object to which this VolumeSnapshotContent + object is bound. + jsonPath: .spec.volumeSnapshotRef.namespace + name: VolumeSnapshotNamespace + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + # This indicates the v1beta1 version of the custom resource is deprecated. + # API requests to this version receive a warning in the server response. + deprecated: true + # This overrides the default warning returned to clients making v1beta1 API requests. + deprecationWarning: snapshot.storage.k8s.io/v1beta1 VolumeSnapshotContent is + deprecated; use snapshot.storage.k8s.io/v1 VolumeSnapshotContent + schema: + openAPIV3Schema: + description: VolumeSnapshotContent represents the actual "on-disk" snapshot + object in the underlying storage system + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource + this object represents. Servers may infer this from the endpoint the + client submits requests to. Cannot be updated. In CamelCase. More + info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + spec: + description: spec defines properties of a VolumeSnapshotContent created + by the underlying storage system. Required. + properties: + deletionPolicy: + description: deletionPolicy determines whether this VolumeSnapshotContent + and its physical snapshot on the underlying storage system should + be deleted when its bound VolumeSnapshot is deleted. Supported + values are "Retain" and "Delete". "Retain" means that the VolumeSnapshotContent + and its physical snapshot on underlying storage system are kept. + "Delete" means that the VolumeSnapshotContent and its physical + snapshot on underlying storage system are deleted. For dynamically + provisioned snapshots, this field will automatically be filled + in by the CSI snapshotter sidecar with the "DeletionPolicy" field + defined in the corresponding VolumeSnapshotClass. For pre-existing + snapshots, users MUST specify this field when creating the VolumeSnapshotContent + object. Required. + enum: [Delete, Retain] + type: string + driver: + description: driver is the name of the CSI driver used to create + the physical snapshot on the underlying storage system. This MUST + be the same as the name returned by the CSI GetPluginName() call + for that driver. Required. + type: string + source: + description: source specifies whether the snapshot is (or should + be) dynamically provisioned or already exists, and just requires + a Kubernetes object representation. This field is immutable after + creation. Required. + properties: + snapshotHandle: + description: snapshotHandle specifies the CSI "snapshot_id" + of a pre-existing snapshot on the underlying storage system + for which a Kubernetes object representation was (or should + be) created. This field is immutable. + type: string + volumeHandle: + description: volumeHandle specifies the CSI "volume_id" of the + volume from which a snapshot should be dynamically taken from. + This field is immutable. + type: string + type: object + volumeSnapshotClassName: + description: name of the VolumeSnapshotClass from which this snapshot + was (or will be) created. Note that after provisioning, the VolumeSnapshotClass + may be deleted or recreated with different set of values, and + as such, should not be referenced post-snapshot creation. + type: string + volumeSnapshotRef: + description: volumeSnapshotRef specifies the VolumeSnapshot object + to which this VolumeSnapshotContent object is bound. VolumeSnapshot.Spec.VolumeSnapshotContentName + field must reference to this VolumeSnapshotContent's name for + the bidirectional binding to be valid. For a pre-existing VolumeSnapshotContent + object, name and namespace of the VolumeSnapshot object MUST be + provided for binding to happen. This field is immutable after + creation. Required. + properties: + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: 'If referring to a piece of an object instead of + an entire object, this string should contain a valid JSON/Go + field access statement, such as desiredState.manifest.containers[2]. + For example, if the object reference is to a container within + a pod, this would take on a value like: "spec.containers{name}" + (where "name" refers to the name of the container that triggered + the event) or if no container name is specified "spec.containers[2]" + (container with index 2 in this pod). This syntax is chosen + only to have some well-defined way of referencing a part of + an object. TODO: this design is not final and this field is + subject to change in the future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + type: string + resourceVersion: + description: 'Specific resourceVersion to which this reference + is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + type: object + required: [deletionPolicy, driver, source, volumeSnapshotRef] + type: object + status: + description: status represents the current information of a snapshot. + properties: + creationTime: + description: creationTime is the timestamp when the point-in-time + snapshot is taken by the underlying storage system. In dynamic + snapshot creation case, this field will be filled in by the CSI + snapshotter sidecar with the "creation_time" value returned from + CSI "CreateSnapshot" gRPC call. For a pre-existing snapshot, this + field will be filled with the "creation_time" value returned from + the CSI "ListSnapshots" gRPC call if the driver supports it. If + not specified, it indicates the creation time is unknown. The + format of this field is a Unix nanoseconds time encoded as an + int64. On Unix, the command `date +%s%N` returns the current time + in nanoseconds since 1970-01-01 00:00:00 UTC. + format: int64 + type: integer + error: + description: error is the last observed error during snapshot creation, + if any. Upon success after retry, this error field will be cleared. + properties: + message: + description: 'message is a string detailing the encountered + error during snapshot creation if specified. NOTE: message + may be logged, and it should not contain sensitive information.' + type: string + time: + description: time is the timestamp when the error was encountered. + format: date-time + type: string + type: object + readyToUse: + description: readyToUse indicates if a snapshot is ready to be used + to restore a volume. In dynamic snapshot creation case, this field + will be filled in by the CSI snapshotter sidecar with the "ready_to_use" + value returned from CSI "CreateSnapshot" gRPC call. For a pre-existing + snapshot, this field will be filled with the "ready_to_use" value + returned from the CSI "ListSnapshots" gRPC call if the driver + supports it, otherwise, this field will be set to "True". If not + specified, it means the readiness of a snapshot is unknown. + type: boolean + restoreSize: + description: restoreSize represents the complete size of the snapshot + in bytes. In dynamic snapshot creation case, this field will be + filled in by the CSI snapshotter sidecar with the "size_bytes" + value returned from CSI "CreateSnapshot" gRPC call. For a pre-existing + snapshot, this field will be filled with the "size_bytes" value + returned from the CSI "ListSnapshots" gRPC call if the driver + supports it. When restoring a volume from this snapshot, the size + of the volume MUST NOT be smaller than the restoreSize if it is + specified, otherwise the restoration will fail. If not specified, + it indicates that the size is unknown. + format: int64 + minimum: 0 + type: integer + snapshotHandle: + description: snapshotHandle is the CSI "snapshot_id" of a snapshot + on the underlying storage system. If not specified, it indicates + that dynamic snapshot creation has either failed or it is still + in progress. + type: string + type: object + required: [spec] + type: object + served: false + storage: false + subresources: + status: {} +status: + acceptedNames: + kind: '' + plural: '' + conditions: [] + storedVersions: [] +{{- end -}} diff --git a/charts/latest/csi-driver-nfs/templates/snapshot.storage.k8s.io_volumesnapshots.yaml b/charts/latest/csi-driver-nfs/templates/snapshot.storage.k8s.io_volumesnapshots.yaml new file mode 100644 index 000000000..9447d45d2 --- /dev/null +++ b/charts/latest/csi-driver-nfs/templates/snapshot.storage.k8s.io_volumesnapshots.yaml @@ -0,0 +1,387 @@ +{{- if .Values.externalSnapshotter.enabled -}} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.8.0 + api-approved.kubernetes.io: https://github.com/kubernetes-csi/external-snapshotter/pull/665 + name: volumesnapshots.snapshot.storage.k8s.io +spec: + group: snapshot.storage.k8s.io + names: + kind: VolumeSnapshot + listKind: VolumeSnapshotList + plural: volumesnapshots + shortNames: [vs] + singular: volumesnapshot + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: Indicates if the snapshot is ready to be used to restore a + volume. + jsonPath: .status.readyToUse + name: ReadyToUse + type: boolean + - description: If a new snapshot needs to be created, this contains the name + of the source PVC from which this snapshot was (or will be) created. + jsonPath: .spec.source.persistentVolumeClaimName + name: SourcePVC + type: string + - description: If a snapshot already exists, this contains the name of the + existing VolumeSnapshotContent object representing the existing snapshot. + jsonPath: .spec.source.volumeSnapshotContentName + name: SourceSnapshotContent + type: string + - description: Represents the minimum size of volume required to rehydrate + from this snapshot. + jsonPath: .status.restoreSize + name: RestoreSize + type: string + - description: The name of the VolumeSnapshotClass requested by the VolumeSnapshot. + jsonPath: .spec.volumeSnapshotClassName + name: SnapshotClass + type: string + - description: Name of the VolumeSnapshotContent object to which the VolumeSnapshot + object intends to bind to. Please note that verification of binding actually + requires checking both VolumeSnapshot and VolumeSnapshotContent to ensure + both are pointing at each other. Binding MUST be verified prior to usage + of this object. + jsonPath: .status.boundVolumeSnapshotContentName + name: SnapshotContent + type: string + - description: Timestamp when the point-in-time snapshot was taken by the + underlying storage system. + jsonPath: .status.creationTime + name: CreationTime + type: date + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1 + schema: + openAPIV3Schema: + description: VolumeSnapshot is a user's request for either creating a point-in-time + snapshot of a persistent volume, or binding to a pre-existing snapshot. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource + this object represents. Servers may infer this from the endpoint the + client submits requests to. Cannot be updated. In CamelCase. More + info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + spec: + description: 'spec defines the desired characteristics of a snapshot + requested by a user. More info: https://kubernetes.io/docs/concepts/storage/volume-snapshots#volumesnapshots + Required.' + properties: + source: + description: source specifies where a snapshot will be created from. + This field is immutable after creation. Required. + properties: + persistentVolumeClaimName: + description: persistentVolumeClaimName specifies the name of + the PersistentVolumeClaim object representing the volume from + which a snapshot should be created. This PVC is assumed to + be in the same namespace as the VolumeSnapshot object. This + field should be set if the snapshot does not exists, and needs + to be created. This field is immutable. + type: string + volumeSnapshotContentName: + description: volumeSnapshotContentName specifies the name of + a pre-existing VolumeSnapshotContent object representing an + existing volume snapshot. This field should be set if the + snapshot already exists and only needs a representation in + Kubernetes. This field is immutable. + type: string + type: object + oneOf: + - required: [persistentVolumeClaimName] + - required: [volumeSnapshotContentName] + volumeSnapshotClassName: + description: 'VolumeSnapshotClassName is the name of the VolumeSnapshotClass + requested by the VolumeSnapshot. VolumeSnapshotClassName may be + left nil to indicate that the default SnapshotClass should be + used. A given cluster may have multiple default Volume SnapshotClasses: + one default per CSI Driver. If a VolumeSnapshot does not specify + a SnapshotClass, VolumeSnapshotSource will be checked to figure + out what the associated CSI Driver is, and the default VolumeSnapshotClass + associated with that CSI Driver will be used. If more than one + VolumeSnapshotClass exist for a given CSI Driver and more than + one have been marked as default, CreateSnapshot will fail and + generate an event. Empty string is not allowed for this field.' + type: string + required: [source] + type: object + status: + description: status represents the current information of a snapshot. + Consumers must verify binding between VolumeSnapshot and VolumeSnapshotContent + objects is successful (by validating that both VolumeSnapshot and + VolumeSnapshotContent point at each other) before using this object. + properties: + boundVolumeSnapshotContentName: + description: 'boundVolumeSnapshotContentName is the name of the + VolumeSnapshotContent object to which this VolumeSnapshot object + intends to bind to. If not specified, it indicates that the VolumeSnapshot + object has not been successfully bound to a VolumeSnapshotContent + object yet. NOTE: To avoid possible security issues, consumers + must verify binding between VolumeSnapshot and VolumeSnapshotContent + objects is successful (by validating that both VolumeSnapshot + and VolumeSnapshotContent point at each other) before using this + object.' + type: string + creationTime: + description: creationTime is the timestamp when the point-in-time + snapshot is taken by the underlying storage system. In dynamic + snapshot creation case, this field will be filled in by the snapshot + controller with the "creation_time" value returned from CSI "CreateSnapshot" + gRPC call. For a pre-existing snapshot, this field will be filled + with the "creation_time" value returned from the CSI "ListSnapshots" + gRPC call if the driver supports it. If not specified, it may + indicate that the creation time of the snapshot is unknown. + format: date-time + type: string + error: + description: error is the last observed error during snapshot creation, + if any. This field could be helpful to upper level controllers(i.e., + application controller) to decide whether they should continue + on waiting for the snapshot to be created based on the type of + error reported. The snapshot controller will keep retrying when + an error occurs during the snapshot creation. Upon success, this + error field will be cleared. + properties: + message: + description: 'message is a string detailing the encountered + error during snapshot creation if specified. NOTE: message + may be logged, and it should not contain sensitive information.' + type: string + time: + description: time is the timestamp when the error was encountered. + format: date-time + type: string + type: object + readyToUse: + description: readyToUse indicates if the snapshot is ready to be + used to restore a volume. In dynamic snapshot creation case, this + field will be filled in by the snapshot controller with the "ready_to_use" + value returned from CSI "CreateSnapshot" gRPC call. For a pre-existing + snapshot, this field will be filled with the "ready_to_use" value + returned from the CSI "ListSnapshots" gRPC call if the driver + supports it, otherwise, this field will be set to "True". If not + specified, it means the readiness of a snapshot is unknown. + type: boolean + restoreSize: + type: string + description: restoreSize represents the minimum size of volume required + to create a volume from this snapshot. In dynamic snapshot creation + case, this field will be filled in by the snapshot controller + with the "size_bytes" value returned from CSI "CreateSnapshot" + gRPC call. For a pre-existing snapshot, this field will be filled + with the "size_bytes" value returned from the CSI "ListSnapshots" + gRPC call if the driver supports it. When restoring a volume from + this snapshot, the size of the volume MUST NOT be smaller than + the restoreSize if it is specified, otherwise the restoration + will fail. If not specified, it indicates that the size is unknown. + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + required: [spec] + type: object + served: true + storage: true + subresources: + status: {} + - additionalPrinterColumns: + - description: Indicates if the snapshot is ready to be used to restore a + volume. + jsonPath: .status.readyToUse + name: ReadyToUse + type: boolean + - description: If a new snapshot needs to be created, this contains the name + of the source PVC from which this snapshot was (or will be) created. + jsonPath: .spec.source.persistentVolumeClaimName + name: SourcePVC + type: string + - description: If a snapshot already exists, this contains the name of the + existing VolumeSnapshotContent object representing the existing snapshot. + jsonPath: .spec.source.volumeSnapshotContentName + name: SourceSnapshotContent + type: string + - description: Represents the minimum size of volume required to rehydrate + from this snapshot. + jsonPath: .status.restoreSize + name: RestoreSize + type: string + - description: The name of the VolumeSnapshotClass requested by the VolumeSnapshot. + jsonPath: .spec.volumeSnapshotClassName + name: SnapshotClass + type: string + - description: Name of the VolumeSnapshotContent object to which the VolumeSnapshot + object intends to bind to. Please note that verification of binding actually + requires checking both VolumeSnapshot and VolumeSnapshotContent to ensure + both are pointing at each other. Binding MUST be verified prior to usage + of this object. + jsonPath: .status.boundVolumeSnapshotContentName + name: SnapshotContent + type: string + - description: Timestamp when the point-in-time snapshot was taken by the + underlying storage system. + jsonPath: .status.creationTime + name: CreationTime + type: date + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + # This indicates the v1beta1 version of the custom resource is deprecated. + # API requests to this version receive a warning in the server response. + deprecated: true + # This overrides the default warning returned to clients making v1beta1 API requests. + deprecationWarning: snapshot.storage.k8s.io/v1beta1 VolumeSnapshot is deprecated; + use snapshot.storage.k8s.io/v1 VolumeSnapshot + schema: + openAPIV3Schema: + description: VolumeSnapshot is a user's request for either creating a point-in-time + snapshot of a persistent volume, or binding to a pre-existing snapshot. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource + this object represents. Servers may infer this from the endpoint the + client submits requests to. Cannot be updated. In CamelCase. More + info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + spec: + description: 'spec defines the desired characteristics of a snapshot + requested by a user. More info: https://kubernetes.io/docs/concepts/storage/volume-snapshots#volumesnapshots + Required.' + properties: + source: + description: source specifies where a snapshot will be created from. + This field is immutable after creation. Required. + properties: + persistentVolumeClaimName: + description: persistentVolumeClaimName specifies the name of + the PersistentVolumeClaim object representing the volume from + which a snapshot should be created. This PVC is assumed to + be in the same namespace as the VolumeSnapshot object. This + field should be set if the snapshot does not exists, and needs + to be created. This field is immutable. + type: string + volumeSnapshotContentName: + description: volumeSnapshotContentName specifies the name of + a pre-existing VolumeSnapshotContent object representing an + existing volume snapshot. This field should be set if the + snapshot already exists and only needs a representation in + Kubernetes. This field is immutable. + type: string + type: object + volumeSnapshotClassName: + description: 'VolumeSnapshotClassName is the name of the VolumeSnapshotClass + requested by the VolumeSnapshot. VolumeSnapshotClassName may be + left nil to indicate that the default SnapshotClass should be + used. A given cluster may have multiple default Volume SnapshotClasses: + one default per CSI Driver. If a VolumeSnapshot does not specify + a SnapshotClass, VolumeSnapshotSource will be checked to figure + out what the associated CSI Driver is, and the default VolumeSnapshotClass + associated with that CSI Driver will be used. If more than one + VolumeSnapshotClass exist for a given CSI Driver and more than + one have been marked as default, CreateSnapshot will fail and + generate an event. Empty string is not allowed for this field.' + type: string + required: [source] + type: object + status: + description: status represents the current information of a snapshot. + Consumers must verify binding between VolumeSnapshot and VolumeSnapshotContent + objects is successful (by validating that both VolumeSnapshot and + VolumeSnapshotContent point at each other) before using this object. + properties: + boundVolumeSnapshotContentName: + description: 'boundVolumeSnapshotContentName is the name of the + VolumeSnapshotContent object to which this VolumeSnapshot object + intends to bind to. If not specified, it indicates that the VolumeSnapshot + object has not been successfully bound to a VolumeSnapshotContent + object yet. NOTE: To avoid possible security issues, consumers + must verify binding between VolumeSnapshot and VolumeSnapshotContent + objects is successful (by validating that both VolumeSnapshot + and VolumeSnapshotContent point at each other) before using this + object.' + type: string + creationTime: + description: creationTime is the timestamp when the point-in-time + snapshot is taken by the underlying storage system. In dynamic + snapshot creation case, this field will be filled in by the snapshot + controller with the "creation_time" value returned from CSI "CreateSnapshot" + gRPC call. For a pre-existing snapshot, this field will be filled + with the "creation_time" value returned from the CSI "ListSnapshots" + gRPC call if the driver supports it. If not specified, it may + indicate that the creation time of the snapshot is unknown. + format: date-time + type: string + error: + description: error is the last observed error during snapshot creation, + if any. This field could be helpful to upper level controllers(i.e., + application controller) to decide whether they should continue + on waiting for the snapshot to be created based on the type of + error reported. The snapshot controller will keep retrying when + an error occurs during the snapshot creation. Upon success, this + error field will be cleared. + properties: + message: + description: 'message is a string detailing the encountered + error during snapshot creation if specified. NOTE: message + may be logged, and it should not contain sensitive information.' + type: string + time: + description: time is the timestamp when the error was encountered. + format: date-time + type: string + type: object + readyToUse: + description: readyToUse indicates if the snapshot is ready to be + used to restore a volume. In dynamic snapshot creation case, this + field will be filled in by the snapshot controller with the "ready_to_use" + value returned from CSI "CreateSnapshot" gRPC call. For a pre-existing + snapshot, this field will be filled with the "ready_to_use" value + returned from the CSI "ListSnapshots" gRPC call if the driver + supports it, otherwise, this field will be set to "True". If not + specified, it means the readiness of a snapshot is unknown. + type: boolean + restoreSize: + type: string + description: restoreSize represents the minimum size of volume required + to create a volume from this snapshot. In dynamic snapshot creation + case, this field will be filled in by the snapshot controller + with the "size_bytes" value returned from CSI "CreateSnapshot" + gRPC call. For a pre-existing snapshot, this field will be filled + with the "size_bytes" value returned from the CSI "ListSnapshots" + gRPC call if the driver supports it. When restoring a volume from + this snapshot, the size of the volume MUST NOT be smaller than + the restoreSize if it is specified, otherwise the restoration + will fail. If not specified, it indicates that the size is unknown. + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + required: [spec] + type: object + served: false + storage: false + subresources: + status: {} +status: + acceptedNames: + kind: '' + plural: '' + conditions: [] + storedVersions: [] +{{- end -}} diff --git a/charts/latest/csi-driver-nfs/values.yaml b/charts/latest/csi-driver-nfs/values.yaml index 97da53e85..c621a666f 100755 --- a/charts/latest/csi-driver-nfs/values.yaml +++ b/charts/latest/csi-driver-nfs/values.yaml @@ -8,6 +8,10 @@ image: repository: registry.k8s.io/sig-storage/csi-provisioner tag: v3.3.0 pullPolicy: IfNotPresent + csiSnapshotter: + repository: registry.k8s.io/sig-storage/csi-snapshotter + tag: v6.2.1 + pullPolicy: IfNotPresent livenessProbe: repository: registry.k8s.io/sig-storage/livenessprobe tag: v2.8.0 @@ -16,6 +20,10 @@ image: repository: registry.k8s.io/sig-storage/csi-node-driver-registrar tag: v2.6.2 pullPolicy: IfNotPresent + externalSnapshotter: + repository: registry.k8s.io/sig-storage/snapshot-controller + tag: v6.1.0 + pullPolicy: IfNotPresent serviceAccount: create: true # When true, service accounts will be created for you. Set to false if you want to use your own. @@ -110,6 +118,12 @@ node: cpu: 10m memory: 20Mi +externalSnapshotter: + enabled: true + name: snapshot-controller + controller: + replicas: 1 + ## Reference to one or more secrets to be used when pulling images ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ ## diff --git a/deploy/csi-nfs-controller.yaml b/deploy/csi-nfs-controller.yaml index c35cc5862..05fdfb46f 100644 --- a/deploy/csi-nfs-controller.yaml +++ b/deploy/csi-nfs-controller.yaml @@ -51,6 +51,20 @@ spec: requests: cpu: 10m memory: 20Mi + - name: csi-snapshotter + image: registry.k8s.io/sig-storage/csi-snapshotter:v6.2.1 + args: + - "--v=5" + - "--csi-address=$(ADDRESS)" + - "--leader-election-namespace=kube-system" + - "--leader-election" + env: + - name: ADDRESS + value: /csi/csi.sock + imagePullPolicy: IfNotPresent + volumeMounts: + - name: socket-dir + mountPath: /csi - name: liveness-probe image: registry.k8s.io/sig-storage/livenessprobe:v2.8.0 args: diff --git a/deploy/csi-snapshot-controller.yaml b/deploy/csi-snapshot-controller.yaml new file mode 100644 index 000000000..cd5b86836 --- /dev/null +++ b/deploy/csi-snapshot-controller.yaml @@ -0,0 +1,40 @@ +# This YAML file shows how to deploy the snapshot controller + +# The snapshot controller implements the control loop for CSI snapshot functionality. +# It should be installed as part of the base Kubernetes distribution in an appropriate +# namespace for components implementing base system functionality. For installing with +# Vanilla Kubernetes, kube-system makes sense for the namespace. + +--- +kind: Deployment +apiVersion: apps/v1 +metadata: + name: snapshot-controller + namespace: kube-system +spec: + replicas: 2 + selector: + matchLabels: + app: snapshot-controller + # the snapshot controller won't be marked as ready if the v1 CRDs are unavailable + # in #504 the snapshot-controller will exit after around 7.5 seconds if it + # can't find the v1 CRDs so this value should be greater than that + minReadySeconds: 15 + strategy: + rollingUpdate: + maxSurge: 0 + maxUnavailable: 1 + type: RollingUpdate + template: + metadata: + labels: + app: snapshot-controller + spec: + serviceAccountName: snapshot-controller + containers: + - name: snapshot-controller + image: registry.k8s.io/sig-storage/snapshot-controller:v6.1.0 + args: + - "--v=5" + - "--leader-election=true" + imagePullPolicy: IfNotPresent diff --git a/deploy/install-driver.sh b/deploy/install-driver.sh index 2c4006bc1..28d2d2e9c 100755 --- a/deploy/install-driver.sh +++ b/deploy/install-driver.sh @@ -16,6 +16,13 @@ set -euo pipefail +# min version of this nfs plugin supporting CSI snapshots +snap_ver='4.3.0' + +# external-snapshotter to install for snapshots to work +snap_controller_repo='github.com/kubernetes-csi/external-snapshotter/deploy/kubernetes/snapshot-controller?ref=v6.2.1' +snap_crd_repo='github.com/kubernetes-csi/external-snapshotter/client/config/crd?ref=v6.2.1' + ver="master" if [[ "$#" -gt 0 ]]; then ver="$1" @@ -33,6 +40,12 @@ if [ $ver != "master" ]; then repo="$repo/$ver" fi +# check for min supported version for snapshots or master to install external-snapshotter +if [[ "$ver" == master || "$(printf '%s\n' "$ver" "$snap_ver" | sort -V | head -n1)" = "$snap_ver" ]]; then + kubectl kustomize "$snap_crd_repo" | kubectl apply -f - + kubectl -n kube-system kustomize "$snap_controller_repo" | kubectl apply -f - +fi + echo "Installing NFS CSI driver, version: $ver ..." kubectl apply -f $repo/rbac-csi-nfs.yaml kubectl apply -f $repo/csi-nfs-driverinfo.yaml diff --git a/deploy/rbac-csi-nfs.yaml b/deploy/rbac-csi-nfs.yaml index 45c80e932..081d76e5d 100644 --- a/deploy/rbac-csi-nfs.yaml +++ b/deploy/rbac-csi-nfs.yaml @@ -26,6 +26,15 @@ rules: - apiGroups: ["storage.k8s.io"] resources: ["storageclasses"] verbs: ["get", "list", "watch"] + - apiGroups: ["snapshot.storage.k8s.io"] + resources: ["volumesnapshotclasses", "volumesnapshots"] + verbs: ["get", "list", "watch"] + - apiGroups: ["snapshot.storage.k8s.io"] + resources: ["volumesnapshotcontents"] + verbs: ["get", "list", "watch", "update", "patch"] + - apiGroups: ["snapshot.storage.k8s.io"] + resources: ["volumesnapshotcontents/status"] + verbs: ["get", "update", "patch"] - apiGroups: [""] resources: ["events"] verbs: ["get", "list", "watch", "create", "update", "patch"] diff --git a/deploy/rbac-snapshot-controller.yaml b/deploy/rbac-snapshot-controller.yaml new file mode 100644 index 000000000..2e6431bd3 --- /dev/null +++ b/deploy/rbac-snapshot-controller.yaml @@ -0,0 +1,82 @@ +# RBAC file for the snapshot controller. +# +# The snapshot controller implements the control loop for CSI snapshot functionality. +# It should be installed as part of the base Kubernetes distribution in an appropriate +# namespace for components implementing base system functionality. For installing with +# Vanilla Kubernetes, kube-system makes sense for the namespace. +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: snapshot-controller + namespace: kube-system + +--- +kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: snapshot-controller-runner +rules: + - apiGroups: [""] + resources: ["persistentvolumes"] + verbs: ["get", "list", "watch"] + - apiGroups: [""] + resources: ["persistentvolumeclaims"] + verbs: ["get", "list", "watch", "update"] + - apiGroups: [""] + resources: ["events"] + verbs: ["list", "watch", "create", "update", "patch"] + - apiGroups: ["snapshot.storage.k8s.io"] + resources: ["volumesnapshotclasses"] + verbs: ["get", "list", "watch"] + - apiGroups: ["snapshot.storage.k8s.io"] + resources: ["volumesnapshotcontents"] + verbs: ["create", "get", "list", "watch", "update", "delete", "patch"] + - apiGroups: ["snapshot.storage.k8s.io"] + resources: ["volumesnapshotcontents/status"] + verbs: ["patch"] + - apiGroups: ["snapshot.storage.k8s.io"] + resources: ["volumesnapshots"] + verbs: ["get", "list", "watch", "update", "patch"] + - apiGroups: ["snapshot.storage.k8s.io"] + resources: ["volumesnapshots/status"] + verbs: ["update", "patch"] + +--- +kind: ClusterRoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: snapshot-controller-role +subjects: + - kind: ServiceAccount + name: snapshot-controller + namespace: kube-system +roleRef: + kind: ClusterRole + name: snapshot-controller-runner + apiGroup: rbac.authorization.k8s.io + +--- +kind: Role +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: snapshot-controller-leaderelection + namespace: kube-system +rules: + - apiGroups: ["coordination.k8s.io"] + resources: ["leases"] + verbs: ["get", "watch", "list", "delete", "update", "create"] + +--- +kind: RoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: snapshot-controller-leaderelection + namespace: kube-system +subjects: + - kind: ServiceAccount + name: snapshot-controller +roleRef: + kind: Role + name: snapshot-controller-leaderelection + apiGroup: rbac.authorization.k8s.io diff --git a/deploy/snapshot.storage.k8s.io_volumesnapshotclasses.yaml b/deploy/snapshot.storage.k8s.io_volumesnapshotclasses.yaml new file mode 100644 index 000000000..f656a4a42 --- /dev/null +++ b/deploy/snapshot.storage.k8s.io_volumesnapshotclasses.yaml @@ -0,0 +1,144 @@ +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.8.0 + api-approved.kubernetes.io: https://github.com/kubernetes-csi/external-snapshotter/pull/665 + name: volumesnapshotclasses.snapshot.storage.k8s.io +spec: + group: snapshot.storage.k8s.io + names: + kind: VolumeSnapshotClass + listKind: VolumeSnapshotClassList + plural: volumesnapshotclasses + shortNames: [vsclass, vsclasses] + singular: volumesnapshotclass + scope: Cluster + versions: + - additionalPrinterColumns: + - jsonPath: .driver + name: Driver + type: string + - description: Determines whether a VolumeSnapshotContent created through + the VolumeSnapshotClass should be deleted when its bound VolumeSnapshot + is deleted. + jsonPath: .deletionPolicy + name: DeletionPolicy + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1 + schema: + openAPIV3Schema: + description: VolumeSnapshotClass specifies parameters that a underlying + storage system uses when creating a volume snapshot. A specific VolumeSnapshotClass + is used by specifying its name in a VolumeSnapshot object. VolumeSnapshotClasses + are non-namespaced + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + deletionPolicy: + description: deletionPolicy determines whether a VolumeSnapshotContent + created through the VolumeSnapshotClass should be deleted when its + bound VolumeSnapshot is deleted. Supported values are "Retain" and + "Delete". "Retain" means that the VolumeSnapshotContent and its physical + snapshot on underlying storage system are kept. "Delete" means that + the VolumeSnapshotContent and its physical snapshot on underlying + storage system are deleted. Required. + enum: [Delete, Retain] + type: string + driver: + description: driver is the name of the storage driver that handles this + VolumeSnapshotClass. Required. + type: string + kind: + description: 'Kind is a string value representing the REST resource + this object represents. Servers may infer this from the endpoint the + client submits requests to. Cannot be updated. In CamelCase. More + info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + parameters: + additionalProperties: + type: string + description: parameters is a key-value map with storage driver specific + parameters for creating snapshots. These values are opaque to Kubernetes. + type: object + required: [deletionPolicy, driver] + type: object + served: true + storage: true + subresources: {} + - additionalPrinterColumns: + - jsonPath: .driver + name: Driver + type: string + - description: Determines whether a VolumeSnapshotContent created through + the VolumeSnapshotClass should be deleted when its bound VolumeSnapshot + is deleted. + jsonPath: .deletionPolicy + name: DeletionPolicy + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + # This indicates the v1beta1 version of the custom resource is deprecated. + # API requests to this version receive a warning in the server response. + deprecated: true + # This overrides the default warning returned to clients making v1beta1 API requests. + deprecationWarning: snapshot.storage.k8s.io/v1beta1 VolumeSnapshotClass is deprecated; + use snapshot.storage.k8s.io/v1 VolumeSnapshotClass + schema: + openAPIV3Schema: + description: VolumeSnapshotClass specifies parameters that a underlying + storage system uses when creating a volume snapshot. A specific VolumeSnapshotClass + is used by specifying its name in a VolumeSnapshot object. VolumeSnapshotClasses + are non-namespaced + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + deletionPolicy: + description: deletionPolicy determines whether a VolumeSnapshotContent + created through the VolumeSnapshotClass should be deleted when its + bound VolumeSnapshot is deleted. Supported values are "Retain" and + "Delete". "Retain" means that the VolumeSnapshotContent and its physical + snapshot on underlying storage system are kept. "Delete" means that + the VolumeSnapshotContent and its physical snapshot on underlying + storage system are deleted. Required. + enum: [Delete, Retain] + type: string + driver: + description: driver is the name of the storage driver that handles this + VolumeSnapshotClass. Required. + type: string + kind: + description: 'Kind is a string value representing the REST resource + this object represents. Servers may infer this from the endpoint the + client submits requests to. Cannot be updated. In CamelCase. More + info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + parameters: + additionalProperties: + type: string + description: parameters is a key-value map with storage driver specific + parameters for creating snapshots. These values are opaque to Kubernetes. + type: object + required: [deletionPolicy, driver] + type: object + served: false + storage: false + subresources: {} +status: + acceptedNames: + kind: '' + plural: '' + conditions: [] + storedVersions: [] diff --git a/deploy/snapshot.storage.k8s.io_volumesnapshotcontents.yaml b/deploy/snapshot.storage.k8s.io_volumesnapshotcontents.yaml new file mode 100644 index 000000000..381466c03 --- /dev/null +++ b/deploy/snapshot.storage.k8s.io_volumesnapshotcontents.yaml @@ -0,0 +1,471 @@ +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.8.0 + api-approved.kubernetes.io: https://github.com/kubernetes-csi/external-snapshotter/pull/665 + name: volumesnapshotcontents.snapshot.storage.k8s.io +spec: + group: snapshot.storage.k8s.io + names: + kind: VolumeSnapshotContent + listKind: VolumeSnapshotContentList + plural: volumesnapshotcontents + shortNames: [vsc, vscs] + singular: volumesnapshotcontent + scope: Cluster + versions: + - additionalPrinterColumns: + - description: Indicates if the snapshot is ready to be used to restore a + volume. + jsonPath: .status.readyToUse + name: ReadyToUse + type: boolean + - description: Represents the complete size of the snapshot in bytes + jsonPath: .status.restoreSize + name: RestoreSize + type: integer + - description: Determines whether this VolumeSnapshotContent and its physical + snapshot on the underlying storage system should be deleted when its bound + VolumeSnapshot is deleted. + jsonPath: .spec.deletionPolicy + name: DeletionPolicy + type: string + - description: Name of the CSI driver used to create the physical snapshot + on the underlying storage system. + jsonPath: .spec.driver + name: Driver + type: string + - description: Name of the VolumeSnapshotClass to which this snapshot belongs. + jsonPath: .spec.volumeSnapshotClassName + name: VolumeSnapshotClass + type: string + - description: Name of the VolumeSnapshot object to which this VolumeSnapshotContent + object is bound. + jsonPath: .spec.volumeSnapshotRef.name + name: VolumeSnapshot + type: string + - description: Namespace of the VolumeSnapshot object to which this VolumeSnapshotContent + object is bound. + jsonPath: .spec.volumeSnapshotRef.namespace + name: VolumeSnapshotNamespace + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1 + schema: + openAPIV3Schema: + description: VolumeSnapshotContent represents the actual "on-disk" snapshot + object in the underlying storage system + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource + this object represents. Servers may infer this from the endpoint the + client submits requests to. Cannot be updated. In CamelCase. More + info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + spec: + description: spec defines properties of a VolumeSnapshotContent created + by the underlying storage system. Required. + properties: + deletionPolicy: + description: deletionPolicy determines whether this VolumeSnapshotContent + and its physical snapshot on the underlying storage system should + be deleted when its bound VolumeSnapshot is deleted. Supported + values are "Retain" and "Delete". "Retain" means that the VolumeSnapshotContent + and its physical snapshot on underlying storage system are kept. + "Delete" means that the VolumeSnapshotContent and its physical + snapshot on underlying storage system are deleted. For dynamically + provisioned snapshots, this field will automatically be filled + in by the CSI snapshotter sidecar with the "DeletionPolicy" field + defined in the corresponding VolumeSnapshotClass. For pre-existing + snapshots, users MUST specify this field when creating the VolumeSnapshotContent + object. Required. + enum: [Delete, Retain] + type: string + driver: + description: driver is the name of the CSI driver used to create + the physical snapshot on the underlying storage system. This MUST + be the same as the name returned by the CSI GetPluginName() call + for that driver. Required. + type: string + source: + description: source specifies whether the snapshot is (or should + be) dynamically provisioned or already exists, and just requires + a Kubernetes object representation. This field is immutable after + creation. Required. + properties: + snapshotHandle: + description: snapshotHandle specifies the CSI "snapshot_id" + of a pre-existing snapshot on the underlying storage system + for which a Kubernetes object representation was (or should + be) created. This field is immutable. + type: string + volumeHandle: + description: volumeHandle specifies the CSI "volume_id" of the + volume from which a snapshot should be dynamically taken from. + This field is immutable. + type: string + type: object + oneOf: + - required: [snapshotHandle] + - required: [volumeHandle] + sourceVolumeMode: + description: SourceVolumeMode is the mode of the volume whose snapshot + is taken. Can be either “Filesystem” or “Block”. If not specified, + it indicates the source volume's mode is unknown. This field is + immutable. This field is an alpha field. + type: string + volumeSnapshotClassName: + description: name of the VolumeSnapshotClass from which this snapshot + was (or will be) created. Note that after provisioning, the VolumeSnapshotClass + may be deleted or recreated with different set of values, and + as such, should not be referenced post-snapshot creation. + type: string + volumeSnapshotRef: + description: volumeSnapshotRef specifies the VolumeSnapshot object + to which this VolumeSnapshotContent object is bound. VolumeSnapshot.Spec.VolumeSnapshotContentName + field must reference to this VolumeSnapshotContent's name for + the bidirectional binding to be valid. For a pre-existing VolumeSnapshotContent + object, name and namespace of the VolumeSnapshot object MUST be + provided for binding to happen. This field is immutable after + creation. Required. + properties: + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: 'If referring to a piece of an object instead of + an entire object, this string should contain a valid JSON/Go + field access statement, such as desiredState.manifest.containers[2]. + For example, if the object reference is to a container within + a pod, this would take on a value like: "spec.containers{name}" + (where "name" refers to the name of the container that triggered + the event) or if no container name is specified "spec.containers[2]" + (container with index 2 in this pod). This syntax is chosen + only to have some well-defined way of referencing a part of + an object. TODO: this design is not final and this field is + subject to change in the future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + type: string + resourceVersion: + description: 'Specific resourceVersion to which this reference + is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + type: object + required: [deletionPolicy, driver, source, volumeSnapshotRef] + type: object + status: + description: status represents the current information of a snapshot. + properties: + creationTime: + description: creationTime is the timestamp when the point-in-time + snapshot is taken by the underlying storage system. In dynamic + snapshot creation case, this field will be filled in by the CSI + snapshotter sidecar with the "creation_time" value returned from + CSI "CreateSnapshot" gRPC call. For a pre-existing snapshot, this + field will be filled with the "creation_time" value returned from + the CSI "ListSnapshots" gRPC call if the driver supports it. If + not specified, it indicates the creation time is unknown. The + format of this field is a Unix nanoseconds time encoded as an + int64. On Unix, the command `date +%s%N` returns the current time + in nanoseconds since 1970-01-01 00:00:00 UTC. + format: int64 + type: integer + error: + description: error is the last observed error during snapshot creation, + if any. Upon success after retry, this error field will be cleared. + properties: + message: + description: 'message is a string detailing the encountered + error during snapshot creation if specified. NOTE: message + may be logged, and it should not contain sensitive information.' + type: string + time: + description: time is the timestamp when the error was encountered. + format: date-time + type: string + type: object + readyToUse: + description: readyToUse indicates if a snapshot is ready to be used + to restore a volume. In dynamic snapshot creation case, this field + will be filled in by the CSI snapshotter sidecar with the "ready_to_use" + value returned from CSI "CreateSnapshot" gRPC call. For a pre-existing + snapshot, this field will be filled with the "ready_to_use" value + returned from the CSI "ListSnapshots" gRPC call if the driver + supports it, otherwise, this field will be set to "True". If not + specified, it means the readiness of a snapshot is unknown. + type: boolean + restoreSize: + description: restoreSize represents the complete size of the snapshot + in bytes. In dynamic snapshot creation case, this field will be + filled in by the CSI snapshotter sidecar with the "size_bytes" + value returned from CSI "CreateSnapshot" gRPC call. For a pre-existing + snapshot, this field will be filled with the "size_bytes" value + returned from the CSI "ListSnapshots" gRPC call if the driver + supports it. When restoring a volume from this snapshot, the size + of the volume MUST NOT be smaller than the restoreSize if it is + specified, otherwise the restoration will fail. If not specified, + it indicates that the size is unknown. + format: int64 + minimum: 0 + type: integer + snapshotHandle: + description: snapshotHandle is the CSI "snapshot_id" of a snapshot + on the underlying storage system. If not specified, it indicates + that dynamic snapshot creation has either failed or it is still + in progress. + type: string + type: object + required: [spec] + type: object + served: true + storage: true + subresources: + status: {} + - additionalPrinterColumns: + - description: Indicates if the snapshot is ready to be used to restore a + volume. + jsonPath: .status.readyToUse + name: ReadyToUse + type: boolean + - description: Represents the complete size of the snapshot in bytes + jsonPath: .status.restoreSize + name: RestoreSize + type: integer + - description: Determines whether this VolumeSnapshotContent and its physical + snapshot on the underlying storage system should be deleted when its bound + VolumeSnapshot is deleted. + jsonPath: .spec.deletionPolicy + name: DeletionPolicy + type: string + - description: Name of the CSI driver used to create the physical snapshot + on the underlying storage system. + jsonPath: .spec.driver + name: Driver + type: string + - description: Name of the VolumeSnapshotClass to which this snapshot belongs. + jsonPath: .spec.volumeSnapshotClassName + name: VolumeSnapshotClass + type: string + - description: Name of the VolumeSnapshot object to which this VolumeSnapshotContent + object is bound. + jsonPath: .spec.volumeSnapshotRef.name + name: VolumeSnapshot + type: string + - description: Namespace of the VolumeSnapshot object to which this VolumeSnapshotContent + object is bound. + jsonPath: .spec.volumeSnapshotRef.namespace + name: VolumeSnapshotNamespace + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + # This indicates the v1beta1 version of the custom resource is deprecated. + # API requests to this version receive a warning in the server response. + deprecated: true + # This overrides the default warning returned to clients making v1beta1 API requests. + deprecationWarning: snapshot.storage.k8s.io/v1beta1 VolumeSnapshotContent is + deprecated; use snapshot.storage.k8s.io/v1 VolumeSnapshotContent + schema: + openAPIV3Schema: + description: VolumeSnapshotContent represents the actual "on-disk" snapshot + object in the underlying storage system + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource + this object represents. Servers may infer this from the endpoint the + client submits requests to. Cannot be updated. In CamelCase. More + info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + spec: + description: spec defines properties of a VolumeSnapshotContent created + by the underlying storage system. Required. + properties: + deletionPolicy: + description: deletionPolicy determines whether this VolumeSnapshotContent + and its physical snapshot on the underlying storage system should + be deleted when its bound VolumeSnapshot is deleted. Supported + values are "Retain" and "Delete". "Retain" means that the VolumeSnapshotContent + and its physical snapshot on underlying storage system are kept. + "Delete" means that the VolumeSnapshotContent and its physical + snapshot on underlying storage system are deleted. For dynamically + provisioned snapshots, this field will automatically be filled + in by the CSI snapshotter sidecar with the "DeletionPolicy" field + defined in the corresponding VolumeSnapshotClass. For pre-existing + snapshots, users MUST specify this field when creating the VolumeSnapshotContent + object. Required. + enum: [Delete, Retain] + type: string + driver: + description: driver is the name of the CSI driver used to create + the physical snapshot on the underlying storage system. This MUST + be the same as the name returned by the CSI GetPluginName() call + for that driver. Required. + type: string + source: + description: source specifies whether the snapshot is (or should + be) dynamically provisioned or already exists, and just requires + a Kubernetes object representation. This field is immutable after + creation. Required. + properties: + snapshotHandle: + description: snapshotHandle specifies the CSI "snapshot_id" + of a pre-existing snapshot on the underlying storage system + for which a Kubernetes object representation was (or should + be) created. This field is immutable. + type: string + volumeHandle: + description: volumeHandle specifies the CSI "volume_id" of the + volume from which a snapshot should be dynamically taken from. + This field is immutable. + type: string + type: object + volumeSnapshotClassName: + description: name of the VolumeSnapshotClass from which this snapshot + was (or will be) created. Note that after provisioning, the VolumeSnapshotClass + may be deleted or recreated with different set of values, and + as such, should not be referenced post-snapshot creation. + type: string + volumeSnapshotRef: + description: volumeSnapshotRef specifies the VolumeSnapshot object + to which this VolumeSnapshotContent object is bound. VolumeSnapshot.Spec.VolumeSnapshotContentName + field must reference to this VolumeSnapshotContent's name for + the bidirectional binding to be valid. For a pre-existing VolumeSnapshotContent + object, name and namespace of the VolumeSnapshot object MUST be + provided for binding to happen. This field is immutable after + creation. Required. + properties: + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: 'If referring to a piece of an object instead of + an entire object, this string should contain a valid JSON/Go + field access statement, such as desiredState.manifest.containers[2]. + For example, if the object reference is to a container within + a pod, this would take on a value like: "spec.containers{name}" + (where "name" refers to the name of the container that triggered + the event) or if no container name is specified "spec.containers[2]" + (container with index 2 in this pod). This syntax is chosen + only to have some well-defined way of referencing a part of + an object. TODO: this design is not final and this field is + subject to change in the future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + type: string + resourceVersion: + description: 'Specific resourceVersion to which this reference + is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + type: object + required: [deletionPolicy, driver, source, volumeSnapshotRef] + type: object + status: + description: status represents the current information of a snapshot. + properties: + creationTime: + description: creationTime is the timestamp when the point-in-time + snapshot is taken by the underlying storage system. In dynamic + snapshot creation case, this field will be filled in by the CSI + snapshotter sidecar with the "creation_time" value returned from + CSI "CreateSnapshot" gRPC call. For a pre-existing snapshot, this + field will be filled with the "creation_time" value returned from + the CSI "ListSnapshots" gRPC call if the driver supports it. If + not specified, it indicates the creation time is unknown. The + format of this field is a Unix nanoseconds time encoded as an + int64. On Unix, the command `date +%s%N` returns the current time + in nanoseconds since 1970-01-01 00:00:00 UTC. + format: int64 + type: integer + error: + description: error is the last observed error during snapshot creation, + if any. Upon success after retry, this error field will be cleared. + properties: + message: + description: 'message is a string detailing the encountered + error during snapshot creation if specified. NOTE: message + may be logged, and it should not contain sensitive information.' + type: string + time: + description: time is the timestamp when the error was encountered. + format: date-time + type: string + type: object + readyToUse: + description: readyToUse indicates if a snapshot is ready to be used + to restore a volume. In dynamic snapshot creation case, this field + will be filled in by the CSI snapshotter sidecar with the "ready_to_use" + value returned from CSI "CreateSnapshot" gRPC call. For a pre-existing + snapshot, this field will be filled with the "ready_to_use" value + returned from the CSI "ListSnapshots" gRPC call if the driver + supports it, otherwise, this field will be set to "True". If not + specified, it means the readiness of a snapshot is unknown. + type: boolean + restoreSize: + description: restoreSize represents the complete size of the snapshot + in bytes. In dynamic snapshot creation case, this field will be + filled in by the CSI snapshotter sidecar with the "size_bytes" + value returned from CSI "CreateSnapshot" gRPC call. For a pre-existing + snapshot, this field will be filled with the "size_bytes" value + returned from the CSI "ListSnapshots" gRPC call if the driver + supports it. When restoring a volume from this snapshot, the size + of the volume MUST NOT be smaller than the restoreSize if it is + specified, otherwise the restoration will fail. If not specified, + it indicates that the size is unknown. + format: int64 + minimum: 0 + type: integer + snapshotHandle: + description: snapshotHandle is the CSI "snapshot_id" of a snapshot + on the underlying storage system. If not specified, it indicates + that dynamic snapshot creation has either failed or it is still + in progress. + type: string + type: object + required: [spec] + type: object + served: false + storage: false + subresources: + status: {} +status: + acceptedNames: + kind: '' + plural: '' + conditions: [] + storedVersions: [] diff --git a/deploy/snapshot.storage.k8s.io_volumesnapshots.yaml b/deploy/snapshot.storage.k8s.io_volumesnapshots.yaml new file mode 100644 index 000000000..3d27cc054 --- /dev/null +++ b/deploy/snapshot.storage.k8s.io_volumesnapshots.yaml @@ -0,0 +1,385 @@ +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.8.0 + api-approved.kubernetes.io: https://github.com/kubernetes-csi/external-snapshotter/pull/665 + name: volumesnapshots.snapshot.storage.k8s.io +spec: + group: snapshot.storage.k8s.io + names: + kind: VolumeSnapshot + listKind: VolumeSnapshotList + plural: volumesnapshots + shortNames: [vs] + singular: volumesnapshot + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: Indicates if the snapshot is ready to be used to restore a + volume. + jsonPath: .status.readyToUse + name: ReadyToUse + type: boolean + - description: If a new snapshot needs to be created, this contains the name + of the source PVC from which this snapshot was (or will be) created. + jsonPath: .spec.source.persistentVolumeClaimName + name: SourcePVC + type: string + - description: If a snapshot already exists, this contains the name of the + existing VolumeSnapshotContent object representing the existing snapshot. + jsonPath: .spec.source.volumeSnapshotContentName + name: SourceSnapshotContent + type: string + - description: Represents the minimum size of volume required to rehydrate + from this snapshot. + jsonPath: .status.restoreSize + name: RestoreSize + type: string + - description: The name of the VolumeSnapshotClass requested by the VolumeSnapshot. + jsonPath: .spec.volumeSnapshotClassName + name: SnapshotClass + type: string + - description: Name of the VolumeSnapshotContent object to which the VolumeSnapshot + object intends to bind to. Please note that verification of binding actually + requires checking both VolumeSnapshot and VolumeSnapshotContent to ensure + both are pointing at each other. Binding MUST be verified prior to usage + of this object. + jsonPath: .status.boundVolumeSnapshotContentName + name: SnapshotContent + type: string + - description: Timestamp when the point-in-time snapshot was taken by the + underlying storage system. + jsonPath: .status.creationTime + name: CreationTime + type: date + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1 + schema: + openAPIV3Schema: + description: VolumeSnapshot is a user's request for either creating a point-in-time + snapshot of a persistent volume, or binding to a pre-existing snapshot. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource + this object represents. Servers may infer this from the endpoint the + client submits requests to. Cannot be updated. In CamelCase. More + info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + spec: + description: 'spec defines the desired characteristics of a snapshot + requested by a user. More info: https://kubernetes.io/docs/concepts/storage/volume-snapshots#volumesnapshots + Required.' + properties: + source: + description: source specifies where a snapshot will be created from. + This field is immutable after creation. Required. + properties: + persistentVolumeClaimName: + description: persistentVolumeClaimName specifies the name of + the PersistentVolumeClaim object representing the volume from + which a snapshot should be created. This PVC is assumed to + be in the same namespace as the VolumeSnapshot object. This + field should be set if the snapshot does not exists, and needs + to be created. This field is immutable. + type: string + volumeSnapshotContentName: + description: volumeSnapshotContentName specifies the name of + a pre-existing VolumeSnapshotContent object representing an + existing volume snapshot. This field should be set if the + snapshot already exists and only needs a representation in + Kubernetes. This field is immutable. + type: string + type: object + oneOf: + - required: [persistentVolumeClaimName] + - required: [volumeSnapshotContentName] + volumeSnapshotClassName: + description: 'VolumeSnapshotClassName is the name of the VolumeSnapshotClass + requested by the VolumeSnapshot. VolumeSnapshotClassName may be + left nil to indicate that the default SnapshotClass should be + used. A given cluster may have multiple default Volume SnapshotClasses: + one default per CSI Driver. If a VolumeSnapshot does not specify + a SnapshotClass, VolumeSnapshotSource will be checked to figure + out what the associated CSI Driver is, and the default VolumeSnapshotClass + associated with that CSI Driver will be used. If more than one + VolumeSnapshotClass exist for a given CSI Driver and more than + one have been marked as default, CreateSnapshot will fail and + generate an event. Empty string is not allowed for this field.' + type: string + required: [source] + type: object + status: + description: status represents the current information of a snapshot. + Consumers must verify binding between VolumeSnapshot and VolumeSnapshotContent + objects is successful (by validating that both VolumeSnapshot and + VolumeSnapshotContent point at each other) before using this object. + properties: + boundVolumeSnapshotContentName: + description: 'boundVolumeSnapshotContentName is the name of the + VolumeSnapshotContent object to which this VolumeSnapshot object + intends to bind to. If not specified, it indicates that the VolumeSnapshot + object has not been successfully bound to a VolumeSnapshotContent + object yet. NOTE: To avoid possible security issues, consumers + must verify binding between VolumeSnapshot and VolumeSnapshotContent + objects is successful (by validating that both VolumeSnapshot + and VolumeSnapshotContent point at each other) before using this + object.' + type: string + creationTime: + description: creationTime is the timestamp when the point-in-time + snapshot is taken by the underlying storage system. In dynamic + snapshot creation case, this field will be filled in by the snapshot + controller with the "creation_time" value returned from CSI "CreateSnapshot" + gRPC call. For a pre-existing snapshot, this field will be filled + with the "creation_time" value returned from the CSI "ListSnapshots" + gRPC call if the driver supports it. If not specified, it may + indicate that the creation time of the snapshot is unknown. + format: date-time + type: string + error: + description: error is the last observed error during snapshot creation, + if any. This field could be helpful to upper level controllers(i.e., + application controller) to decide whether they should continue + on waiting for the snapshot to be created based on the type of + error reported. The snapshot controller will keep retrying when + an error occurs during the snapshot creation. Upon success, this + error field will be cleared. + properties: + message: + description: 'message is a string detailing the encountered + error during snapshot creation if specified. NOTE: message + may be logged, and it should not contain sensitive information.' + type: string + time: + description: time is the timestamp when the error was encountered. + format: date-time + type: string + type: object + readyToUse: + description: readyToUse indicates if the snapshot is ready to be + used to restore a volume. In dynamic snapshot creation case, this + field will be filled in by the snapshot controller with the "ready_to_use" + value returned from CSI "CreateSnapshot" gRPC call. For a pre-existing + snapshot, this field will be filled with the "ready_to_use" value + returned from the CSI "ListSnapshots" gRPC call if the driver + supports it, otherwise, this field will be set to "True". If not + specified, it means the readiness of a snapshot is unknown. + type: boolean + restoreSize: + type: string + description: restoreSize represents the minimum size of volume required + to create a volume from this snapshot. In dynamic snapshot creation + case, this field will be filled in by the snapshot controller + with the "size_bytes" value returned from CSI "CreateSnapshot" + gRPC call. For a pre-existing snapshot, this field will be filled + with the "size_bytes" value returned from the CSI "ListSnapshots" + gRPC call if the driver supports it. When restoring a volume from + this snapshot, the size of the volume MUST NOT be smaller than + the restoreSize if it is specified, otherwise the restoration + will fail. If not specified, it indicates that the size is unknown. + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + required: [spec] + type: object + served: true + storage: true + subresources: + status: {} + - additionalPrinterColumns: + - description: Indicates if the snapshot is ready to be used to restore a + volume. + jsonPath: .status.readyToUse + name: ReadyToUse + type: boolean + - description: If a new snapshot needs to be created, this contains the name + of the source PVC from which this snapshot was (or will be) created. + jsonPath: .spec.source.persistentVolumeClaimName + name: SourcePVC + type: string + - description: If a snapshot already exists, this contains the name of the + existing VolumeSnapshotContent object representing the existing snapshot. + jsonPath: .spec.source.volumeSnapshotContentName + name: SourceSnapshotContent + type: string + - description: Represents the minimum size of volume required to rehydrate + from this snapshot. + jsonPath: .status.restoreSize + name: RestoreSize + type: string + - description: The name of the VolumeSnapshotClass requested by the VolumeSnapshot. + jsonPath: .spec.volumeSnapshotClassName + name: SnapshotClass + type: string + - description: Name of the VolumeSnapshotContent object to which the VolumeSnapshot + object intends to bind to. Please note that verification of binding actually + requires checking both VolumeSnapshot and VolumeSnapshotContent to ensure + both are pointing at each other. Binding MUST be verified prior to usage + of this object. + jsonPath: .status.boundVolumeSnapshotContentName + name: SnapshotContent + type: string + - description: Timestamp when the point-in-time snapshot was taken by the + underlying storage system. + jsonPath: .status.creationTime + name: CreationTime + type: date + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1beta1 + # This indicates the v1beta1 version of the custom resource is deprecated. + # API requests to this version receive a warning in the server response. + deprecated: true + # This overrides the default warning returned to clients making v1beta1 API requests. + deprecationWarning: snapshot.storage.k8s.io/v1beta1 VolumeSnapshot is deprecated; + use snapshot.storage.k8s.io/v1 VolumeSnapshot + schema: + openAPIV3Schema: + description: VolumeSnapshot is a user's request for either creating a point-in-time + snapshot of a persistent volume, or binding to a pre-existing snapshot. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource + this object represents. Servers may infer this from the endpoint the + client submits requests to. Cannot be updated. In CamelCase. More + info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + spec: + description: 'spec defines the desired characteristics of a snapshot + requested by a user. More info: https://kubernetes.io/docs/concepts/storage/volume-snapshots#volumesnapshots + Required.' + properties: + source: + description: source specifies where a snapshot will be created from. + This field is immutable after creation. Required. + properties: + persistentVolumeClaimName: + description: persistentVolumeClaimName specifies the name of + the PersistentVolumeClaim object representing the volume from + which a snapshot should be created. This PVC is assumed to + be in the same namespace as the VolumeSnapshot object. This + field should be set if the snapshot does not exists, and needs + to be created. This field is immutable. + type: string + volumeSnapshotContentName: + description: volumeSnapshotContentName specifies the name of + a pre-existing VolumeSnapshotContent object representing an + existing volume snapshot. This field should be set if the + snapshot already exists and only needs a representation in + Kubernetes. This field is immutable. + type: string + type: object + volumeSnapshotClassName: + description: 'VolumeSnapshotClassName is the name of the VolumeSnapshotClass + requested by the VolumeSnapshot. VolumeSnapshotClassName may be + left nil to indicate that the default SnapshotClass should be + used. A given cluster may have multiple default Volume SnapshotClasses: + one default per CSI Driver. If a VolumeSnapshot does not specify + a SnapshotClass, VolumeSnapshotSource will be checked to figure + out what the associated CSI Driver is, and the default VolumeSnapshotClass + associated with that CSI Driver will be used. If more than one + VolumeSnapshotClass exist for a given CSI Driver and more than + one have been marked as default, CreateSnapshot will fail and + generate an event. Empty string is not allowed for this field.' + type: string + required: [source] + type: object + status: + description: status represents the current information of a snapshot. + Consumers must verify binding between VolumeSnapshot and VolumeSnapshotContent + objects is successful (by validating that both VolumeSnapshot and + VolumeSnapshotContent point at each other) before using this object. + properties: + boundVolumeSnapshotContentName: + description: 'boundVolumeSnapshotContentName is the name of the + VolumeSnapshotContent object to which this VolumeSnapshot object + intends to bind to. If not specified, it indicates that the VolumeSnapshot + object has not been successfully bound to a VolumeSnapshotContent + object yet. NOTE: To avoid possible security issues, consumers + must verify binding between VolumeSnapshot and VolumeSnapshotContent + objects is successful (by validating that both VolumeSnapshot + and VolumeSnapshotContent point at each other) before using this + object.' + type: string + creationTime: + description: creationTime is the timestamp when the point-in-time + snapshot is taken by the underlying storage system. In dynamic + snapshot creation case, this field will be filled in by the snapshot + controller with the "creation_time" value returned from CSI "CreateSnapshot" + gRPC call. For a pre-existing snapshot, this field will be filled + with the "creation_time" value returned from the CSI "ListSnapshots" + gRPC call if the driver supports it. If not specified, it may + indicate that the creation time of the snapshot is unknown. + format: date-time + type: string + error: + description: error is the last observed error during snapshot creation, + if any. This field could be helpful to upper level controllers(i.e., + application controller) to decide whether they should continue + on waiting for the snapshot to be created based on the type of + error reported. The snapshot controller will keep retrying when + an error occurs during the snapshot creation. Upon success, this + error field will be cleared. + properties: + message: + description: 'message is a string detailing the encountered + error during snapshot creation if specified. NOTE: message + may be logged, and it should not contain sensitive information.' + type: string + time: + description: time is the timestamp when the error was encountered. + format: date-time + type: string + type: object + readyToUse: + description: readyToUse indicates if the snapshot is ready to be + used to restore a volume. In dynamic snapshot creation case, this + field will be filled in by the snapshot controller with the "ready_to_use" + value returned from CSI "CreateSnapshot" gRPC call. For a pre-existing + snapshot, this field will be filled with the "ready_to_use" value + returned from the CSI "ListSnapshots" gRPC call if the driver + supports it, otherwise, this field will be set to "True". If not + specified, it means the readiness of a snapshot is unknown. + type: boolean + restoreSize: + type: string + description: restoreSize represents the minimum size of volume required + to create a volume from this snapshot. In dynamic snapshot creation + case, this field will be filled in by the snapshot controller + with the "size_bytes" value returned from CSI "CreateSnapshot" + gRPC call. For a pre-existing snapshot, this field will be filled + with the "size_bytes" value returned from the CSI "ListSnapshots" + gRPC call if the driver supports it. When restoring a volume from + this snapshot, the size of the volume MUST NOT be smaller than + the restoreSize if it is specified, otherwise the restoration + will fail. If not specified, it indicates that the size is unknown. + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + required: [spec] + type: object + served: false + storage: false + subresources: + status: {} +status: + acceptedNames: + kind: '' + plural: '' + conditions: [] + storedVersions: [] diff --git a/deploy/uninstall-driver.sh b/deploy/uninstall-driver.sh index d563fc981..acd40f558 100755 --- a/deploy/uninstall-driver.sh +++ b/deploy/uninstall-driver.sh @@ -16,6 +16,10 @@ set -euo pipefail +# external-snapshotter to install for snapshots to work +snap_controller_repo='github.com/kubernetes-csi/external-snapshotter/deploy/kubernetes/snapshot-controller?ref=v6.2.1' +snap_crd_repo='github.com/kubernetes-csi/external-snapshotter/client/config/crd?ref=v6.2.1' + ver="master" if [[ "$#" -gt 0 ]]; then ver="$1" @@ -34,6 +38,8 @@ if [ $ver != "master" ]; then fi echo "Uninstalling NFS driver, version: $ver ..." +# this keeps VolumeSnapshot CRDs untouched +kubectl -n kube-system kustomize "$snap_controller_repo" | kubectl delete --ignore-not-found -f - kubectl delete -f $repo/csi-nfs-controller.yaml --ignore-not-found kubectl delete -f $repo/csi-nfs-node.yaml --ignore-not-found kubectl delete -f $repo/csi-nfs-driverinfo.yaml --ignore-not-found diff --git a/hack/verify-helm-chart.sh b/hack/verify-helm-chart.sh index 174f06f77..642eec226 100755 --- a/hack/verify-helm-chart.sh +++ b/hack/verify-helm-chart.sh @@ -62,12 +62,16 @@ pip install yq --ignore-installed PyYAML # Extract images from csi-nfs-controller.yaml expected_csi_provisioner_image="$(cat ${PKG_ROOT}/deploy/csi-nfs-controller.yaml | yq -r .spec.template.spec.containers[0].image | head -n 1)" -expected_liveness_probe_image="$(cat ${PKG_ROOT}/deploy/csi-nfs-controller.yaml | yq -r .spec.template.spec.containers[1].image | head -n 1)" -expected_nfs_image="$(cat ${PKG_ROOT}/deploy/csi-nfs-controller.yaml | yq -r .spec.template.spec.containers[2].image | head -n 1)" +expected_csi_snapshotter_image="$(cat ${PKG_ROOT}/deploy/csi-nfs-controller.yaml | yq -r .spec.template.spec.containers[1].image | head -n 1)" +expected_liveness_probe_image="$(cat ${PKG_ROOT}/deploy/csi-nfs-controller.yaml | yq -r .spec.template.spec.containers[2].image | head -n 1)" +expected_nfs_image="$(cat ${PKG_ROOT}/deploy/csi-nfs-controller.yaml | yq -r .spec.template.spec.containers[3].image | head -n 1)" csi_provisioner_image="$(get_image_from_helm_chart "csiProvisioner")" validate_image "${expected_csi_provisioner_image}" "${csi_provisioner_image}" +csi_snapshotter_image="$(get_image_from_helm_chart "csiSnapshotter")" +validate_image "${expected_csi_snapshotter_image}" "${csi_snapshotter_image}" + liveness_probe_image="$(get_image_from_helm_chart "livenessProbe")" validate_image "${expected_liveness_probe_image}" "${liveness_probe_image}" diff --git a/test/external-e2e/run.sh b/test/external-e2e/run.sh index de1264858..8790da267 100644 --- a/test/external-e2e/run.sh +++ b/test/external-e2e/run.sh @@ -32,8 +32,11 @@ setup_e2e_binaries() { # test on alternative driver name sed -i "s/nfs.csi.k8s.io/$DRIVER.csi.k8s.io/g" deploy/example/storageclass-nfs.yaml + sed -i "s/nfs.csi.k8s.io/$DRIVER.csi.k8s.io/g" deploy/example/snapshotclass-nfs.yaml # install csi driver - mkdir -p /tmp/csi && cp deploy/example/storageclass-nfs.yaml /tmp/csi/storageclass.yaml + mkdir -p /tmp/csi + cp deploy/example/storageclass-nfs.yaml /tmp/csi/storageclass.yaml + cp deploy/example/snapshotclass-nfs.yaml /tmp/csi/snapshotclass.yaml make e2e-bootstrap make install-nfs-server } diff --git a/test/external-e2e/testdriver.yaml b/test/external-e2e/testdriver.yaml index b63de8d90..f31623cd8 100644 --- a/test/external-e2e/testdriver.yaml +++ b/test/external-e2e/testdriver.yaml @@ -3,6 +3,8 @@ StorageClass: FromFile: /tmp/csi/storageclass.yaml +SnapshotClass: + FromName: true DriverInfo: Name: test.csi.k8s.io SupportedFsType: {"nfs"} @@ -13,6 +15,7 @@ DriverInfo: RWX: true fsGroup: true pvcDataSource: true + snapshotDataSource: true InlineVolumes: - Attributes: server: nfs-server.default.svc.cluster.local From aeb0a8d410c6ca84522528c148cbfd07764f28cb Mon Sep 17 00:00:00 2001 From: Jan Wozniak Date: Sat, 18 Mar 2023 21:40:45 +0100 Subject: [PATCH 02/30] feat: add SnapshotClass and VolumeSnapshot example --- deploy/example/snapshot-nfs-dynamic.yaml | 9 +++++++++ deploy/example/snapshotclass-nfs.yaml | 7 +++++++ 2 files changed, 16 insertions(+) create mode 100644 deploy/example/snapshot-nfs-dynamic.yaml create mode 100644 deploy/example/snapshotclass-nfs.yaml diff --git a/deploy/example/snapshot-nfs-dynamic.yaml b/deploy/example/snapshot-nfs-dynamic.yaml new file mode 100644 index 000000000..7795d0681 --- /dev/null +++ b/deploy/example/snapshot-nfs-dynamic.yaml @@ -0,0 +1,9 @@ +--- +apiVersion: snapshot.storage.k8s.io/v1 +kind: VolumeSnapshot +metadata: + name: test-nfs-snapshot +spec: + volumeSnapshotClassName: csi-nfs-snapclass + source: + persistentVolumeClaimName: pvc-nfs-dynamic diff --git a/deploy/example/snapshotclass-nfs.yaml b/deploy/example/snapshotclass-nfs.yaml new file mode 100644 index 000000000..d6b8e3332 --- /dev/null +++ b/deploy/example/snapshotclass-nfs.yaml @@ -0,0 +1,7 @@ +--- +apiVersion: snapshot.storage.k8s.io/v1 +kind: VolumeSnapshotClass +metadata: + name: csi-nfs-snapclass +driver: nfs.csi.k8s.io +deletionPolicy: Delete From ce66bf8a858ee29b2466c8200157f8d7a1acb730 Mon Sep 17 00:00:00 2001 From: Jan Wozniak Date: Fri, 17 Mar 2023 17:11:06 +0100 Subject: [PATCH 03/30] feat: implement volume snapshots --- pkg/nfs/controllerserver.go | 298 +++++++++++++++++++++++++++++++++++- pkg/nfs/nfs.go | 1 + 2 files changed, 291 insertions(+), 8 deletions(-) diff --git a/pkg/nfs/controllerserver.go b/pkg/nfs/controllerserver.go index eb8c52b01..a1911ac04 100644 --- a/pkg/nfs/controllerserver.go +++ b/pkg/nfs/controllerserver.go @@ -18,6 +18,7 @@ package nfs import ( "fmt" + "io/fs" "os" "os/exec" "path/filepath" @@ -29,6 +30,7 @@ import ( "golang.org/x/net/context" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" + "google.golang.org/protobuf/types/known/timestamppb" "k8s.io/klog/v2" ) @@ -59,6 +61,35 @@ type nfsVolume struct { onDelete string } +// nfsSnapshot is an internal representation of a volume snapshot +// created by the provisioner. +type nfsSnapshot struct { + // Snapshot id. + id string + // Address of the NFS server. + // Matches paramServer. + server string + // Base directory of the NFS server to create snapshots under + // Matches paramShare. + baseDir string + // Snapshot name. + uuid string + // Source volume. + src string +} + +func (snap nfsSnapshot) archiveSubPath() string { + return snap.uuid +} + +func (snap nfsSnapshot) archiveName() string { + return fmt.Sprintf("%v.tar.gz", snap.src) +} + +func (snap nfsSnapshot) archivePath() string { + return filepath.Join(snap.archiveSubPath(), snap.archiveName()) +} + // Ordering of elements in the CSI volume id. // ID is of the form {server}/{baseDir}/{subDir}. // TODO: This volume id format limits baseDir and @@ -74,6 +105,19 @@ const ( totalIDElements // Always last ) +// Ordering of elements in the CSI snapshot id. +// ID is of the form {server}/{baseDir}/{snapName}/{srcVolumeName}. +// Adding a new element should always go at the end +// before totalSnapIDElements +const ( + idSnapServer = iota + idSnapBaseDir + idSnapUUID + idSnapArchivePath + idSnapArchiveName + totalIDSnapElements // Always last +) + // CreateVolume create a volume func (cs *ControllerServer) CreateVolume(ctx context.Context, req *csi.CreateVolumeRequest) (*csi.CreateVolumeResponse, error) { name := req.GetName() @@ -263,11 +307,115 @@ func (cs *ControllerServer) ControllerGetCapabilities(ctx context.Context, req * } func (cs *ControllerServer) CreateSnapshot(ctx context.Context, req *csi.CreateSnapshotRequest) (*csi.CreateSnapshotResponse, error) { - return nil, status.Error(codes.Unimplemented, "") + if len(req.GetName()) == 0 { + return nil, status.Error(codes.InvalidArgument, "CreateSnapshot name must be provided") + } + if len(req.GetSourceVolumeId()) == 0 { + return nil, status.Error(codes.InvalidArgument, "CreateSnapshot source volume ID must be provided") + } + + srcVol, err := getNfsVolFromID(req.GetSourceVolumeId()) + if err != nil { + return nil, status.Errorf(codes.NotFound, "failed to create source volume: %v", err) + } + snapshot, err := newNFSSnapshot(req.GetName(), req.GetParameters(), srcVol) + if err != nil { + return nil, status.Errorf(codes.NotFound, "failed to create nfsSnapshot: %v", err) + } + snapVol := volumeFromSnapshot(snapshot) + if err = cs.internalMount(ctx, snapVol, nil, nil); err != nil { + return nil, status.Errorf(codes.Internal, "failed to mount snapshot nfs server: %v", err) + } + defer func() { + if err = cs.internalUnmount(ctx, snapVol); err != nil { + klog.Warningf("failed to unmount snapshot nfs server: %v", err) + } + }() + snapInternalVolPath := filepath.Join(getInternalVolumePath(cs.Driver.workingMountDir, snapVol), snapshot.archiveSubPath()) + if err = os.MkdirAll(snapInternalVolPath, 0777); err != nil { + return nil, status.Errorf(codes.Internal, "failed to make subdirectory: %v", err) + } + if err := validateSnapshot(snapInternalVolPath, snapshot); err != nil { + return nil, err + } + + if err = cs.internalMount(ctx, srcVol, nil, nil); err != nil { + return nil, status.Errorf(codes.Internal, "failed to mount src nfs server: %v", err) + } + defer func() { + if err = cs.internalUnmount(ctx, srcVol); err != nil { + klog.Warningf("failed to unmount src nfs server: %v", err) + } + }() + + srcPath := getInternalVolumePath(cs.Driver.workingMountDir, srcVol) + dstPath := filepath.Join(snapInternalVolPath, snapshot.archiveName()) + klog.V(2).Infof("archiving %v -> %v", srcPath, dstPath) + out, err := exec.Command("tar", "-C", srcPath, "-czvf", dstPath, ".").CombinedOutput() + if err != nil { + return nil, status.Errorf(codes.Internal, "failed to create archive for snapshot: %v: %v", err, string(out)) + } + klog.V(2).Infof("archived %s -> %s", srcPath, dstPath) + + var snapshotSize int64 + fi, err := os.Stat(dstPath) + if err != nil { + klog.Warningf("failed to determine snapshot size: %v", err) + } else { + snapshotSize = fi.Size() + } + return &csi.CreateSnapshotResponse{ + Snapshot: &csi.Snapshot{ + SnapshotId: snapshot.id, + SourceVolumeId: srcVol.id, + SizeBytes: snapshotSize, + CreationTime: timestamppb.Now(), + ReadyToUse: true, + }, + }, nil } func (cs *ControllerServer) DeleteSnapshot(ctx context.Context, req *csi.DeleteSnapshotRequest) (*csi.DeleteSnapshotResponse, error) { - return nil, status.Error(codes.Unimplemented, "") + if len(req.GetSnapshotId()) == 0 { + return nil, status.Error(codes.InvalidArgument, "Snapshot ID is required for deletion") + } + snap, err := getNfsSnapFromID(req.GetSnapshotId()) + if err != nil { + // An invalid ID should be treated as doesn't exist + klog.Warningf("failed to get nfs snapshot for id %v deletion: %v", req.GetSnapshotId(), err) + return &csi.DeleteSnapshotResponse{}, nil + } + + var volCap *csi.VolumeCapability + mountOptions := getMountOptions(req.GetSecrets()) + if mountOptions != "" { + klog.V(2).Infof("DeleteSnapshot: found mountOptions(%s) for snapshot(%s)", mountOptions, req.GetSnapshotId()) + volCap = &csi.VolumeCapability{ + AccessType: &csi.VolumeCapability_Mount{ + Mount: &csi.VolumeCapability_MountVolume{ + MountFlags: []string{mountOptions}, + }, + }, + } + } + vol := volumeFromSnapshot(snap) + if err = cs.internalMount(ctx, vol, nil, volCap); err != nil { + return nil, status.Errorf(codes.Internal, "failed to mount nfs server for snapshot deletion: %v", err) + } + defer func() { + if err = cs.internalUnmount(ctx, vol); err != nil { + klog.Warningf("failed to unmount nfs server after snapshot deletion: %v", err) + } + }() + + // delete snapshot archive + internalVolumePath := filepath.Join(getInternalVolumePath(cs.Driver.workingMountDir, vol), snap.archiveSubPath()) + klog.V(2).Infof("Removing snapshot archive at %v", internalVolumePath) + if err = os.RemoveAll(internalVolumePath); err != nil { + return nil, status.Errorf(codes.Internal, "failed to delete subdirectory: %v", err.Error()) + } + + return &csi.DeleteSnapshotResponse{}, nil } func (cs *ControllerServer) ListSnapshots(ctx context.Context, req *csi.ListSnapshotsRequest) (*csi.ListSnapshotsResponse, error) { @@ -325,6 +473,47 @@ func (cs *ControllerServer) internalUnmount(ctx context.Context, vol *nfsVolume) return err } +func (cs *ControllerServer) copyFromSnapshot(ctx context.Context, req *csi.CreateVolumeRequest, dstVol *nfsVolume) error { + snap, err := getNfsSnapFromID(req.VolumeContentSource.GetSnapshot().GetSnapshotId()) + if err != nil { + return status.Error(codes.NotFound, err.Error()) + } + snapVol := volumeFromSnapshot(snap) + + var volCap *csi.VolumeCapability + if len(req.GetVolumeCapabilities()) > 0 { + volCap = req.GetVolumeCapabilities()[0] + } + + if err = cs.internalMount(ctx, snapVol, nil, volCap); err != nil { + return status.Errorf(codes.Internal, "failed to mount src nfs server for snapshot volume copy: %v", err) + } + defer func() { + if err = cs.internalUnmount(ctx, snapVol); err != nil { + klog.Warningf("failed to unmount src nfs server after snapshot volume copy: %v", err) + } + }() + if err = cs.internalMount(ctx, dstVol, nil, volCap); err != nil { + return status.Errorf(codes.Internal, "failed to mount dst nfs server for snapshot volume copy: %v", err) + } + defer func() { + if err = cs.internalUnmount(ctx, dstVol); err != nil { + klog.Warningf("failed to unmount dst nfs server after snapshot volume copy: %v", err) + } + }() + + // untar snapshot archive to dst path + snapPath := filepath.Join(getInternalVolumePath(cs.Driver.workingMountDir, snapVol), snap.archivePath()) + dstPath := getInternalVolumePath(cs.Driver.workingMountDir, dstVol) + klog.V(2).Infof("copy volume from snapshot %v -> %v", snapPath, dstPath) + out, err := exec.Command("tar", "-xzvf", snapPath, "-C", dstPath).CombinedOutput() + if err != nil { + return status.Errorf(codes.Internal, "failed to copy volume for snapshot: %v: %v", err, string(out)) + } + klog.V(2).Infof("volume copied from snapshot %v -> %v", snapPath, dstPath) + return nil +} + func (cs *ControllerServer) copyFromVolume(ctx context.Context, req *csi.CreateVolumeRequest, dstVol *nfsVolume) error { srcVol, err := getNfsVolFromID(req.GetVolumeContentSource().GetVolume().GetVolumeId()) if err != nil { @@ -340,26 +529,26 @@ func (cs *ControllerServer) copyFromVolume(ctx context.Context, req *csi.CreateV volCap = req.GetVolumeCapabilities()[0] } if err = cs.internalMount(ctx, srcVol, nil, volCap); err != nil { - return status.Errorf(codes.Internal, "failed to mount src nfs server: %v", err.Error()) + return status.Errorf(codes.Internal, "failed to mount src nfs server: %v", err) } defer func() { if err = cs.internalUnmount(ctx, srcVol); err != nil { - klog.Warningf("failed to unmount nfs server: %v", err.Error()) + klog.Warningf("failed to unmount nfs server: %v", err) } }() if err = cs.internalMount(ctx, dstVol, nil, volCap); err != nil { - return status.Errorf(codes.Internal, "failed to mount dst nfs server: %v", err.Error()) + return status.Errorf(codes.Internal, "failed to mount dst nfs server: %v", err) } defer func() { if err = cs.internalUnmount(ctx, dstVol); err != nil { - klog.Warningf("failed to unmount dst nfs server: %v", err.Error()) + klog.Warningf("failed to unmount dst nfs server: %v", err) } }() // recursive 'cp' with '-a' to handle symlinks out, err := exec.Command("cp", "-a", srcPath, dstPath).CombinedOutput() if err != nil { - return status.Error(codes.Internal, fmt.Sprintf("%v: %v", err, string(out))) + return status.Errorf(codes.Internal, "failed to copy volume %v: %v", err, string(out)) } klog.V(2).Infof("copied %s -> %s", srcPath, dstPath) return nil @@ -369,7 +558,7 @@ func (cs *ControllerServer) copyVolume(ctx context.Context, req *csi.CreateVolum vs := req.VolumeContentSource switch vs.Type.(type) { case *csi.VolumeContentSource_Snapshot: - return status.Error(codes.Unimplemented, "Currently only volume copy from another volume is supported") + return cs.copyFromSnapshot(ctx, req, vol) case *csi.VolumeContentSource_Volume: return cs.copyFromVolume(ctx, req, vol) default: @@ -377,6 +566,40 @@ func (cs *ControllerServer) copyVolume(ctx context.Context, req *csi.CreateVolum } } +// newNFSSnapshot Convert VolumeSnapshot parameters to a nfsSnapshot +func newNFSSnapshot(name string, params map[string]string, vol *nfsVolume) (*nfsSnapshot, error) { + server := vol.server + baseDir := vol.baseDir + for k, v := range params { + switch strings.ToLower(k) { + case paramServer: + server = v + case paramShare: + baseDir = v + } + } + + if server == "" { + return nil, fmt.Errorf("%v is a required parameter", paramServer) + } + snapshot := &nfsSnapshot{ + server: server, + baseDir: baseDir, + uuid: name, + } + if vol.subDir != "" { + snapshot.src = vol.subDir + } + if vol.uuid != "" { + snapshot.src = vol.uuid + } + if snapshot.src == "" { + return nil, fmt.Errorf("missing required source volume name") + } + snapshot.id = getSnapshotIDFromNfsSnapshot(snapshot) + return snapshot, nil +} + // newNFSVolume Convert VolumeCreate parameters to an nfsVolume func newNFSVolume(name string, size int64, params map[string]string, defaultOnDeletePolicy string) (*nfsVolume, error) { var server, baseDir, subDir, onDelete string @@ -470,6 +693,17 @@ func getVolumeIDFromNfsVol(vol *nfsVolume) string { return strings.Join(idElements, separator) } +// Given a nfsSnapshot, return a CSI snapshot id. +func getSnapshotIDFromNfsSnapshot(snap *nfsSnapshot) string { + idElements := make([]string, totalIDSnapElements) + idElements[idSnapServer] = strings.Trim(snap.server, "/") + idElements[idSnapBaseDir] = strings.Trim(snap.baseDir, "/") + idElements[idSnapUUID] = snap.uuid + idElements[idSnapArchivePath] = snap.uuid + idElements[idSnapArchiveName] = snap.src + return strings.Join(idElements, separator) +} + // Given a CSI volume id, return a nfsVolume // sample volume Id: // @@ -513,6 +747,25 @@ func getNfsVolFromID(id string) (*nfsVolume, error) { }, nil } +// Given a CSI snapshot ID, return a nfsSnapshot +// sample snapshot ID: +// +// nfs-server.default.svc.cluster.local#share#snapshot-016f784f-56f4-44d1-9041-5f59e82dbce1#snapshot-016f784f-56f4-44d1-9041-5f59e82dbce1#pvc-4bcbf944-b6f7-4bd0-b50f-3c3dd00efc64 +func getNfsSnapFromID(id string) (*nfsSnapshot, error) { + segments := strings.Split(id, separator) + if len(segments) == totalIDSnapElements { + return &nfsSnapshot{ + id: id, + server: segments[idSnapServer], + baseDir: segments[idSnapBaseDir], + src: segments[idSnapArchiveName], + uuid: segments[idSnapUUID], + }, nil + } + + return &nfsSnapshot{}, fmt.Errorf("failed to create nfsSnapshot from snapshot ID") +} + // isValidVolumeCapabilities validates the given VolumeCapability array is valid func isValidVolumeCapabilities(volCaps []*csi.VolumeCapability) error { if len(volCaps) == 0 { @@ -525,3 +778,32 @@ func isValidVolumeCapabilities(volCaps []*csi.VolumeCapability) error { } return nil } + +// Validate snapshot after internal mount +func validateSnapshot(snapInternalVolPath string, snap *nfsSnapshot) error { + return filepath.WalkDir(snapInternalVolPath, func(path string, d fs.DirEntry, err error) error { + if path == snapInternalVolPath { + // skip root + return nil + } + if err != nil { + return err + } + if d.Name() != snap.archiveName() { + // there should be just one archive in the snapshot path and archive name should match + return status.Errorf(codes.AlreadyExists, "snapshot with the same name but different source volume ID already exists: found %q, desired %q", d.Name(), snap.archiveName()) + } + return nil + }) +} + +// Volume for snapshot internal mount/unmount +func volumeFromSnapshot(snap *nfsSnapshot) *nfsVolume { + return &nfsVolume{ + id: snap.id, + server: snap.server, + baseDir: snap.baseDir, + subDir: snap.baseDir, + uuid: snap.uuid, + } +} diff --git a/pkg/nfs/nfs.go b/pkg/nfs/nfs.go index 8230bbf28..e312f05c1 100644 --- a/pkg/nfs/nfs.go +++ b/pkg/nfs/nfs.go @@ -88,6 +88,7 @@ func NewDriver(options *DriverOptions) *Driver { csi.ControllerServiceCapability_RPC_CREATE_DELETE_VOLUME, csi.ControllerServiceCapability_RPC_SINGLE_NODE_MULTI_WRITER, csi.ControllerServiceCapability_RPC_CLONE_VOLUME, + csi.ControllerServiceCapability_RPC_CREATE_DELETE_SNAPSHOT, }) n.AddNodeServiceCapabilities([]csi.NodeServiceCapability_RPC_Type{ From 8694d473213f639cf8616719c61562bea90a37a3 Mon Sep 17 00:00:00 2001 From: Jan Wozniak Date: Sun, 26 Mar 2023 20:26:21 +0200 Subject: [PATCH 04/30] test: copy volume from snapshot unit tests --- pkg/nfs/controllerserver_test.go | 314 ++++++++++++++++++++++++++++++- 1 file changed, 311 insertions(+), 3 deletions(-) diff --git a/pkg/nfs/controllerserver_test.go b/pkg/nfs/controllerserver_test.go index 08663510e..8e5d43331 100644 --- a/pkg/nfs/controllerserver_test.go +++ b/pkg/nfs/controllerserver_test.go @@ -17,6 +17,8 @@ limitations under the License. package nfs import ( + "archive/tar" + "compress/gzip" "os" "path/filepath" "reflect" @@ -31,6 +33,7 @@ import ( "golang.org/x/net/context" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" + "google.golang.org/protobuf/types/known/timestamppb" mount "k8s.io/mount-utils" ) @@ -352,6 +355,13 @@ func TestControllerGetCapabilities(t *testing.T) { }, }, }, + { + Type: &csi.ControllerServiceCapability_Rpc{ + Rpc: &csi.ControllerServiceCapability_RPC{ + Type: csi.ControllerServiceCapability_RPC_CREATE_DELETE_SNAPSHOT, + }, + }, + }, }, }, expectedErr: nil, @@ -687,6 +697,8 @@ func TestCopyVolume(t *testing.T) { req *csi.CreateVolumeRequest dstVol *nfsVolume expectErr bool + prepare func() error + cleanup func() error }{ { desc: "copy volume from valid volume", @@ -707,6 +719,56 @@ func TestCopyVolume(t *testing.T) { subDir: "subdir", uuid: "dst-pv-name", }, + prepare: func() error { return os.MkdirAll("/tmp/src-pv-name/subdir", 0777) }, + cleanup: func() error { return os.RemoveAll("/tmp/src-pv-name") }, + }, + { + desc: "copy volume from valid snapshot", + req: &csi.CreateVolumeRequest{ + Name: "snapshot-name", + VolumeContentSource: &csi.VolumeContentSource{ + Type: &csi.VolumeContentSource_Snapshot{ + Snapshot: &csi.VolumeContentSource_SnapshotSource{ + SnapshotId: "nfs-server.default.svc.cluster.local#share#snapshot-name#snapshot-name#src-pv-name", + }, + }, + }, + }, + dstVol: &nfsVolume{ + id: "nfs-server.default.svc.cluster.local#share#subdir#dst-pv-name", + server: "//nfs-server.default.svc.cluster.local", + baseDir: "share", + subDir: "subdir", + uuid: "dst-pv-name", + }, + prepare: func() error { + if err := os.MkdirAll("/tmp/snapshot-name/share/snapshot-name/", 0777); err != nil { + return err + } + file, err := os.Create("/tmp/snapshot-name/share/snapshot-name/src-pv-name.tar.gz") + if err != nil { + return err + } + defer file.Close() + gzipWriter := gzip.NewWriter(file) + defer gzipWriter.Close() + tarWriter := tar.NewWriter(gzipWriter) + defer tarWriter.Close() + body := "test file" + hdr := &tar.Header{ + Name: "test.txt", + Mode: 0777, + Size: int64(len(body)), + } + if err := tarWriter.WriteHeader(hdr); err != nil { + return err + } + if _, err := tarWriter.Write([]byte(body)); err != nil { + return err + } + return nil + }, + cleanup: func() error { return os.RemoveAll("/tmp/snapshot-name") }, }, { desc: "copy volume missing source id", @@ -747,17 +809,263 @@ func TestCopyVolume(t *testing.T) { }, expectErr: true, }, - } - if err := os.MkdirAll("/tmp/src-pv-name/subdir", 0777); err != nil { - t.Fatalf("Unexpected error when creating srcVolume: %v", err) + { + desc: "copy volume from broken snapshot", + req: &csi.CreateVolumeRequest{ + Name: "snapshot-name", + VolumeContentSource: &csi.VolumeContentSource{ + Type: &csi.VolumeContentSource_Snapshot{ + Snapshot: &csi.VolumeContentSource_SnapshotSource{ + SnapshotId: "nfs-server.default.svc.cluster.local#share#snapshot-name#snapshot-name#src-pv-name", + }, + }, + }, + }, + dstVol: &nfsVolume{ + id: "nfs-server.default.svc.cluster.local#share#subdir#dst-pv-name", + server: "//nfs-server.default.svc.cluster.local", + baseDir: "share", + subDir: "subdir", + uuid: "dst-pv-name", + }, + expectErr: true, + }, + { + desc: "copy volume from missing snapshot", + req: &csi.CreateVolumeRequest{ + Name: "snapshot-name", + VolumeContentSource: &csi.VolumeContentSource{ + Type: &csi.VolumeContentSource_Snapshot{ + Snapshot: &csi.VolumeContentSource_SnapshotSource{}, + }, + }, + }, + dstVol: &nfsVolume{ + id: "nfs-server.default.svc.cluster.local#share#subdir#dst-pv-name", + server: "//nfs-server.default.svc.cluster.local", + baseDir: "share", + subDir: "subdir", + uuid: "dst-pv-name", + }, + expectErr: true, + }, + { + desc: "copy volume from snapshot into missing dst volume", + req: &csi.CreateVolumeRequest{ + Name: "snapshot-name", + VolumeContentSource: &csi.VolumeContentSource{ + Type: &csi.VolumeContentSource_Snapshot{ + Snapshot: &csi.VolumeContentSource_SnapshotSource{}, + }, + }, + }, + dstVol: &nfsVolume{ + server: "//nfs-server.default.svc.cluster.local", + baseDir: "share", + subDir: "subdir", + uuid: "dst-pv-name", + }, + expectErr: true, + }, } for _, test := range cases { t.Run(test.desc, func(t *testing.T) { + if test.prepare != nil { + if err := test.prepare(); err != nil { + t.Errorf(`[test: %s] prepare failed: "%v"`, test.desc, err) + } + } cs := initTestController(t) err := cs.copyVolume(context.TODO(), test.req, test.dstVol) if (err == nil) == test.expectErr { t.Errorf(`[test: %s] Error expectation mismatch, expected error: "%v", received: %q`, test.desc, test.expectErr, err) } + if test.cleanup != nil { + if err := test.cleanup(); err != nil { + t.Errorf(`[test: %s] cleanup failed: "%v"`, test.desc, err) + } + } }) } } + +func TestCreateSnapshot(t *testing.T) { + cases := []struct { + desc string + req *csi.CreateSnapshotRequest + expResp *csi.CreateSnapshotResponse + expectErr bool + prepare func() error + cleanup func() error + }{ + { + desc: "create snapshot with valid request", + req: &csi.CreateSnapshotRequest{ + SourceVolumeId: "nfs-server.default.svc.cluster.local#share#subdir#src-pv-name", + Name: "snapshot-name", + }, + expResp: &csi.CreateSnapshotResponse{ + Snapshot: &csi.Snapshot{ + SnapshotId: "nfs-server.default.svc.cluster.local#share#snapshot-name#snapshot-name#src-pv-name", + SourceVolumeId: "nfs-server.default.svc.cluster.local#share#subdir#src-pv-name", + ReadyToUse: true, + SizeBytes: 1, // doesn't match exact size, just denotes non-zero size expected + CreationTime: timestamppb.Now(), // doesn't match exact timestamp, just denotes non-zero ts expected + }, + }, + prepare: func() error { return os.MkdirAll("/tmp/src-pv-name/subdir", 0777) }, + cleanup: func() error { return os.RemoveAll("/tmp/src-pv-name") }, + }, + { + desc: "create snapshot from nonexisting volume", + req: &csi.CreateSnapshotRequest{ + SourceVolumeId: "nfs-server.default.svc.cluster.local#share#subdir#src-pv-name", + Name: "snapshot-name", + }, + expectErr: true, + }, + } + for _, test := range cases { + t.Run(test.desc, func(t *testing.T) { + if test.prepare != nil { + if err := test.prepare(); err != nil { + t.Errorf(`[test: %s] prepare failed: "%v"`, test.desc, err) + } + } + cs := initTestController(t) + resp, err := cs.CreateSnapshot(context.TODO(), test.req) + if (err == nil) == test.expectErr { + t.Errorf(`[test: %s] Error expectation mismatch, expected error: "%v", received: %q`, test.desc, test.expectErr, err) + } + if err := matchCreateSnapshotResponse(test.expResp, resp); err != nil { + t.Errorf("[test: %s] failed %q: got resp %+v, expected %+v", test.desc, err, resp, test.expResp) + } + if test.cleanup != nil { + if err := test.cleanup(); err != nil { + t.Errorf(`[test: %s] cleanup failed: "%v"`, test.desc, err) + } + } + }) + } +} + +func TestDeleteSnapshot(t *testing.T) { + cases := []struct { + desc string + req *csi.DeleteSnapshotRequest + expResp *csi.DeleteSnapshotResponse + expectErr bool + prepare func() error + cleanup func() error + }{ + { + desc: "delete valid snapshot", + req: &csi.DeleteSnapshotRequest{ + SnapshotId: "nfs-server.default.svc.cluster.local#share#snapshot-name#snapshot-name#src-pv-name", + }, + expResp: &csi.DeleteSnapshotResponse{}, + prepare: func() error { + if err := os.MkdirAll("/tmp/snapshot-name/snapshot-name/", 0777); err != nil { + return err + } + f, err := os.OpenFile("/tmp/snapshot-name/snapshot-name/src-pv-name.tar.gz", os.O_CREATE, 0777) + if err != nil { + return err + } + return f.Close() + }, + cleanup: func() error { return os.RemoveAll("/tmp/snapshot-name") }, + }, + { + desc: "delete nonexisting snapshot", + req: &csi.DeleteSnapshotRequest{ + SnapshotId: "nfs-server.default.svc.cluster.local#share#snapshot-name#snapshot-name#src-pv-name", + }, + expResp: &csi.DeleteSnapshotResponse{}, + }, + { + desc: "delete snapshot with improper id", + req: &csi.DeleteSnapshotRequest{ + SnapshotId: "incorrect-snap-id", + }, + expResp: &csi.DeleteSnapshotResponse{}, + }, + { + desc: "delete valid snapshot with mount options", + req: &csi.DeleteSnapshotRequest{ + SnapshotId: "nfs-server.default.svc.cluster.local#share#snapshot-name#snapshot-name#src-pv-name", + Secrets: map[string]string{"mountoptions": "nfsvers=4.1"}, + }, + expResp: &csi.DeleteSnapshotResponse{}, + prepare: func() error { + if err := os.MkdirAll("/tmp/snapshot-name/snapshot-name/", 0777); err != nil { + return err + } + f, err := os.OpenFile("/tmp/snapshot-name/snapshot-name/src-pv-name.tar.gz", os.O_CREATE, 0777) + if err != nil { + return err + } + return f.Close() + }, + cleanup: func() error { return os.RemoveAll("/tmp/snapshot-name") }, + }, + } + for _, test := range cases { + t.Run(test.desc, func(t *testing.T) { + if test.prepare != nil { + if err := test.prepare(); err != nil { + t.Errorf(`[test: %s] prepare failed: "%v"`, test.desc, err) + } + } + cs := initTestController(t) + resp, err := cs.DeleteSnapshot(context.TODO(), test.req) + if (err == nil) == test.expectErr { + t.Errorf(`[test: %s] Error expectation mismatch, expected error: "%v", received: %q`, test.desc, test.expectErr, err) + } + if !reflect.DeepEqual(test.expResp, resp) { + t.Errorf("[test: %s] got resp %+v, expected %+v", test.desc, resp, test.expResp) + } + if test.cleanup != nil { + if err := test.cleanup(); err != nil { + t.Errorf(`[test: %s] cleanup failed: "%v"`, test.desc, err) + } + } + }) + } +} + +func matchCreateSnapshotResponse(e, r *csi.CreateSnapshotResponse) error { + if e == nil && r == nil { + return nil + } + if e == nil || e.Snapshot == nil { + return fmt.Errorf("expected nil response") + } + if r == nil || r.Snapshot == nil { + return fmt.Errorf("unexpected nil response") + } + es, rs := e.Snapshot, r.Snapshot + + var errs []string + // comparing ts and size just for presence, not the exact value + if es.CreationTime.IsValid() != rs.CreationTime.IsValid() { + errs = append(errs, "CreationTime") + } + if (es.SizeBytes == 0) != (rs.SizeBytes == 0) { + errs = append(errs, "SizeBytes") + } + // comparing remaining fields for exact match + if es.ReadyToUse != rs.ReadyToUse { + errs = append(errs, "ReadyToUse") + } + if es.SnapshotId != rs.SnapshotId { + errs = append(errs, "SnapshotId") + } + if es.SourceVolumeId != rs.SourceVolumeId { + errs = append(errs, "SourceVolumeId") + } + if len(errs) == 0 { + return nil + } + return fmt.Errorf("mismatch CreateSnapshotResponse in fields: %v", strings.Join(errs, ", ")) +} From 6881ee5ddffbc00b09d512ab0ba34ed3c64b0658 Mon Sep 17 00:00:00 2001 From: Jan Wozniak Date: Sat, 18 Mar 2023 19:33:43 +0100 Subject: [PATCH 05/30] chore: go mod $ go mod tidy && go mod vendor --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 5140a414f..ea4a98d05 100644 --- a/go.mod +++ b/go.mod @@ -12,6 +12,7 @@ require ( github.com/stretchr/testify v1.8.0 golang.org/x/net v0.7.0 google.golang.org/grpc v1.40.0 + google.golang.org/protobuf v1.27.1 k8s.io/api v0.23.14 k8s.io/apimachinery v0.23.14 k8s.io/client-go v0.23.14 @@ -82,7 +83,6 @@ require ( golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2 // indirect - google.golang.org/protobuf v1.27.1 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect From 847601bb284c9761b462b87720c5d9575e56d48f Mon Sep 17 00:00:00 2001 From: andyzhangx Date: Sat, 8 Apr 2023 13:09:42 +0000 Subject: [PATCH 06/30] feat: enable securityContext.seccompProfile, set system-cluster-critical --- charts/latest/csi-driver-nfs-v0.0.0.tgz | Bin 10237 -> 10277 bytes .../templates/csi-nfs-controller.yaml | 3 +++ .../templates/csi-nfs-node.yaml | 4 ++++ .../templates/csi-snapshot-controller.yaml | 4 ++++ deploy/csi-nfs-controller.yaml | 3 +++ deploy/csi-nfs-node.yaml | 4 ++++ deploy/csi-snapshot-controller.yaml | 4 ++++ 7 files changed, 22 insertions(+) diff --git a/charts/latest/csi-driver-nfs-v0.0.0.tgz b/charts/latest/csi-driver-nfs-v0.0.0.tgz index ea01024fa47be57cb2f54a76a184d03a9f865c49..e9dcd8dced7392c5eea6c6b3e96b0255f516cf07 100644 GIT binary patch delta 10247 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 delta 10182 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 Date: Thu, 13 Apr 2023 08:11:10 +0000 Subject: [PATCH 07/30] change the storageclass configuration method in the test file --- deploy/example/statefulset.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/deploy/example/statefulset.yaml b/deploy/example/statefulset.yaml index 0a7116d37..2e9a855cf 100644 --- a/deploy/example/statefulset.yaml +++ b/deploy/example/statefulset.yaml @@ -33,9 +33,8 @@ spec: volumeClaimTemplates: - metadata: name: persistent-storage - annotations: - volume.beta.kubernetes.io/storage-class: nfs-csi spec: + storageClassName: nfs-csi accessModes: ["ReadWriteOnce"] resources: requests: From 5eed83f75ed056d4ecf2bf27e65bd66dea57da57 Mon Sep 17 00:00:00 2001 From: andyzhangx Date: Sat, 29 Apr 2023 07:29:29 +0000 Subject: [PATCH 08/30] fix: set ClusterFirstWithHostNet as default dnsPolicy --- Makefile | 1 - charts/README.md | 4 ++-- charts/latest/csi-driver-nfs-v0.0.0.tgz | Bin 10277 -> 10281 bytes charts/latest/csi-driver-nfs/values.yaml | 4 ++-- deploy/csi-nfs-controller.yaml | 2 +- deploy/csi-nfs-node.yaml | 2 +- 6 files changed, 6 insertions(+), 7 deletions(-) diff --git a/Makefile b/Makefile index 04ae1b086..fceb5315f 100644 --- a/Makefile +++ b/Makefile @@ -147,7 +147,6 @@ e2e-bootstrap: install-helm OUTPUT_TYPE=registry $(MAKE) container push helm install csi-driver-nfs ./charts/latest/csi-driver-nfs --namespace kube-system --wait --timeout=15m -v=5 --debug \ ${E2E_HELM_OPTIONS} \ - --set controller.dnsPolicy=ClusterFirstWithHostNet \ --set controller.logLevel=8 \ --set node.logLevel=8 diff --git a/charts/README.md b/charts/README.md index 40c0741e2..34f19bb91 100644 --- a/charts/README.md +++ b/charts/README.md @@ -65,7 +65,7 @@ The following table lists the configurable parameters of the latest NFS CSI Driv | `controller.replicas` | replica number of csi-nfs-controller | `1` | | `controller.runOnMaster` | run controller on master node(deprecated on k8s 1.25+) |`false` | | `controller.runOnControlPlane` | run controller on control plane node |`false` | -| `controller.dnsPolicy` | dnsPolicy of controller driver, available values: `Default`, `ClusterFirstWithHostNet`, `ClusterFirst` | `Default` | +| `controller.dnsPolicy` | dnsPolicy of controller driver, available values: `Default`, `ClusterFirstWithHostNet`, `ClusterFirst` | `ClusterFirstWithHostNet` | | `controller.defaultOnDeletePolicy` | default policy for deleting subdirectory when deleting a volume, available values: `delete`, `retain` | `delete` | | `controller.logLevel` | controller driver log level |`5` | | `controller.workingMountDir` | working directory for provisioner to mount nfs shares temporarily | `/tmp` | @@ -82,7 +82,7 @@ The following table lists the configurable parameters of the latest NFS CSI Driv | `controller.resources.nfs.requests.cpu` | csi-driver-nfs cpu requests limits | 10m | | `controller.resources.nfs.requests.memory` | csi-driver-nfs memory requests limits | 20Mi | | `node.name` | driver node daemonset name | `csi-nfs-node` -| `node.dnsPolicy` | dnsPolicy of driver node daemonset, available values: `Default`, `ClusterFirstWithHostNet`, `ClusterFirst` | +| `node.dnsPolicy` | dnsPolicy of driver node daemonset, available values: `Default`, `ClusterFirstWithHostNet`, `ClusterFirst` |`ClusterFirstWithHostNet` | `node.maxUnavailable` | `maxUnavailable` value of driver node daemonset | `1` | `node.logLevel` | node driver log level |`5` | | `node.livenessProbe.healthPort ` | the health check port for liveness probe |`29653` | diff --git a/charts/latest/csi-driver-nfs-v0.0.0.tgz b/charts/latest/csi-driver-nfs-v0.0.0.tgz index e9dcd8dced7392c5eea6c6b3e96b0255f516cf07..c3d838196451a5ebdecd9281c5c816fed42d5c08 100644 GIT binary patch delta 10055 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 B!}S0F diff --git a/charts/latest/csi-driver-nfs/values.yaml b/charts/latest/csi-driver-nfs/values.yaml index c621a666f..270bc5d06 100755 --- a/charts/latest/csi-driver-nfs/values.yaml +++ b/charts/latest/csi-driver-nfs/values.yaml @@ -53,7 +53,7 @@ controller: healthPort: 29652 logLevel: 5 workingMountDir: /tmp - dnsPolicy: Default # available values: Default, ClusterFirstWithHostNet, ClusterFirst + dnsPolicy: ClusterFirstWithHostNet # available values: Default, ClusterFirstWithHostNet, ClusterFirst defaultOnDeletePolicy: delete # available values: delete, retain affinity: {} nodeSelector: {} @@ -89,7 +89,7 @@ controller: node: name: csi-nfs-node - dnsPolicy: Default # available values: Default, ClusterFirstWithHostNet, ClusterFirst + dnsPolicy: ClusterFirstWithHostNet # available values: Default, ClusterFirstWithHostNet, ClusterFirst maxUnavailable: 1 logLevel: 5 livenessProbe: diff --git a/deploy/csi-nfs-controller.yaml b/deploy/csi-nfs-controller.yaml index 0903b39ab..5212737bd 100644 --- a/deploy/csi-nfs-controller.yaml +++ b/deploy/csi-nfs-controller.yaml @@ -15,7 +15,7 @@ spec: app: csi-nfs-controller spec: hostNetwork: true # controller also needs to mount nfs to create dir - dnsPolicy: Default # available values: Default, ClusterFirstWithHostNet, ClusterFirst + dnsPolicy: ClusterFirstWithHostNet # available values: Default, ClusterFirstWithHostNet, ClusterFirst serviceAccountName: csi-nfs-controller-sa nodeSelector: kubernetes.io/os: linux # add "kubernetes.io/role: master" to run controller on master node diff --git a/deploy/csi-nfs-node.yaml b/deploy/csi-nfs-node.yaml index e8eb6f814..55e3b6249 100644 --- a/deploy/csi-nfs-node.yaml +++ b/deploy/csi-nfs-node.yaml @@ -18,7 +18,7 @@ spec: app: csi-nfs-node spec: hostNetwork: true # original nfs connection would be broken without hostNetwork setting - dnsPolicy: Default # available values: Default, ClusterFirstWithHostNet, ClusterFirst + dnsPolicy: ClusterFirstWithHostNet # available values: Default, ClusterFirstWithHostNet, ClusterFirst serviceAccountName: csi-nfs-node-sa priorityClassName: system-node-critical securityContext: From 75a4774bd01204f9e0b6bad2e7214cca15f8d517 Mon Sep 17 00:00:00 2001 From: andyzhangx Date: Sun, 30 Apr 2023 09:00:21 +0000 Subject: [PATCH 09/30] chore: upgrade csi sidecar container images --- charts/README.md | 6 +++--- charts/latest/csi-driver-nfs-v0.0.0.tgz | Bin 10281 -> 10275 bytes charts/latest/csi-driver-nfs/values.yaml | 6 +++--- deploy/csi-nfs-controller.yaml | 4 ++-- deploy/csi-nfs-node.yaml | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/charts/README.md b/charts/README.md index 34f19bb91..d2cc15980 100644 --- a/charts/README.md +++ b/charts/README.md @@ -51,13 +51,13 @@ The following table lists the configurable parameters of the latest NFS CSI Driv | `image.nfs.tag` | csi-driver-nfs image tag | `latest` | | `image.nfs.pullPolicy` | csi-driver-nfs image pull policy | `IfNotPresent` | | `image.csiProvisioner.repository` | csi-provisioner docker image | `registry.k8s.io/sig-storage/csi-provisioner` | -| `image.csiProvisioner.tag` | csi-provisioner docker image tag | `v3.3.0` | +| `image.csiProvisioner.tag` | csi-provisioner docker image tag | `v3.5.0` | | `image.csiProvisioner.pullPolicy` | csi-provisioner image pull policy | `IfNotPresent` | | `image.livenessProbe.repository` | liveness-probe docker image | `registry.k8s.io/sig-storage/livenessprobe` | -| `image.livenessProbe.tag` | liveness-probe docker image tag | `v2.8.0` | +| `image.livenessProbe.tag` | liveness-probe docker image tag | `v2.10.0` | | `image.livenessProbe.pullPolicy` | liveness-probe image pull policy | `IfNotPresent` | | `image.nodeDriverRegistrar.repository` | csi-node-driver-registrar docker image | `registry.k8s.io/sig-storage/csi-node-driver-registrar` | -| `image.nodeDriverRegistrar.tag` | csi-node-driver-registrar docker image tag | `v2.6.2` | +| `image.nodeDriverRegistrar.tag` | csi-node-driver-registrar docker image tag | `v2.8.0` | | `image.nodeDriverRegistrar.pullPolicy` | csi-node-driver-registrar image pull policy | `IfNotPresent` | | `imagePullSecrets` | Specify docker-registry secret names as an array | [] (does not add image pull secrets to deployed pods) | | `serviceAccount.create` | whether create service account of csi-nfs-controller | `true` | diff --git a/charts/latest/csi-driver-nfs-v0.0.0.tgz b/charts/latest/csi-driver-nfs-v0.0.0.tgz index c3d838196451a5ebdecd9281c5c816fed42d5c08..552446e8dec33acf776cf9b9de154c1b8c91c18d 100644 GIT binary patch delta 10064 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 U^ZE$}1_lasRTNf*v4e&AU&J8Yu>b%7 diff --git a/charts/latest/csi-driver-nfs/values.yaml b/charts/latest/csi-driver-nfs/values.yaml index 270bc5d06..c8ba407af 100755 --- a/charts/latest/csi-driver-nfs/values.yaml +++ b/charts/latest/csi-driver-nfs/values.yaml @@ -6,7 +6,7 @@ image: pullPolicy: IfNotPresent csiProvisioner: repository: registry.k8s.io/sig-storage/csi-provisioner - tag: v3.3.0 + tag: v3.5.0 pullPolicy: IfNotPresent csiSnapshotter: repository: registry.k8s.io/sig-storage/csi-snapshotter @@ -14,11 +14,11 @@ image: pullPolicy: IfNotPresent livenessProbe: repository: registry.k8s.io/sig-storage/livenessprobe - tag: v2.8.0 + tag: v2.10.0 pullPolicy: IfNotPresent nodeDriverRegistrar: repository: registry.k8s.io/sig-storage/csi-node-driver-registrar - tag: v2.6.2 + tag: v2.8.0 pullPolicy: IfNotPresent externalSnapshotter: repository: registry.k8s.io/sig-storage/snapshot-controller diff --git a/deploy/csi-nfs-controller.yaml b/deploy/csi-nfs-controller.yaml index 5212737bd..163b77f31 100644 --- a/deploy/csi-nfs-controller.yaml +++ b/deploy/csi-nfs-controller.yaml @@ -35,7 +35,7 @@ spec: effect: "NoSchedule" containers: - name: csi-provisioner - image: registry.k8s.io/sig-storage/csi-provisioner:v3.3.0 + image: registry.k8s.io/sig-storage/csi-provisioner:v3.5.0 args: - "-v=2" - "--csi-address=$(ADDRESS)" @@ -69,7 +69,7 @@ spec: - name: socket-dir mountPath: /csi - name: liveness-probe - image: registry.k8s.io/sig-storage/livenessprobe:v2.8.0 + image: registry.k8s.io/sig-storage/livenessprobe:v2.10.0 args: - --csi-address=/csi/csi.sock - --probe-timeout=3s diff --git a/deploy/csi-nfs-node.yaml b/deploy/csi-nfs-node.yaml index 55e3b6249..2f596ae50 100644 --- a/deploy/csi-nfs-node.yaml +++ b/deploy/csi-nfs-node.yaml @@ -30,7 +30,7 @@ spec: - operator: "Exists" containers: - name: liveness-probe - image: registry.k8s.io/sig-storage/livenessprobe:v2.8.0 + image: registry.k8s.io/sig-storage/livenessprobe:v2.10.0 args: - --csi-address=/csi/csi.sock - --probe-timeout=3s @@ -46,7 +46,7 @@ spec: cpu: 10m memory: 20Mi - name: node-driver-registrar - image: registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.6.2 + image: registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.8.0 args: - --v=2 - --csi-address=/csi/csi.sock From 76187a6babe9ca28a211154eb2af05ef9b4da12d Mon Sep 17 00:00:00 2001 From: andyzhangx Date: Fri, 5 May 2023 11:34:39 +0000 Subject: [PATCH 10/30] chore: add dependabot --- .github/dependabot.yaml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 .github/dependabot.yaml diff --git a/.github/dependabot.yaml b/.github/dependabot.yaml new file mode 100644 index 000000000..b2da86fea --- /dev/null +++ b/.github/dependabot.yaml @@ -0,0 +1,20 @@ +version: 2 +updates: +- package-ecosystem: gomod + directory: "/" + schedule: + interval: daily + labels: + - "area/dependency" + - "release-note-none" + - "ok-to-test" + open-pull-requests-limit: 1 +- package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "daily" + labels: + - "area/dependency" + - "release-note-none" + - "ok-to-test" + open-pull-requests-limit: 1 From 921d186cde978b3546e48569a3767504b8f01231 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 May 2023 11:58:25 +0000 Subject: [PATCH 11/30] chore(deps): bump github/codeql-action from 1 to 2 Bumps [github/codeql-action](https://github.com/github/codeql-action) from 1 to 2. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/v1...v2) --- updated-dependencies: - dependency-name: github/codeql-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/codeql-analysis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index f961545b1..9e5807367 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -48,7 +48,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v1 + uses: github/codeql-action/init@v2 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -63,4 +63,4 @@ jobs: make all - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v1 + uses: github/codeql-action/analyze@v2 From f70acd44d51183156389f40e3742533e74fb24e2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 May 2023 11:59:08 +0000 Subject: [PATCH 12/30] chore(deps): bump sigs.k8s.io/yaml from 1.2.0 to 1.3.0 Bumps [sigs.k8s.io/yaml](https://github.com/kubernetes-sigs/yaml) from 1.2.0 to 1.3.0. - [Release notes](https://github.com/kubernetes-sigs/yaml/releases) - [Changelog](https://github.com/kubernetes-sigs/yaml/blob/master/RELEASE.md) - [Commits](https://github.com/kubernetes-sigs/yaml/compare/v1.2.0...v1.3.0) --- updated-dependencies: - dependency-name: sigs.k8s.io/yaml dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 3 ++- vendor/modules.txt | 2 +- vendor/sigs.k8s.io/yaml/.gitignore | 4 ++++ vendor/sigs.k8s.io/yaml/.travis.yml | 7 +++---- vendor/sigs.k8s.io/yaml/README.md | 2 +- 6 files changed, 12 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index ea4a98d05..e611bfac5 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ require ( k8s.io/kubernetes v1.23.14 k8s.io/mount-utils v0.23.14 k8s.io/utils v0.0.0-20221107191617-1a15be271d1d - sigs.k8s.io/yaml v1.2.0 + sigs.k8s.io/yaml v1.3.0 ) require ( diff --git a/go.sum b/go.sum index 9b21a8d2b..7643f1937 100644 --- a/go.sum +++ b/go.sum @@ -1191,5 +1191,6 @@ sigs.k8s.io/kustomize/kyaml v0.13.0/go.mod h1:FTJxEZ86ScK184NpGSAQcfEqee0nul8oLC sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.2.1 h1:bKCqE9GvQ5tiVHn5rfn1r+yao3aLQEaLzkkmAkf+A6Y= sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= +sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= +sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/vendor/modules.txt b/vendor/modules.txt index 7cb2ab831..288bf617d 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -986,7 +986,7 @@ sigs.k8s.io/structured-merge-diff/v4/fieldpath sigs.k8s.io/structured-merge-diff/v4/schema sigs.k8s.io/structured-merge-diff/v4/typed sigs.k8s.io/structured-merge-diff/v4/value -# sigs.k8s.io/yaml v1.2.0 +# sigs.k8s.io/yaml v1.3.0 ## explicit; go 1.12 sigs.k8s.io/yaml # k8s.io/api => k8s.io/api v0.23.14 diff --git a/vendor/sigs.k8s.io/yaml/.gitignore b/vendor/sigs.k8s.io/yaml/.gitignore index e256a31e0..2dc92904e 100644 --- a/vendor/sigs.k8s.io/yaml/.gitignore +++ b/vendor/sigs.k8s.io/yaml/.gitignore @@ -6,6 +6,10 @@ .project .settings/** +# Idea files +.idea/** +.idea/ + # Emacs save files *~ diff --git a/vendor/sigs.k8s.io/yaml/.travis.yml b/vendor/sigs.k8s.io/yaml/.travis.yml index d20e23eff..54ed8f9cb 100644 --- a/vendor/sigs.k8s.io/yaml/.travis.yml +++ b/vendor/sigs.k8s.io/yaml/.travis.yml @@ -1,8 +1,7 @@ language: go -dist: xenial -go: - - 1.12.x - - 1.13.x +arch: arm64 +dist: focal +go: 1.15.x script: - diff -u <(echo -n) <(gofmt -d *.go) - diff -u <(echo -n) <(golint $(go list -e ./...) | grep -v YAMLToJSON) diff --git a/vendor/sigs.k8s.io/yaml/README.md b/vendor/sigs.k8s.io/yaml/README.md index 5a651d916..e81cc426b 100644 --- a/vendor/sigs.k8s.io/yaml/README.md +++ b/vendor/sigs.k8s.io/yaml/README.md @@ -107,8 +107,8 @@ func main() { } fmt.Println(string(y)) /* Output: - name: John age: 30 + name: John */ j2, err := yaml.YAMLToJSON(y) if err != nil { From cf1075483f82e61cbd2f589f6661db4d11323868 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 May 2023 23:02:40 +0000 Subject: [PATCH 13/30] chore(deps): bump actions/setup-go from 2 to 4 Bumps [actions/setup-go](https://github.com/actions/setup-go) from 2 to 4. - [Release notes](https://github.com/actions/setup-go/releases) - [Commits](https://github.com/actions/setup-go/compare/v2...v4) --- updated-dependencies: - dependency-name: actions/setup-go dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/codeql-analysis.yml | 2 +- .github/workflows/darwin.yaml | 2 +- .github/workflows/linux.yaml | 2 +- .github/workflows/static.yaml | 2 +- .github/workflows/trivy.yaml | 2 +- .github/workflows/windows.yaml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 9e5807367..1c1bbf05b 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -38,7 +38,7 @@ jobs: steps: - name: Set up Go 1.x - uses: actions/setup-go@v2 + uses: actions/setup-go@v4 with: go-version: ^1.18 id: go diff --git a/.github/workflows/darwin.yaml b/.github/workflows/darwin.yaml index 4ab87ff72..0b0dca399 100644 --- a/.github/workflows/darwin.yaml +++ b/.github/workflows/darwin.yaml @@ -8,7 +8,7 @@ jobs: runs-on: macos-latest steps: - name: Set up Go 1.x - uses: actions/setup-go@v2 + uses: actions/setup-go@v4 with: go-version: ^1.16 id: go diff --git a/.github/workflows/linux.yaml b/.github/workflows/linux.yaml index c17c12425..7937760dd 100644 --- a/.github/workflows/linux.yaml +++ b/.github/workflows/linux.yaml @@ -11,7 +11,7 @@ jobs: steps: - name: Set up Go 1.x - uses: actions/setup-go@v2 + uses: actions/setup-go@v4 with: go-version: ^1.17 id: go diff --git a/.github/workflows/static.yaml b/.github/workflows/static.yaml index fa2f9c9fa..220117e94 100644 --- a/.github/workflows/static.yaml +++ b/.github/workflows/static.yaml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Set up Go 1.x - uses: actions/setup-go@v3 + uses: actions/setup-go@v4 with: go-version: ^1.19 - uses: actions/checkout@master diff --git a/.github/workflows/trivy.yaml b/.github/workflows/trivy.yaml index cb853130c..a1f9a5d4b 100644 --- a/.github/workflows/trivy.yaml +++ b/.github/workflows/trivy.yaml @@ -13,7 +13,7 @@ jobs: uses: actions/checkout@v3 - name: Install go - uses: actions/setup-go@v3 + uses: actions/setup-go@v4 with: go-version: ^1.19 diff --git a/.github/workflows/windows.yaml b/.github/workflows/windows.yaml index f24ac7649..07ab2077d 100644 --- a/.github/workflows/windows.yaml +++ b/.github/workflows/windows.yaml @@ -11,7 +11,7 @@ jobs: runs-on: ${{ matrix.platform }} steps: - name: Install Go - uses: actions/setup-go@v2 + uses: actions/setup-go@v4 with: go-version: ${{ matrix.go }} - name: Checkout code From eb5b685f9ff6a1a840abc5df56de17f9f847bd36 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 May 2023 23:02:56 +0000 Subject: [PATCH 14/30] chore(deps): bump golang.org/x/net from 0.7.0 to 0.9.0 Bumps [golang.org/x/net](https://github.com/golang/net) from 0.7.0 to 0.9.0. - [Commits](https://github.com/golang/net/compare/v0.7.0...v0.9.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 8 +- go.sum | 16 +- vendor/golang.org/x/net/html/doc.go | 15 ++ vendor/golang.org/x/net/html/escape.go | 81 ++++++++++ vendor/golang.org/x/net/html/render.go | 2 +- vendor/golang.org/x/net/html/token.go | 10 +- vendor/golang.org/x/net/http2/pipe.go | 6 +- vendor/golang.org/x/net/http2/server.go | 7 +- vendor/golang.org/x/net/http2/transport.go | 11 +- vendor/golang.org/x/sys/cpu/hwcap_linux.go | 15 ++ vendor/golang.org/x/sys/cpu/runtime_auxv.go | 16 ++ .../x/sys/cpu/runtime_auxv_go121.go | 19 +++ vendor/golang.org/x/sys/unix/ioctl_signed.go | 70 +++++++++ .../sys/unix/{ioctl.go => ioctl_unsigned.go} | 21 +-- vendor/golang.org/x/sys/unix/ioctl_zos.go | 20 ++- vendor/golang.org/x/sys/unix/mkerrors.sh | 2 + vendor/golang.org/x/sys/unix/ptrace_darwin.go | 6 + vendor/golang.org/x/sys/unix/ptrace_ios.go | 6 + vendor/golang.org/x/sys/unix/syscall_aix.go | 7 +- .../golang.org/x/sys/unix/syscall_aix_ppc.go | 1 - .../x/sys/unix/syscall_aix_ppc64.go | 1 - vendor/golang.org/x/sys/unix/syscall_bsd.go | 3 +- .../golang.org/x/sys/unix/syscall_darwin.go | 15 +- .../x/sys/unix/syscall_darwin_amd64.go | 1 + .../x/sys/unix/syscall_darwin_arm64.go | 1 + .../x/sys/unix/syscall_dragonfly.go | 2 +- .../golang.org/x/sys/unix/syscall_freebsd.go | 44 +++++- .../x/sys/unix/syscall_freebsd_386.go | 17 +-- .../x/sys/unix/syscall_freebsd_amd64.go | 17 +-- .../x/sys/unix/syscall_freebsd_arm.go | 15 +- .../x/sys/unix/syscall_freebsd_arm64.go | 15 +- .../x/sys/unix/syscall_freebsd_riscv64.go | 15 +- vendor/golang.org/x/sys/unix/syscall_hurd.go | 8 + vendor/golang.org/x/sys/unix/syscall_linux.go | 46 ++++-- .../x/sys/unix/syscall_linux_386.go | 27 ---- .../x/sys/unix/syscall_linux_amd64.go | 1 - .../x/sys/unix/syscall_linux_arm.go | 27 ---- .../x/sys/unix/syscall_linux_arm64.go | 10 -- .../x/sys/unix/syscall_linux_loong64.go | 5 - .../x/sys/unix/syscall_linux_mips64x.go | 1 - .../x/sys/unix/syscall_linux_mipsx.go | 27 ---- .../x/sys/unix/syscall_linux_ppc.go | 27 ---- .../x/sys/unix/syscall_linux_ppc64x.go | 1 - .../x/sys/unix/syscall_linux_riscv64.go | 1 - .../x/sys/unix/syscall_linux_s390x.go | 1 - .../x/sys/unix/syscall_linux_sparc64.go | 1 - .../golang.org/x/sys/unix/syscall_netbsd.go | 7 +- .../golang.org/x/sys/unix/syscall_openbsd.go | 2 +- .../golang.org/x/sys/unix/syscall_solaris.go | 36 ++--- vendor/golang.org/x/sys/unix/syscall_unix.go | 7 + .../x/sys/unix/syscall_zos_s390x.go | 6 +- .../x/sys/unix/zerrors_darwin_amd64.go | 19 +++ .../x/sys/unix/zerrors_darwin_arm64.go | 19 +++ vendor/golang.org/x/sys/unix/zerrors_linux.go | 10 +- .../x/sys/unix/zptrace_armnn_linux.go | 8 +- .../x/sys/unix/zptrace_linux_arm64.go | 4 +- .../x/sys/unix/zptrace_mipsnn_linux.go | 8 +- .../x/sys/unix/zptrace_mipsnnle_linux.go | 8 +- .../x/sys/unix/zptrace_x86_linux.go | 8 +- .../golang.org/x/sys/unix/zsyscall_aix_ppc.go | 23 ++- .../x/sys/unix/zsyscall_aix_ppc64.go | 24 +-- .../x/sys/unix/zsyscall_aix_ppc64_gc.go | 17 +-- .../x/sys/unix/zsyscall_aix_ppc64_gccgo.go | 18 +-- .../x/sys/unix/zsyscall_darwin_amd64.go | 55 +++++-- .../x/sys/unix/zsyscall_darwin_amd64.s | 11 +- .../x/sys/unix/zsyscall_darwin_arm64.go | 55 +++++-- .../x/sys/unix/zsyscall_darwin_arm64.s | 11 +- .../x/sys/unix/zsyscall_dragonfly_amd64.go | 20 +-- .../x/sys/unix/zsyscall_freebsd_386.go | 30 ++-- .../x/sys/unix/zsyscall_freebsd_amd64.go | 30 ++-- .../x/sys/unix/zsyscall_freebsd_arm.go | 30 ++-- .../x/sys/unix/zsyscall_freebsd_arm64.go | 30 ++-- .../x/sys/unix/zsyscall_freebsd_riscv64.go | 30 ++-- .../golang.org/x/sys/unix/zsyscall_linux.go | 20 +-- .../x/sys/unix/zsyscall_linux_386.go | 10 -- .../x/sys/unix/zsyscall_linux_amd64.go | 10 -- .../x/sys/unix/zsyscall_linux_arm.go | 10 -- .../x/sys/unix/zsyscall_linux_arm64.go | 10 -- .../x/sys/unix/zsyscall_linux_mips.go | 10 -- .../x/sys/unix/zsyscall_linux_mips64.go | 10 -- .../x/sys/unix/zsyscall_linux_mips64le.go | 10 -- .../x/sys/unix/zsyscall_linux_mipsle.go | 10 -- .../x/sys/unix/zsyscall_linux_ppc.go | 10 -- .../x/sys/unix/zsyscall_linux_ppc64.go | 10 -- .../x/sys/unix/zsyscall_linux_ppc64le.go | 10 -- .../x/sys/unix/zsyscall_linux_riscv64.go | 10 -- .../x/sys/unix/zsyscall_linux_s390x.go | 10 -- .../x/sys/unix/zsyscall_linux_sparc64.go | 10 -- .../x/sys/unix/zsyscall_netbsd_386.go | 20 +-- .../x/sys/unix/zsyscall_netbsd_amd64.go | 20 +-- .../x/sys/unix/zsyscall_netbsd_arm.go | 20 +-- .../x/sys/unix/zsyscall_netbsd_arm64.go | 20 +-- .../x/sys/unix/zsyscall_openbsd_386.go | 22 +-- .../x/sys/unix/zsyscall_openbsd_386.s | 5 - .../x/sys/unix/zsyscall_openbsd_amd64.go | 22 +-- .../x/sys/unix/zsyscall_openbsd_amd64.s | 5 - .../x/sys/unix/zsyscall_openbsd_arm.go | 22 +-- .../x/sys/unix/zsyscall_openbsd_arm.s | 5 - .../x/sys/unix/zsyscall_openbsd_arm64.go | 22 +-- .../x/sys/unix/zsyscall_openbsd_arm64.s | 5 - .../x/sys/unix/zsyscall_openbsd_mips64.go | 22 +-- .../x/sys/unix/zsyscall_openbsd_mips64.s | 5 - .../x/sys/unix/zsyscall_openbsd_ppc64.go | 22 +-- .../x/sys/unix/zsyscall_openbsd_ppc64.s | 6 - .../x/sys/unix/zsyscall_openbsd_riscv64.go | 22 +-- .../x/sys/unix/zsyscall_openbsd_riscv64.s | 5 - .../x/sys/unix/zsyscall_solaris_amd64.go | 26 ++-- .../x/sys/unix/zsyscall_zos_s390x.go | 12 +- .../x/sys/unix/ztypes_darwin_amd64.go | 11 ++ .../x/sys/unix/ztypes_darwin_arm64.go | 11 ++ .../x/sys/unix/ztypes_freebsd_386.go | 2 +- .../x/sys/unix/ztypes_freebsd_amd64.go | 2 +- .../x/sys/unix/ztypes_freebsd_arm.go | 2 +- .../x/sys/unix/ztypes_freebsd_arm64.go | 2 +- .../x/sys/unix/ztypes_freebsd_riscv64.go | 2 +- vendor/golang.org/x/sys/unix/ztypes_linux.go | 140 +++++++++++++----- .../golang.org/x/sys/unix/ztypes_linux_386.go | 2 +- .../x/sys/unix/ztypes_linux_amd64.go | 2 +- .../golang.org/x/sys/unix/ztypes_linux_arm.go | 2 +- .../x/sys/unix/ztypes_linux_arm64.go | 2 +- .../x/sys/unix/ztypes_linux_loong64.go | 2 +- .../x/sys/unix/ztypes_linux_mips.go | 2 +- .../x/sys/unix/ztypes_linux_mips64.go | 2 +- .../x/sys/unix/ztypes_linux_mips64le.go | 2 +- .../x/sys/unix/ztypes_linux_mipsle.go | 2 +- .../golang.org/x/sys/unix/ztypes_linux_ppc.go | 2 +- .../x/sys/unix/ztypes_linux_ppc64.go | 2 +- .../x/sys/unix/ztypes_linux_ppc64le.go | 2 +- .../x/sys/unix/ztypes_linux_riscv64.go | 2 +- .../x/sys/unix/ztypes_linux_s390x.go | 2 +- .../x/sys/unix/ztypes_linux_sparc64.go | 2 +- .../x/sys/windows/syscall_windows.go | 6 +- .../golang.org/x/sys/windows/types_windows.go | 89 ++++++++++- .../x/sys/windows/zsyscall_windows.go | 27 ++++ .../x/text/encoding/internal/internal.go | 2 +- .../x/text/unicode/norm/forminfo.go | 2 +- vendor/modules.txt | 8 +- 137 files changed, 1123 insertions(+), 875 deletions(-) create mode 100644 vendor/golang.org/x/sys/cpu/runtime_auxv.go create mode 100644 vendor/golang.org/x/sys/cpu/runtime_auxv_go121.go create mode 100644 vendor/golang.org/x/sys/unix/ioctl_signed.go rename vendor/golang.org/x/sys/unix/{ioctl.go => ioctl_unsigned.go} (76%) diff --git a/go.mod b/go.mod index e611bfac5..f53d0aa54 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( github.com/onsi/gomega v1.10.1 github.com/pborman/uuid v1.2.0 github.com/stretchr/testify v1.8.0 - golang.org/x/net v0.7.0 + golang.org/x/net v0.9.0 google.golang.org/grpc v1.40.0 google.golang.org/protobuf v1.27.1 k8s.io/api v0.23.14 @@ -76,9 +76,9 @@ require ( go.opentelemetry.io/proto/otlp v0.7.0 // indirect golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 // indirect golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f // indirect - golang.org/x/sys v0.5.0 // indirect - golang.org/x/term v0.5.0 // indirect - golang.org/x/text v0.7.0 // indirect + golang.org/x/sys v0.7.0 // indirect + golang.org/x/term v0.7.0 // indirect + golang.org/x/text v0.9.0 // indirect golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect google.golang.org/appengine v1.6.7 // indirect diff --git a/go.sum b/go.sum index 7643f1937..3d17f79b4 100644 --- a/go.sum +++ b/go.sum @@ -755,8 +755,8 @@ golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM= +golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -861,12 +861,12 @@ golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.7.0 h1:BEvjmm5fURWqcfbSKTdpkDXYBrUS1c0m8agp14W48vQ= +golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -876,8 +876,8 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= diff --git a/vendor/golang.org/x/net/html/doc.go b/vendor/golang.org/x/net/html/doc.go index 822ed42a0..5ff8480cf 100644 --- a/vendor/golang.org/x/net/html/doc.go +++ b/vendor/golang.org/x/net/html/doc.go @@ -92,6 +92,21 @@ example, to process each anchor node in depth-first order: The relevant specifications include: https://html.spec.whatwg.org/multipage/syntax.html and https://html.spec.whatwg.org/multipage/syntax.html#tokenization + +# Security Considerations + +Care should be taken when parsing and interpreting HTML, whether full documents +or fragments, within the framework of the HTML specification, especially with +regard to untrusted inputs. + +This package provides both a tokenizer and a parser. Only the parser constructs +a DOM according to the HTML specification, resolving malformed and misplaced +tags where appropriate. The tokenizer simply tokenizes the HTML presented to it, +and as such does not resolve issues that may exist in the processed HTML, +producing a literal interpretation of the input. + +If your use case requires semantically well-formed HTML, as defined by the +WHATWG specification, the parser should be used rather than the tokenizer. */ package html // import "golang.org/x/net/html" diff --git a/vendor/golang.org/x/net/html/escape.go b/vendor/golang.org/x/net/html/escape.go index d85613962..04c6bec21 100644 --- a/vendor/golang.org/x/net/html/escape.go +++ b/vendor/golang.org/x/net/html/escape.go @@ -193,6 +193,87 @@ func lower(b []byte) []byte { return b } +// escapeComment is like func escape but escapes its input bytes less often. +// Per https://github.com/golang/go/issues/58246 some HTML comments are (1) +// meaningful and (2) contain angle brackets that we'd like to avoid escaping +// unless we have to. +// +// "We have to" includes the '&' byte, since that introduces other escapes. +// +// It also includes those bytes (not including EOF) that would otherwise end +// the comment. Per the summary table at the bottom of comment_test.go, this is +// the '>' byte that, per above, we'd like to avoid escaping unless we have to. +// +// Studying the summary table (and T actions in its '>' column) closely, we +// only need to escape in states 43, 44, 49, 51 and 52. State 43 is at the +// start of the comment data. State 52 is after a '!'. The other three states +// are after a '-'. +// +// Our algorithm is thus to escape every '&' and to escape '>' if and only if: +// - The '>' is after a '!' or '-' (in the unescaped data) or +// - The '>' is at the start of the comment data (after the opening ""); err != nil { diff --git a/vendor/golang.org/x/net/html/token.go b/vendor/golang.org/x/net/html/token.go index 50f7c6aac..5c2a1f4ef 100644 --- a/vendor/golang.org/x/net/html/token.go +++ b/vendor/golang.org/x/net/html/token.go @@ -110,7 +110,7 @@ func (t Token) String() string { case SelfClosingTagToken: return "<" + t.tagString() + "/>" case CommentToken: - return "" + return "" case DoctypeToken: return "" } @@ -598,10 +598,10 @@ scriptDataDoubleEscapeEnd: // readComment reads the next comment token starting with "