Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
93 commits
Select commit Hold shift + click to select a range
4c8c8d9
Initial primary storage pool plugin skeleton
Sep 30, 2025
bf838b3
Initial primary storage pool plugin skeleton - added license string
rajiv-jain-netapp Oct 8, 2025
b82fb40
Initial primary storage pool plugin skeleton - added license string +…
rajiv-jain-netapp Oct 8, 2025
1199d55
Initial primary storage pool plugin skeleton - added license string +…
rajiv-jain-netapp Oct 8, 2025
ebc3f00
Merge pull request #1 from NetApp/feature-CSTACKEX-24
rajiv-jain-netapp Oct 9, 2025
28faca1
Feignconfiguration and volume feignClient along with desired POJOs
rajiv-jain-netapp Oct 13, 2025
fe0f752
Feignconfiguration and volume feignClient along with desired POJOs
rajiv-jain-netapp Oct 13, 2025
35f1011
Revert "Feignconfiguration and volume feignClient along with desired …
rajiv-jain-netapp Oct 13, 2025
a03a2c4
Revert "Feignconfiguration and volume feignClient along with desired …
rajiv-jain-netapp Oct 13, 2025
2e0efe8
Feignconfiguration and volume feignClient along with desired POJOs
rajiv-jain-netapp Oct 13, 2025
a96eb9e
Feignconfiguration and volume feignClient along with desired POJOs
rajiv-jain-netapp Oct 13, 2025
0f09c5f
CSTACKEX-28: added copyright comment in the logger configuration
rajiv-jain-netapp Oct 13, 2025
2cc4b0c
CSTACKEX-28: added newline in the end of the file
rajiv-jain-netapp Oct 13, 2025
033c23d
CSTACKEX-28 - incorporated review comments
rajiv-jain-netapp Oct 14, 2025
2822946
Merge pull request #4 from NetApp/feature/CSTACKEX-28
rajiv-jain-netapp Oct 14, 2025
f7b837a
Cluster, SVM and Aggr Feign Client
suryag1201 Oct 16, 2025
c585299
NAS and Job Feign Client
suryag1201 Oct 17, 2025
a492797
CSTACKEX-30 SAN Feign Client (#8)
suryag1201 Oct 22, 2025
25353c2
CSTACKEX-7: ONTAP Primary storage pool (#9)
sandeeplocharla Oct 24, 2025
973f5e2
CSTACKEX-34: Upgrade to framework classes design
rajiv-jain-netapp Oct 28, 2025
686a892
CSTACKEX-34: incorporating the review comments
rajiv-jain-netapp Oct 28, 2025
edfcdde
CSTACKEX-34: transient changes to the review comments
rajiv-jain-netapp Oct 28, 2025
73eb9f5
CSTACKEX-34: Unable to get checkstyle pass hence fixing this as well
rajiv-jain-netapp Oct 28, 2025
465fffe
CSTACKEX-34: further review comments incorporations
rajiv-jain-netapp Oct 28, 2025
3d6bd91
CSTACKEX-34: addressing checkstyle issues
rajiv-jain-netapp Oct 28, 2025
5815ebd
CSTACKEX-34: fix checksyle issues
rajiv-jain-netapp Oct 28, 2025
618f957
Merge pull request #13 from NetApp/feature/CSTACKEX-34
rajiv-jain-netapp Oct 28, 2025
6c4b24e
CSTACKEX-35 Create Async (#14)
suryag1201 Oct 29, 2025
1b0c7f7
Feature/cstackex-01: Primary Storage pool creation
sandeeplocharla Nov 5, 2025
54ddfa9
Merge branch 'apache:main' into main
rajiv-jain-netapp Nov 25, 2025
b23ac40
CSTACKEX-50: Disable, Re-Enable, Delete Storage pool and Enter, Exit …
sandeeplocharla Dec 8, 2025
2c61e76
Feature/cstackex 22: Shared NFS pool and volume creation - Approach 1…
piyush5netapp Dec 8, 2025
e99b98e
feature/CSTACKEX-65: Aggregate selection logic for creating ONTAP Vol…
sandeeplocharla Jan 13, 2026
ef0354a
feature/CSTACKEX-77: added first junit for lifecycle.initialize mthod…
rajiv-jain-netapp Jan 14, 2026
2f02d8a
Delete export policy NFS for the storage pool (#23)
piyush5netapp Jan 19, 2026
1ae738b
Merge pull request #25 from NetApp/feature/CSTACKEX-77
rajiv-jain-netapp Jan 20, 2026
890c2db
UTs for NFS storage pool creation code (#29)
piyush5netapp Feb 2, 2026
2d3b279
Merge branch 'apache:main' into main
rajiv-jain-netapp Feb 4, 2026
8a2c7fb
Feature/cstackex 88 - Storage Pool operation code changes and UTs (#30)
piyush5netapp Feb 6, 2026
b26542f
CSTACKEX-46: Create, Delete iSCSI type Cloudstack volumes, Enter, Can…
sandeeplocharla Feb 11, 2026
856c5cc
Feature/cstackex 112 (#33)
suryag1201 Feb 11, 2026
7c2b229
CSTACKEX-112 Struct Security Issue
Feb 13, 2026
763aa3b
Feature/cstackex 117 (#34)
suryag1201 Feb 13, 2026
eace4ee
CSTACKEX-114: Delete volume or qcow2 file NFS (#32)
piyush5netapp Feb 17, 2026
f42552b
CSTACKEX-18_2: NFS3 snapshot changes
rajiv-jain-netapp Feb 19, 2026
8894248
CSTACK-18_2: fixing junit dependent changes
rajiv-jain-netapp Feb 19, 2026
3f0019a
STACK-18_2: fixes
rajiv-jain-netapp Feb 20, 2026
9b79f46
CSTACKEX-18_2: adding VM snapshot logic
rajiv-jain-netapp Feb 20, 2026
7a0d61e
CSTACKEX-18_2: fix junit issues
rajiv-jain-netapp Feb 20, 2026
7c3419e
CSTACKEX-18_2: fixes for vm snapshot workflow
rajiv-jain-netapp Feb 21, 2026
d2b6a27
CSTACKEX-18_2: fixing the behaviour for the VM level snapshot when qu…
rajiv-jain-netapp Feb 21, 2026
c5d5428
CSTACKEX-18_2: incorporating the review comments.
rajiv-jain-netapp Feb 24, 2026
3f18c11
CSTACKEX-18_2: transient fixes post incorporating the comments
rajiv-jain-netapp Feb 24, 2026
723561b
CSTACKEX-18_2: Incorporate review comments
rajiv-jain-netapp Feb 24, 2026
09968db
CSTACKEX-18_2: quiecing VM would be done based on user input for VM l…
rajiv-jain-netapp Feb 25, 2026
0a1a9c4
CSTACKEX-18_2: ONTAP plugin can not handle memory snapshot with stora…
rajiv-jain-netapp Feb 26, 2026
49df4c3
CSTACKEX-18_2: junit fix
rajiv-jain-netapp Feb 26, 2026
776b9a2
CSTACKEX-18_2: junit fix2
rajiv-jain-netapp Feb 26, 2026
c04e223
CSTACKEX-18_2: ensure that ONTAP volume related calls are served by c…
rajiv-jain-netapp Feb 26, 2026
186e59b
CSTACKEX-18_2: using flexvolume snapshot to get snapshot workflows fo…
rajiv-jain-netapp Feb 26, 2026
1020a2c
CSTACKEX-18_2: using flexvolume snapshot even for CS volume snapshot …
rajiv-jain-netapp Feb 27, 2026
672d7a4
CSTACKEX-18_2: we are taking snapshot for volume with flexvolume snap…
rajiv-jain-netapp Feb 28, 2026
9c63c61
CSTACKEX-18_2: junit fixes with recent refactor
rajiv-jain-netapp Feb 28, 2026
79730ed
CSTACKEX-18_2: fixing snapshot delete condition fix
rajiv-jain-netapp Mar 2, 2026
ae96e9b
CSTACKEX-18_2: delete snapshot should be done over plugin path not on…
rajiv-jain-netapp Mar 2, 2026
1b0bba9
CSTACKEX-18_2: plugin has to consider VM for snapshot in running and …
rajiv-jain-netapp Mar 2, 2026
7780a93
CSTACKEX-18_2: revert snapshot fixes for API not found
rajiv-jain-netapp Mar 2, 2026
5bff41f
CSTACKEC-18_2: revertsnapshot workflow using private cli REST endpoint
rajiv-jain-netapp Mar 4, 2026
2abbed6
CSTACKEX-18_2: taking snapshot with memory option set as true
rajiv-jain-netapp Mar 5, 2026
2340400
CSTACKEX-18_2: add exception handling for any error coming from agent
rajiv-jain-netapp Mar 5, 2026
ce93705
CSTACKEX-18_2: reverting memory snapshot workflow and eroring out for…
rajiv-jain-netapp Mar 5, 2026
e1a6465
CSTACKEX-18_2: revert of memory snapshot implementation
rajiv-jain-netapp Mar 5, 2026
9138e20
CSTACKEX-18_2: rollback the object creation in case of failures
rajiv-jain-netapp Mar 5, 2026
5f9e51c
CSTACKEX-18_2: rollback in case of any failures
rajiv-jain-netapp Mar 9, 2026
142e0e6
CSTACKEX-18_2: comments and some changes
rajiv-jain-netapp Mar 9, 2026
aa74a5a
CSTACKEX-18_2: checkstyle fixes
rajiv-jain-netapp Mar 9, 2026
55447b7
CSTACKEX-18_2: junit fixes
rajiv-jain-netapp Mar 9, 2026
fccaf83
Merge pull request #36 from NetApp/feature/CSTACKEX-18_2
rajiv-jain-netapp Mar 9, 2026
ea40967
feature/CSTACKEX-122: Per host Igroup changes (#37)
piyush5netapp Mar 16, 2026
a41eb28
bugfix/CSTACKEX-130: All VM becomes a dummy/zombie running vm without…
piyush5netapp Apr 13, 2026
7d08878
bugfix/CSTACKEX-143: Second VM creation creates a dummy running VM wi…
piyush5netapp Apr 13, 2026
4a62d40
bugfix/CSTACKEX-131: ISCSI VM created with small sized template which…
piyush5netapp Apr 14, 2026
a6e4b49
bugfix/CSTACKEX-135: added Netapp ontap screen during zone creation (…
piyush5netapp Apr 15, 2026
b58fd24
Merge branch 'main' of github.com:netapp/cloudstack into sync/apache-…
rajiv-jain-netapp Apr 20, 2026
0f5370a
Resolving conflicts from rebase
rajiv-jain-netapp Apr 20, 2026
ddb119f
conflicts are resolvd which are originated from rebase
rajiv-jain-netapp Apr 20, 2026
929d30f
Correction on conflict resolution
rajiv-jain-netapp Apr 21, 2026
a20b6cc
Correction on merge conflicts for constants
rajiv-jain-netapp Apr 21, 2026
9748198
copilot review comments incorporation
rajiv-jain-netapp Apr 24, 2026
cddacd1
bugfix/CSTACKEX-154: NPE check in delete datastore (#52)
piyush5netapp Apr 24, 2026
34e910c
bugfix/CSTACKEX-147: Deletion of non last VM on any host still shows …
piyush5netapp Apr 24, 2026
c86d377
Correction in code owners username
rajiv-jain-netapp Apr 24, 2026
c6e222b
cleaning up lock files
rajiv-jain-netapp Apr 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@

/plugins/storage/volume/linstor @rp-
/plugins/storage/volume/storpool @slavkap
/plugins/storage/volume/ontap @rajiv1 @sandeeplocharla @piyush5 @suryag
/plugins/storage/volume/ontap @rajiv-jain-netapp @sandeeplocharla @piyush5netapp @suryag1201

.pre-commit-config.yaml @jbampton
/.github/linters/ @jbampton
Expand Down
1,022 changes: 0 additions & 1,022 deletions .github/workflows/daily-repo-status.lock.yml

This file was deleted.

54 changes: 0 additions & 54 deletions .github/workflows/daily-repo-status.md

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,8 @@ public class KvmFileBasedStorageVmSnapshotStrategy extends StorageVMSnapshotStra

private static final List<Storage.StoragePoolType> supportedStoragePoolTypes = List.of(Storage.StoragePoolType.Filesystem, Storage.StoragePoolType.NetworkFilesystem, Storage.StoragePoolType.SharedMountPoint);

private static final String ONTAP_PROVIDER_NAME = "NetApp ONTAP";

@Inject
protected SnapshotDataStoreDao snapshotDataStoreDao;

Expand Down Expand Up @@ -325,6 +327,11 @@ public StrategyPriority canHandle(Long vmId, Long rootPoolId, boolean snapshotMe
List<VolumeVO> volumes = volumeDao.findByInstance(vmId);
for (VolumeVO volume : volumes) {
StoragePoolVO storagePoolVO = storagePool.findById(volume.getPoolId());
if (storagePoolVO.isManaged() && ONTAP_PROVIDER_NAME.equals(storagePoolVO.getStorageProviderName())) {
logger.debug(String.format("%s as the VM has a volume on ONTAP managed storage pool [%s]. " +
"ONTAP managed storage has its own dedicated VM snapshot strategy.", cantHandleLog, storagePoolVO.getName()));
return StrategyPriority.CANT_HANDLE;
}
if (!supportedStoragePoolTypes.contains(storagePoolVO.getPoolType())) {
logger.debug(String.format("%s as the VM has a volume that is in a storage with unsupported type [%s].", cantHandleLog, storagePoolVO.getPoolType()));
return StrategyPriority.CANT_HANDLE;
Expand Down Expand Up @@ -503,8 +510,9 @@ protected VMSnapshot takeVmSnapshotInternal(VMSnapshot vmSnapshot, Map<VolumeInf
return processCreateVmSnapshotAnswer(vmSnapshot, volumeInfoToSnapshotObjectMap, createDiskOnlyVMSnapshotAnswer, userVm, vmSnapshotVO, virtualSize, parentSnapshotVo);
}

logger.error("Disk-only VM snapshot for VM [{}] failed{}.", userVm.getUuid(), answer != null ? " due to" + answer.getDetails() : "");
throw new CloudRuntimeException(String.format("Disk-only VM snapshot for VM [%s] failed.", userVm.getUuid()));
String details = answer != null ? answer.getDetails() : String.format("No answer received from host [%s]. The host may be unreachable.", hostId);
logger.error("Disk-only VM snapshot for VM [{}] failed due to: {}.", userVm.getUuid(), details);
throw new CloudRuntimeException(String.format("Disk-only VM snapshot for VM [%s] failed due to: %s.", userVm.getUuid(), details));
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1340,6 +1340,15 @@ private void createManagedVolumeCopyTemplateAsync(VolumeInfo volumeInfo, Primary
primaryDataStore.setDetails(details);

grantAccess(volumeInfo, destHost, primaryDataStore);
volumeInfo = volFactory.getVolume(volumeInfo.getId(), primaryDataStore);
// For Netapp ONTAP iscsiName or Lun path is available only after grantAccess
String managedStoreTarget = volumeInfo.get_iScsiName() != null ? volumeInfo.get_iScsiName() : volumeInfo.getUuid();
details.put(PrimaryDataStore.MANAGED_STORE_TARGET, managedStoreTarget);
primaryDataStore.setDetails(details);
// Update destTemplateInfo with the iSCSI path from volumeInfo
if (destTemplateInfo instanceof TemplateObject) {
((TemplateObject)destTemplateInfo).setInstallPath(volumeInfo.getPath());
}

try {
motionSrv.copyAsync(srcTemplateInfo, destTemplateInfo, destHost, caller);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,10 @@ protected Answer takeDiskOnlyVmSnapshotOfRunningVm(CreateDiskOnlyVmSnapshotComma
return new CreateDiskOnlyVmSnapshotAnswer(cmd, false, errorMsg, null);
}
return new CreateDiskOnlyVmSnapshotAnswer(cmd, false, e.getMessage(), null);
} catch (Exception e) {
String errorMsg = String.format("Creation of disk-only VM snapshot for VM [%s] failed due to %s.", vmName, e.getMessage());
logger.error(errorMsg, e);
return new CreateDiskOnlyVmSnapshotAnswer(cmd, false, errorMsg, null);
} finally {
if (dm != null) {
try {
Expand Down Expand Up @@ -146,21 +150,13 @@ protected Answer takeDiskOnlyVmSnapshotOfStoppedVm(CreateDiskOnlyVmSnapshotComma
}
} catch (LibvirtException | QemuImgException e) {
logger.error("Exception while creating disk-only VM snapshot for VM [{}]. Deleting leftover deltas.", vmName, e);
for (VolumeObjectTO volumeObjectTO : volumeObjectTos) {
Pair<Long, String> volSizeAndNewPath = mapVolumeToSnapshotSizeAndNewVolumePath.get(volumeObjectTO.getUuid());
PrimaryDataStoreTO primaryDataStoreTO = (PrimaryDataStoreTO) volumeObjectTO.getDataStore();
KVMStoragePool kvmStoragePool = storagePoolMgr.getStoragePool(primaryDataStoreTO.getPoolType(), primaryDataStoreTO.getUuid());

if (volSizeAndNewPath == null) {
continue;
}
try {
Files.deleteIfExists(Path.of(kvmStoragePool.getLocalPathFor(volSizeAndNewPath.second())));
} catch (IOException ex) {
logger.warn("Tried to delete leftover snapshot at [{}] failed.", volSizeAndNewPath.second(), ex);
}
}
cleanupLeftoverDeltas(volumeObjectTos, mapVolumeToSnapshotSizeAndNewVolumePath, storagePoolMgr);
return new Answer(cmd, e);
} catch (Exception e) {
logger.error("Unexpected exception while creating disk-only VM snapshot for VM [{}]. Deleting leftover deltas.", vmName, e);
cleanupLeftoverDeltas(volumeObjectTos, mapVolumeToSnapshotSizeAndNewVolumePath, storagePoolMgr);
return new CreateDiskOnlyVmSnapshotAnswer(cmd, false,
String.format("Creation of disk-only VM snapshot for VM [%s] failed due to %s.", vmName, e.getMessage()), null);
}

return new CreateDiskOnlyVmSnapshotAnswer(cmd, true, null, mapVolumeToSnapshotSizeAndNewVolumePath);
Expand Down Expand Up @@ -192,6 +188,23 @@ protected Pair<String, Map<String, Pair<Long, String>>> createSnapshotXmlAndNewV
return new Pair<>(snapshotXml, volumeObjectToNewPathMap);
}

protected void cleanupLeftoverDeltas(List<VolumeObjectTO> volumeObjectTos, Map<String, Pair<Long, String>> mapVolumeToSnapshotSizeAndNewVolumePath, KVMStoragePoolManager storagePoolMgr) {
for (VolumeObjectTO volumeObjectTO : volumeObjectTos) {
Pair<Long, String> volSizeAndNewPath = mapVolumeToSnapshotSizeAndNewVolumePath.get(volumeObjectTO.getUuid());
PrimaryDataStoreTO primaryDataStoreTO = (PrimaryDataStoreTO) volumeObjectTO.getDataStore();
KVMStoragePool kvmStoragePool = storagePoolMgr.getStoragePool(primaryDataStoreTO.getPoolType(), primaryDataStoreTO.getUuid());

if (volSizeAndNewPath == null) {
continue;
}
try {
Files.deleteIfExists(Path.of(kvmStoragePool.getLocalPathFor(volSizeAndNewPath.second())));
} catch (IOException ex) {
logger.warn("Tried to delete leftover snapshot at [{}] failed.", volSizeAndNewPath.second(), ex);
}
}
}

protected long getFileSize(String path) {
return new File(path).length();
}
Expand Down
Loading