diff --git a/core/src/com/cloud/agent/api/storage/UploadAnswer.java b/core/src/com/cloud/agent/api/storage/UploadAnswer.java old mode 100644 new mode 100755 index c7f13fb4c07..b878bf7ca6b --- a/core/src/com/cloud/agent/api/storage/UploadAnswer.java +++ b/core/src/com/cloud/agent/api/storage/UploadAnswer.java @@ -38,8 +38,11 @@ public class UploadAnswer extends Answer { protected UploadAnswer() { } - - public String getJobId() { + + public void setErrorString(String errorString) { + this.errorString = errorString; + } + public String getJobId() { return jobId; } public void setJobId(String jobId) { diff --git a/core/src/com/cloud/storage/Upload.java b/core/src/com/cloud/storage/Upload.java old mode 100644 new mode 100755 index 197ef2795b9..b6b54f7ce90 --- a/core/src/com/cloud/storage/Upload.java +++ b/core/src/com/cloud/storage/Upload.java @@ -2,6 +2,6 @@ package com.cloud.storage; public interface Upload { - public static enum Status {UNKNOWN, ABANDONED, UPLOADED, NOT_UPLOADED, UPLOAD_ERROR, UPLOAD_IN_PROGRESS} + public static enum Status {UNKNOWN, ABANDONED, UPLOADED, NOT_UPLOADED, UPLOAD_ERROR, UPLOAD_IN_PROGRESS, NOT_COPIED, COPY_IN_PROGRESS, COPY_ERROR, COPY_COMPLETE} public static enum Type {VOLUME, TEMPLATE, ISO} } diff --git a/core/src/com/cloud/storage/dao/UploadDao.java b/core/src/com/cloud/storage/dao/UploadDao.java old mode 100644 new mode 100755 index 78e3da1a397..95637029bd2 --- a/core/src/com/cloud/storage/dao/UploadDao.java +++ b/core/src/com/cloud/storage/dao/UploadDao.java @@ -12,4 +12,6 @@ public interface UploadDao extends GenericDao { List listByTypeUploadStatus(long typeId, Type type, Status uploadState); + List listByHostAndUploadStatus(long sserverId, Status uploadInProgress); + } diff --git a/core/src/com/cloud/storage/dao/UploadDaoImpl.java b/core/src/com/cloud/storage/dao/UploadDaoImpl.java index 225ec33e65f..9d4da07c223 100755 --- a/core/src/com/cloud/storage/dao/UploadDaoImpl.java +++ b/core/src/com/cloud/storage/dao/UploadDaoImpl.java @@ -1,27 +1,20 @@ package com.cloud.storage.dao; - -import java.sql.PreparedStatement; -import java.util.Date; import java.util.List; -import java.util.Map; -import java.util.TimeZone; - import javax.ejb.Local; -import javax.naming.ConfigurationException; import org.apache.log4j.Logger; import com.cloud.storage.UploadVO; -import com.cloud.utils.DateUtil; +import com.cloud.storage.Upload.Status; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; -import com.cloud.utils.db.Transaction; @Local(value={UploadDao.class}) public class UploadDaoImpl extends GenericDaoBase implements UploadDao { public static final Logger s_logger = Logger.getLogger(UploadDaoImpl.class.getName()); protected final SearchBuilder typeUploadStatusSearch; + protected final SearchBuilder typeHostAndUploadStatusSearch; protected static final String UPDATE_UPLOAD_INFO = "UPDATE upload SET upload_state = ?, upload_pct= ?, last_updated = ? " @@ -39,6 +32,11 @@ public class UploadDaoImpl extends GenericDaoBase implements Upl typeUploadStatusSearch.and("upload_state", typeUploadStatusSearch.entity().getUploadState(), SearchCriteria.Op.EQ); typeUploadStatusSearch.and("type", typeUploadStatusSearch.entity().getType(), SearchCriteria.Op.EQ); typeUploadStatusSearch.done(); + + typeHostAndUploadStatusSearch = createSearchBuilder(); + typeHostAndUploadStatusSearch.and("host_id", typeHostAndUploadStatusSearch.entity().getHostId(), SearchCriteria.Op.EQ); + typeHostAndUploadStatusSearch.and("upload_state", typeHostAndUploadStatusSearch.entity().getUploadState(), SearchCriteria.Op.EQ); + typeHostAndUploadStatusSearch.done(); } @Override @@ -49,26 +47,12 @@ public class UploadDaoImpl extends GenericDaoBase implements Upl sc.setParameters("upload_state", uploadState.toString()); return listBy(sc); } - /* - public void updateUploadStatus(long hostId, long typeId, int uploadPercent, UploadVO.Status uploadState, - String uploadJobId, String uploadUrl ) { - Transaction txn = Transaction.currentTxn(); - PreparedStatement pstmt = null; - try { - Date now = new Date(); - String sql = UPDATE_UPLOAD_INFO; - pstmt = txn.prepareAutoCloseStatement(sql); - pstmt.setString(1, uploadState.toString()); - pstmt.setInt(2, uploadPercent); - pstmt.setString(3, DateUtil.getDateDisplayString(TimeZone.getTimeZone("GMT"), now)); - pstmt.setString(4, uploadJobId); - pstmt.setLong(5, hostId); - pstmt.setLong(6, typeId); - - pstmt.setString(7, uploadUrl); - pstmt.executeUpdate(); - } catch (Exception e) { - s_logger.warn("Exception: ", e); - } - }*/ + + @Override + public List listByHostAndUploadStatus(long sserverId, Status uploadState){ + SearchCriteria sc = typeHostAndUploadStatusSearch.create(); + sc.setParameters("host_id", sserverId); + sc.setParameters("upload_state", uploadState.toString()); + return listBy(sc); + } } \ No newline at end of file diff --git a/server/src/com/cloud/api/commands/ExtractIsoCmd.java b/server/src/com/cloud/api/commands/ExtractIsoCmd.java index 87096bdd5c6..aa6e91b0f59 100755 --- a/server/src/com/cloud/api/commands/ExtractIsoCmd.java +++ b/server/src/com/cloud/api/commands/ExtractIsoCmd.java @@ -41,7 +41,7 @@ public class ExtractIsoCmd extends BaseCmd { throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Unable to find ISO with id " + templateId); } if (template.getName().startsWith("xs-tools") ){ - throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Unable to extract the ISO " + template.getName() + " It is not supported yet"); + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Unable to extract the ISO " + template.getName() + " It is not allowed"); } if (template.getFormat() != ImageFormat.ISO ){ throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Unsupported format, could not extract the ISO"); diff --git a/server/src/com/cloud/api/commands/ExtractTemplateCmd.java b/server/src/com/cloud/api/commands/ExtractTemplateCmd.java index bf8d6b756c7..bc6f43bacd0 100755 --- a/server/src/com/cloud/api/commands/ExtractTemplateCmd.java +++ b/server/src/com/cloud/api/commands/ExtractTemplateCmd.java @@ -45,6 +45,9 @@ public class ExtractTemplateCmd extends BaseCmd { if (template.getFormat() == ImageFormat.ISO ){ throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Unsupported format, could not extract the template"); } + if (template.getName().startsWith("SystemVM Template") ){ + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Unable to extract " + template.getName() + ". It is not allowed."); + } if(url.toLowerCase().contains("file://")){ throw new ServerApiException(BaseCmd.PARAM_ERROR, "file:// type urls are currently unsupported"); diff --git a/server/src/com/cloud/async/executor/ExtractJobResultObject.java b/server/src/com/cloud/async/executor/ExtractJobResultObject.java index 813aa8705a2..61474ea8962 100644 --- a/server/src/com/cloud/async/executor/ExtractJobResultObject.java +++ b/server/src/com/cloud/async/executor/ExtractJobResultObject.java @@ -9,10 +9,12 @@ import com.cloud.storage.upload.UploadState; public class ExtractJobResultObject { - public ExtractJobResultObject(Long accountId, String typeName, UploadState currState, int i, Long uploadId){ + public ExtractJobResultObject(Long accountId, String typeName, String currState, int i, Long uploadId){ this.accountId = accountId; this.name = typeName; - this.state = currState.toString(); + this.state = currState; + this.id = uploadId; + this.uploadPercent = i; } public ExtractJobResultObject(){ diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index ddd67097aac..52c9b2d9fad 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -101,6 +101,7 @@ import com.cloud.async.executor.DeleteRuleParam; import com.cloud.async.executor.DeleteTemplateParam; import com.cloud.async.executor.DeployVMParam; import com.cloud.async.executor.DisassociateIpAddressParam; +import com.cloud.async.executor.ExtractJobResultObject; import com.cloud.async.executor.ExtractTemplateParam; import com.cloud.async.executor.LoadBalancerParam; import com.cloud.async.executor.NetworkGroupIngressParam; @@ -188,6 +189,7 @@ import com.cloud.serializer.GsonHelper; import com.cloud.server.auth.UserAuthenticator; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; +import com.cloud.storage.UploadVO; import com.cloud.storage.DiskOfferingVO; import com.cloud.storage.DiskTemplateVO; import com.cloud.storage.GuestOS; @@ -223,6 +225,7 @@ import com.cloud.storage.dao.SnapshotDao; import com.cloud.storage.dao.SnapshotPolicyDao; import com.cloud.storage.dao.StoragePoolDao; import com.cloud.storage.dao.StoragePoolHostDao; +import com.cloud.storage.dao.UploadDao; import com.cloud.storage.dao.VMTemplateDao; import com.cloud.storage.dao.VMTemplateHostDao; import com.cloud.storage.dao.VolumeDao; @@ -361,6 +364,7 @@ public class ManagementServerImpl implements ManagementServer { private final InstanceGroupDao _vmGroupDao; private final InstanceGroupVMMapDao _groupVMMapDao; private final UploadMonitor _uploadMonitor; + private final UploadDao _uploadDao; private final ScheduledExecutorService _executor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("AccountChecker")); private final ScheduledExecutorService _eventExecutor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("EventChecker")); @@ -439,6 +443,7 @@ public class ManagementServerImpl implements ManagementServer { _vmDao = locator.getDao(UserVmDao.class); _vmGroupDao = locator.getDao(InstanceGroupDao.class); _groupVMMapDao = locator.getDao(InstanceGroupVMMapDao.class); + _uploadDao = locator.getDao(UploadDao.class); _configs = _configDao.getConfiguration(); _userStatsDao = locator.getDao(UserStatisticsDao.class); @@ -451,7 +456,7 @@ public class ManagementServerImpl implements ManagementServer { _snapMgr = locator.getManager(SnapshotManager.class); _snapshotScheduler = locator.getManager(SnapshotScheduler.class); _networkGroupMgr = locator.getManager(NetworkGroupManager.class); - _uploadMonitor = locator.getManager(UploadMonitor.class); + _uploadMonitor = locator.getManager(UploadMonitor.class); _userAuthenticators = locator.getAdapters(UserAuthenticator.class); if (_userAuthenticators == null || !_userAuthenticators.isSet()) { @@ -4866,16 +4871,45 @@ public class ManagementServerImpl implements ManagementServer { String secondaryStorageURL = _storageMgr.getSecondaryStorageURL(zoneId); StoragePoolVO srcPool = _poolDao.findById(volume.getPoolId()); Long sourceHostId = _storageMgr.findHostIdForStoragePool(srcPool); + List storageServers = _hostDao.listByTypeDataCenter(Host.Type.SecondaryStorage, zoneId); + HostVO sserver = storageServers.get(0); + + saveStartedEvent(1L, volume.getAccountId(), EventTypes.EVENT_VOLUME_UPLOAD, "Starting upload of " +volume.getName()+ " to " +url, eventId); + UploadVO uploadJob = _uploadMonitor.createNewUploadEntry(sserver.getId(), volumeId, UploadVO.Status.COPY_IN_PROGRESS, 0, Type.VOLUME, null, null, url); + uploadJob = _uploadDao.createForUpdate(uploadJob.getId()); + + // Update the async Job + ExtractJobResultObject resultObj = new ExtractJobResultObject(volume.getAccountId(), volume.getName(), UploadVO.Status.COPY_IN_PROGRESS.toString(), 0, uploadJob.getId()); + _asyncMgr.updateAsyncJobAttachment(asyncJobId, Type.VOLUME.toString(), volumeId); + _asyncMgr.updateAsyncJobStatus(asyncJobId, AsyncJobResult.STATUS_IN_PROGRESS, resultObj); + // Copy the volume from the source storage pool to secondary storage CopyVolumeCommand cvCmd = new CopyVolumeCommand(volume.getId(), volume.getPath(), srcPool, secondaryStorageURL, true); CopyVolumeAnswer cvAnswer = (CopyVolumeAnswer) _agentMgr.easySend(sourceHostId, cvCmd); - + if (cvAnswer == null || !cvAnswer.getResult()) { - throw new InternalErrorException("Failed to copy the volume from the source primary storage pool to secondary storage."); + + String errorString = "Failed to copy the volume from the source primary storage pool to secondary storage."; + + resultObj.setResult_string(errorString); + resultObj.setUploadStatus(UploadVO.Status.COPY_ERROR.toString()); + _asyncMgr.completeAsyncJob(asyncJobId, AsyncJobResult.STATUS_FAILED, 0, resultObj); + + uploadJob.setUploadState(UploadVO.Status.COPY_ERROR); + uploadJob.setErrorString(errorString); + uploadJob.setLastUpdated(new Date()); + _uploadDao.update(uploadJob.getId(), uploadJob); + + saveEvent(1L, volume.getAccountId(), EventTypes.EVENT_VOLUME_UPLOAD, errorString); + + throw new InternalErrorException(errorString); } - _uploadMonitor.extractVolume(volume, url, zoneId, "volumes/"+volume.getId()+"/"+cvAnswer.getVolumePath()+".vhd", eventId, asyncJobId, _asyncMgr); + uploadJob.setUploadState(UploadVO.Status.COPY_COMPLETE); + uploadJob.setLastUpdated(new Date()); + _uploadDao.update(uploadJob.getId(), uploadJob); + _uploadMonitor.extractVolume(uploadJob, sserver, volume, url, zoneId, "volumes/"+volume.getId()+"/"+cvAnswer.getVolumePath()+".vhd", eventId, asyncJobId, _asyncMgr); } diff --git a/server/src/com/cloud/storage/download/DownloadMonitorImpl.java b/server/src/com/cloud/storage/download/DownloadMonitorImpl.java old mode 100644 new mode 100755 index c1b09f88041..a602db8badc --- a/server/src/com/cloud/storage/download/DownloadMonitorImpl.java +++ b/server/src/com/cloud/storage/download/DownloadMonitorImpl.java @@ -487,6 +487,8 @@ public class DownloadMonitorImpl implements DownloadMonitor { TemplateInfo tInfo = templateInfo.get(uniqueName); DeleteTemplateCommand dtCommand = new DeleteTemplateCommand(tInfo.getInstallPath()); long result = send(sserverId, dtCommand, null); + String description = "Deleted template " + tInfo.getTemplateName() + " on secondary storage " + sserverId + " since it isn't in the database, result=" + result; + logEvent(1L, EventTypes.EVENT_TEMPLATE_DELETE, description, EventVO.LEVEL_INFO); s_logger.info("Deleted template " + tInfo.getTemplateName() + " on secondary storage " + sserverId + " since it isn't in the database, result=" + result); } diff --git a/server/src/com/cloud/storage/upload/UploadListener.java b/server/src/com/cloud/storage/upload/UploadListener.java index 8ca72691153..b956074df66 100755 --- a/server/src/com/cloud/storage/upload/UploadListener.java +++ b/server/src/com/cloud/storage/upload/UploadListener.java @@ -151,7 +151,7 @@ public class UploadListener implements Listener { this.eventId = eventId; this.asyncJobId = asyncJobId; this.asyncMgr = asyncMgr; - this.resultObj = new ExtractJobResultObject(accountId, typeName, currState, 0, uploadId); + this.resultObj = new ExtractJobResultObject(accountId, typeName, Status.NOT_UPLOADED.toString(), 0, uploadId); updateDatabase(Status.NOT_UPLOADED, cmd.getUrl(),""); } @@ -214,21 +214,14 @@ public class UploadListener implements Listener { if (!(cmd instanceof StartupStorageCommand)) { return true; } - /* if (cmd.getGuid().startsWith("iso:")) { - //FIXME: do not download template for ISO secondary - return true; - }*/ - + long agentId = agent.getId(); StartupStorageCommand storage = (StartupStorageCommand)cmd; if (storage.getResourceType() == Storage.StorageResourceType.STORAGE_HOST || storage.getResourceType() == Storage.StorageResourceType.SECONDARY_STORAGE ) { - uploadMonitor.handleUploadTemplateSync(agentId, storage.getTemplateInfo()); - } else { - //downloadMonitor.handlePoolTemplateSync(storage.getPoolInfo(), storage.getTemplateInfo()); - //no need to do anything. The storagepoolmonitor will initiate template sync. + uploadMonitor.handleUploadSync(agentId); } return true; } @@ -246,7 +239,7 @@ public class UploadListener implements Listener { public void logUploadStart() { String event = uploadMonitor.getEvent(type); - uploadMonitor.logEvent(accountId, event, "Storage server " + sserver.getName() + " started upload of " +type.toString() + " " + typeName, EventVO.LEVEL_INFO,eventId); + //uploadMonitor.logEvent(accountId, event, "Storage server " + sserver.getName() + " started upload of " +type.toString() + " " + typeName, EventVO.LEVEL_INFO, eventId); } public void cancelTimeoutTask() { @@ -363,15 +356,14 @@ public class UploadListener implements Listener { } private Long getUploadId() { - /*if (uploadId == null){ - VMTemplateHostVO templHost = vmTemplateHostDao.findByHostTemplate(sserver.getId(), template.getId()); - uploadId = templHost.getId(); - }*/ //TO DO return uploadId; } public synchronized void updateDatabase(UploadAnswer answer) { + if(answer.getErrorString().startsWith("553")){ + answer.setErrorString(answer.getErrorString().concat(". Please check if the file name already exists.")); + } resultObj.setResult_string(answer.getErrorString()); resultObj.setState(answer.getUploadStatus().toString()); resultObj.setUploadPercent(answer.getUploadPct()); diff --git a/server/src/com/cloud/storage/upload/UploadMonitor.java b/server/src/com/cloud/storage/upload/UploadMonitor.java index 5000a5adff6..be5d8c7769d 100755 --- a/server/src/com/cloud/storage/upload/UploadMonitor.java +++ b/server/src/com/cloud/storage/upload/UploadMonitor.java @@ -21,9 +21,12 @@ package com.cloud.storage.upload; import java.util.Map; import com.cloud.async.AsyncJobManager; +import com.cloud.host.HostVO; +import com.cloud.storage.UploadVO; import com.cloud.storage.VMTemplateHostVO; import com.cloud.storage.VMTemplateVO; import com.cloud.storage.VolumeVO; +import com.cloud.storage.Upload.Status; import com.cloud.storage.Upload.Type; import com.cloud.storage.template.TemplateInfo; import com.cloud.utils.component.Manager; @@ -40,13 +43,16 @@ public interface UploadMonitor extends Manager{ public void extractTemplate(VMTemplateVO template, String url, VMTemplateHostVO tmpltHostRef,Long dataCenterId, long eventId, long asyncJobId, AsyncJobManager asyncMgr); - void handleUploadTemplateSync(long sserverId, - Map templateInfo); - - void extractVolume(VolumeVO volume, String url, Long dataCenterId, - String installPath, long eventId, long asyncJobId, - AsyncJobManager asyncMgr); - boolean isTypeUploadInProgress(Long typeId, Type type); + void handleUploadSync(long sserverId); + + UploadVO createNewUploadEntry(Long hostId, Long typeId, Status uploadState, + int uploadPercent, Type type, String errorString, String jobId, + String uploadUrl); + + void extractVolume(UploadVO uploadVolumeObj, HostVO sserver, VolumeVO volume, String url, + Long dataCenterId, String installPath, long eventId, + long asyncJobId, AsyncJobManager asyncMgr); + } \ No newline at end of file diff --git a/server/src/com/cloud/storage/upload/UploadMonitorImpl.java b/server/src/com/cloud/storage/upload/UploadMonitorImpl.java index 689f26fbb4a..448628d58e0 100755 --- a/server/src/com/cloud/storage/upload/UploadMonitorImpl.java +++ b/server/src/com/cloud/storage/upload/UploadMonitorImpl.java @@ -1,5 +1,6 @@ package com.cloud.storage.upload; +import java.util.ArrayList; import java.util.Date; import java.util.HashSet; import java.util.Iterator; @@ -20,6 +21,7 @@ import com.cloud.agent.api.Command; import com.cloud.agent.api.storage.UploadCommand; import com.cloud.agent.api.storage.UploadProgressCommand; import com.cloud.agent.api.storage.UploadProgressCommand.RequestType; +import com.cloud.api.commands.CreateNetworkGroupCmd; import com.cloud.async.AsyncJobManager; import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.dc.dao.DataCenterDao; @@ -64,10 +66,6 @@ public class UploadMonitorImpl implements UploadMonitor { VMTemplateHostDao _vmTemplateHostDao; @Inject UploadDao _uploadDao; - @Inject - VMTemplatePoolDao _vmTemplatePoolDao; - @Inject - StoragePoolHostDao _poolHostDao; @Inject SecondaryStorageVmDao _secStorageVmDao; @@ -103,21 +101,35 @@ public class UploadMonitorImpl implements UploadMonitor { public boolean isTypeUploadInProgress(Long typeId, Type type) { List uploadsInProgress = _uploadDao.listByTypeUploadStatus(typeId, type, UploadVO.Status.UPLOAD_IN_PROGRESS); - return (uploadsInProgress.size() != 0); + + if(uploadsInProgress.size() > 0) + return true; + else if (type == Type.VOLUME && _uploadDao.listByTypeUploadStatus(typeId, type, UploadVO.Status.COPY_IN_PROGRESS).size() > 0){ + return true; + } + return false; } @Override - public void extractVolume(VolumeVO volume, String url, Long dataCenterId, String installPath, long eventId, long asyncJobId, AsyncJobManager asyncMgr){ - - List storageServers = _serverDao.listByTypeDataCenter(Host.Type.SecondaryStorage, dataCenterId); - HostVO sserver = storageServers.get(0); - - UploadVO uploadVolumeObj = new UploadVO(sserver.getId(), volume.getId(), new Date(), - Upload.Status.NOT_UPLOADED, 0, Type.VOLUME, - null, "jobid0000", url); - _uploadDao.persist(uploadVolumeObj); - + public UploadVO createNewUploadEntry(Long hostId, Long typeId, UploadVO.Status uploadState, + int uploadPercent, Type type, + String errorString, String jobId, String uploadUrl){ + + UploadVO uploadObj = new UploadVO(hostId, typeId, new Date(), + uploadState, 0, type, null, "jobid0000", uploadUrl); + _uploadDao.persist(uploadObj); + + return uploadObj; + + } + + @Override + public void extractVolume(UploadVO uploadVolumeObj, HostVO sserver, VolumeVO volume, String url, Long dataCenterId, String installPath, long eventId, long asyncJobId, AsyncJobManager asyncMgr){ + + uploadVolumeObj.setUploadState(Upload.Status.NOT_UPLOADED); + _uploadDao.update(uploadVolumeObj.getId(), uploadVolumeObj); + start(); UploadCommand ucmd = new UploadCommand(url, volume.getId(), volume.getSize(), installPath, Type.VOLUME); UploadListener ul = new UploadListener(sserver, _timer, _uploadDao, uploadVolumeObj.getId(), this, ucmd, volume.getAccountId(), volume.getName(), Type.VOLUME, eventId, asyncJobId, asyncMgr); @@ -189,7 +201,6 @@ public class UploadMonitorImpl implements UploadMonitor { @Override public String getName() { - // TODO Auto-generated method stub return _name; } @@ -230,65 +241,7 @@ public class UploadMonitorImpl implements UploadMonitor { } if (reason == Upload.Status.ABANDONED) { logEvent(accountId, getEvent(type), typeName + " :aborted upload from storage server " + host.getName(), EventVO.LEVEL_WARN, eventId); - } - - /*VMTemplateHostVO vmTemplateHost = _vmTemplateHostDao.findByHostTemplate(host.getId(), template.getId()); - - if (upldStatus == Status.UPLOADED) { - long size = -1; - if(vmTemplateHost!=null){ - size = vmTemplateHost.getSize(); - } - else{ - s_logger.warn("Failed to get size for template" + template.getName()); - } - String eventParams = "id=" + template.getId() + "\ndcId="+host.getDataCenterId()+"\nsize="+size; - EventVO event = new EventVO(); - event.setUserId(1L); - event.setAccountId(template.getAccountId()); - if((template.getFormat()).equals(ImageFormat.ISO)){ - event.setType(EventTypes.EVENT_ISO_CREATE); - event.setDescription("Successfully uploaded ISO " + template.getName()); - } - else{ - event.setType(EventTypes.EVENT_TEMPLATE_); - event.setDescription("Successfully uploaded template " + template.getName()); - } - event.setParameters(eventParams); - event.setLevel(EventVO.LEVEL_INFO); - _eventDao.persist(event); - } - - if (vmTemplateHost != null) { - Long poolId = vmTemplateHost.getPoolId(); - if (poolId != null) { - VMTemplateStoragePoolVO vmTemplatePool = _vmTemplatePoolDao.findByPoolTemplate(poolId, template.getId()); - StoragePoolHostVO poolHost = _poolHostDao.findByPoolHost(poolId, host.getId()); - if (vmTemplatePool != null && poolHost != null) { - vmTemplatePool.setDownloadPercent(vmTemplateHost.getUploadPercent()); - vmTemplatePool.setDownloadState(vmTemplateHost.getUploadState()); - vmTemplatePool.setErrorString(vmTemplateHost.getUpload_errorString()); - String localPath = poolHost.getLocalPath(); - String installPath = vmTemplateHost.getInstallPath(); - if (installPath != null) { - if (!installPath.startsWith("/")) { - installPath = "/" + installPath; - } - if (!(localPath == null) && !installPath.startsWith(localPath)) { - localPath = localPath.replaceAll("/\\p{Alnum}+/*$", ""); //remove instance if necessary - } - if (!(localPath == null) && installPath.startsWith(localPath)) { - installPath = installPath.substring(localPath.length()); - } - } - vmTemplatePool.setInstallPath(installPath); - vmTemplatePool.setLastUpdated(vmTemplateHost.getLastUpdated()); - vmTemplatePool.setJobId(vmTemplateHost.getJobId()); - vmTemplatePool.setLocalDownloadPath(vmTemplateHost.getLocalDownloadPath()); - _vmTemplatePoolDao.update(vmTemplatePool.getId(),vmTemplatePool); - } - } - }*/ + } } @@ -305,55 +258,28 @@ public class UploadMonitorImpl implements UploadMonitor { } @Override - public void handleUploadTemplateSync(long sserverId, Map templateInfo) { - /*HostVO storageHost = _serverDao.findById(sserverId); - if (storageHost == null) { - s_logger.warn("Huh? Agent id " + sserverId + " does not correspond to a row in hosts table?"); - return; - } - - List allTemplates = _templateDao.listAllInZone(storageHost.getDataCenterId()); - VMTemplateVO rtngTmplt = _templateDao.findRoutingTemplate(); - VMTemplateVO defaultBuiltin = _templateDao.findDefaultBuiltinTemplate(); + public void handleUploadSync(long sserverId) { + + HostVO storageHost = _serverDao.findById(sserverId); + if (storageHost == null) { + s_logger.warn("Huh? Agent id " + sserverId + " does not correspond to a row in hosts table?"); + return; + } + s_logger.debug("Handling upload sserverId " +sserverId); + List uploadsInProgress = new ArrayList(); + uploadsInProgress.addAll(_uploadDao.listByHostAndUploadStatus(sserverId, UploadVO.Status.UPLOAD_IN_PROGRESS)); + uploadsInProgress.addAll(_uploadDao.listByHostAndUploadStatus(sserverId, UploadVO.Status.COPY_IN_PROGRESS)); + if (uploadsInProgress.size() > 0){ + for (UploadVO uploadJob : uploadsInProgress){ + uploadJob.setUploadState(UploadVO.Status.UPLOAD_ERROR); + uploadJob.setErrorString("Could not complete the upload."); + uploadJob.setLastUpdated(new Date()); + _uploadDao.update(uploadJob.getId(), uploadJob); + } + + } + - if (rtngTmplt != null && !allTemplates.contains(rtngTmplt)) - allTemplates.add(rtngTmplt); - - if (defaultBuiltin != null && !allTemplates.contains(defaultBuiltin)) { - allTemplates.add(defaultBuiltin); - } - - - for (VMTemplateVO tmplt: allTemplates) { - String uniqueName = tmplt.getUniqueName(); - VMTemplateHostVO tmpltHost = _vmTemplateHostDao.findByHostTemplate(sserverId, tmplt.getId()); - if (templateInfo.containsKey(uniqueName)) { - if (tmpltHost != null) { - s_logger.info("Template Sync found " + uniqueName + " already in the template host table"); - if (tmpltHost.getUploadState() != Status.UPLOADED) { - tmpltHost.setUpload_errorString(""); - } - tmpltHost.setUploadPercent(100); - tmpltHost.setUploadState(Status.UPLOADED); - tmpltHost.setLastUpdated(new Date()); - _vmTemplateHostDao.update(tmpltHost.getId(), tmpltHost); - } else { - VMTemplateHostVO templtHost = new VMTemplateHostVO(sserverId, tmplt.getId(), new Date(), 100, Status.UPLOADED, null, null, null, templateInfo.get(uniqueName).getInstallPath(), tmplt.getUrl()); - templtHost.setSize(templateInfo.get(uniqueName).getSize()); - _vmTemplateHostDao.persist(templtHost); - } - templateInfo.remove(uniqueName); - continue; - } - if (tmpltHost != null && tmpltHost.getUploadState() != Status.UPLOADED) { - s_logger.info("Template Sync did not find " + uniqueName + " ready on server " + sserverId + ", will request upload to start/resume shortly"); - - } else if (tmpltHost == null) { - s_logger.info("Template Sync did not find " + uniqueName + " on the server " + sserverId + ", will request upload shortly"); - VMTemplateHostVO templtHost = new VMTemplateHostVO(sserverId, tmplt.getId(), new Date(), 0, Status.NOT_UPLOADED, null, null, null, null, tmplt.getUrl()); - _vmTemplateHostDao.persist(templtHost); - }*/ - - } + } }