image upload working

This commit is contained in:
Abhisar Sinha 2026-01-25 11:39:40 +05:30 committed by Abhishek Kumar
parent aae158b2af
commit 10f65b67d7
6 changed files with 62 additions and 16 deletions

View File

@ -33,7 +33,7 @@ public interface ImageTransfer extends ControlledEntity, InternalIdentity {
String getUuid();
long getBackupId();
Long getBackupId();
long getDiskId();

View File

@ -117,7 +117,7 @@ public class ImageTransferVO implements ImageTransfer {
}
@Override
public long getBackupId() {
public Long getBackupId() {
return backupId;
}

View File

@ -27,4 +27,6 @@ public interface ImageTransferDao extends GenericDao<ImageTransferVO, Long> {
List<ImageTransferVO> listByBackupId(Long backupId);
ImageTransferVO findByUuid(String uuid);
ImageTransferVO findByNbdPort(int port);
ImageTransferVO findByVolume(Long volumeId);
}

View File

@ -34,6 +34,7 @@ public class ImageTransferDaoImpl extends GenericDaoBase<ImageTransferVO, Long>
private SearchBuilder<ImageTransferVO> backupIdSearch;
private SearchBuilder<ImageTransferVO> uuidSearch;
private SearchBuilder<ImageTransferVO> nbdPortSearch;
private SearchBuilder<ImageTransferVO> volumeSearch;
public ImageTransferDaoImpl() {
}
@ -51,6 +52,10 @@ public class ImageTransferDaoImpl extends GenericDaoBase<ImageTransferVO, Long>
nbdPortSearch = createSearchBuilder();
nbdPortSearch.and("nbdPort", nbdPortSearch.entity().getNbdPort(), SearchCriteria.Op.EQ);
nbdPortSearch.done();
volumeSearch = createSearchBuilder();
volumeSearch.and("volumeId", volumeSearch.entity().getDiskId(), SearchCriteria.Op.EQ);
volumeSearch.done();
}
@Override
@ -73,4 +78,11 @@ public class ImageTransferDaoImpl extends GenericDaoBase<ImageTransferVO, Long>
sc.setParameters("nbdPort", port);
return findOneBy(sc);
}
@Override
public ImageTransferVO findByVolume(Long volumeId) {
SearchCriteria<ImageTransferVO> sc = volumeSearch.create();
sc.setParameters("volumeId", volumeId);
return findOneBy(sc);
}
}

View File

