Skip to content

Commit 8015d4e

Browse files
Gupta, SuryaGupta, Surya
authored andcommitted
CSTACKEX-16 ISCSI Snapshot
1 parent eace4ee commit 8015d4e

File tree

7 files changed

+293
-115
lines changed

7 files changed

+293
-115
lines changed

plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/driver/OntapPrimaryDatastoreDriver.java

Lines changed: 235 additions & 59 deletions
Large diffs are not rendered by default.

plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/service/SANStrategy.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
package org.apache.cloudstack.storage.service;
2121

2222
import org.apache.cloudstack.storage.feign.model.OntapStorage;
23+
import org.apache.cloudstack.storage.service.model.AccessGroup;
2324

2425
public abstract class SANStrategy extends StorageStrategy {
2526
public SANStrategy(OntapStorage ontapStorage) {
@@ -46,5 +47,5 @@ public SANStrategy(OntapStorage ontapStorage) {
4647
* @param accessGroupName the igroup name
4748
* @return true if the initiator is found in the igroup, false otherwise
4849
*/
49-
public abstract boolean validateInitiatorInAccessGroup(String hostInitiator, String svmName, String accessGroupName);
50+
public abstract boolean validateInitiatorInAccessGroup(String hostInitiator, AccessGroup accessGroup);
5051
}

plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/service/StorageStrategy.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -493,18 +493,18 @@ public String getNetworkInterface() {
493493
* cloneNameSpace for Nvme/TCP and Nvme/FC protocol
494494
* @param cloudstackVolume the CloudStack volume to copy
495495
*/
496-
abstract public void copyCloudStackVolume(CloudStackVolume cloudstackVolume);
496+
abstract public CloudStackVolume copyCloudStackVolume(CloudStackVolume cloudstackVolume);
497497

498498
/**
499499
* Method encapsulates the behavior based on the opted protocol in subclasses.
500500
* it is going to mimic
501501
* getLun for iSCSI, FC protocols
502502
* getFile for NFS3.0 and NFS4.1 protocols
503503
* getNameSpace for Nvme/TCP and Nvme/FC protocol
504-
* @param cloudStackVolumeMap the CloudStack volume to retrieve
504+
* @param cloudStackVolume the CloudStack volume to retrieve
505505
* @return the retrieved CloudStackVolume object
506506
*/
507-
abstract public CloudStackVolume getCloudStackVolume(Map<String, String> cloudStackVolumeMap);
507+
abstract public CloudStackVolume getCloudStackVolume(CloudStackVolume cloudStackVolume);
508508

509509
/**
510510
* Method encapsulates the behavior based on the opted protocol in subclasses
@@ -540,9 +540,9 @@ public String getNetworkInterface() {
540540
* e.g., getIGroup for iSCSI and FC protocols
541541
* e.g., getExportPolicy for NFS 3.0 and NFS 4.1 protocols
542542
* //TODO for Nvme/TCP and Nvme/FC protocols
543-
* @param values map to get access group values like name, svm name etc.
543+
* @param accessGroup map to get access group values like name, svm name etc.
544544
*/
545-
abstract public AccessGroup getAccessGroup(Map<String, String> values);
545+
abstract public AccessGroup getAccessGroup(AccessGroup accessGroup);
546546

547547
/**
548548
* Method encapsulates the behavior based on the opted protocol in subclasses

plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/service/UnifiedNASStrategy.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -128,12 +128,12 @@ public void deleteCloudStackVolume(CloudStackVolume cloudstackVolume) {
128128
}
129129

130130
@Override
131-
public void copyCloudStackVolume(CloudStackVolume cloudstackVolume) {
132-
131+
public CloudStackVolume copyCloudStackVolume(CloudStackVolume cloudstackVolume) {
132+
return null;
133133
}
134134

135135
@Override
136-
public CloudStackVolume getCloudStackVolume(Map<String, String> cloudStackVolumeMap) {
136+
public CloudStackVolume getCloudStackVolume(CloudStackVolume cloudStackVolume) {
137137
return null;
138138
}
139139

@@ -205,7 +205,7 @@ public AccessGroup updateAccessGroup(AccessGroup accessGroup) {
205205
}
206206

207207
@Override
208-
public AccessGroup getAccessGroup(Map<String, String> values) {
208+
public AccessGroup getAccessGroup(AccessGroup accessGroup) {
209209
return null; //TODO: This method need to be rewritten according to the signature in StorageStrategy interface
210210
}
211211

plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/service/UnifiedSANStrategy.java

Lines changed: 35 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ public void deleteCloudStackVolume(CloudStackVolume cloudstackVolume) {
131131
}
132132

133133
@Override
134-
public void copyCloudStackVolume(CloudStackVolume cloudstackVolume) {
134+
public CloudStackVolume copyCloudStackVolume(CloudStackVolume cloudstackVolume) {
135135
if (cloudstackVolume == null || cloudstackVolume.getLun() == null) {
136136
s_logger.error("copyCloudStackVolume: Lun clone creation failed. Invalid request: {}", cloudstackVolume);
137137
throw new CloudRuntimeException("copyCloudStackVolume : Failed to create Lun clone, invalid request");
@@ -142,15 +142,18 @@ public void copyCloudStackVolume(CloudStackVolume cloudstackVolume) {
142142
// Get AuthHeader
143143
String authHeader = Utility.generateAuthHeader(storage.getUsername(), storage.getPassword());
144144
// Create URI for lun clone creation
145-
Lun lunCloneRequest = cloudstackVolume.getLun();
146-
Lun.Clone clone = new Lun.Clone();
147-
Lun.Source source = new Lun.Source();
148-
source.setName(cloudstackVolume.getLun().getName());
149-
clone.setSource(source);
150-
lunCloneRequest.setClone(clone);
151-
String lunCloneName = cloudstackVolume.getLun().getName() + "_clone";
152-
lunCloneRequest.setName(lunCloneName);
153-
sanFeignClient.createLun(authHeader, true, lunCloneRequest);
145+
OntapResponse<Lun> clonedLun = sanFeignClient.createLun(authHeader, true, cloudstackVolume.getLun());
146+
if (clonedLun == null || clonedLun.getRecords() == null || clonedLun.getRecords().size() == 0) {
147+
s_logger.error("copyCloudStackVolume: LUN cloned failed for Lun {}", cloudstackVolume.getLun().getName());
148+
throw new CloudRuntimeException("Failed to create Lun clone: " + cloudstackVolume.getLun().getName());
149+
}
150+
Lun lun = clonedLun.getRecords().get(0);
151+
s_logger.debug("copyCloudStackVolume: LUN cloned created successfully. Lun: {}", lun);
152+
s_logger.info("copyCloudStackVolume: LUN cloned created successfully. LunName: {}", lun.getName());
153+
154+
CloudStackVolume createdCloudStackVolume = new CloudStackVolume();
155+
createdCloudStackVolume.setLun(lun);
156+
return createdCloudStackVolume;
154157
} catch (FeignException e) {
155158
s_logger.error("FeignException occurred while creating Lun clone: {}, Status: {}, Exception: {}", cloudstackVolume.getLun().getName(), e.status(), e.getMessage());
156159
throw new CloudRuntimeException("Failed to create Lun clone: " + e.getMessage());
@@ -161,19 +164,17 @@ public void copyCloudStackVolume(CloudStackVolume cloudstackVolume) {
161164
}
162165

163166
@Override
164-
public CloudStackVolume getCloudStackVolume(Map<String, String> values) {
167+
public CloudStackVolume getCloudStackVolume(CloudStackVolume cloudStackVolumeRequest) {
165168
s_logger.info("getCloudStackVolume : fetching Lun");
166-
s_logger.debug("getCloudStackVolume : fetching Lun with params {} ", values);
167-
if (values == null || values.isEmpty()) {
168-
s_logger.error("getCloudStackVolume: get Lun failed. Invalid request: {}", values);
169+
s_logger.debug("getCloudStackVolume : CloudStackVolumeRequest {} ", cloudStackVolumeRequest);
170+
if (cloudStackVolumeRequest == null || cloudStackVolumeRequest.getLun() == null || cloudStackVolumeRequest.getLun().getSvm() == null
171+
|| cloudStackVolumeRequest.getLun().getSvm().getName() == null || cloudStackVolumeRequest.getLun().getSvm().getName().isEmpty()
172+
|| cloudStackVolumeRequest.getLun().getName() == null || cloudStackVolumeRequest.getLun().getName().isEmpty()) {
173+
s_logger.error("getCloudStackVolume: get Lun failed. Invalid request: {}", cloudStackVolumeRequest);
169174
throw new CloudRuntimeException("getCloudStackVolume : get Lun Failed, invalid request");
170175
}
171-
String svmName = values.get(Constants.SVM_DOT_NAME);
172-
String lunName = values.get(Constants.NAME);
173-
if (svmName == null || lunName == null || svmName.isEmpty() || lunName.isEmpty()) {
174-
s_logger.error("getCloudStackVolume: get Lun failed. Invalid svm:{} or Lun name: {}", svmName, lunName);
175-
throw new CloudRuntimeException("getCloudStackVolume : Failed to get Lun, invalid request");
176-
}
176+
String svmName = cloudStackVolumeRequest.getLun().getSvm().getName();
177+
String lunName = cloudStackVolumeRequest.getLun().getName();
177178
try {
178179
String authHeader = Utility.generateAuthHeader(storage.getUsername(), storage.getPassword());
179180
Map<String, Object> queryParams = Map.of(Constants.SVM_DOT_NAME, svmName, Constants.NAME, lunName);
@@ -410,19 +411,17 @@ public AccessGroup updateAccessGroup(AccessGroup accessGroup) {
410411
}
411412

412413
@Override
413-
public AccessGroup getAccessGroup(Map<String, String> values) {
414+
public AccessGroup getAccessGroup(AccessGroup accessGroupRequest) {
414415
s_logger.info("getAccessGroup : fetch Igroup");
415-
s_logger.debug("getAccessGroup : fetching Igroup with params {} ", values);
416-
if (values == null || values.isEmpty()) {
417-
s_logger.error("getAccessGroup: get Igroup failed. Invalid request: {}", values);
416+
s_logger.debug("getAccessGroup : accessGroupRequest params {} ", accessGroupRequest);
417+
if (accessGroupRequest == null || accessGroupRequest.getIgroup() == null
418+
|| accessGroupRequest.getIgroup().getName() == null || accessGroupRequest.getIgroup().getName().isEmpty() || accessGroupRequest.getIgroup().getSvm() == null
419+
|| accessGroupRequest.getIgroup().getSvm().getName() == null || accessGroupRequest.getIgroup().getSvm().getName().isEmpty()) {
420+
s_logger.error("getAccessGroup: get Igroup failed. Invalid request: {}", accessGroupRequest);
418421
throw new CloudRuntimeException("getAccessGroup : get Igroup Failed, invalid request");
419422
}
420-
String svmName = values.get(Constants.SVM_DOT_NAME);
421-
String igroupName = values.get(Constants.NAME);
422-
if (svmName == null || igroupName == null || svmName.isEmpty() || igroupName.isEmpty()) {
423-
s_logger.error("getAccessGroup: get Igroup failed. Invalid svm:{} or igroup name: {}", svmName, igroupName);
424-
throw new CloudRuntimeException("getAccessGroup : Failed to get Igroup, invalid request");
425-
}
423+
String svmName = accessGroupRequest.getIgroup().getSvm().getName();
424+
String igroupName = accessGroupRequest.getIgroup().getName();
426425
try {
427426
String authHeader = Utility.generateAuthHeader(storage.getUsername(), storage.getPassword());
428427
Map<String, Object> queryParams = Map.of(Constants.SVM_DOT_NAME, svmName, Constants.NAME, igroupName, Constants.FIELDS, Constants.INITIATORS);
@@ -613,34 +612,29 @@ public String ensureLunMapped(String svmName, String lunName, String accessGroup
613612
}
614613

615614
@Override
616-
public boolean validateInitiatorInAccessGroup(String hostInitiator, String svmName, String accessGroupName) {
617-
s_logger.info("validateInitiatorInAccessGroup: Validating initiator [{}] is in igroup [{}] on SVM [{}]", hostInitiator, accessGroupName, svmName);
615+
public boolean validateInitiatorInAccessGroup(String hostInitiator, AccessGroup accessGroup) {
616+
s_logger.info("validateInitiatorInAccessGroup: Validating initiator [{}] is in igroup", hostInitiator);
618617

619618
if (hostInitiator == null || hostInitiator.isEmpty()) {
620619
s_logger.warn("validateInitiatorInAccessGroup: host initiator is null or empty");
621620
return false;
622621
}
623622

624-
Map<String, String> getAccessGroupMap = Map.of(
625-
Constants.NAME, accessGroupName,
626-
Constants.SVM_DOT_NAME, svmName
627-
);
628-
AccessGroup accessGroup = getAccessGroup(getAccessGroupMap);
629-
if (accessGroup == null || accessGroup.getIgroup() == null) {
630-
s_logger.warn("validateInitiatorInAccessGroup: iGroup [{}] not found on SVM [{}]", accessGroupName, svmName);
623+
if (accessGroup == null || accessGroup.getIgroup() == null || accessGroup.getIgroup().getName() == null || accessGroup.getIgroup().getName().isEmpty()) {
624+
s_logger.warn("validateInitiatorInAccessGroup: Invalid access group provided for validation");
631625
return false;
632626
}
633627

634628
Igroup igroup = accessGroup.getIgroup();
635629
if (igroup.getInitiators() != null) {
636630
for (Initiator initiator : igroup.getInitiators()) {
637631
if (initiator.getName().equalsIgnoreCase(hostInitiator)) {
638-
s_logger.info("validateInitiatorInAccessGroup: Initiator [{}] validated successfully in igroup [{}]", hostInitiator, accessGroupName);
632+
s_logger.info("validateInitiatorInAccessGroup: Initiator [{}] validated successfully in igroup [{}]", hostInitiator, igroup.getName());
639633
return true;
640634
}
641635
}
642636
}
643-
s_logger.warn("validateInitiatorInAccessGroup: Initiator [{}] NOT found in igroup [{}]", hostInitiator, accessGroupName);
637+
s_logger.warn("validateInitiatorInAccessGroup: Initiator [{}] NOT found in igroup [{}]", hostInitiator, igroup.getName());
644638
return false;
645639
}
646640
}

plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/utils/Constants.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,14 @@ public class Constants {
2626
public static final int NFS3_PORT = 2049;
2727
public static final int ISCSI_PORT = 3260;
2828

29+
public static final int MAX_SNAPSHOT_NAME_LENGTH = 256;
30+
31+
public static final String CREATE = "create";
32+
public static final String SRC_CS_VOLUME_ID = "src_cs_volume_id";
33+
public static final String BASE_ONTAP_FV_ID = "base_ontap_fv_id";
34+
public static final String ONTAP_SNAP_ID = "ontap_snap_id";
35+
public static final String PRIMARY_POOL_ID = "primary_pool_id";
36+
public static final String ONTAP_SNAP_SIZE = "ontap_snap_size";
2937
public static final String NFS = "nfs";
3038
public static final String ISCSI = "iscsi";
3139
public static final String SIZE = "size";

plugins/storage/volume/ontap/src/test/java/org/apache/cloudstack/storage/service/StorageStrategyTest.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -137,12 +137,12 @@ public void deleteCloudStackVolume(org.apache.cloudstack.storage.service.model.C
137137
}
138138

139139
@Override
140-
public void copyCloudStackVolume(org.apache.cloudstack.storage.service.model.CloudStackVolume cloudstackVolume) {
140+
public CloudStackVolume copyCloudStackVolume(org.apache.cloudstack.storage.service.model.CloudStackVolume cloudstackVolume) {
141+
return null;
141142
}
142143

143144
@Override
144-
public CloudStackVolume getCloudStackVolume(
145-
Map<String, String> cloudStackVolumeMap) {
145+
public CloudStackVolume getCloudStackVolume(CloudStackVolume cloudStackVolume) {
146146
return null;
147147
}
148148

@@ -163,8 +163,7 @@ AccessGroup updateAccessGroup(
163163
}
164164

165165
@Override
166-
public AccessGroup getAccessGroup(
167-
Map<String, String> values) {
166+
public AccessGroup getAccessGroup(AccessGroup accessGroup) {
168167
return null;
169168
}
170169

0 commit comments

Comments
 (0)