Skip to content

Commit 9bf66e6

Browse files
Gupta, SuryaGupta, Surya
authored andcommitted
CSTACKEX-112 UI Changes for storage pool creation
1 parent 8a2c7fb commit 9bf66e6

File tree

12 files changed

+122
-79
lines changed

12 files changed

+122
-79
lines changed

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/lifecycle/OntapPrimaryDatastoreLifecycle.java

Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,6 @@ public DataStore initialize(Map<String, Object> dsInfos) {
8686
if (dsInfos == null) {
8787
throw new CloudRuntimeException("Datastore info map is null, cannot create primary storage");
8888
}
89-
String url = (String) dsInfos.get("url");
9089
Long zoneId = (Long) dsInfos.get("zoneId");
9190
Long podId = (Long) dsInfos.get("podId");
9291
Long clusterId = (Long) dsInfos.get("clusterId");
@@ -156,23 +155,9 @@ public DataStore initialize(Map<String, Object> dsInfos) {
156155
Constants.PASSWORD,
157156
Constants.SVM_NAME,
158157
Constants.PROTOCOL,
159-
Constants.MANAGEMENT_LIF,
160-
Constants.IS_DISAGGREGATED
158+
Constants.STORAGE_IP
161159
);
162160

163-
// Parse key=value pairs from URL into details (skip empty segments)
164-
if (url != null && !url.isEmpty()) {
165-
for (String segment : url.split(Constants.SEMICOLON)) {
166-
if (segment.isEmpty()) {
167-
continue;
168-
}
169-
String[] kv = segment.split(Constants.EQUALS, 2);
170-
if (kv.length == 2) {
171-
details.put(kv[0].trim(), kv[1].trim());
172-
}
173-
}
174-
}
175-
176161
// Validate existing entries (reject unexpected keys, empty values)
177162
for (Map.Entry<String, String> e : details.entrySet()) {
178163
String key = e.getKey();
@@ -195,21 +180,17 @@ public DataStore initialize(Map<String, Object> dsInfos) {
195180

196181
details.put(Constants.SIZE, capacityBytes.toString());
197182

198-
// Default for IS_DISAGGREGATED if needed
199-
details.putIfAbsent(Constants.IS_DISAGGREGATED, "false");
200-
201183
ProtocolType protocol = ProtocolType.valueOf(details.get(Constants.PROTOCOL));
202184

203185
// Connect to ONTAP and create volume
204186
long volumeSize = Long.parseLong(details.get(Constants.SIZE));
205187
OntapStorage ontapStorage = new OntapStorage(
206188
details.get(Constants.USERNAME),
207189
details.get(Constants.PASSWORD),
208-
details.get(Constants.MANAGEMENT_LIF),
190+
details.get(Constants.STORAGE_IP),
209191
details.get(Constants.SVM_NAME),
210192
volumeSize,
211-
protocol,
212-
Boolean.parseBoolean(details.get(Constants.IS_DISAGGREGATED).toLowerCase()));
193+
protocol);
213194

214195
StorageStrategy storageStrategy = StorageProviderFactory.getStrategy(ontapStorage);
215196
boolean isValid = storageStrategy.connect();

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public HypervisorHostListener getHostListener() {
6565
@Override
6666
public String getName() {
6767
s_logger.trace("OntapPrimaryDatastoreProvider: getName: Called");
68-
return "ONTAP Primary Datastore Provider";
68+
return "NetApp ONTAP";
6969
}
7070

7171
@Override

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
s_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/service/UnifiedNASStrategy.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ public class UnifiedNASStrategy extends NASStrategy {
7272

7373
public UnifiedNASStrategy(OntapStorage ontapStorage) {
7474
super(ontapStorage);
75-
String baseURL = Constants.HTTPS + ontapStorage.getManagementLIF();
75+
String baseURL = Constants.HTTPS + ontapStorage.getStorageIP();
7676
this.feignClientFactory = new FeignClientFactory();
7777
this.nasFeignClient = feignClientFactory.createClient(NASFeignClient.class, baseURL);
7878
this.volumeFeignClient = feignClientFactory.createClient(VolumeFeignClient.class,baseURL );

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public class UnifiedSANStrategy extends SANStrategy {
5252

5353
public UnifiedSANStrategy(OntapStorage ontapStorage) {
5454
super(ontapStorage);
55-
String baseURL = Constants.HTTPS + ontapStorage.getManagementLIF();
55+
String baseURL = Constants.HTTPS + ontapStorage.getStorageIP();
5656
// Initialize FeignClientFactory and create SAN client
5757
this.feignClientFactory = new FeignClientFactory();
5858
this.sanFeignClient = feignClientFactory.createClient(SANFeignClient.class, baseURL);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public class Constants {
3030
public static final String USERNAME = "username";
3131
public static final String PASSWORD = "password";
3232
public static final String DATA_LIF = "dataLIF";
33-
public static final String MANAGEMENT_LIF = "managementLIF";
33+
public static final String STORAGE_IP = "storageIP";
3434
public static final String VOLUME_NAME = "volumeName";
3535
public static final String VOLUME_UUID = "volumeUUID";
3636
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
@@ -121,9 +121,8 @@ public static StorageStrategy getStrategyByStoragePoolDetails(Map<String, String
121121
}
122122
String protocol = details.get(Constants.PROTOCOL);
123123
OntapStorage ontapStorage = new OntapStorage(details.get(Constants.USERNAME), details.get(Constants.PASSWORD),
124-
details.get(Constants.MANAGEMENT_LIF), details.get(Constants.SVM_NAME), Long.parseLong(details.get(Constants.SIZE)),
125-
ProtocolType.valueOf(protocol),
126-
Boolean.parseBoolean(details.get(Constants.IS_DISAGGREGATED)));
124+
details.get(Constants.STORAGE_IP), details.get(Constants.SVM_NAME), Long.parseLong(details.get(Constants.SIZE)),
125+
ProtocolType.valueOf(protocol));
127126
StorageStrategy storageStrategy = StorageProviderFactory.getStrategy(ontapStorage);
128127
boolean isValid = storageStrategy.connect();
129128
if (isValid) {

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

Lines changed: 37 additions & 17 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;
@@ -135,17 +136,20 @@ void setUp() {
135136
poolDetails.put("password", "password");
136137
poolDetails.put("svmName", "svm1");
137138
poolDetails.put("protocol", "NFS3");
138-
poolDetails.put("managementLIF", "192.168.1.100");
139-
poolDetails.put("isDisaggregated", "false");
139+
poolDetails.put("storageIP", "192.168.1.100");
140140
}
141141

142142
@Test
143143
public void testInitialize_positive() {
144144

145+
HashMap<String, String> detailsMap = new HashMap<String, String>();
146+
detailsMap.put(Constants.USERNAME, "testUser");
147+
detailsMap.put(Constants.PASSWORD, "testPassword");
148+
detailsMap.put(Constants.STORAGE_IP, "10.10.10.10");
149+
detailsMap.put(Constants.SVM_NAME, "vs0");
150+
detailsMap.put(Constants.PROTOCOL, "NFS3");
151+
145152
Map<String, Object> dsInfos = new HashMap<>();
146-
dsInfos.put("username", "testUser");
147-
dsInfos.put("password", "testPassword");
148-
dsInfos.put("url", "username=testUser;password=testPassword;svmName=testSVM;protocol=NFS3;managementLIF=192.168.1.1;isDisaggregated=false");
149153
dsInfos.put("zoneId",1L);
150154
dsInfos.put("podId",1L);
151155
dsInfos.put("clusterId", 1L);
@@ -155,7 +159,7 @@ public void testInitialize_positive() {
155159
dsInfos.put("managed",true);
156160
dsInfos.put("tags", "testTag");
157161
dsInfos.put("isTagARule", false);
158-
dsInfos.put("details", new HashMap<String, String>());
162+
dsInfos.put("details", detailsMap);
159163

160164
try(MockedStatic<StorageProviderFactory> storageProviderFactory = Mockito.mockStatic(StorageProviderFactory.class)) {
161165
storageProviderFactory.when(() -> StorageProviderFactory.getStrategy(any())).thenReturn(storageStrategy);
@@ -172,8 +176,14 @@ public void testInitialize_null_Arg() {
172176

173177
@Test
174178
public void testInitialize_missingRequiredDetailKey() {
179+
180+
HashMap<String, String> detailsMap = new HashMap<String, String>();
181+
detailsMap.put(Constants.USERNAME, "testUser");
182+
detailsMap.put(Constants.PASSWORD, "testPassword");
183+
detailsMap.put(Constants.STORAGE_IP, "10.10.10.10");
184+
detailsMap.put(Constants.SVM_NAME, "vs0");
185+
175186
Map<String, Object> dsInfos = new HashMap<>();
176-
dsInfos.put("url", "username=testUser;password=testPassword;svmName=testSVM;protocol=NFS3;managementLIF=192.168.1.1");
177187
dsInfos.put("zoneId",1L);
178188
dsInfos.put("podId",1L);
179189
dsInfos.put("clusterId", 1L);
@@ -183,7 +193,7 @@ public void testInitialize_missingRequiredDetailKey() {
183193
dsInfos.put("managed",true);
184194
dsInfos.put("tags", "testTag");
185195
dsInfos.put("isTagARule", false);
186-
dsInfos.put("details", new HashMap<String, String>());
196+
dsInfos.put("details", detailsMap);
187197

188198
try (MockedStatic<StorageProviderFactory> storageProviderFactory = Mockito.mockStatic(StorageProviderFactory.class)) {
189199
storageProviderFactory.when(() -> StorageProviderFactory.getStrategy(any())).thenReturn(storageStrategy);
@@ -194,8 +204,15 @@ public void testInitialize_missingRequiredDetailKey() {
194204

195205
@Test
196206
public void testInitialize_invalidCapacityBytes() {
207+
208+
HashMap<String, String> detailsMap = new HashMap<String, String>();
209+
detailsMap.put(Constants.USERNAME, "testUser");
210+
detailsMap.put(Constants.PASSWORD, "testPassword");
211+
detailsMap.put(Constants.STORAGE_IP, "10.10.10.10");
212+
detailsMap.put(Constants.SVM_NAME, "vs0");
213+
detailsMap.put(Constants.PROTOCOL, "NFS3");
214+
197215
Map<String, Object> dsInfos = new HashMap<>();
198-
dsInfos.put("url", "username=testUser;password=testPassword;svmName=testSVM;protocol=NFS3;managementLIF=192.168.1.1;isDisaggregated=false");
199216
dsInfos.put("zoneId",1L);
200217
dsInfos.put("podId",1L);
201218
dsInfos.put("clusterId", 1L);
@@ -205,7 +222,7 @@ public void testInitialize_invalidCapacityBytes() {
205222
dsInfos.put("managed",true);
206223
dsInfos.put("tags", "testTag");
207224
dsInfos.put("isTagARule", false);
208-
dsInfos.put("details", new HashMap<String, String>());
225+
dsInfos.put("details", detailsMap);
209226

210227
try (MockedStatic<StorageProviderFactory> storageProviderFactory = Mockito.mockStatic(StorageProviderFactory.class)) {
211228
storageProviderFactory.when(() -> StorageProviderFactory.getStrategy(any())).thenReturn(storageStrategy);
@@ -216,7 +233,6 @@ public void testInitialize_invalidCapacityBytes() {
216233
@Test
217234
public void testInitialize_unmanagedStorage() {
218235
Map<String, Object> dsInfos = new HashMap<>();
219-
dsInfos.put("url", "username=testUser;password=testPassword;svmName=testSVM;protocol=NFS3;managementLIF=192.168.1.1;isDisaggregated=false");
220236
dsInfos.put("zoneId",1L);
221237
dsInfos.put("podId",1L);
222238
dsInfos.put("clusterId", 1L);
@@ -240,7 +256,6 @@ public void testInitialize_unmanagedStorage() {
240256
@Test
241257
public void testInitialize_nullStoragePoolName() {
242258
Map<String, Object> dsInfos = new HashMap<>();
243-
dsInfos.put("url", "username=testUser;password=testPassword;svmName=testSVM;protocol=NFS3;managementLIF=192.168.1.1;isDisaggregated=false");
244259
dsInfos.put("zoneId",1L);
245260
dsInfos.put("podId",1L);
246261
dsInfos.put("clusterId", 1L);
@@ -264,7 +279,6 @@ public void testInitialize_nullStoragePoolName() {
264279
@Test
265280
public void testInitialize_nullProviderName() {
266281
Map<String, Object> dsInfos = new HashMap<>();
267-
dsInfos.put("url", "username=testUser;password=testPassword;svmName=testSVM;protocol=NFS3;managementLIF=192.168.1.1;isDisaggregated=false");
268282
dsInfos.put("zoneId",1L);
269283
dsInfos.put("podId",1L);
270284
dsInfos.put("clusterId", 1L);
@@ -288,7 +302,6 @@ public void testInitialize_nullProviderName() {
288302
@Test
289303
public void testInitialize_nullPodAndClusterAndZone() {
290304
Map<String, Object> dsInfos = new HashMap<>();
291-
dsInfos.put("url", "username=testUser;password=testPassword;svmName=testSVM;protocol=NFS3;managementLIF=192.168.1.1;isDisaggregated=false");
292305
dsInfos.put("zoneId",null);
293306
dsInfos.put("podId",null);
294307
dsInfos.put("clusterId", null);
@@ -316,7 +329,6 @@ public void testInitialize_clusterNotKVM() {
316329
when(_clusterDao.findById(2L)).thenReturn(clusterVO);
317330

318331
Map<String, Object> dsInfos = new HashMap<>();
319-
dsInfos.put("url", "username=testUser;password=testPassword;svmName=testSVM;protocol=NFS3;managementLIF=192.168.1.1;isDisaggregated=false");
320332
dsInfos.put("zoneId",1L);
321333
dsInfos.put("podId",1L);
322334
dsInfos.put("clusterId", 2L);
@@ -339,8 +351,16 @@ public void testInitialize_clusterNotKVM() {
339351

340352
@Test
341353
public void testInitialize_unexpectedDetailKey() {
354+
355+
HashMap<String, String> detailsMap = new HashMap<String, String>();
356+
detailsMap.put(Constants.USERNAME, "testUser");
357+
detailsMap.put(Constants.PASSWORD, "testPassword");
358+
detailsMap.put(Constants.STORAGE_IP, "10.10.10.10");
359+
detailsMap.put(Constants.SVM_NAME, "vs0");
360+
detailsMap.put(Constants.PROTOCOL, "NFS3");
361+
detailsMap.put("unexpectedKey", "unexpectedValue");
362+
342363
Map<String, Object> dsInfos = new HashMap<>();
343-
dsInfos.put("url", "username=testUser;password=testPassword;svmName=testSVM;protocol=NFS3;managementLIF=192.168.1.1;isDisaggregated=false;unexpectedKey=unexpectedValue");
344364
dsInfos.put("zoneId",1L);
345365
dsInfos.put("podId",1L);
346366
dsInfos.put("clusterId", 1L);
@@ -350,7 +370,7 @@ public void testInitialize_unexpectedDetailKey() {
350370
dsInfos.put("managed",true);
351371
dsInfos.put("tags", "testTag");
352372
dsInfos.put("isTagARule", false);
353-
dsInfos.put("details", new HashMap<String, String>());
373+
dsInfos.put("details", detailsMap);
354374

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

0 commit comments

Comments
 (0)