Skip to content

Commit 934d5b5

Browse files
suryag1201Gupta, Surya
authored andcommitted
Feature/cstackex 112 (#33)
* CSTACKEX-112 UI Changes for storage pool creation * CSTACKEX-112 Rebase * CSTACKEX-112 Fixed test cases * CSTACKEX-112 Change the provider name --------- Co-authored-by: Gupta, Surya <Surya.Gupta@netapp.com>
1 parent 03486ee commit 934d5b5

11 files changed

Lines changed: 124 additions & 87 deletions

File tree

plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/feign/model/OntapStorage.java

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -24,20 +24,18 @@
2424
public class OntapStorage {
2525
private final String username;
2626
private final String password;
27-
private final String managementLIF;
27+
private final String storageIP;
2828
private final String svmName;
2929
private final Long size;
3030
private final ProtocolType protocolType;
31-
private final Boolean isDisaggregated;
3231

33-
public OntapStorage(String username, String password, String managementLIF, String svmName, Long size, ProtocolType protocolType, Boolean isDisaggregated) {
32+
public OntapStorage(String username, String password, String storageIP, String svmName, Long size, ProtocolType protocolType) {
3433
this.username = username;
3534
this.password = password;
36-
this.managementLIF = managementLIF;
35+
this.storageIP = storageIP;
3736
this.svmName = svmName;
3837
this.size = size;
3938
this.protocolType = protocolType;
40-
this.isDisaggregated = isDisaggregated;
4139
}
4240

4341
public String getUsername() {
@@ -48,13 +46,9 @@ public String getPassword() {
4846
return password;
4947
}
5048

51-
public String getManagementLIF() {
52-
return managementLIF;
53-
}
49+
public String getStorageIP() { return storageIP; }
5450

55-
public String getSvmName() {
56-
return svmName;
57-
}
51+
public String getSvmName() { return svmName; }
5852

5953
public Long getSize() {
6054
return size;
@@ -63,8 +57,4 @@ public Long getSize() {
6357
public ProtocolType getProtocol() {
6458
return protocolType;
6559
}
66-
67-
public Boolean getIsDisaggregated() {
68-
return isDisaggregated;
69-
}
7060
}

plugins/storage/volume/ontap/src/main/java/org/apache/cloudstack/storage/provider/StorageProviderFactory.java

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -38,21 +38,15 @@ public static StorageStrategy getStrategy(OntapStorage ontapStorage) {
3838
logger.info("Initializing StorageProviderFactory with protocol: " + protocol);
3939
switch (protocol) {
4040
case NFS3:
41-
if (!ontapStorage.getIsDisaggregated()) {
42-
UnifiedNASStrategy unifiedNASStrategy = new UnifiedNASStrategy(ontapStorage);
43-
ComponentContext.inject(unifiedNASStrategy);
44-
unifiedNASStrategy.setOntapStorage(ontapStorage);
45-
return unifiedNASStrategy;
46-
}
47-
throw new CloudRuntimeException("Unsupported configuration: Disaggregated ONTAP is not supported.");
41+
UnifiedNASStrategy unifiedNASStrategy = new UnifiedNASStrategy(ontapStorage);
42+
ComponentContext.inject(unifiedNASStrategy);
43+
unifiedNASStrategy.setOntapStorage(ontapStorage);
44+
return unifiedNASStrategy;
4845
case ISCSI:
49-
if (!ontapStorage.getIsDisaggregated()) {
50-
UnifiedSANStrategy unifiedSANStrategy = new UnifiedSANStrategy(ontapStorage);
51-
ComponentContext.inject(unifiedSANStrategy);
52-
unifiedSANStrategy.setOntapStorage(ontapStorage);
53-
return unifiedSANStrategy;
54-
}
55-
throw new CloudRuntimeException("Unsupported configuration: Disaggregated ONTAP is not supported.");
46+
UnifiedSANStrategy unifiedSANStrategy = new UnifiedSANStrategy(ontapStorage);
47+
ComponentContext.inject(unifiedSANStrategy);
48+
unifiedSANStrategy.setOntapStorage(ontapStorage);
49+
return unifiedSANStrategy;
5650
default:
5751
throw new CloudRuntimeException("Unsupported protocol: " + protocol);
5852
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ public abstract class StorageStrategy {
7979

8080
public StorageStrategy(OntapStorage ontapStorage) {
8181
storage = ontapStorage;
82-
String baseURL = Constants.HTTPS + storage.getManagementLIF();
82+
String baseURL = Constants.HTTPS + storage.getStorageIP();
8383
s_logger.info("Initializing StorageStrategy with base URL: " + baseURL);
8484
// Initialize FeignClientFactory and create clients
8585
this.feignClientFactory = new FeignClientFactory();
@@ -93,7 +93,7 @@ public StorageStrategy(OntapStorage ontapStorage) {
9393

9494
// Connect method to validate ONTAP cluster, credentials, protocol, and SVM
9595
public boolean connect() {
96-
s_logger.info("Attempting to connect to ONTAP cluster at " + storage.getManagementLIF() + " and validate SVM " +
96+
s_logger.info("Attempting to connect to ONTAP cluster at " + storage.getStorageIP() + " and validate SVM " +
9797
storage.getSvmName() + ", protocol " + storage.getProtocol());
9898
//Get AuthHeader
9999
String authHeader = Utility.generateAuthHeader(storage.getUsername(), storage.getPassword());

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222

2323
public class Constants {
2424

25-
public static final String ONTAP_PLUGIN_NAME = "ONTAP";
25+
public static final String ONTAP_PLUGIN_NAME = "NetApp ONTAP";
2626
public static final int NFS3_PORT = 2049;
2727
public static final int ISCSI_PORT = 3260;
2828

@@ -34,7 +34,7 @@ public class Constants {
3434
public static final String USERNAME = "username";
3535
public static final String PASSWORD = "password";
3636
public static final String DATA_LIF = "dataLIF";
37-
public static final String MANAGEMENT_LIF = "managementLIF";
37+
public static final String STORAGE_IP = "storageIP";
3838
public static final String VOLUME_NAME = "volumeName";
3939
public static final String VOLUME_UUID = "volumeUUID";
4040
public static final String EXPORT_POLICY_ID = "exportPolicyId";

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,9 +126,8 @@ public static StorageStrategy getStrategyByStoragePoolDetails(Map<String, String
126126
}
127127
String protocol = details.get(Constants.PROTOCOL);
128128
OntapStorage ontapStorage = new OntapStorage(details.get(Constants.USERNAME), details.get(Constants.PASSWORD),
129-
details.get(Constants.MANAGEMENT_LIF), details.get(Constants.SVM_NAME), Long.parseLong(details.get(Constants.SIZE)),
130-
ProtocolType.valueOf(protocol),
131-
Boolean.parseBoolean(details.get(Constants.IS_DISAGGREGATED)));
129+
details.get(Constants.STORAGE_IP), details.get(Constants.SVM_NAME), Long.parseLong(details.get(Constants.SIZE)),
130+
ProtocolType.valueOf(protocol));
132131
StorageStrategy storageStrategy = StorageProviderFactory.getStrategy(ontapStorage);
133132
boolean isValid = storageStrategy.connect();
134133
if (isValid) {

plugins/storage/volume/ontap/src/test/java/org/apache/cloudstack/storage/lifecycle/OntapPrimaryDatastoreLifecycleTest.java

Lines changed: 36 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
*/
1919
package org.apache.cloudstack.storage.lifecycle;
2020

21+
import org.apache.cloudstack.storage.utils.Constants;
2122
import org.junit.jupiter.api.BeforeEach;
2223
import org.junit.jupiter.api.Test;
2324
import org.junit.jupiter.api.extension.ExtendWith;
@@ -151,41 +152,20 @@ void setUp() {
151152
poolDetails.put("password", "password");
152153
poolDetails.put("svmName", "svm1");
153154
poolDetails.put("protocol", "NFS3");
154-
poolDetails.put("managementLIF", "192.168.1.100");
155-
poolDetails.put("isDisaggregated", "false");
155+
poolDetails.put("storageIP", "192.168.1.100");
156156
}
157157

158158
@Test
159159
public void testInitialize_positive() {
160160

161-
Map<String, Object> dsInfos = new HashMap<>();
162-
dsInfos.put("username", "testUser");
163-
dsInfos.put("password", "testPassword");
164-
dsInfos.put("url", "username=testUser;password=testPassword;svmName=testSVM;protocol=NFS3;managementLIF=192.168.1.1");
165-
dsInfos.put("zoneId",1L);
166-
dsInfos.put("podId",1L);
167-
dsInfos.put("clusterId", 1L);
168-
dsInfos.put("name", "testStoragePool");
169-
dsInfos.put("providerName", "testProvider");
170-
dsInfos.put("capacityBytes",200000L);
171-
dsInfos.put("managed",true);
172-
dsInfos.put("tags", "testTag");
173-
dsInfos.put("isTagARule", false);
174-
dsInfos.put("details", new HashMap<String, String>());
175-
176-
try(MockedStatic<StorageProviderFactory> storageProviderFactory = Mockito.mockStatic(StorageProviderFactory.class)) {
177-
storageProviderFactory.when(() -> StorageProviderFactory.getStrategy(any())).thenReturn(storageStrategy);
178-
ontapPrimaryDatastoreLifecycle.initialize(dsInfos);
179-
}
180-
}
181-
182-
@Test
183-
public void testInitialize_positiveWithIsDisaggregated() {
161+
HashMap<String, String> detailsMap = new HashMap<String, String>();
162+
detailsMap.put(Constants.USERNAME, "testUser");
163+
detailsMap.put(Constants.PASSWORD, "testPassword");
164+
detailsMap.put(Constants.STORAGE_IP, "10.10.10.10");
165+
detailsMap.put(Constants.SVM_NAME, "vs0");
166+
detailsMap.put(Constants.PROTOCOL, "NFS3");
184167

185168
Map<String, Object> dsInfos = new HashMap<>();
186-
dsInfos.put("username", "testUser");
187-
dsInfos.put("password", "testPassword");
188-
dsInfos.put("url", "username=testUser;password=testPassword;svmName=testSVM;protocol=NFS3;managementLIF=192.168.1.1;isDisaggregated=false");
189169
dsInfos.put("zoneId",1L);
190170
dsInfos.put("podId",1L);
191171
dsInfos.put("clusterId", 1L);
@@ -195,7 +175,7 @@ public void testInitialize_positiveWithIsDisaggregated() {
195175
dsInfos.put("managed",true);
196176
dsInfos.put("tags", "testTag");
197177
dsInfos.put("isTagARule", false);
198-
dsInfos.put("details", new HashMap<String, String>());
178+
dsInfos.put("details", detailsMap);
199179

200180
try(MockedStatic<StorageProviderFactory> storageProviderFactory = Mockito.mockStatic(StorageProviderFactory.class)) {
201181
storageProviderFactory.when(() -> StorageProviderFactory.getStrategy(any())).thenReturn(storageStrategy);
@@ -212,8 +192,14 @@ public void testInitialize_null_Arg() {
212192

213193
@Test
214194
public void testInitialize_missingRequiredDetailKey() {
195+
196+
HashMap<String, String> detailsMap = new HashMap<String, String>();
197+
detailsMap.put(Constants.USERNAME, "testUser");
198+
detailsMap.put(Constants.PASSWORD, "testPassword");
199+
detailsMap.put(Constants.STORAGE_IP, "10.10.10.10");
200+
detailsMap.put(Constants.SVM_NAME, "vs0");
201+
215202
Map<String, Object> dsInfos = new HashMap<>();
216-
dsInfos.put("url", "username=testUser;password=testPassword;svmName=testSVM;protocol=NFS3");
217203
dsInfos.put("zoneId",1L);
218204
dsInfos.put("podId",1L);
219205
dsInfos.put("clusterId", 1L);
@@ -223,7 +209,7 @@ public void testInitialize_missingRequiredDetailKey() {
223209
dsInfos.put("managed",true);
224210
dsInfos.put("tags", "testTag");
225211
dsInfos.put("isTagARule", false);
226-
dsInfos.put("details", new HashMap<String, String>());
212+
dsInfos.put("details", detailsMap);
227213

228214
try (MockedStatic<StorageProviderFactory> storageProviderFactory = Mockito.mockStatic(StorageProviderFactory.class)) {
229215
storageProviderFactory.when(() -> StorageProviderFactory.getStrategy(any())).thenReturn(storageStrategy);
@@ -234,8 +220,15 @@ public void testInitialize_missingRequiredDetailKey() {
234220

235221
@Test
236222
public void testInitialize_invalidCapacityBytes() {
223+
224+
HashMap<String, String> detailsMap = new HashMap<String, String>();
225+
detailsMap.put(Constants.USERNAME, "testUser");
226+
detailsMap.put(Constants.PASSWORD, "testPassword");
227+
detailsMap.put(Constants.STORAGE_IP, "10.10.10.10");
228+
detailsMap.put(Constants.SVM_NAME, "vs0");
229+
detailsMap.put(Constants.PROTOCOL, "NFS3");
230+
237231
Map<String, Object> dsInfos = new HashMap<>();
238-
dsInfos.put("url", "username=testUser;password=testPassword;svmName=testSVM;protocol=NFS3;managementLIF=192.168.1.1");
239232
dsInfos.put("zoneId",1L);
240233
dsInfos.put("podId",1L);
241234
dsInfos.put("clusterId", 1L);
@@ -245,7 +238,7 @@ public void testInitialize_invalidCapacityBytes() {
245238
dsInfos.put("managed",true);
246239
dsInfos.put("tags", "testTag");
247240
dsInfos.put("isTagARule", false);
248-
dsInfos.put("details", new HashMap<String, String>());
241+
dsInfos.put("details", detailsMap);
249242

250243
try (MockedStatic<StorageProviderFactory> storageProviderFactory = Mockito.mockStatic(StorageProviderFactory.class)) {
251244
storageProviderFactory.when(() -> StorageProviderFactory.getStrategy(any())).thenReturn(storageStrategy);
@@ -256,7 +249,6 @@ public void testInitialize_invalidCapacityBytes() {
256249
@Test
257250
public void testInitialize_unmanagedStorage() {
258251
Map<String, Object> dsInfos = new HashMap<>();
259-
dsInfos.put("url", "username=testUser;password=testPassword;svmName=testSVM;protocol=NFS3;managementLIF=192.168.1.1");
260252
dsInfos.put("zoneId",1L);
261253
dsInfos.put("podId",1L);
262254
dsInfos.put("clusterId", 1L);
@@ -280,7 +272,6 @@ public void testInitialize_unmanagedStorage() {
280272
@Test
281273
public void testInitialize_nullStoragePoolName() {
282274
Map<String, Object> dsInfos = new HashMap<>();
283-
dsInfos.put("url", "username=testUser;password=testPassword;svmName=testSVM;protocol=NFS3;managementLIF=192.168.1.1");
284275
dsInfos.put("zoneId",1L);
285276
dsInfos.put("podId",1L);
286277
dsInfos.put("clusterId", 1L);
@@ -304,7 +295,6 @@ public void testInitialize_nullStoragePoolName() {
304295
@Test
305296
public void testInitialize_nullProviderName() {
306297
Map<String, Object> dsInfos = new HashMap<>();
307-
dsInfos.put("url", "username=testUser;password=testPassword;svmName=testSVM;protocol=NFS3;managementLIF=192.168.1.1");
308298
dsInfos.put("zoneId",1L);
309299
dsInfos.put("podId",1L);
310300
dsInfos.put("clusterId", 1L);
@@ -328,7 +318,6 @@ public void testInitialize_nullProviderName() {
328318
@Test
329319
public void testInitialize_nullPodAndClusterAndZone() {
330320
Map<String, Object> dsInfos = new HashMap<>();
331-
dsInfos.put("url", "username=testUser;password=testPassword;svmName=testSVM;protocol=NFS3;managementLIF=192.168.1.1");
332321
dsInfos.put("zoneId",null);
333322
dsInfos.put("podId",null);
334323
dsInfos.put("clusterId", null);
@@ -356,7 +345,6 @@ public void testInitialize_clusterNotKVM() {
356345
when(_clusterDao.findById(2L)).thenReturn(clusterVO);
357346

358347
Map<String, Object> dsInfos = new HashMap<>();
359-
dsInfos.put("url", "username=testUser;password=testPassword;svmName=testSVM;protocol=NFS3;managementLIF=192.168.1.1");
360348
dsInfos.put("zoneId",1L);
361349
dsInfos.put("podId",1L);
362350
dsInfos.put("clusterId", 2L);
@@ -379,8 +367,16 @@ public void testInitialize_clusterNotKVM() {
379367

380368
@Test
381369
public void testInitialize_unexpectedDetailKey() {
370+
371+
HashMap<String, String> detailsMap = new HashMap<String, String>();
372+
detailsMap.put(Constants.USERNAME, "testUser");
373+
detailsMap.put(Constants.PASSWORD, "testPassword");
374+
detailsMap.put(Constants.STORAGE_IP, "10.10.10.10");
375+
detailsMap.put(Constants.SVM_NAME, "vs0");
376+
detailsMap.put(Constants.PROTOCOL, "NFS3");
377+
detailsMap.put("unexpectedKey", "unexpectedValue");
378+
382379
Map<String, Object> dsInfos = new HashMap<>();
383-
dsInfos.put("url", "username=testUser;password=testPassword;svmName=testSVM;protocol=NFS3;managementLIF=192.168.1.1;unexpectedKey=unexpectedValue");
384380
dsInfos.put("zoneId",1L);
385381
dsInfos.put("podId",1L);
386382
dsInfos.put("clusterId", 1L);
@@ -390,7 +386,7 @@ public void testInitialize_unexpectedDetailKey() {
390386
dsInfos.put("managed",true);
391387
dsInfos.put("tags", "testTag");
392388
dsInfos.put("isTagARule", false);
393-
dsInfos.put("details", new HashMap<String, String>());
389+
dsInfos.put("details", detailsMap);
394390

395391
Exception ex = assertThrows(CloudRuntimeException.class, () -> {
396392
try (MockedStatic<StorageProviderFactory> storageProviderFactory = Mockito.mockStatic(StorageProviderFactory.class)) {

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ public Map<String, String> getLogicalAccess(Map<String, String> values) {
187187
void setUp() {
188188
// Create OntapStorage using constructor (immutable object)
189189
OntapStorage ontapStorage = new OntapStorage("admin", "password", "192.168.1.100",
190-
"svm1", null, ProtocolType.NFS3, false);
190+
"svm1", null, ProtocolType.NFS3);
191191

192192
// Note: In real implementation, StorageStrategy constructor creates Feign clients
193193
// For testing, we'll need to mock the FeignClientFactory behavior
@@ -290,7 +290,7 @@ public void testConnect_iscsiNotEnabled() {
290290
// Note: Protocol validation is currently broken in StorageStrategy (enum vs string comparison)
291291
// so this test verifies connection succeeds even when iSCSI is disabled
292292
OntapStorage iscsiStorage = new OntapStorage("admin", "password", "192.168.1.100",
293-
"svm1", null, ProtocolType.ISCSI, false);
293+
"svm1", null, ProtocolType.ISCSI);
294294
storageStrategy = new TestableStorageStrategy(iscsiStorage,
295295
aggregateFeignClient, volumeFeignClient, svmFeignClient,
296296
jobFeignClient, networkFeignClient, sanFeignClient);
@@ -611,7 +611,7 @@ public void testDeleteStorageVolume_feignException() {
611611
public void testGetStoragePath_iscsi() {
612612
// Setup - recreate with iSCSI protocol
613613
OntapStorage iscsiStorage = new OntapStorage("admin", "password", "192.168.1.100",
614-
"svm1", null, ProtocolType.ISCSI, false);
614+
"svm1", null, ProtocolType.ISCSI);
615615
storageStrategy = new TestableStorageStrategy(iscsiStorage,
616616
aggregateFeignClient, volumeFeignClient, svmFeignClient,
617617
jobFeignClient, networkFeignClient, sanFeignClient);
@@ -641,7 +641,7 @@ public void testGetStoragePath_iscsi() {
641641
public void testGetStoragePath_iscsi_noService() {
642642
// Setup - recreate with iSCSI protocol
643643
OntapStorage iscsiStorage = new OntapStorage("admin", "password", "192.168.1.100",
644-
"svm1", null, ProtocolType.ISCSI, false);
644+
"svm1", null, ProtocolType.ISCSI);
645645
storageStrategy = new TestableStorageStrategy(iscsiStorage,
646646
aggregateFeignClient, volumeFeignClient, svmFeignClient,
647647
jobFeignClient, networkFeignClient, sanFeignClient);
@@ -662,7 +662,7 @@ public void testGetStoragePath_iscsi_noService() {
662662
public void testGetStoragePath_iscsi_noTargetIqn() {
663663
// Setup - recreate with iSCSI protocol
664664
OntapStorage iscsiStorage = new OntapStorage("admin", "password", "192.168.1.100",
665-
"svm1", null, ProtocolType.ISCSI, false);
665+
"svm1", null, ProtocolType.ISCSI);
666666
storageStrategy = new TestableStorageStrategy(iscsiStorage,
667667
aggregateFeignClient, volumeFeignClient, svmFeignClient,
668668
jobFeignClient, networkFeignClient, sanFeignClient);
@@ -712,7 +712,7 @@ public void testGetNetworkInterface_nfs() {
712712
public void testGetNetworkInterface_iscsi() {
713713
// Setup - recreate with iSCSI protocol
714714
OntapStorage iscsiStorage = new OntapStorage("admin", "password", "192.168.1.100",
715-
"svm1", null, ProtocolType.ISCSI, false);
715+
"svm1", null, ProtocolType.ISCSI);
716716
storageStrategy = new TestableStorageStrategy(iscsiStorage,
717717
aggregateFeignClient, volumeFeignClient, svmFeignClient,
718718
jobFeignClient, networkFeignClient, sanFeignClient);

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,8 +122,7 @@ public void setUp() throws Exception {
122122
"192.168.1.100",
123123
"svm1",
124124
100L,
125-
ProtocolType.NFS3,
126-
false
125+
ProtocolType.NFS3
127126
);
128127
strategy = new TestableUnifiedNASStrategy(ontapStorage, nasFeignClient, volumeFeignClient, jobFeignClient, aggregateFeignClient, svmFeignClient, networkFeignClient, sanFeignClient);
129128
injectField("volumeDao", volumeDao);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ class UnifiedSANStrategyTest {
8989

9090
@BeforeEach
9191
void setUp() {
92-
lenient().when(ontapStorage.getManagementLIF()).thenReturn("192.168.1.100");
92+
lenient().when(ontapStorage.getStorageIP()).thenReturn("192.168.1.100");
9393
lenient().when(ontapStorage.getUsername()).thenReturn("admin");
9494
lenient().when(ontapStorage.getPassword()).thenReturn("password");
9595
lenient().when(ontapStorage.getSvmName()).thenReturn("svm1");

0 commit comments

Comments
 (0)