|
68 | 68 | import org.jetbrains.annotations.Nullable; |
69 | 69 |
|
70 | 70 | import com.cloud.agent.api.Answer; |
71 | | -import com.cloud.agent.api.storage.ResizeVolumeCommand; |
72 | 71 | import com.cloud.agent.api.to.DataObjectType; |
73 | 72 | import com.cloud.agent.api.to.DataStoreTO; |
74 | 73 | import com.cloud.agent.api.to.DataTO; |
75 | | -import com.cloud.agent.api.to.StorageFilerTO; |
76 | 74 | import com.cloud.exception.InvalidParameterValueException; |
77 | 75 | import com.cloud.host.Host; |
78 | 76 | import com.cloud.host.HostVO; |
@@ -604,54 +602,52 @@ public boolean canCopy(DataObject srcData, DataObject destData) { |
604 | 602 | public void resize(DataObject data, AsyncCompletionCallback<CreateCmdResult> callback) { |
605 | 603 | CreateCmdResult result = null; |
606 | 604 | try { |
607 | | - if (!(data instanceof VolumeInfo)) { |
608 | | - throw new CloudRuntimeException("resize: Expected VolumeInfo but received " + |
609 | | - (data != null ? data.getClass().getSimpleName() : "null")); |
610 | | - } |
611 | | - VolumeInfo volumeInfo = (VolumeInfo) data; |
612 | | - Object rawPayload = volumeInfo.getpayload(); |
613 | | - ResizeVolumePayload payload = (rawPayload instanceof ResizeVolumePayload) |
614 | | - ? (ResizeVolumePayload) rawPayload : null; |
615 | | - if (payload == null || payload.newSize == null) { |
616 | | - throw new CloudRuntimeException("Invalid resize payload for volume " + volumeInfo.getId()); |
617 | | - } |
618 | | - if (volumeInfo.getDataStore() == null) { |
619 | | - throw new CloudRuntimeException("Data store not found for volume " + volumeInfo.getId()); |
620 | | - } |
621 | | - |
622 | | - StoragePoolVO storagePool = storagePoolDao.findById(volumeInfo.getDataStore().getId()); |
623 | | - if (storagePool == null) { |
624 | | - throw new CloudRuntimeException("Storage pool not found for volume " + volumeInfo.getId()); |
625 | | - } |
626 | | - Map<String, String> details = storagePoolDetailsDao.listDetailsKeyPairs(storagePool.getId()); |
| 605 | + if (data != null && data.getType() == DataObjectType.VOLUME) { |
| 606 | + if (!(data instanceof VolumeInfo)) { |
| 607 | + throw new CloudRuntimeException("Expected VolumeInfo but received " + |
| 608 | + data.getClass().getSimpleName()); |
| 609 | + } |
| 610 | + VolumeInfo volumeInfo = (VolumeInfo) data; |
| 611 | + Object rawPayload = volumeInfo.getpayload(); |
| 612 | + ResizeVolumePayload payload = (rawPayload instanceof ResizeVolumePayload) |
| 613 | + ? (ResizeVolumePayload) rawPayload : null; |
| 614 | + if (payload == null || payload.newSize == null) { |
| 615 | + throw new CloudRuntimeException("Invalid resize payload for volume " + volumeInfo.getId()); |
| 616 | + } |
| 617 | + if (volumeInfo.getDataStore() == null) { |
| 618 | + throw new CloudRuntimeException("Data store not found for volume " + volumeInfo.getId()); |
| 619 | + } |
627 | 620 |
|
628 | | - VolumeVO volumeVO = volumeDao.findById(volumeInfo.getId()); |
629 | | - if (volumeVO == null) { |
630 | | - throw new CloudRuntimeException("Volume not found for id " + volumeInfo.getId()); |
631 | | - } |
632 | | - if (payload.newSize < volumeVO.getSize()) { |
633 | | - throw new CloudRuntimeException(String.format( |
634 | | - "Storage pool %s does not support shrinking a volume.", storagePool.getName())); |
635 | | - } |
| 621 | + StoragePoolVO storagePool = storagePoolDao.findById(volumeInfo.getDataStore().getId()); |
| 622 | + if (storagePool == null) { |
| 623 | + throw new CloudRuntimeException("Storage pool not found for volume " + volumeInfo.getId()); |
| 624 | + } |
| 625 | + Map<String, String> details = storagePoolDetailsDao.listDetailsKeyPairs(storagePool.getId()); |
636 | 626 |
|
637 | | - StorageStrategy storageStrategy = OntapStorageUtils.getStrategyByStoragePoolDetails(details); |
638 | | - CloudStackVolume cloudStackVolume = new CloudStackVolume(); |
639 | | - cloudStackVolume.setVolumeInfo(volumeInfo); |
640 | | - storageStrategy.resizeCloudStackVolume(cloudStackVolume, payload.newSize); |
| 627 | + VolumeVO volumeVO = volumeDao.findById(volumeInfo.getId()); |
| 628 | + if (volumeVO == null) { |
| 629 | + throw new CloudRuntimeException("Volume not found for id " + volumeInfo.getId()); |
| 630 | + } |
| 631 | + if (payload.newSize < volumeVO.getSize()) { |
| 632 | + throw new CloudRuntimeException("Unable to shrink volume. Volume shrink is not supported."); |
| 633 | + } |
641 | 634 |
|
642 | | - long currentSize = volumeVO.getSize(); |
643 | | - volumeVO.setSize(payload.newSize); |
644 | | - if (!volumeDao.update(volumeVO.getId(), volumeVO)) { |
645 | | - throw new CloudRuntimeException("Failed to update volume " + volumeVO.getId() |
646 | | - + " after resizing the ONTAP backing object"); |
| 635 | + StorageStrategy storageStrategy = OntapStorageUtils.getStrategyByStoragePoolDetails(details); |
| 636 | + CloudStackVolume cloudStackVolume = new CloudStackVolume(); |
| 637 | + cloudStackVolume.setVolumeInfo(volumeInfo); |
| 638 | + storageStrategy.resizeCloudStackVolume(cloudStackVolume, payload.newSize); |
| 639 | + |
| 640 | + volumeVO.setSize(payload.newSize); |
| 641 | + if (!volumeDao.update(volumeVO.getId(), volumeVO)) { |
| 642 | + throw new CloudRuntimeException("Failed to update volume " + volumeVO.getId() |
| 643 | + + " after resizing the ONTAP backing object"); |
| 644 | + } |
| 645 | + result = new CreateCmdResult(volumeVO.getPath(), new Answer(null, true, null)); |
| 646 | + logger.info("resize: Successfully resized volume [{}] to [{}] bytes", volumeInfo.getId(), payload.newSize); |
| 647 | + } else { |
| 648 | + throw new CloudRuntimeException("Expected a VOLUME DataObject but received " + |
| 649 | + (data != null ? data.getType() : "null")); |
647 | 650 | } |
648 | | - String instanceName = payload.instanceName != null ? payload.instanceName : "none"; |
649 | | - |
650 | | - ResizeVolumeCommand resizeCmd = new ResizeVolumeCommand(volumeVO.getPath(), |
651 | | - new StorageFilerTO(storagePool), currentSize, payload.newSize, |
652 | | - false, instanceName); |
653 | | - result = new CreateCmdResult(volumeVO.getPath(), new Answer(resizeCmd, true, null)); |
654 | | - logger.info("resize: Successfully resized volume [{}] to [{}] bytes", volumeInfo.getId(), payload.newSize); |
655 | 651 | } catch (Exception e) { |
656 | 652 | String errMsg = e.getMessage(); |
657 | 653 | logger.error("resize: Failed for volume [{}]: {}", data != null ? data.getId() : null, errMsg, e); |
|
0 commit comments