@ -273,20 +273,14 @@ public class IncrementalBackupServiceImpl extends ManagerBase implements Increme
}
}
private ImageTransferVO createDownloadImageTransfer(CreateImageTransferCmd cmd) {
private ImageTransferVO createDownloadImageTransfer(CreateImageTransferCmd cmd, VolumeVO volume) {
Long backupId = cmd.getBackupId();
Long volumeId = cmd.getVolumeId();
BackupVO backup = backupDao.findById(backupId);
if (backup == null) {
throw new CloudRuntimeException("Backup not found: " + backupId);
}
boolean dummyOffering = isDummyOffering(backup.getBackupOfferingId());
Volume volume = volumeDao.findById(volumeId);
if (volume == null) {
throw new CloudRuntimeException("Volume not found: " + volumeId);
}
String transferId = UUID.randomUUID().toString();
Host host = hostDao.findById(backup.getHostId());
CreateImageTransferCommand transferCmd = new CreateImageTransferCommand(
@ -315,7 +309,7 @@ public class IncrementalBackupServiceImpl extends ManagerBase implements Increme
ImageTransferVO imageTransfer = new ImageTransferVO(
transferId,
backupId,
volumeId,
volume.getId(),
backup.getHostId(),
backup.getNbdPort(),
ImageTransferVO.Phase.transferring,
@ -345,17 +339,16 @@ public class IncrementalBackupServiceImpl extends ManagerBase implements Increme
return hosts.get(0);
}
private ImageTransferVO createUploadImageTransfer(CreateImageTransferCmd cmd) {
private ImageTransferVO createUploadImageTransfer(CreateImageTransferCmd cmd, VolumeVO volume) {
String transferId = UUID.randomUUID().toString();
int nbdPort = allocateNbdPort();
VolumeVO volume = volumeDao.findById(cmd.getVolumeId());
Long poolId = volume.getPoolId();
StoragePoolVO storagePoolVO = primaryDataStoreDao.findById(poolId);
Host host = getFirstHostFromStoragePool(storagePoolVO);
// todo: This only works with file based storage (not ceph, linbit)
String volumePath = String.format("/mnt/%s/%s", storagePoolVO.getUuid(), volume.getPath());
StartNBDServerAnswer nbdServerAnswer;
StartNBDServerCommand nbdServerCmd = new StartNBDServerCommand(
transferId,
@ -415,10 +408,18 @@ public class IncrementalBackupServiceImpl extends ManagerBase implements Increme
@Override
public ImageTransferResponse createImageTransfer(CreateImageTransferCmd cmd) {
ImageTransfer imageTransfer;
Long volumeId = cmd.getVolumeId();
VolumeVO volume = volumeDao.findById(cmd.getVolumeId());
ImageTransferVO existingTransfer = imageTransferDao.findByVolume(volume.getId());
if (existingTransfer != null) {
throw new CloudRuntimeException("Image transfer already in progress for volume: " + volume.getUuid());
}
if (cmd.getDirection().equals(ImageTransfer.Direction.upload)) {
imageTransfer = createUploadImageTransfer(cmd);
imageTransfer = createUploadImageTransfer(cmd, volume);
} else if (cmd.getDirection().equals(ImageTransfer.Direction.download)) {
imageTransfer = createDownloadImageTransfer(cmd);
imageTransfer = createDownloadImageTransfer(cmd, volume);
} else {
throw new CloudRuntimeException("Invalid direction: " + cmd.getDirection());
}

View File

@ -3725,14 +3725,19 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
private boolean stopImageServer() {
String unitName = "cloudstack-image-server";
final int imageServerPort = 54323;
Script checkScript = new Script("/bin/bash", logger);
checkScript.add("-c");
checkScript.add(String.format("systemctl is-active --quiet %s", unitName));
String checkResult = checkScript.execute();
if (checkResult != null) {
logger.info(String.format("Image server not running, resetting failed state", unitName));
logger.info(String.format("Image server not running, resetting failed state"));
resetService(unitName);
// Still try to remove firewall rule in case it exists
if (_inSystemVM) {
removeFirewallRule(imageServerPort);
}
return true;
}
@ -3743,9 +3748,27 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
resetService(unitName);
logger.info(String.format("Image server %s stopped", unitName));
// Close firewall port for image server
if (_inSystemVM) {
removeFirewallRule(imageServerPort);
}
return true;
}
private void removeFirewallRule(int port) {
String rule = String.format("-p tcp -m state --state NEW -m tcp --dport %d -j ACCEPT", port);
Script removeScript = new Script("/bin/bash", logger);
removeScript.add("-c");
removeScript.add(String.format("iptables -D INPUT %s || true", rule));
String result = removeScript.execute();
if (result != null && !result.isEmpty() && !result.contains("iptables: Bad rule")) {
logger.debug(String.format("Firewall rule removal result for port %d: %s", port, result));
} else {
logger.info(String.format("Firewall rule removed for port %d (or did not exist)", port));
}
}
private boolean startImageServerIfNotRunning(int imageServerPort) {
final String imageServerScript = "/opt/cloud/bin/image_server.py";
String unitName = "cloudstack-image-server";
@ -3800,6 +3823,14 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
logger.error(String.format("Image server failed to start within %d seconds", maxWaitSeconds));
return false;
}
// Open firewall port for image server
if (_inSystemVM) {
String rule = String.format("-p tcp -m state --state NEW -m tcp --dport %d -j ACCEPT", imageServerPort);
IpTablesHelper.addConditionally(IpTablesHelper.INPUT_CHAIN, true, rule,
String.format("Error in opening up image server port %d", imageServerPort));
}
return true;
}