tromob opened a new issue, #13634:
URL: https://github.com/apache/cloudstack/issues/13634

   ### problem
   
   This is a bug in the **CloudStack CSI driver** (repo 
`cloudstack/cloudstack-csi-driver`, image 
`ghcr.io/cloudstack/cloudstack-csi-driver`). Filing it here because Issues are 
disabled on that repository. Related open PR: 
cloudstack/cloudstack-csi-driver#7.
   
   **Symptom:** Expanding a PVC (StorageClass with `allowVolumeExpansion: 
true`) never completes when the backing CloudStack volume is owned by a 
**project**. The `external-resizer` retries indefinitely and the PVC stays in 
`Resizing` forever; `status.capacity` never updates.
   
   On every attempt the `cloudstack-csi-controller` logs:
   
   ```
   ControllerExpandVolume ... volume_id="<volume-uuid>"
   rpc error: code = Internal desc = Could not resize volume "<volume-uuid>" to 
size N:
   failed to retrieve volume '<volume-uuid>': No match found for <volume-uuid>: 
&{Count:0 Volumes:[]}
   ```
   
   **Root cause:** In `pkg/cloud/volumes.go`, `ExpandVolume()` looks up the 
volume with the raw cloudstack-go SDK call `c.Volume.GetVolumeByID(volumeID)`, 
which does **not** include `projectid`. For a project-owned volume, a 
project-scoped API key then gets `Count:0` ("No match found") — even though 
`project-id` is correctly set in the cloud-config. The driver's own 
project-aware wrapper `c.GetVolumeByID(ctx, volumeID)` (which calls 
`SetProjectid`) is not used in this path.
   
   **Secondary issue:** `ExpandVolume` calls `ResizeVolume(newSize)` 
unconditionally, without checking `currentSize >= newSize`, so it also cannot 
converge if the CloudStack volume is already at the requested size.
   
   ### versions
   
   - Apache CloudStack: 4.22.0.0
   - cloudstack-csi-driver: v3.0.0 (same code in release `cloudstack-csi-3.0.1` 
and current `main`); image `ghcr.io/cloudstack/cloudstack-csi-driver`
   - Kubernetes: v1.33; sidecar `external-resizer` v1.11.1
   - Hypervisor: KVM
   - Storage backend: Linstor/DRBD (note: the bug is at the CloudStack API 
layer and is storage-agnostic)
   
   ### The steps to reproduce the bug
   
   1. A Kubernetes cluster whose CSI volumes live in a CloudStack **project**, 
with a project-scoped API key in `cloudstack-secret` (cloud-config has 
`project-id` set).
   2. Provision a PVC via the `cloudstack-csi` StorageClass (works fine).
   3. Increase the PVC's `spec.resources.requests.storage` (e.g. 20Gi -> 40Gi).
   4. `external-resizer` loops with `... No match found for <uuid>: &{Count:0 
Volumes:[]}`; the PVC never leaves `Resizing`.
   
   ### What to do about it?
   
   Make `ExpandVolume` use a project-aware lookup (the existing 
`c.GetVolumeByID(ctx, ...)` wrapper), and/or set the project id globally on the 
cloudstack-go client so every SDK call includes it.
   
   Open PR cloudstack/cloudstack-csi-driver#7 already adds the global approach 
via `csClient.DefaultOptions(cloudstack.WithProject(config.ProjectID))`, which 
would also cover `ExpandVolume` — but it is still open, and its description 
only mentions the `getVMByName` / node-metadata symptom, not volume resize. 
Merging that (and noting it also fixes resize) would resolve this. 
Additionally, guard `ExpandVolume` to skip the resize when the volume is 
already at the requested size (idempotency).
   
   **Workaround for others hitting this:** grow the CloudStack volume, then 
online-grow the filesystem on the node (`resize2fs` on the mounted ext4 volume 
— non-disruptive), and reconcile the Kubernetes objects (`PV .spec.capacity` 
and `PVC .status.capacity` to the new size, and clear the `Resizing` condition) 
so the resizer sees `requests == capacity` and stops.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to