This is an automated email from the ASF dual-hosted git repository. vishesh pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/cloudstack.git
commit e9ff2707bbd58de8788da2397cfdd8e8a0ab44ff Merge: 0d1bc7dfd0c 87e7c57d08c Author: Vishesh <vishes...@gmail.com> AuthorDate: Tue May 7 12:44:51 2024 +0530 Merge branch '4.19' .../driver/LinstorPrimaryDataStoreDriverImpl.java | 54 ++++++++++++++++++++++ test/integration/smoke/test_restore_vm.py | 14 ++++-- 2 files changed, 64 insertions(+), 4 deletions(-) diff --cc plugins/storage/volume/linstor/src/main/java/org/apache/cloudstack/storage/datastore/driver/LinstorPrimaryDataStoreDriverImpl.java index 016ab0e993f,9612781ee4c..6ed8db66582 --- a/plugins/storage/volume/linstor/src/main/java/org/apache/cloudstack/storage/datastore/driver/LinstorPrimaryDataStoreDriverImpl.java +++ b/plugins/storage/volume/linstor/src/main/java/org/apache/cloudstack/storage/datastore/driver/LinstorPrimaryDataStoreDriverImpl.java @@@ -102,12 -102,12 +102,13 @@@ import org.apache.cloudstack.storage.da import org.apache.cloudstack.storage.datastore.util.LinstorConfigurationManager; import org.apache.cloudstack.storage.datastore.util.LinstorUtil; import org.apache.cloudstack.storage.to.SnapshotObjectTO; + import org.apache.cloudstack.storage.to.VolumeObjectTO; import org.apache.cloudstack.storage.volume.VolumeObject; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.LogManager; public class LinstorPrimaryDataStoreDriverImpl implements PrimaryDataStoreDriver { - private static final Logger s_logger = Logger.getLogger(LinstorPrimaryDataStoreDriverImpl.class); + protected Logger logger = LogManager.getLogger(getClass()); @Inject private PrimaryDataStoreDao _storagePoolDao; @Inject private VolumeDao _volumeDao; @Inject private VolumeDetailsDao _volumeDetailsDao; @@@ -965,6 -982,43 +982,43 @@@ return answer; } + private Answer copyVolume(DataObject srcData, DataObject dstData) { + VolumeInfo srcVolInfo = (VolumeInfo) srcData; + final StoragePoolVO pool = _storagePoolDao.findById(srcVolInfo.getDataStore().getId()); + final DevelopersApi api = LinstorUtil.getLinstorAPI(pool.getHostAddress()); + final String rscName = LinstorUtil.RSC_PREFIX + srcVolInfo.getUuid(); + + VolumeObjectTO to = (VolumeObjectTO) srcVolInfo.getTO(); + // patch source format + // Linstor volumes are stored as RAW, but we can't set the correct format as RAW (we use QCOW2) + // otherwise create template from snapshot won't work, because this operation + // uses the format of the base volume and we backup snapshots as QCOW2 + // https://github.com/apache/cloudstack/pull/8802#issuecomment-2024019927 + to.setFormat(Storage.ImageFormat.RAW); + int nMaxExecutionSeconds = NumbersUtil.parseInt( + _configDao.getValue(Config.CopyVolumeWait.key()), 10800); + CopyCommand cmd = new CopyCommand( + to, + dstData.getTO(), + nMaxExecutionSeconds, + VirtualMachineManager.ExecuteInSequence.value()); + Answer answer; + + try { + Optional<RemoteHostEndPoint> optEP = getLinstorEP(api, rscName); + if (optEP.isPresent()) { + answer = optEP.get().sendMessage(cmd); + } + else { + answer = new Answer(cmd, false, "Unable to get matching Linstor endpoint."); + } + } catch (ApiException exc) { - s_logger.error("copy volume failed: ", exc); ++ logger.error("copy volume failed: ", exc); + throw new CloudRuntimeException(exc.getBestMessage()); + } + return answer; + } + /** * Create a temporary resource from the snapshot to backup, so we can copy the data on a diskless agent * @param api Linstor Developer api object