console icon indicating copy to clipboard operation
console copied to clipboard

Restore PVC is broken for pre-provisioned snapshots

Open xinzheyang opened this issue 2 months ago • 0 comments

example yaml.

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  annotations:
    snapshot.storage.kubernetes.io/pvc-access-modes: ReadWriteMany
    snapshot.storage.kubernetes.io/pvc-storage-class: fa-direct-access
    snapshot.storage.kubernetes.io/pvc-volume-mode: Block
  resourceVersion: '28282087'
  name: pg1.2.px-f5cd27d7-pvc-f11e88b4-09cd-495f-a351-aa8a87dd928c
  uid: a76b414e-9f0a-45bd-9bdc-49a80e307f89
  creationTimestamp: '2025-10-01T23:16:30Z'
  namespace: xyang
  finalizers:
    - snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection
spec:
  source:
    volumeSnapshotContentName: snapcontent-pg1.2.px-f5cd27d7-pvc-f11e88b4-09cd-495f-a351-aa8a87dd928c
status:
  boundVolumeSnapshotContentName: snapcontent-pg1.2.px-f5cd27d7-pvc-f11e88b4-09cd-495f-a351-aa8a87dd928c
  creationTime: '2025-10-01T23:16:30Z'
  readyToUse: true

the code assumes these annotations exist

    snapshot.storage.kubernetes.io/pvc-access-modes: ReadWriteMany
    snapshot.storage.kubernetes.io/pvc-storage-class: fa-direct-access
    snapshot.storage.kubernetes.io/pvc-volume-mode: Block

but even if I add these, the modal fails to show up with error

k8s-get-hook.ts:20 TypeError: Cannot read properties of undefined (reading 'title')
    at h (access-mode.tsx:63:79)
  const [selected, setSelected] = React.useState<string>(
    getAccessModeOptions().find((mode) => mode.value === pvcInitialAccessMode[0]).title,  <----
  );

this is because in restore-pvc-modal.tsx

    const [pvcResource, pvcResourceLoaded, pvcResourceLoadError] = useK8sGet<
      PersistentVolumeClaimKind
    >(PersistentVolumeClaimModel, resource?.spec?.source?.persistentVolumeClaimName, namespace);

this will query a list of PVCs if resource.spec.source.persistentVolumeClaimName doesn't exist, which breaks assumption for all the callers.

  const pvcInitialAccessMode = pvcResource
    ? getPVCAccessModes(pvcResource, 'value')
    : availableAccessModes;

getPVCAccessModes(pvcResource, 'value') assumes pvcResouce is a single item, but a list is provided, hence pvcInitialAccessMode is an empty list, causing the undefined error.

xinzheyang avatar Oct 11 '25 00:10 xinzheyang