You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit f1cd693
Browse filesBrowse the repository at this point in the historyBrowse files
CSTACKEX-301: automation for cs volume resize (#109)
### Description
automation test cases for volume resize.
**Test cases covered:**
-Stop the VM and grow the attached volume.
-Verify the resized size through:
CloudStack database
NFS3: host-side qemu-img info
iSCSI: ONTAP LUN space.size
-Verify shrinking is rejected and existing sizes remain unchanged.
-Restart the VM and validate the resized disk capacity.
-Detach volume and grow the volume again.
This PR...
<!--- Describe your changes in DETAIL - And how has behaviour
functionally changed. -->
<!-- For new features, provide link to FS, dev ML discussion etc. -->
<!-- In case of bug fix, the expected and actual behaviours, steps to
reproduce. -->
<!-- When "Fixes: #<id>" is specified, the issue/PR will automatically
be closed when this PR gets merged -->
<!-- For addressing multiple issues/PRs, use multiple "Fixes: #<id>" -->
<!-- Fixes: # -->
<!---
*******************************************************************************
-->
<!--- NOTE: AUTOMATION USES THE DESCRIPTIONS TO SET LABELS AND PRODUCE
DOCUMENTATION. -->
<!--- PLEASE PUT AN 'X' in only **ONE** box -->
<!---
*******************************************************************************
-->
### Types of changes
- [ ] Breaking change (fix or feature that would cause existing
functionality to change)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Bug fix (non-breaking change which fixes an issue)
- [ ] Enhancement (improves an existing feature and functionality)
- [ ] Cleanup (Code refactoring and cleanup, that may add test cases)
- [ ] Build/CI
- [X] Test (unit or integration test code)
### Feature/Enhancement Scale or Bug Severity
#### Feature/Enhancement Scale
- [ ] Major
- [ ] Minor
#### Bug Severity
- [ ] BLOCKER
- [ ] Critical
- [ ] Major
- [ ] Minor
- [ ] Trivial
### Screenshots (if appropriate):
### How Has This Been Tested?
<img width="1166" height="893" alt="Screenshot 2026-10-12 at 11 54
34 AM"
src="https://github.com/user-attachments/assets/5d8bd7d1-3286-45f3-b047-0eaa97916f4d"
/>
<!-- Please describe in detail how you tested your changes. -->
<!-- Include details of your testing environment, and the tests you ran
to -->
#### How did you try to break this feature and the system with this
change?
<!-- see how your change affects other areas of the code, etc. -->
<!-- Please read the
[CONTRIBUTING](https://github.com/apache/cloudstack/blob/main/CONTRIBUTING.md)
document -->
---------
Co-authored-by: Cursor <cursoragent@cursor.com>
| NFS3 Pool with Volumes |`nfs3/pool/test_pool_with_volumes.py`| 7 | Same + live volume present; negative delete guard |
335
335
| NFS3 Zone-Scoped Pool |`nfs3/pool/test_zone_scoped_pool.py`| 4 | Zone scope — all hosts connected via `attachZone`|
336
336
| NFS3 Volume Lifecycle |`nfs3/volume/test_volume_lifecycle.py`| 5 | Volume is metadata-only; FlexVol unchanged on delete |
337
-
| NFS3 VM + Volume Attach |`nfs3/instance/test_vm_volume_attach.py`|10| Full VM lifecycle with hot-plug/detach; ROOT on tagged pool seeds/reuses template cache, which survives VM delete |
337
+
| NFS3 VM + Volume Attach |`nfs3/instance/test_vm_volume_attach.py`|13| Full VM lifecycle with stopped-VM qcow2 grow; ROOT on tagged pool seeds/reuses template cache, which survives VM delete |
| iSCSI Pool with Volumes |`iscsi/pool/test_pool_with_volumes.py`| 7 | Same + live LUN present; negative delete guard |
341
341
| iSCSI Zone-Scoped Pool |`iscsi/pool/test_zone_scoped_pool.py`| 4 | Zone scope |
342
342
| iSCSI Volume Lifecycle |`iscsi/volume/test_volume_lifecycle.py`| 5 | LUN created per CS volume; LUN removed on delete |
343
-
| iSCSI VM + Volume Attach |`iscsi/instance/test_vm_volume_attach.py`|10| Full VM lifecycle; LUN-maps on VM start/stop/detach; ROOT on tagged pool seeds/reuses `cs_tmpl_*` LUN cache |
343
+
| iSCSI VM + Volume Attach |`iscsi/instance/test_vm_volume_attach.py`|13| Full VM lifecycle; stopped-VM LUN grow and LUN-map checks; ROOT on tagged pool seeds/reuses `cs_tmpl_*` LUN cache |
For the goal, dependencies, and exact success criteria of every individual test, see [TEST_CASES.md](TEST_CASES.md).
@@ -356,7 +356,7 @@ For the goal, dependencies, and exact success criteria of every individual test,
356
356
|`Lost connection to MySQL`| MySQL not accepting remote connections | Enable remote MySQL access (see Prerequisites §3) |
357
357
|`sh: python: command not found` (repeated) | Marvin internal call — harmless on macOS | Ignore; Marvin Init still succeeds |
358
358
| Pool state never reaches `Maintenance`| KVM agent not responding | Check `cloudstack-agent` on KVM host; verify host is connected in CloudStack UI |
359
-
| iSCSI `test_07` error 530 | KVM guest does not ACK SCSI hot-unplug | Known environment limitation — see TEST_CASES.md Suite 10 note |
359
+
| iSCSI `test_09` error 530 | KVM guest does not ACK SCSI hot-unplug | Known environment limitation — see TEST_CASES.md Suite 10 note |
360
360
| ONTAP REST `401 Unauthorized`| Wrong credentials in `ontap.cfg`| Verify `username`/`password` under `ontap` section |
361
361
|`ISCSI protocol is not enabled on SVM` / many pool tests EXCEPTION then FAIL | SVM iSCSI service off or no `data_iscsi` LIF | Enable iSCSI on the SVM and assign `default-data-iscsi` (or `default-data-blocks`) to at least one data LIF; `run_tests.sh` now fails this check before Marvin starts |
362
362
|`No ready KVM user template available`| Template still downloading | Re-run `setup_zone` (step 12 waits for template readiness); or wait in CloudStack UI |
Copy file name to clipboardExpand all lines: test/integration/plugins/ontap/TEST_CASES.md
+22-16Lines changed: 22 additions & 16 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -19,7 +19,7 @@
19
19
20
20
# ONTAP Integration Test Cases
21
21
22
-
Complete reference for all 72 test cases across 12 test suites.
22
+
Complete reference for all 80 test cases across 12 test suites.
23
23
Each suite is sequential — tests must run in numbered order; each step builds on state created by the previous step.
24
24
25
25
---
@@ -114,7 +114,7 @@ Each suite is sequential — tests must run in numbered order; each step builds
114
114
**File:**`nfs3/instance/test_vm_volume_attach.py`
115
115
**Class:**`TestOntapVMVolumeAttach`
116
116
**Tag:**`vm_volume_workflow`
117
-
**Total:**10 tests | **Scope:** end-to-end — NFS3 pool, data volume, running VM (ROOT on the ONTAP pool via a tagged compute offering), primary template cache seed / reuse / survive VM delete, attach/detach lifecycle
117
+
**Total:**13 tests | **Scope:** end-to-end — NFS3 pool, data volume resize, running VM (ROOT on the ONTAP pool via a tagged compute offering), primary template cache seed / reuse / survive VM delete, attach/detach lifecycle
118
118
119
119
| # | Test method | Goal | Depends on | CloudStack success criteria | ONTAP success criteria | Type |
@@ -123,11 +123,14 @@ Each suite is sequential — tests must run in numbered order; each step builds
123
123
| 03 |`test_03_deploy_vm`| Deploy a VM with the tagged SO — ROOT on ONTAP; seeds template cache | test_02 (`pool`, `volume`) |`vm.state == "Running"`; ROOT `storageid` = pool; `template_spool_ref` Ready/DOWNLOADED | Cache file present at spool `install_path`| positive |
124
124
| 03a |`test_03a_deploy_second_vm_reuses_template_cache`| Deploy VM-2 — reuses cache | test_03 | VM-2 Running; ROOT on pool; still exactly one `template_spool_ref`| Same cache file (no second cache) | positive |
125
125
| 03b |`test_03b_expunge_second_vm_template_cache_survives`| Expunge VM-2 — cache must remain (lazy GC) | test_03a | spool_ref still Ready | Cache file still present | positive |
126
-
| 04 |`test_04_attach_volume_to_vm`| Attach the ONTAP data volume to the running VM (hot-plug) |test_03 (`vm`, `volume`) |`volume.virtualmachineid == vm.id`; `attachVolume` job succeeds | FlexVol `online`; after attach, a data file matching volume UUID present in FlexVol (`list_files_in_volume`) | positive |
126
+
| 04 |`test_04_attach_volume_to_vm`| Attach the ONTAP data volume to the running VM (hot-plug) |test_03b (`vm`, `volume`) |`volume.virtualmachineid == vm.id`; `attachVolume` job succeeds | FlexVol `online`; after attach, a data file matching volume UUID present in FlexVol (`list_files_in_volume`) | positive |
127
127
| 05 |`test_05_stop_vm_export_retained`| Stop the running VM with volume attached | test_04 |`vm.state == "Stopped"`| FlexVol still `online`; NFS export policy still present | positive |
128
-
| 06 |`test_06_start_vm_volume_accessible`| Start the stopped VM | test_05 |`vm.state == "Running"`| FlexVol still `online`| positive |
129
-
| 07 |`test_07_detach_volume_from_vm`| Hot-detach the ONTAP volume from the running VM (TDS Detach NFS3) | test_06 (`vm`, `volume`) |`volume.virtualmachineid` cleared; `volume.state == "Ready"`| FlexVol still `online`; data file **still present** (NFS3: file persists until `deleteVolume`, not on detach) | positive |
130
-
| 08 |`test_08_destroy_vm_and_cleanup`| Destroy VM (expunge), delete volume, enter maintenance, force-delete pool | test_07 | VM no longer listed; spool_ref still Ready after VM expunge; volume no longer listed; pool no longer listed | Cache file present after VM expunge; FlexVol deleted; export policy deleted | cleanup |
128
+
| 06 |`test_06_grow_stopped_vm_volume`| Grow the attached volume while the VM is stopped | test_05 | Volume is `Ready` at the requested byte size |`qemu-img info` reports the requested virtual size; ONTAP file remains present | positive |
129
+
| 07 |`test_07_shrink_rejected`| Attempt to shrink the grown qcow2 volume with `shrinkok=true`| test_06 | Resize is rejected; grown size remains unchanged | qcow2 virtual size remains unchanged | negative |
130
+
| 08 |`test_08_start_vm_volume_accessible`| Start the stopped VM | test_07 |`vm.state == "Running"`; KVM data-disk capacity equals target | FlexVol still `online`| positive |
131
+
| 09 |`test_09_detach_volume_from_vm`| Hot-detach the ONTAP volume from the running VM (TDS Detach NFS3) | test_08 (`vm`, `volume`) |`volume.virtualmachineid` cleared; `volume.state == "Ready"`| FlexVol still `online`; data file **still present** (NFS3: file persists until `deleteVolume`, not on detach) | positive |
132
+
| 10 |`test_10_grow_detached_volume`| Grow the detached, materialized data volume | test_09 | API and DB size equal target | qcow2 virtual size equals target | positive |
133
+
| 11 |`test_11_destroy_vm_and_cleanup`| Destroy VM (expunge), delete volume, enter maintenance, force-delete pool | test_10 | VM no longer listed; spool_ref still Ready after VM expunge; volume no longer listed; pool no longer listed | Cache file present after VM expunge; FlexVol deleted; export policy deleted | cleanup |
131
134
132
135
---
133
136
@@ -208,22 +211,25 @@ Each suite is sequential — tests must run in numbered order; each step builds
**Total:**10 tests | **Scope:** end-to-end — iSCSI pool, data volume (LUN), running VM (ROOT on the ONTAP pool via a tagged compute offering), `cs_tmpl_<templateId>` LUN cache seed / reuse / survive VM delete, attach/stop/start/detach lifecycle
214
+
**Total:**13 tests | **Scope:** end-to-end — iSCSI pool, data volume resize (LUN), running VM (ROOT on the ONTAP pool via a tagged compute offering), `cs_tmpl_<templateId>` LUN cache seed / reuse / survive VM delete, attach/stop/start/detach lifecycle
212
215
213
216
| # | Test method | Goal | Depends on | CloudStack success criteria | ONTAP success criteria | Type |
| 02 |`test_02_create_ontap_data_volume`| Allocate a CloudStack data volume (creates a LUN in the FlexVol) | test_01 (`pool`) |Volume non-None | ≥1 LUN in FlexVol| positive |
219
+
| 02 |`test_02_create_ontap_data_volume`| Allocate and grow a detached data volume | test_01 (`pool`) |API and DB size equal target |LUN exists and `space.size` equals target| positive |
217
220
| 03 |`test_03_deploy_vm`| Deploy VM with the tagged SO — ROOT on ONTAP; seeds `cs_tmpl_*`; verify 0 data-volume LUN-maps before attach | test_02 (`volume`) |`vm.state == "Running"`; ROOT on pool; spool_ref Ready (`local_path` = LUN uuid) | Exactly one `/vol/<flex>/cs_tmpl_<id>` LUN; 0 data-volume LUN-maps | positive |
218
221
| 03a |`test_03a_deploy_second_vm_reuses_template_cache`| Deploy VM-2 — reuse cache | test_03 | VM-2 Running; ROOT on pool; still one spool_ref | Still one `cs_tmpl_*`; non-cache LUN count +1 | positive |
219
222
| 03b |`test_03b_expunge_second_vm_template_cache_survives`| Expunge VM-2 — cache LUN remains | test_03a | spool_ref still Ready | VM-2 ROOT LUN gone (non-cache count back to baseline); `cs_tmpl_*` still present | positive |
220
-
| 04 |`test_04_attach_volume_to_vm`| Hot-attach the ONTAP iSCSI volume to the running VM — a LUN-map is created (TDS SN 27) |test_03 (`vm`, `volume`) |`volume.virtualmachineid == vm.id`| ≥1 LUN-map linking the LUN to the host's igroup | positive |
223
+
| 04 |`test_04_attach_volume_to_vm`| Hot-attach the ONTAP iSCSI volume to the running VM — a LUN-map is created (TDS SN 27) |test_03b (`vm`, `volume`) |`volume.virtualmachineid == vm.id`| ≥1 LUN-map linking the LUN to the host's igroup | positive |
221
224
| 05 |`test_05_stop_vm_lun_unmapped`| Stop VM — LUN-maps must be removed (TDS VM Stop iSCSI) | test_04 |`vm.state == "Stopped"`| 0 LUN-maps; LUN itself **still present** in FlexVol | positive |
222
-
| 06 |`test_06_start_vm_lun_remapped`| Start VM — LUN-maps must be re-created (TDS VM Start iSCSI) | test_05 |`vm.state == "Running"`| ≥1 LUN-map re-created | positive |
223
-
| 07 |`test_07_detach_volume_from_vm`| Hot-detach the iSCSI volume from the running VM (TDS Detach iSCSI) | test_06 (`vm`, `volume`) |`volume.virtualmachineid` cleared | 0 LUN-maps; LUN still in FlexVol | positive ⚠️ |
224
-
| 08 |`test_08_destroy_vm_and_cleanup`| Destroy VM (expunge), delete volume, enter maintenance, delete pool | test_07 | VM gone; spool_ref still Ready after VM expunge; volume gone; pool gone |`cs_tmpl_*` present after VM expunge; FlexVol deleted; all LUNs and igroups deleted | cleanup |
225
+
| 06 |`test_06_grow_stopped_vm_volume`| Grow the attached volume while the VM is stopped | test_05 | Volume is `Ready` at the requested byte size | LUN `space.size` equals the requested size; LUN remains unmapped | positive |
226
+
| 07 |`test_07_shrink_rejected`| Attempt to shrink the grown LUN with `shrinkok=true`| test_06 | Resize is rejected; grown size remains unchanged | LUN `space.size` remains unchanged | negative |
227
+
| 08 |`test_08_start_vm_lun_remapped`| Start VM — LUN-maps must be re-created (TDS VM Start iSCSI) | test_07 |`vm.state == "Running"`; KVM data-disk capacity equals target | ≥1 LUN-map re-created | positive |
228
+
| 09 |`test_09_detach_volume_from_vm`| Hot-detach the iSCSI volume from the running VM (TDS Detach iSCSI) | test_08 (`vm`, `volume`) |`volume.virtualmachineid` cleared | 0 LUN-maps; LUN still in FlexVol | positive ⚠️ |
229
+
| 10 |`test_10_grow_detached_volume`| Grow the detached, materialized data volume | test_09 | API and DB size equal target | LUN `space.size` equals target | positive |
230
+
| 11 |`test_11_destroy_vm_and_cleanup`| Destroy VM (expunge), delete volume, enter maintenance, force-delete pool | test_10 | VM gone; spool_ref still Ready after VM expunge; volume gone; pool gone |`cs_tmpl_*` present after VM expunge; FlexVol deleted; all LUNs and igroups deleted | cleanup |
225
231
226
-
> ⚠️ **test_07 known status:** iSCSI hot-detach from a running VM relies on the KVM guest acknowledging the SCSI device removal. On this environment the guest does not acknowledge in time, causing CloudStack error 530. This is a KVM-host-level or guest-template limitation, not a test code defect. All other 61 tests pass.
232
+
> ⚠️ **test_09 known status:** iSCSI hot-detach from a running VM relies on the KVM guest acknowledging the SCSI device removal. On this environment the guest does not acknowledge in time, causing CloudStack error 530. This is a KVM-host-level or guest-template limitation, not a test code defect.
227
233
228
234
---
229
235
@@ -265,12 +271,12 @@ Each suite is sequential — tests must run in numbered order; each step builds
265
271
| NFS3 Pool with Volumes | NFS3 | Cluster | 7 | ✅ |
0 commit comments