From b3ac91ef6391533e72c5a7524403dad5e65dddbf Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Thu, 11 Jul 2013 16:07:48 +0200 Subject: [PATCH] CLOUDSTACK-3368: clear download URLs when create SSVM and validate download URLs --- .../SecondaryStorageManagerImpl.java | 7 +++++ .../storage/upload/UploadMonitorImpl.java | 27 ++++++++++++++++--- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java index 05256a8582a..6859b0bb20d 100755 --- a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java +++ b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java @@ -98,9 +98,11 @@ import com.cloud.resource.ServerResource; import com.cloud.resource.UnableDeleteHostException; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; +import com.cloud.storage.UploadVO; import com.cloud.storage.VMTemplateVO; import com.cloud.storage.dao.SnapshotDao; import com.cloud.storage.dao.StoragePoolHostDao; +import com.cloud.storage.dao.UploadDao; import com.cloud.storage.dao.VMTemplateDao; import com.cloud.storage.template.TemplateConstants; import com.cloud.template.TemplateManager; @@ -114,6 +116,7 @@ import com.cloud.utils.Pair; import com.cloud.utils.component.ManagerBase; import com.cloud.utils.db.GlobalLock; import com.cloud.utils.db.SearchCriteria.Op; +import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.SearchCriteria2; import com.cloud.utils.db.SearchCriteriaService; import com.cloud.utils.events.SubscriptionMgr; @@ -225,6 +228,8 @@ public class SecondaryStorageManagerImpl extends ManagerBase implements Secondar protected RulesManager _rulesMgr; @Inject TemplateManager templateMgr; + @Inject + UploadDao _uploadDao; @Inject KeystoreManager _keystoreMgr; @@ -658,6 +663,8 @@ public class SecondaryStorageManagerImpl extends ManagerBase implements Secondar if (_allocLock.lock(ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_SYNC)) { try { secStorageVm = startNew(dataCenterId, role); + for (UploadVO upload :_uploadDao.listAll()) + _uploadDao.expunge(upload.getId()); } finally { _allocLock.unlock(); } diff --git a/server/src/com/cloud/storage/upload/UploadMonitorImpl.java b/server/src/com/cloud/storage/upload/UploadMonitorImpl.java index d46db0ce3a6..a589e7d4bd1 100755 --- a/server/src/com/cloud/storage/upload/UploadMonitorImpl.java +++ b/server/src/com/cloud/storage/upload/UploadMonitorImpl.java @@ -211,11 +211,33 @@ public class UploadMonitorImpl extends ManagerBase implements UploadMonitor { boolean success = false; Type type = (template.getFormat() == ImageFormat.ISO) ? Type.ISO : Type.TEMPLATE ; + // find an endpoint to send command + DataStore store = this.storeMgr.getDataStore(vmTemplateHost.getDataStoreId(), DataStoreRole.Image); + EndPoint ep = _epSelector.select(store); //Check if it already exists. List extractURLList = _uploadDao.listByTypeUploadStatus(template.getId(), type, UploadVO.Status.DOWNLOAD_URL_CREATED); if (extractURLList.size() > 0) { - return extractURLList.get(0); + // do some check here + UploadVO upload = extractURLList.get(0); + String uploadUrl = extractURLList.get(0).getUploadUrl(); + String[] token = uploadUrl.split("/"); + // example: uploadUrl = https://10-11-101-112.realhostip.com/userdata/2fdd9a70-9c4a-4a04-b1d5-1e41c221a1f9.iso + // then token[2] = 10-11-101-112.realhostip.com, token[4] = 2fdd9a70-9c4a-4a04-b1d5-1e41c221a1f9.iso + String hostname = ep.getPublicAddr().replace(".", "-") + "."; + if ((token != null) && (token.length == 5) && (token[2].equals(hostname + _ssvmUrlDomain))) // ssvm publicip and domain suffix not changed + return extractURLList.get(0); + else if ((token != null) && (token.length == 5) && (token[2].startsWith(hostname))) { // domain suffix changed + String uuid = token[4]; + uploadUrl = generateCopyUrl(ep.getPublicAddr(), uuid); + UploadVO vo = _uploadDao.createForUpdate(); + vo.setLastUpdated(new Date()); + vo.setUploadUrl(uploadUrl); + _uploadDao.update(upload.getId(), vo); + return _uploadDao.findById(upload.getId(), true); + } else { // ssvm publicip changed + return null; + } } // It doesn't exist so create a DB entry. @@ -224,9 +246,6 @@ public class UploadMonitorImpl extends ManagerBase implements UploadMonitor { uploadTemplateObj.setInstallPath(vmTemplateHost.getInstallPath()); _uploadDao.persist(uploadTemplateObj); - // find an endpoint to send command - DataStore store = this.storeMgr.getDataStore(vmTemplateHost.getDataStoreId(), DataStoreRole.Image); - EndPoint ep = _epSelector.select(store); try{ // Create Symlink at ssvm String path = vmTemplateHost.getInstallPath();