zfs-localpv/pkg/builder/snapbuilder/kubernetes.go

429 lines
10 KiB
Go
Raw Normal View History

feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
// Copyright © 2020 The OpenEBS Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
package snapbuilder
import (
"context"
"encoding/json"
client "github.com/openebs/lib-csi/pkg/common/kubernetes/client"
apis "github.com/openebs/zfs-localpv/pkg/apis/openebs.io/zfs/v1"
clientset "github.com/openebs/zfs-localpv/pkg/generated/clientset/internalclientset"
"github.com/pkg/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
// getClientsetFn is a typed function that
// abstracts fetching of internal clientset
type getClientsetFn func() (clientset *clientset.Clientset, err error)
// getClientsetFromPathFn is a typed function that
// abstracts fetching of clientset from kubeConfigPath
type getClientsetForPathFn func(kubeConfigPath string) (
clientset *clientset.Clientset,
err error,
)
// createFn is a typed function that abstracts
feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
// creating zfssnap volume instance
type createFn func(
cs *clientset.Clientset,
feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
upgradeResultObj *apis.ZFSSnapshot,
namespace string,
feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
) (*apis.ZFSSnapshot, error)
// getFn is a typed function that abstracts
feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
// fetching a zfssnap volume instance
type getFn func(
cli *clientset.Clientset,
name,
namespace string,
opts metav1.GetOptions,
feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
) (*apis.ZFSSnapshot, error)
// listFn is a typed function that abstracts
feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
// listing of zfssnap volume instances
type listFn func(
cli *clientset.Clientset,
namespace string,
opts metav1.ListOptions,
feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
) (*apis.ZFSSnapshotList, error)
// delFn is a typed function that abstracts
feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
// deleting a zfssnap volume instance
type delFn func(
cli *clientset.Clientset,
name,
namespace string,
opts *metav1.DeleteOptions,
) error
// updateFn is a typed function that abstracts
feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
// updating zfssnap volume instance
type updateFn func(
cs *clientset.Clientset,
feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
vol *apis.ZFSSnapshot,
namespace string,
feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
) (*apis.ZFSSnapshot, error)
// Kubeclient enables kubernetes API operations
feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
// on zfssnap volume instance
type Kubeclient struct {
feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
// clientset refers to zfssnap volume's
// clientset that will be responsible to
// make kubernetes API calls
clientset *clientset.Clientset
kubeConfigPath string
// namespace holds the namespace on which
// kubeclient has to operate
namespace string
// functions useful during mocking
getClientset getClientsetFn
getClientsetForPath getClientsetForPathFn
get getFn
list listFn
del delFn
create createFn
update updateFn
}
// KubeclientBuildOption defines the abstraction
// to build a kubeclient instance
type KubeclientBuildOption func(*Kubeclient)
// defaultGetClientset is the default implementation to
// get kubernetes clientset instance
func defaultGetClientset() (clients *clientset.Clientset, err error) {
config, err := client.GetConfig(client.New())
if err != nil {
return nil, err
}
return clientset.NewForConfig(config)
}
// defaultGetClientsetForPath is the default implementation to
// get kubernetes clientset instance based on the given
// kubeconfig path
func defaultGetClientsetForPath(
kubeConfigPath string,
) (clients *clientset.Clientset, err error) {
config, err := client.GetConfig(
client.New(client.WithKubeConfigPath(kubeConfigPath)))
if err != nil {
return nil, err
}
return clientset.NewForConfig(config)
}
// defaultGet is the default implementation to get
feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
// a zfssnap volume instance in kubernetes cluster
func defaultGet(
cli *clientset.Clientset,
name, namespace string,
opts metav1.GetOptions,
feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
) (*apis.ZFSSnapshot, error) {
return cli.ZfsV1().
feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
ZFSSnapshots(namespace).
Get(context.TODO(), name, opts)
}
// defaultList is the default implementation to list
feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
// zfssnap volume instances in kubernetes cluster
func defaultList(
cli *clientset.Clientset,
namespace string,
opts metav1.ListOptions,
feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
) (*apis.ZFSSnapshotList, error) {
return cli.ZfsV1().
feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
ZFSSnapshots(namespace).
List(context.TODO(), opts)
}
// defaultCreate is the default implementation to delete
feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
// a zfssnap volume instance in kubernetes cluster
func defaultDel(
cli *clientset.Clientset,
name, namespace string,
opts *metav1.DeleteOptions,
) error {
deletePropagation := metav1.DeletePropagationForeground
opts.PropagationPolicy = &deletePropagation
err := cli.ZfsV1().
feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
ZFSSnapshots(namespace).
Delete(context.TODO(), name, *opts)
return err
}
// defaultCreate is the default implementation to create
feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
// a zfssnap volume instance in kubernetes cluster
func defaultCreate(
cli *clientset.Clientset,
feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
vol *apis.ZFSSnapshot,
namespace string,
feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
) (*apis.ZFSSnapshot, error) {
return cli.ZfsV1().
feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
ZFSSnapshots(namespace).
Create(context.TODO(), vol, metav1.CreateOptions{})
}
// defaultUpdate is the default implementation to update
feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
// a zfssnap volume instance in kubernetes cluster
func defaultUpdate(
cli *clientset.Clientset,
feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
vol *apis.ZFSSnapshot,
namespace string,
feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
) (*apis.ZFSSnapshot, error) {
return cli.ZfsV1().
feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
ZFSSnapshots(namespace).
Update(context.TODO(), vol, metav1.UpdateOptions{})
}
// withDefaults sets the default options
// of kubeclient instance
func (k *Kubeclient) withDefaults() {
if k.getClientset == nil {
k.getClientset = defaultGetClientset
}
if k.getClientsetForPath == nil {
k.getClientsetForPath = defaultGetClientsetForPath
}
if k.get == nil {
k.get = defaultGet
}
if k.list == nil {
k.list = defaultList
}
if k.del == nil {
k.del = defaultDel
}
if k.create == nil {
k.create = defaultCreate
}
if k.update == nil {
k.update = defaultUpdate
}
}
// WithClientSet sets the kubernetes client against
// the kubeclient instance
func WithClientSet(c *clientset.Clientset) KubeclientBuildOption {
return func(k *Kubeclient) {
k.clientset = c
}
}
// WithNamespace sets the kubernetes client against
// the provided namespace
func WithNamespace(namespace string) KubeclientBuildOption {
return func(k *Kubeclient) {
k.namespace = namespace
}
}
// WithNamespace sets the provided namespace
// against this Kubeclient instance
func (k *Kubeclient) WithNamespace(namespace string) *Kubeclient {
k.namespace = namespace
return k
}
// WithKubeConfigPath sets the kubernetes client
// against the provided path
func WithKubeConfigPath(path string) KubeclientBuildOption {
return func(k *Kubeclient) {
k.kubeConfigPath = path
}
}
// NewKubeclient returns a new instance of
feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
// kubeclient meant for zfssnap volume operations
func NewKubeclient(opts ...KubeclientBuildOption) *Kubeclient {
k := &Kubeclient{}
for _, o := range opts {
o(k)
}
k.withDefaults()
return k
}
func (k *Kubeclient) getClientsetForPathOrDirect() (
*clientset.Clientset,
error,
) {
if k.kubeConfigPath != "" {
return k.getClientsetForPath(k.kubeConfigPath)
}
return k.getClientset()
}
// getClientOrCached returns either a new instance
// of kubernetes client or its cached copy
func (k *Kubeclient) getClientOrCached() (*clientset.Clientset, error) {
if k.clientset != nil {
return k.clientset, nil
}
c, err := k.getClientsetForPathOrDirect()
if err != nil {
return nil,
errors.Wrapf(
err,
"failed to get clientset",
)
}
k.clientset = c
return k.clientset, nil
}
feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
// Create creates a zfssnap volume instance
// in kubernetes cluster
feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
func (k *Kubeclient) Create(vol *apis.ZFSSnapshot) (*apis.ZFSSnapshot, error) {
if vol == nil {
return nil,
errors.New(
"failed to create csivolume: nil vol object",
)
}
cs, err := k.getClientOrCached()
if err != nil {
return nil, errors.Wrapf(
err,
feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
"failed to create zfssnap volume {%s} in namespace {%s}",
vol.Name,
k.namespace,
)
}
return k.create(cs, vol, k.namespace)
}
feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
// Get returns zfssnap volume object for given name
func (k *Kubeclient) Get(
name string,
opts metav1.GetOptions,
feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
) (*apis.ZFSSnapshot, error) {
if name == "" {
return nil,
errors.New(
feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
"failed to get zfssnap volume: missing zfssnap volume name",
)
}
cli, err := k.getClientOrCached()
if err != nil {
return nil, errors.Wrapf(
err,
feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
"failed to get zfssnap volume {%s} in namespace {%s}",
name,
k.namespace,
)
}
return k.get(cli, name, k.namespace, opts)
}
feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
// GetRaw returns zfssnap volume instance
// in bytes
func (k *Kubeclient) GetRaw(
name string,
opts metav1.GetOptions,
) ([]byte, error) {
if name == "" {
return nil, errors.New(
feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
"failed to get raw zfssnap volume: missing vol name",
)
}
csiv, err := k.Get(name, opts)
if err != nil {
return nil, errors.Wrapf(
err,
feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
"failed to get zfssnap volume {%s} in namespace {%s}",
name,
k.namespace,
)
}
return json.Marshal(csiv)
}
feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
// List returns a list of zfssnap volume
// instances present in kubernetes cluster
feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
func (k *Kubeclient) List(opts metav1.ListOptions) (*apis.ZFSSnapshotList, error) {
cli, err := k.getClientOrCached()
if err != nil {
return nil, errors.Wrapf(
err,
feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
"failed to list zfssnap volumes in namespace {%s}",
k.namespace,
)
}
return k.list(cli, k.namespace, opts)
}
feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
// Delete deletes the zfssnap volume from
// kubernetes
func (k *Kubeclient) Delete(name string) error {
if name == "" {
return errors.New(
"failed to delete csivolume: missing vol name",
)
}
cli, err := k.getClientOrCached()
if err != nil {
return errors.Wrapf(
err,
"failed to delete csivolume {%s} in namespace {%s}",
name,
k.namespace,
)
}
return k.del(cli, name, k.namespace, &metav1.DeleteOptions{})
}
feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
// Update updates this zfssnap volume instance
// against kubernetes cluster
feat(zfspv): adding snapshot and clone support for ZFSPV (#39) This commits support snapshot and clone commands via CSI driver. User can create snap and clone using the following steps. Note: - Snapshot is created via reconciliation CR - Cloned volume will be on the same zpool where the snapshot is taken - Cloned volume will have same properties as source volume. ----------------------------------- Create a Snapshotclass ``` kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: zfspv-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" driver: zfs.csi.openebs.io deletionPolicy: Delete ``` Once snapshotclass is created, we can use this class to create a Snapshot ``` apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: zfspv-snap spec: volumeSnapshotClassName: zfspv-snapclass source: persistentVolumeClaimName: csi-zfspv ``` ``` $ kubectl get volumesnapshot NAME AGE zfspv-snap 7m52s ``` ``` $ kubectl get volumesnapshot -o yaml apiVersion: v1 items: - apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"snapshot.storage.k8s.io/v1beta1","kind":"VolumeSnapshot","metadata":{"annotations":{},"name":"zfspv-snap","namespace":"default"},"spec":{"source":{"persistentVolumeClaimName":"csi-zfspv"},"volumeSnapshotClassName":"zfspv-snapclass"}} creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection - snapshot.storage.kubernetes.io/volumesnapshot-bound-protection generation: 1 name: zfspv-snap namespace: default resourceVersion: "30040" selfLink: /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/zfspv-snap uid: 1a5cf166-c599-4f58-9f3c-f1148be47fca spec: source: persistentVolumeClaimName: csi-zfspv volumeSnapshotClassName: zfspv-snapclass status: boundVolumeSnapshotContentName: snapcontent-1a5cf166-c599-4f58-9f3c-f1148be47fca creationTime: "2020-01-30T10:31:24Z" readyToUse: true restoreSize: "0" kind: List metadata: resourceVersion: "" selfLink: "" ``` Openebs resource for the created snapshot ``` $ kubectl get snap -n openebs -o yaml apiVersion: v1 items: - apiVersion: openebs.io/v1alpha1 kind: ZFSSnapshot metadata: creationTimestamp: "2020-01-30T10:31:24Z" finalizers: - zfs.openebs.io/finalizer generation: 2 labels: kubernetes.io/nodename: pawan-2 openebs.io/persistent-volume: pvc-18cab7c3-ec5e-4264-8507-e6f7df4c789a name: snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca namespace: openebs resourceVersion: "30035" selfLink: /apis/openebs.io/v1alpha1/namespaces/openebs/zfssnapshots/snapshot-1a5cf166-c599-4f58-9f3c-f1148be47fca uid: e29d571c-42b5-4fb7-9110-e1cfc9b96641 spec: capacity: "4294967296" fsType: zfs ownerNodeID: pawan-2 poolName: zfspv-pool status: Ready volumeType: DATASET kind: List metadata: resourceVersion: "" selfLink: "" ``` Create a clone volume We can provide a datasource as snapshot name to create a clone volume ```yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: zfspv-clone spec: storageClassName: openebs-zfspv dataSource: name: zfspv-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 4Gi ``` It will create a ZFS clone volume from the mentioned snapshot and create the PV on the same node where original volume is there. Here, As resize is not supported yet, the clone PVC size should match the size of the snapshot. Also, all the properties from the storageclass will not be considered for the clone case, it will take the properties from the snapshot and create the clone volume. One thing to note here is that, the storageclass in clone PVC should have the same poolname as that of the original volume as across the pool, clone is not supported. Signed-off-by: Pawan <pawan@mayadata.io>
2020-02-13 13:31:17 +05:30
func (k *Kubeclient) Update(vol *apis.ZFSSnapshot) (*apis.ZFSSnapshot, error) {
if vol == nil {
return nil,
errors.New(
"failed to update csivolume: nil vol object",
)
}
cs, err := k.getClientOrCached()
if err != nil {
return nil, errors.Wrapf(
err,
"failed to update csivolume {%s} in namespace {%s}",
vol.Name,
vol.Namespace,
)
}
return k.update(cs, vol, k.namespace)
}