Related issue
https://github.com/longhorn/longhorn/issues/2534
Test Setup
- Deploy the CSI snapshot CRDs, Controller as instructed at https://longhorn.io/docs/1.2.3/snapshots-and-backups/csi-snapshot-support/enable-csi-snapshot-support/
- Deploy 4 VolumeSnapshotClass:
kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: longhorn-backup-1 driver: driver.longhorn.io deletionPolicy: Deletekind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: longhorn-backup-2 driver: driver.longhorn.io deletionPolicy: Delete parameters: type: bakkind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: longhorn-snapshot driver: driver.longhorn.io deletionPolicy: Delete parameters: type: snapkind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1beta1 metadata: name: invalid-class driver: driver.longhorn.io deletionPolicy: Delete parameters: type: invalid - Create Longhorn volume
test-volof 5GB. Create PV/PVC for the Longhorn volume. - Create a workload that uses the volume. Write some data to the volume.
Make sure data persist to the volume by running
sync - Set up a backup target for Longhorn
Scenarios 1: CreateSnapshot
-
typeisbakor""- Create a VolumeSnapshot with the following yaml
apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: test-snapshot-longhorn-backup spec: volumeSnapshotClassName: longhorn-backup-1 source: persistentVolumeClaimName: test-vol - Verify that a backup is created.
- Delete the
test-snapshot-longhorn-backup - Verify that the backup is deleted
- Create the
test-snapshot-longhorn-backupVolumeSnapshot withvolumeSnapshotClassName: longhorn-backup-2 - Verify that a backup is created.
- Create a VolumeSnapshot with the following yaml
-
typeissnap- volume is in detached state.
- Scale down the workload of
test-volto detach the volume. - Create
test-snapshot-longhorn-snapshotVolumeSnapshot withvolumeSnapshotClassName: longhorn-snapshot. - Verify the error
volume ... invalid state ... for taking snapshotin the Longhorn CSI plugin.
- Scale down the workload of
- volume is in attached state.
- Scale up the workload to attach
test-vol - Verify that a Longhorn snapshot is created for the
test-vol.
- Scale up the workload to attach
- volume is in detached state.
-
invalid type
- Create
test-snapshot-invalidVolumeSnapshot withvolumeSnapshotClassName: invalid-class. - Verify the error
invalid snapshot type: %v. Must be %v or %v orin the Longhorn CSI plugin. - Delete
test-snapshot-invalidVolumeSnapshot.
- Create
Scenarios 2: Create new volume from CSI snapshot
- From
longhorn-backuptype- Create a new PVC with the flowing yaml:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: test-restore-pvc spec: storageClassName: longhorn dataSource: name: test-snapshot-longhorn-backup kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 5Gi - Attach the PVC
test-restore-pvcand verify the data - Delete the PVC
- Create a new PVC with the flowing yaml:
- From
longhorn-snapshottype- Source volume is attached && Longhorn snapshot exist
- Create a PVC with the following yaml:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: test-restore-pvc spec: storageClassName: longhorn dataSource: name: test-snapshot-longhorn-snapshot kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 5Gi - Attach the PVC
test-restore-pvcand verify the data - Delete the PVC
- Create a PVC with the following yaml:
- Source volume is detached
- Scale down the workload to detach the
test-vol - Create the same PVC
test-restore-pvcas in theSource volume is attached && Longhorn snapshot existsection - Verify that PVC provisioning failed because the source volume is detached so Longhorn cannot verify the existence of the Longhorn snapshot in the source volume.
- Scale up the workload to attach
test-vol - Wait for PVC to finish provisioning and be bounded
- Attach the PVC
test-restore-pvcand verify the data - Delete the PVC
- Scale down the workload to detach the
- Source volume is attached && Longhorn snapshot doesn’t exist
- Find the VolumeSnapshotContent of the VolumeSnapshot
test-snapshot-longhorn-snapshot. Find the Longhorn snapshot name inside the fieldVolumeSnapshotContent.snapshotHandle. Go to Longhorn UI. Delete the Longhorn snapshot. Make sure that the snapshot is gone (the snapshot might still be there if it is the child of volume head. In this case you need to create a new snapshot before you can delete the target sanapshot ) - Repeat steps in the section
Longhorn snapshot existabove. PVC should be stuck in provisioning because Longhorn snapshot of the source volume doesn’t exist. - Delete the PVC
test-restore-pvcPVC
- Find the VolumeSnapshotContent of the VolumeSnapshot
- Source volume is attached && Longhorn snapshot exist
Scenarios 3: Delete CSI snapshot
baktype- Done in the above step
snaptype- volume is attached && snapshot doesn’t exist
- Delete the VolumeSnapshot
test-snapshot-longhorn-snapshotand verify that the VolumeSnapshot is deleted.
- Delete the VolumeSnapshot
- volume is attached && snapshot exist
- Recreate the VolumeSnapshot
test-snapshot-longhorn-snapshot - Verify the creation of Longhorn snapshot with the name in the field
VolumeSnapshotContent.snapshotHandle - Delete the VolumeSnapshot
test-snapshot-longhorn-snapshot - Verify that Longhorn snapshot is removed or marked as removed
- Verify that the VolumeSnapshot
test-snapshot-longhorn-snapshotis deleted.
- Recreate the VolumeSnapshot
- volume is detached
- Recreate the VolumeSnapshot
test-snapshot-longhorn-snapshot - Scale down the workload to detach
test-vol - Delete the VolumeSnapshot
test-snapshot-longhorn-snapshot - Verify that VolumeSnapshot
test-snapshot-longhorn-snapshotis stuck in deleting
- Recreate the VolumeSnapshot
- volume is attached && snapshot doesn’t exist
Scenarios 4: Concurrent backup creation & deletion
- From https://longhorn.github.io/longhorn-tests/manual/pre-release/backup-and-restore/concurrent-backup-creation-deletion/
- `` and
baktype- Use volume test-vol previous created
- Connect to node via ssh and issue dd if=/dev/urandom of=/dev/longhorn/dak status=progress
- Wait for a bunch of data to be written (1GB)
- take a backup(1) by
apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: test-snapshot-longhorn-backup1 spec: volumeSnapshotClassName: longhorn-backup-1 source: persistentVolumeClaimName: test-vol- wait for a bunch of data to be written (1GB)
- take a backup(2) by
apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: test-snapshot-longhorn-backup2 spec: volumeSnapshotClassName: longhorn-backup-1 source: persistentVolumeClaimName: test-vol- immediately request deletion of backup(1)
- verify that backup(2) completes successfully.
- verify that backup(1) has not been deleted.
- verify that all blocks mentioned in the backup(2).cfg file are present in the blocks directory.
- delete backup(1)
- verify that backup(1) has been deleted.
- Repeat previous use ‘volumeSnapshotClassName: longhorn-backup-2’ (bak)