From 636dc041c712fd4715a66138a262f1c47cee89b9 Mon Sep 17 00:00:00 2001 From: nit Date: Fri, 17 Sep 2010 17:04:07 +0530 Subject: [PATCH] bug 4286: Making extractIsoCmd and extractTemplateCmd async --- core/src/com/cloud/event/EventTypes.java | 17 +--- .../com/cloud/server/ManagementServer.java | 3 +- .../storage/template/FtpTemplateUploader.java | 4 +- .../com/cloud/api/commands/ExtractIsoCmd.java | 6 +- .../api/commands/ExtractTemplateCmd.java | 10 ++- .../executor/ExtractJobResultObject.java | 16 +--- .../cloud/server/ManagementServerImpl.java | 32 ++++++- .../cloud/storage/upload/UploadListener.java | 87 +++++++++++++------ .../cloud/storage/upload/UploadMonitor.java | 5 +- .../storage/upload/UploadMonitorImpl.java | 35 ++++---- .../com/cloud/template/TemplateManager.java | 32 ++++++- .../cloud/template/TemplateManagerImpl.java | 5 +- setup/db/server-setup.xml | 53 +++++++---- 13 files changed, 199 insertions(+), 106 deletions(-) mode change 100644 => 100755 core/src/com/cloud/storage/template/FtpTemplateUploader.java mode change 100644 => 100755 server/src/com/cloud/api/commands/ExtractIsoCmd.java mode change 100644 => 100755 server/src/com/cloud/template/TemplateManager.java diff --git a/core/src/com/cloud/event/EventTypes.java b/core/src/com/cloud/event/EventTypes.java index b3707663dd6..b7a483eb7f6 100755 --- a/core/src/com/cloud/event/EventTypes.java +++ b/core/src/com/cloud/event/EventTypes.java @@ -75,22 +75,15 @@ public class EventTypes { public static final String EVENT_TEMPLATE_CREATE = "TEMPLATE.CREATE"; public static final String EVENT_TEMPLATE_DELETE = "TEMPLATE.DELETE"; public static final String EVENT_TEMPLATE_UPDATE = "TEMPLATE.UPDATE"; - public static final String EVENT_TEMPLATE_COPY = "TEMPLATE.COPY"; - public static final String EVENT_TEMPLATE_DOWNLOAD_START = "TEMPLATE.DOWNLOAD.START"; - public static final String EVENT_TEMPLATE_DOWNLOAD_SUCCESS = "TEMPLATE.DOWNLOAD.SUCCESS"; - public static final String EVENT_TEMPLATE_DOWNLOAD_FAILED = "TEMPLATE.DOWNLOAD.FAILED"; - public static final String EVENT_TEMPLATE_UPLOAD_FAILED = "TEMPLATE.UPLOAD.FAILED"; - public static final String EVENT_TEMPLATE_UPLOAD_START = "TEMPLATE.UPLOAD.START"; - public static final String EVENT_TEMPLATE_UPLOAD_SUCCESS = "TEMPLATE.UPLOAD.SUCCESS"; + public static final String EVENT_TEMPLATE_COPY = "TEMPLATE.COPY"; + public static final String EVENT_TEMPLATE_UPLOAD = "TEMPLATE.UPLOAD"; // Volume Events public static final String EVENT_VOLUME_CREATE = "VOLUME.CREATE"; public static final String EVENT_VOLUME_DELETE = "VOLUME.DELETE"; public static final String EVENT_VOLUME_ATTACH = "VOLUME.ATTACH"; public static final String EVENT_VOLUME_DETACH = "VOLUME.DETACH"; - public static final String EVENT_VOLUME_UPLOAD_START = "VOLUME.UPLOAD.START"; - public static final String EVENT_VOLUME_UPLOAD_SUCCESS = "VOLUME.UPLOAD.SUCCESS"; - public static final String EVENT_VOLUME_UPLOAD_FAILED = "VOLUME.UPLOAD.FAILED"; + public static final String EVENT_VOLUME_UPLOAD = "VOLUME.UPLOAD"; // Domains public static final String EVENT_DOMAIN_CREATE = "DOMAIN.CREATE"; @@ -110,9 +103,7 @@ public class EventTypes { public static final String EVENT_ISO_COPY = "ISO.COPY"; public static final String EVENT_ISO_ATTACH = "ISO.ATTACH"; public static final String EVENT_ISO_DETACH = "ISO.DETACH"; - public static final String EVENT_ISO_UPLOAD_FAILED = "ISO.UPLOAD.FAILED"; - public static final String EVENT_ISO_UPLOAD_START = "ISO.UPLOAD.START"; - public static final String EVENT_ISO_UPLOAD_SUCCESS = "ISO.UPLOAD.SUCCESS"; + public static final String EVENT_ISO_UPLOAD = "ISO.UPLOAD"; //SSVM public static final String EVENT_SSVM_CREATE = "SSVM.CREATE"; diff --git a/core/src/com/cloud/server/ManagementServer.java b/core/src/com/cloud/server/ManagementServer.java index 7f437bf0b08..157c3685ba8 100755 --- a/core/src/com/cloud/server/ManagementServer.java +++ b/core/src/com/cloud/server/ManagementServer.java @@ -2194,7 +2194,7 @@ public interface ManagementServer { * @param template id - the id of the template * */ - void extractTemplate(String url, Long templateId, Long zoneId) throws URISyntaxException; + void extractTemplate(String url, Long templateId, Long zoneId, long eventId, long asyncJobId) throws URISyntaxException; Map listCapabilities(); GuestOSVO getGuestOs(Long guestOsId); @@ -2248,6 +2248,7 @@ public interface ManagementServer { */ void extractVolume(String url, Long volumeId, Long zoneId) throws URISyntaxException, InternalErrorException; + long extractTemplateAsync(String url, Long templateId, Long zoneId) throws URISyntaxException; } diff --git a/core/src/com/cloud/storage/template/FtpTemplateUploader.java b/core/src/com/cloud/storage/template/FtpTemplateUploader.java old mode 100644 new mode 100755 index 736df550de1..379a9bf7412 --- a/core/src/com/cloud/storage/template/FtpTemplateUploader.java +++ b/core/src/com/cloud/storage/template/FtpTemplateUploader.java @@ -73,9 +73,11 @@ public class FtpTemplateUploader implements TemplateUploader { { URL url = new URL( sb.toString() ); URLConnection urlc = url.openConnection(); + File sourceFile = new File(sourcePath); + templateSizeinBytes = sourceFile.length(); outputStream = new BufferedOutputStream( urlc.getOutputStream() ); - inputStream = new BufferedInputStream( new FileInputStream( new File(sourcePath) ) ); + inputStream = new BufferedInputStream( new FileInputStream(sourceFile) ); status = TemplateUploader.Status.IN_PROGRESS; diff --git a/server/src/com/cloud/api/commands/ExtractIsoCmd.java b/server/src/com/cloud/api/commands/ExtractIsoCmd.java old mode 100644 new mode 100755 index 6ef13c121ea..c6d35e0d75a --- a/server/src/com/cloud/api/commands/ExtractIsoCmd.java +++ b/server/src/com/cloud/api/commands/ExtractIsoCmd.java @@ -60,9 +60,9 @@ public class ExtractIsoCmd extends BaseCmd { throw new ServerApiException(BaseCmd.PARAM_ERROR, "Unable to extract ISO " + templateId + " to " + url + ", permission denied."); } } - + Long jobId; try { - managementServer.extractTemplate(url, templateId, zoneId); + jobId = managementServer.extractTemplateAsync(url, templateId, zoneId); } catch (Exception e) { s_logger.error(e.getMessage(), e); throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Internal Error Extracting the ISO " + e.getMessage()); @@ -75,7 +75,7 @@ public class ExtractIsoCmd extends BaseCmd { response.add(new Pair(BaseCmd.Properties.URL.getName(), url)); response.add(new Pair(BaseCmd.Properties.ZONE_ID.getName(), zoneId)); response.add(new Pair(BaseCmd.Properties.ZONE_NAME.getName(), zone.getName())); - response.add(new Pair(BaseCmd.Properties.TEMPLATE_STATUS.getName(), "Processing")); + response.add(new Pair(BaseCmd.Properties.JOB_ID.getName(), jobId)); return response; } diff --git a/server/src/com/cloud/api/commands/ExtractTemplateCmd.java b/server/src/com/cloud/api/commands/ExtractTemplateCmd.java index a7a5d55799a..bf8d6b756c7 100755 --- a/server/src/com/cloud/api/commands/ExtractTemplateCmd.java +++ b/server/src/com/cloud/api/commands/ExtractTemplateCmd.java @@ -59,9 +59,9 @@ public class ExtractTemplateCmd extends BaseCmd { throw new ServerApiException(BaseCmd.PARAM_ERROR, "Unable to extract template " + templateId + " to " + url + ", permission denied."); } } - + Long jobId; try { - managementServer.extractTemplate(url, templateId, zoneId); + jobId = managementServer.extractTemplateAsync(url, templateId, zoneId); } catch (Exception e) { s_logger.error(e.getMessage(), e); throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Internal Error Extracting the template " + e.getMessage()); @@ -74,7 +74,7 @@ public class ExtractTemplateCmd extends BaseCmd { response.add(new Pair(BaseCmd.Properties.URL.getName(), url)); response.add(new Pair(BaseCmd.Properties.ZONE_ID.getName(), zoneId)); response.add(new Pair(BaseCmd.Properties.ZONE_NAME.getName(), zone.getName())); - response.add(new Pair(BaseCmd.Properties.TEMPLATE_STATUS.getName(), "Processing")); + response.add(new Pair(BaseCmd.Properties.JOB_ID.getName(), jobId)); return response; } @@ -82,6 +82,10 @@ public class ExtractTemplateCmd extends BaseCmd { public String getName() { return s_name; } + + public static String getStaticName() { + return "ExtractTemplate"; + } @Override public List> getProperties() { diff --git a/server/src/com/cloud/async/executor/ExtractJobResultObject.java b/server/src/com/cloud/async/executor/ExtractJobResultObject.java index ccdea192cae..813aa8705a2 100644 --- a/server/src/com/cloud/async/executor/ExtractJobResultObject.java +++ b/server/src/com/cloud/async/executor/ExtractJobResultObject.java @@ -23,9 +23,6 @@ public class ExtractJobResultObject { @Param(name="name") private String name; - - @Param(name="host_id") - private Long hostId; @Param(name="uploadPercentage") private int uploadPercent; @@ -34,10 +31,7 @@ public class ExtractJobResultObject { private String uploadStatus; @Param(name="accountid") - long accountId; - - @Param(name="account") - private String accountName; + long accountId; @Param(name="result_string") String result_string; @@ -126,14 +120,6 @@ public class ExtractJobResultObject { return name; } - public void setAccountName(String accountName) { - this.accountName = accountName; - } - - public String getAccountName() { - return accountName; - } - public void setSize(long size) { this.size = size; } diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index fc795f6de15..366c2813928 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -72,6 +72,7 @@ import com.cloud.api.commands.DeleteIsoCmd; import com.cloud.api.commands.DeleteTemplateCmd; import com.cloud.api.commands.DeleteUserCmd; import com.cloud.api.commands.DeployVMCmd; +import com.cloud.api.commands.ExtractTemplateCmd; import com.cloud.api.commands.PrepareForMaintenanceCmd; import com.cloud.api.commands.PreparePrimaryStorageForMaintenanceCmd; import com.cloud.api.commands.ReconnectHostCmd; @@ -96,6 +97,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.ExtractTemplateParam; import com.cloud.async.executor.LoadBalancerParam; import com.cloud.async.executor.NetworkGroupIngressParam; import com.cloud.async.executor.ResetVMPasswordParam; @@ -4845,8 +4847,7 @@ public class ManagementServerImpl implements ManagementServer { } @Override - public void extractTemplate(String url, Long templateId, Long zoneId) throws URISyntaxException{ - + public long extractTemplateAsync(String url, Long templateId, Long zoneId) throws URISyntaxException{ URI uri = new URI(url); if ( (uri.getScheme() == null) || (!uri.getScheme().equalsIgnoreCase("ftp") )) { throw new IllegalArgumentException("Unsupported scheme for url: " + url); @@ -4875,8 +4876,33 @@ public class ManagementServerImpl implements ManagementServer { if (tmpltHostRef != null && tmpltHostRef.getDownloadState() != com.cloud.storage.VMTemplateStorageResourceAssoc.Status.DOWNLOADED){ throw new IllegalArgumentException("The template hasnt been downloaded "); } + long userId = UserContext.current().getUserId(); + long accountId = template.getAccountId(); + String event = template.getFormat() == ImageFormat.ISO ? EventTypes.EVENT_ISO_UPLOAD : EventTypes.EVENT_TEMPLATE_UPLOAD; + long eventId = saveScheduledEvent(userId, accountId, event, "Extraction job"); - _tmpltMgr.extract(template, url, tmpltHostRef, zoneId); + ExtractTemplateParam param = new ExtractTemplateParam(userId, templateId, zoneId, eventId , url); + Gson gson = GsonHelper.getBuilder().create(); + + AsyncJobVO job = new AsyncJobVO(); + job.setUserId(userId); + job.setAccountId(accountId); + job.setCmd("ExtractTemplate"); + job.setCmdInfo(gson.toJson(param)); + job.setCmdOriginator(ExtractTemplateCmd.getStaticName()); + + return _asyncMgr.submitAsyncJob(job); + + } + + @Override + public void extractTemplate(String url, Long templateId, Long zoneId, long eventId, long asyncJobId) throws URISyntaxException{ + + VMTemplateVO template = findTemplateById(templateId); + VMTemplateHostVO tmpltHostRef = findTemplateHostRef(templateId, zoneId); + String event = template.getFormat() == ImageFormat.ISO ? EventTypes.EVENT_ISO_UPLOAD : EventTypes.EVENT_TEMPLATE_UPLOAD; + saveStartedEvent(template.getAccountId(), template.getAccountId(), event, "Starting upload of " +template.getName()+ " to " +url, eventId); + _tmpltMgr.extract(template, url, tmpltHostRef, zoneId, eventId, asyncJobId, _asyncMgr); } diff --git a/server/src/com/cloud/storage/upload/UploadListener.java b/server/src/com/cloud/storage/upload/UploadListener.java index 8fd0279dfc2..8ca72691153 100755 --- a/server/src/com/cloud/storage/upload/UploadListener.java +++ b/server/src/com/cloud/storage/upload/UploadListener.java @@ -17,24 +17,21 @@ import com.cloud.agent.api.Answer; import com.cloud.agent.api.Command; import com.cloud.agent.api.StartupCommand; import com.cloud.agent.api.StartupStorageCommand; -import com.cloud.agent.api.storage.DownloadCommand; -import com.cloud.agent.api.storage.DownloadProgressCommand; import com.cloud.agent.api.storage.UploadAnswer; 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.async.AsyncJobManager; +import com.cloud.async.AsyncJobResult; +import com.cloud.async.executor.ExtractJobResultObject; import com.cloud.event.EventTypes; import com.cloud.event.EventVO; import com.cloud.host.HostVO; import com.cloud.storage.Storage; import com.cloud.storage.UploadVO; -import com.cloud.storage.VMTemplateHostVO; -import com.cloud.storage.VMTemplateVO; import com.cloud.storage.dao.UploadDao; -import com.cloud.storage.dao.VMTemplateHostDao; import com.cloud.storage.Upload.Status; import com.cloud.storage.Upload.Type; -import com.cloud.storage.download.DownloadState.DownloadEvent; import com.cloud.storage.upload.UploadMonitorImpl; import com.cloud.storage.upload.UploadState.UploadEvent; import com.cloud.utils.exception.CloudRuntimeException; @@ -103,13 +100,41 @@ public class UploadListener implements Listener { private Long accountId; private String typeName; private Type type; + private long asyncJobId; + private long eventId; + private AsyncJobManager asyncMgr; + private ExtractJobResultObject resultObj; + public AsyncJobManager getAsyncMgr() { + return asyncMgr; + } + + public void setAsyncMgr(AsyncJobManager asyncMgr) { + this.asyncMgr = asyncMgr; + } + + public long getAsyncJobId() { + return asyncJobId; + } + + public void setAsyncJobId(long asyncJobId) { + this.asyncJobId = asyncJobId; + } + + public long getEventId() { + return eventId; + } + + public void setEventId(long eventId) { + this.eventId = eventId; + } + private final Map stateMap = new HashMap(); private Long uploadId; public UploadListener(HostVO host, Timer _timer, UploadDao uploadDao, Long uploadId, UploadMonitorImpl uploadMonitor, UploadCommand cmd, - Long accountId, String typeName, Type type) { + Long accountId, String typeName, Type type, long eventId, long asyncJobId, AsyncJobManager asyncMgr) { this.sserver = host; this.uploadDao = uploadDao; this.uploadMonitor = uploadMonitor; @@ -123,6 +148,10 @@ public class UploadListener implements Listener { this.timer = _timer; this.timeoutTask = new TimeoutTask(this); this.timer.schedule(timeoutTask, 3*STATUS_POLL_INTERVAL); + this.eventId = eventId; + this.asyncJobId = asyncJobId; + this.asyncMgr = asyncMgr; + this.resultObj = new ExtractJobResultObject(accountId, typeName, currState, 0, uploadId); updateDatabase(Status.NOT_UPLOADED, cmd.getUrl(),""); } @@ -212,19 +241,12 @@ public class UploadListener implements Listener { public void setUploadInactive(Status reason) { uploadActive=false; - uploadMonitor.handleUploadEvent(sserver, accountId, typeName, type, uploadId, reason); + uploadMonitor.handleUploadEvent(sserver, accountId, typeName, type, uploadId, reason, eventId); } public void logUploadStart() { - String event; - if (type == Type.TEMPLATE){ - event = EventTypes.EVENT_TEMPLATE_UPLOAD_START; - }else if (type == Type.ISO){ - event = EventTypes.EVENT_ISO_UPLOAD_START; - }else{ - event = EventTypes.EVENT_VOLUME_UPLOAD_START; - } - uploadMonitor.logEvent(accountId, event, "Storage server " + sserver.getName() + " started upload of " +type.toString() + " " + typeName, EventVO.LEVEL_INFO); + String event = uploadMonitor.getEvent(type); + uploadMonitor.logEvent(accountId, event, "Storage server " + sserver.getName() + " started upload of " +type.toString() + " " + typeName, EventVO.LEVEL_INFO,eventId); } public void cancelTimeoutTask() { @@ -310,6 +332,10 @@ public class UploadListener implements Listener { } public void updateDatabase(Status state, String uploadErrorString) { + resultObj.setResult_string(uploadErrorString); + resultObj.setState(state.toString()); + asyncMgr.updateAsyncJobAttachment(asyncJobId, type.toString(), 1L); + asyncMgr.updateAsyncJobStatus(asyncJobId, AsyncJobResult.STATUS_IN_PROGRESS, resultObj); UploadVO vo = uploadDao.createForUpdate(); vo.setUploadState(state); @@ -319,6 +345,11 @@ public class UploadListener implements Listener { } public void updateDatabase(Status state, String uploadUrl,String uploadErrorString) { + resultObj.setResult_string(uploadErrorString); + resultObj.setState(state.toString()); + asyncMgr.updateAsyncJobAttachment(asyncJobId, type.toString(), 1L); + asyncMgr.updateAsyncJobStatus(asyncJobId, AsyncJobResult.STATUS_IN_PROGRESS, resultObj); + UploadVO vo = uploadDao.createForUpdate(); vo.setUploadState(state); @@ -341,6 +372,18 @@ public class UploadListener implements Listener { public synchronized void updateDatabase(UploadAnswer answer) { + resultObj.setResult_string(answer.getErrorString()); + resultObj.setState(answer.getUploadStatus().toString()); + resultObj.setUploadPercent(answer.getUploadPct()); + + if (answer.getUploadStatus() == Status.UPLOAD_IN_PROGRESS){ + asyncMgr.updateAsyncJobAttachment(asyncJobId, type.toString(), 1L); + asyncMgr.updateAsyncJobStatus(asyncJobId, AsyncJobResult.STATUS_IN_PROGRESS, resultObj); + }else if(answer.getUploadStatus() == Status.UPLOADED){ + asyncMgr.completeAsyncJob(asyncJobId, AsyncJobResult.STATUS_SUCCEEDED, 0, resultObj); + }else{ + asyncMgr.completeAsyncJob(asyncJobId, AsyncJobResult.STATUS_FAILED, 0, resultObj); + } UploadVO updateBuilder = uploadDao.createForUpdate(); updateBuilder.setUploadPercent(answer.getUploadPct()); updateBuilder.setUploadState(answer.getUploadStatus()); @@ -371,14 +414,8 @@ public class UploadListener implements Listener { public void logDisconnect() { s_logger.warn("Unable to monitor upload progress of " + typeName + " at host " + sserver.getName()); String event; - if (type == Type.TEMPLATE){ - event = EventTypes.EVENT_TEMPLATE_UPLOAD_FAILED; - }else if (type == Type.ISO){ - event = EventTypes.EVENT_ISO_UPLOAD_FAILED; - }else{ - event = EventTypes.EVENT_VOLUME_UPLOAD_FAILED; - } - uploadMonitor.logEvent(accountId, event, "Storage server " + sserver.getName() + " disconnected during upload of " + typeName, EventVO.LEVEL_WARN); + event = uploadMonitor.getEvent(type); + uploadMonitor.logEvent(accountId, event, "Storage server " + sserver.getName() + " disconnected during upload of " + typeName, EventVO.LEVEL_WARN, eventId); } public void scheduleImmediateStatusCheck(RequestType request) { diff --git a/server/src/com/cloud/storage/upload/UploadMonitor.java b/server/src/com/cloud/storage/upload/UploadMonitor.java index 9967900c172..9bd94fc021a 100755 --- a/server/src/com/cloud/storage/upload/UploadMonitor.java +++ b/server/src/com/cloud/storage/upload/UploadMonitor.java @@ -20,13 +20,14 @@ package com.cloud.storage.upload; import java.util.Map; +import com.cloud.async.AsyncJobManager; import com.cloud.storage.VMTemplateHostVO; import com.cloud.storage.VMTemplateVO; import com.cloud.storage.template.TemplateInfo; import com.cloud.utils.component.Manager; /** - * Monitor upload progress of all templates. + * Monitor upload progress of all entities. * @author nitin * */ @@ -35,7 +36,7 @@ public interface UploadMonitor extends Manager{ public void cancelAllUploads(Long templateId); public void extractTemplate(VMTemplateVO template, String url, - VMTemplateHostVO tmpltHostRef,Long dataCenterId); + VMTemplateHostVO tmpltHostRef,Long dataCenterId, long eventId, long asyncJobId, AsyncJobManager asyncMgr); void handleUploadTemplateSync(long sserverId, Map templateInfo); diff --git a/server/src/com/cloud/storage/upload/UploadMonitorImpl.java b/server/src/com/cloud/storage/upload/UploadMonitorImpl.java index 759c30b0fdf..b7f0931f8cd 100755 --- a/server/src/com/cloud/storage/upload/UploadMonitorImpl.java +++ b/server/src/com/cloud/storage/upload/UploadMonitorImpl.java @@ -20,6 +20,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.async.AsyncJobManager; import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.dc.dao.DataCenterDao; import com.cloud.event.EventTypes; @@ -123,7 +124,7 @@ public class UploadMonitorImpl implements UploadMonitor { 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); + UploadListener ul = new UploadListener(sserver, _timer, _uploadDao, uploadVolumeObj.getId(), this, ucmd, volume.getAccountId(), volume.getName(), Type.VOLUME, dataCenterId, dataCenterId, null); _listenerMap.put(uploadVolumeObj, ul); long result = send(sserver.getId(), ucmd, ul); @@ -137,7 +138,7 @@ public class UploadMonitorImpl implements UploadMonitor { @Override public void extractTemplate( VMTemplateVO template, String url, - VMTemplateHostVO vmTemplateHost,Long dataCenterId){ + VMTemplateHostVO vmTemplateHost,Long dataCenterId, long eventId, long asyncJobId, AsyncJobManager asyncMgr){ Type type = (template.getFormat() == ImageFormat.ISO) ? Type.ISO : Type.TEMPLATE ; @@ -156,7 +157,7 @@ public class UploadMonitorImpl implements UploadMonitor { if(vmTemplateHost != null) { start(); UploadCommand ucmd = new UploadCommand(template, url, vmTemplateHost); - UploadListener ul = new UploadListener(sserver, _timer, _uploadDao, uploadTemplateObj.getId(), this, ucmd, template.getAccountId(), template.getName(), type);//TO DO - remove template + UploadListener ul = new UploadListener(sserver, _timer, _uploadDao, uploadTemplateObj.getId(), this, ucmd, template.getAccountId(), template.getName(), type, eventId, asyncJobId, asyncMgr); _listenerMap.put(uploadTemplateObj, ul); long result = send(sserver.getId(), ucmd, ul); @@ -211,23 +212,16 @@ public class UploadMonitorImpl implements UploadMonitor { return true; } - public String getEvent(Upload.Status status, Type type){ - if (status == Upload.Status.UPLOADED){ - if(type == Type.TEMPLATE) return EventTypes.EVENT_TEMPLATE_UPLOAD_SUCCESS; - if(type == Type.ISO) return EventTypes.EVENT_ISO_UPLOAD_SUCCESS; - if(type == Type.VOLUME) return EventTypes.EVENT_VOLUME_UPLOAD_SUCCESS; - } - - if (status == Upload.Status.UPLOAD_ERROR || status == Upload.Status.ABANDONED){ - if(type == Type.TEMPLATE) return EventTypes.EVENT_TEMPLATE_UPLOAD_FAILED; - if(type == Type.ISO) return EventTypes.EVENT_ISO_UPLOAD_FAILED; - if(type == Type.VOLUME) return EventTypes.EVENT_VOLUME_UPLOAD_FAILED; - } + public String getEvent(Type type){ + + if(type == Type.TEMPLATE) return EventTypes.EVENT_TEMPLATE_UPLOAD; + if(type == Type.ISO) return EventTypes.EVENT_ISO_UPLOAD; + if(type == Type.VOLUME) return EventTypes.EVENT_VOLUME_UPLOAD; return null; } - public void handleUploadEvent(HostVO host, Long accountId, String typeName, Type type, Long uploadId, com.cloud.storage.Upload.Status reason) { + public void handleUploadEvent(HostVO host, Long accountId, String typeName, Type type, Long uploadId, com.cloud.storage.Upload.Status reason, long eventId) { if ((reason == Upload.Status.UPLOADED) || (reason==Upload.Status.ABANDONED)){ UploadVO uploadObj = new UploadVO(uploadId); @@ -237,13 +231,13 @@ public class UploadMonitorImpl implements UploadMonitor { } } if (reason == Upload.Status.UPLOADED) { - logEvent(accountId, getEvent(reason, type), typeName + " successfully uploaded from storage server " + host.getName(), EventVO.LEVEL_INFO); + logEvent(accountId, getEvent(type), typeName + " successfully uploaded from storage server " + host.getName(), EventVO.LEVEL_INFO, eventId); } if (reason == Upload.Status.UPLOAD_ERROR) { - logEvent(accountId, getEvent(reason, type), typeName + " failed to upload from storage server " + host.getName(), EventVO.LEVEL_ERROR); + logEvent(accountId, getEvent(type), typeName + " failed to upload from storage server " + host.getName(), EventVO.LEVEL_ERROR, eventId); } if (reason == Upload.Status.ABANDONED) { - logEvent(accountId, getEvent(reason, type), typeName + " :aborted upload from storage server " + host.getName(), EventVO.LEVEL_WARN); + logEvent(accountId, getEvent(type), typeName + " :aborted upload from storage server " + host.getName(), EventVO.LEVEL_WARN, eventId); } /*VMTemplateHostVO vmTemplateHost = _vmTemplateHostDao.findByHostTemplate(host.getId(), template.getId()); @@ -306,13 +300,14 @@ public class UploadMonitorImpl implements UploadMonitor { } - public void logEvent(long accountId, String evtType, String description, String level) { + public void logEvent(long accountId, String evtType, String description, String level, long eventId) { EventVO event = new EventVO(); event.setUserId(1); event.setAccountId(accountId); event.setType(evtType); event.setDescription(description); event.setLevel(level); + event.setStartId(eventId); _eventDao.persist(event); } diff --git a/server/src/com/cloud/template/TemplateManager.java b/server/src/com/cloud/template/TemplateManager.java old mode 100644 new mode 100755 index a4f67f3a0da..7644e5bb22e --- a/server/src/com/cloud/template/TemplateManager.java +++ b/server/src/com/cloud/template/TemplateManager.java @@ -20,6 +20,7 @@ package com.cloud.template; import java.net.URI; import java.util.List; +import com.cloud.async.AsyncJobManager; import com.cloud.exception.InternalErrorException; import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.StorageUnavailableException; @@ -98,7 +99,34 @@ public interface TemplateManager extends Manager { * @param sourceZoneId * @param destZoneId * @return true if success - * @throws InternalErrorException + * @throws InternalErrorException URI uri = new URI(url); + if ( (uri.getScheme() == null) || (!uri.getScheme().equalsIgnoreCase("ftp") )) { + throw new IllegalArgumentException("Unsupported scheme for url: " + url); + } + String host = uri.getHost(); + + try { + InetAddress hostAddr = InetAddress.getByName(host); + if (hostAddr.isAnyLocalAddress() || hostAddr.isLinkLocalAddress() || hostAddr.isLoopbackAddress() || hostAddr.isMulticastAddress() ) { + throw new IllegalArgumentException("Illegal host specified in url"); + } + if (hostAddr instanceof Inet6Address) { + throw new IllegalArgumentException("IPV6 addresses not supported (" + hostAddr.getHostAddress() + ")"); + } + } catch (UnknownHostException uhe) { + throw new IllegalArgumentException("Unable to resolve " + host); + } + + if (_dcDao.findById(zoneId) == null) { + throw new IllegalArgumentException("Please specify a valid zone."); + } + + VMTemplateVO template = findTemplateById(templateId); + + VMTemplateHostVO tmpltHostRef = findTemplateHostRef(templateId, zoneId); + if (tmpltHostRef != null && tmpltHostRef.getDownloadState() != com.cloud.storage.VMTemplateStorageResourceAssoc.Status.DOWNLOADED){ + throw new IllegalArgumentException("The template hasnt been downloaded "); + } * @throws StorageUnavailableException * @throws InvalidParameterValueException */ @@ -128,6 +156,6 @@ public interface TemplateManager extends Manager { boolean templateIsDeleteable(VMTemplateHostVO templateHostRef); - void extract(VMTemplateVO template, String url, VMTemplateHostVO tmpltHostRef, Long zoneId); + void extract(VMTemplateVO template, String url, VMTemplateHostVO tmpltHostRef, Long zoneId, long eventId, long asyncJobId, AsyncJobManager asyncMgr); } diff --git a/server/src/com/cloud/template/TemplateManagerImpl.java b/server/src/com/cloud/template/TemplateManagerImpl.java index 5a473617158..5b5b8a7ddba 100755 --- a/server/src/com/cloud/template/TemplateManagerImpl.java +++ b/server/src/com/cloud/template/TemplateManagerImpl.java @@ -32,6 +32,7 @@ import com.cloud.agent.api.Answer; import com.cloud.agent.api.storage.DestroyCommand; import com.cloud.agent.api.storage.DownloadAnswer; import com.cloud.agent.api.storage.PrimaryStorageDownloadCommand; +import com.cloud.async.AsyncJobManager; import com.cloud.configuration.ResourceCount.ResourceType; import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.dc.DataCenterVO; @@ -148,8 +149,8 @@ public class TemplateManagerImpl implements TemplateManager { } @Override - public void extract(VMTemplateVO template, String url, VMTemplateHostVO tmpltHostRef, Long zoneId){ - _uploadMonitor.extractTemplate(template, url, tmpltHostRef, zoneId); + public void extract(VMTemplateVO template, String url, VMTemplateHostVO tmpltHostRef, Long zoneId, long eventId, long asyncJobId, AsyncJobManager asyncMgr){ + _uploadMonitor.extractTemplate(template, url, tmpltHostRef, zoneId, eventId, asyncJobId, asyncMgr); } @Override @DB diff --git a/setup/db/server-setup.xml b/setup/db/server-setup.xml index 7db947bee0b..9ca63ba9643 100755 --- a/setup/db/server-setup.xml +++ b/setup/db/server-setup.xml @@ -12,14 +12,14 @@ 1 - ZONE1 - 72.52.126.11 - 72.52.126.12 - 192.168.10.253 - 192.168.10.254 - 172.16.0.1 - 255.255.0.0 - 172.16.1.1-172.16.255.253 + NM + 4.2.2.2 + 10.10.10.14 + 4.2.2.2 + 4.2.2.2 + 10.91.28.1 + 255.255.255.0 + 560-579 10.1.1.0/24 @@ -35,24 +35,46 @@ 1 - POD1 + NM 1 - 192.168.2.1 - 192.168.2.0/24 - 192.168.2.20-192.168.2.170 + 10.91.28.1 + 10.91.28.0/24 + 10.91.28.160-10.91.28.179 - + + + 1 30 VirtualNetwork - 192.168.30.1 + 10.91.30.1 255.255.255.0 - 192.168.30.10-192.168.30.19 + 10.91.30.160-10.91.30.179 + +