Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
Original file line number Diff line number Diff line change
Expand Up @@ -52,5 +52,5 @@ public interface VolumeFeignClient {

@RequestLine("PATCH /api/storage/volumes/{uuid}")
@Headers({ "Authorization: {authHeader}"})
JobResponse updateVolumeRebalancing(@Param("authHeader") String authHeader, @Param("uuid") String uuid, Volume volumeRequest);
JobResponse updateVolume(@Param("authHeader") String authHeader, @Param("uuid") String uuid, Volume volumeRequest);
}
Original file line number Diff line number Diff line change
Expand Up @@ -526,7 +526,34 @@ public boolean migrateToObjectStore(DataStore store) {

@Override
public void updateStoragePool(StoragePool storagePool, Map<String, String> details) {
String newCapacityStr = details.get(PrimaryDataStoreLifeCycle.CAPACITY_BYTES);
if (newCapacityStr == null) {
logger.debug("No capacity change requested for pool: {}, skipping FlexVolume resize", storagePool.getName());
return;
}

long currentCapacityBytes = storagePool.getCapacityBytes();

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add sufficient unit test cases for this functionality

long newCapacityBytes = Long.parseLong(newCapacityStr);
StorageStrategy storageStrategy = OntapStorageUtils.getStrategyByStoragePoolDetails(details);

String volumeUuid = details.get(OntapStorageConstants.VOLUME_UUID);
if (volumeUuid == null || volumeUuid.isEmpty()) {
logger.error("Volume UUID or name not found in details for pool: {}, cannot resize", storagePool.getName());
throw new CloudRuntimeException("Volume UUID or name not found in details, cannot resize ONTAP FlexVolume");
}

Volume volume = new Volume();
volume.setUuid(volumeUuid);
volume.setName(details.get(OntapStorageConstants.VOLUME_NAME));

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why volume name is required?
we can just use UUID

volume.setSize(newCapacityBytes);
try {
storageStrategy.updateStorageVolume(volume);
logger.info("Successfully resized ONTAP FlexVolume '{}' (UUID: {}) for pool '{}' from {} bytes to {} bytes",
volume.getName(), volume.getUuid(), storagePool.getName(), currentCapacityBytes, newCapacityBytes);
} catch (Exception e) {
logger.error("Exception while resizing FlexVolume for pool: {}. Error: {}", storagePool.getName(), e.getMessage(), e);
throw new CloudRuntimeException("Failed to resize ONTAP FlexVolume for pool: " + storagePool.getName() + ". " + e.getMessage(), e);
}
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -368,7 +368,24 @@ public Volume createStorageVolume(String volumeName, Long size) {
* @return the updated Volume object
*/
public Volume updateStorageVolume(Volume volume) {
return null;
logger.info("Resizing ONTAP FlexVolume '{}' (UUID: {}) to {} bytes", volume.getName(), volume.getUuid(), volume.getSize());
String authHeader = OntapStorageUtils.generateAuthHeader(storage.getUsername(), storage.getPassword());
try {
Volume resizeRequest = new Volume();
resizeRequest.setSize(volume.getSize());
JobResponse jobResponse = volumeFeignClient.updateVolume(authHeader, volume.getUuid(), resizeRequest);
pollJobIfPresent(jobResponse, "resize FlexVolume [" + volume.getUuid() + "]", 10, 1000);
logger.info("FlexVolume '{}' (UUID: {}) resized successfully to {} bytes", volume.getName(), volume.getUuid(), volume.getSize());
} catch (FeignException e) {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This method should handle other exception also, bcz job polling can get time out and throw cloudRuntime Exception

if (OntapStorageUtils.isOntapObjectNotFoundError(e)) {
String msg = String.format("Cannot resize FlexVolume '%s' (UUID: %s): volume not found on ONTAP (404). ", volume.getName(), volume.getUuid());
logger.error(msg);
throw new CloudRuntimeException(msg, e);
}
logger.error("Exception while resizing FlexVolume '{}' (UUID: {}): {}", volume.getName(), volume.getUuid(), e.getMessage(), e);
throw new CloudRuntimeException("Failed to resize ONTAP FlexVolume: " + e.getMessage(), e);
}
return volume;
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -391,7 +391,7 @@ private void assignExportPolicyToVolume(String volumeUuid, String policyName) {
volumeUpdate.setNas(nas);

try {
JobResponse jobResponse = volumeFeignClient.updateVolumeRebalancing(authHeader, volumeUuid, volumeUpdate);
JobResponse jobResponse = volumeFeignClient.updateVolume(authHeader, volumeUuid, volumeUpdate);
if (jobResponse == null || jobResponse.getJob() == null) {
throw new CloudRuntimeException("Failed to attach policy " + policyName + "to volume " + volumeUuid);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -296,7 +296,7 @@ public void testCreateAccessGroup_Success() throws Exception {
when(accessGroup.getHostsToConnect()).thenReturn(hosts);
doNothing().when(nasFeignClient).createExportPolicy(anyString(), any(ExportPolicy.class));
when(nasFeignClient.getExportPolicyResponse(anyString(), anyMap())).thenReturn(policyResponse);
when(volumeFeignClient.updateVolumeRebalancing(anyString(), anyString(), any())).thenReturn(jobResponse);
when(volumeFeignClient.updateVolume(anyString(), anyString(), any())).thenReturn(jobResponse);
when(jobFeignClient.getJobByUUID(anyString(), anyString())).thenReturn(job);
doNothing().when(storagePoolDetailsDao).addDetail(anyLong(), anyString(), anyString(), eq(true));

Expand All @@ -307,7 +307,7 @@ public void testCreateAccessGroup_Success() throws Exception {
assertNotNull(result);
verify(nasFeignClient).createExportPolicy(anyString(), any(ExportPolicy.class));
verify(nasFeignClient).getExportPolicyResponse(anyString(), anyMap());
verify(volumeFeignClient).updateVolumeRebalancing(anyString(), eq("vol-uuid-123"), any());
verify(volumeFeignClient).updateVolume(anyString(), eq("vol-uuid-123"), any());
verify(storagePoolDetailsDao, times(2)).addDetail(anyLong(), anyString(), anyString(), eq(true));
}

Expand Down Expand Up @@ -402,7 +402,7 @@ public void testCreateAccessGroup_JobFailure() throws Exception {
when(accessGroup.getHostsToConnect()).thenReturn(hosts);
doNothing().when(nasFeignClient).createExportPolicy(anyString(), any(ExportPolicy.class));
when(nasFeignClient.getExportPolicyResponse(anyString(), anyMap())).thenReturn(policyResponse);
when(volumeFeignClient.updateVolumeRebalancing(anyString(), anyString(), any())).thenReturn(jobResponse);
when(volumeFeignClient.updateVolume(anyString(), anyString(), any())).thenReturn(jobResponse);
when(jobFeignClient.getJobByUUID(anyString(), anyString())).thenReturn(job);

assertThrows(CloudRuntimeException.class, () -> {
Expand Down Expand Up @@ -446,7 +446,7 @@ public void testCreateAccessGroup_HostWithPrivateIP() throws Exception {
when(accessGroup.getHostsToConnect()).thenReturn(hosts);
doNothing().when(nasFeignClient).createExportPolicy(anyString(), any(ExportPolicy.class));
when(nasFeignClient.getExportPolicyResponse(anyString(), anyMap())).thenReturn(policyResponse);
when(volumeFeignClient.updateVolumeRebalancing(anyString(), anyString(), any())).thenReturn(jobResponse);
when(volumeFeignClient.updateVolume(anyString(), anyString(), any())).thenReturn(jobResponse);
when(jobFeignClient.getJobByUUID(anyString(), anyString())).thenReturn(job);
doNothing().when(storagePoolDetailsDao).addDetail(anyLong(), anyString(), anyString(), eq(true));

Expand Down
Loading