mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
bug 4286: Making extractIsoCmd and extractTemplateCmd async
This commit is contained in:
parent
fceb9378ca
commit
636dc041c7
@ -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";
|
||||
|
||||
@ -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<String, String> 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;
|
||||
|
||||
|
||||
}
|
||||
|
||||
4
core/src/com/cloud/storage/template/FtpTemplateUploader.java
Normal file → Executable file
4
core/src/com/cloud/storage/template/FtpTemplateUploader.java
Normal file → Executable file
@ -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;
|
||||
|
||||
|
||||
6
server/src/com/cloud/api/commands/ExtractIsoCmd.java
Normal file → Executable file
6
server/src/com/cloud/api/commands/ExtractIsoCmd.java
Normal file → Executable file
@ -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<String, Object>(BaseCmd.Properties.URL.getName(), url));
|
||||
response.add(new Pair<String, Object>(BaseCmd.Properties.ZONE_ID.getName(), zoneId));
|
||||
response.add(new Pair<String, Object>(BaseCmd.Properties.ZONE_NAME.getName(), zone.getName()));
|
||||
response.add(new Pair<String, Object>(BaseCmd.Properties.TEMPLATE_STATUS.getName(), "Processing"));
|
||||
response.add(new Pair<String, Object>(BaseCmd.Properties.JOB_ID.getName(), jobId));
|
||||
return response;
|
||||
|
||||
}
|
||||
|
||||
@ -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<String, Object>(BaseCmd.Properties.URL.getName(), url));
|
||||
response.add(new Pair<String, Object>(BaseCmd.Properties.ZONE_ID.getName(), zoneId));
|
||||
response.add(new Pair<String, Object>(BaseCmd.Properties.ZONE_NAME.getName(), zone.getName()));
|
||||
response.add(new Pair<String, Object>(BaseCmd.Properties.TEMPLATE_STATUS.getName(), "Processing"));
|
||||
response.add(new Pair<String, Object>(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<Pair<Enum, Boolean>> getProperties() {
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@ -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<String, UploadState> stateMap = new HashMap<String, UploadState>();
|
||||
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) {
|
||||
|
||||
@ -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<String, TemplateInfo> templateInfo);
|
||||
|
||||
@ -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);
|
||||
|
||||
}
|
||||
|
||||
32
server/src/com/cloud/template/TemplateManager.java
Normal file → Executable file
32
server/src/com/cloud/template/TemplateManager.java
Normal file → Executable file
@ -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);
|
||||
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -12,14 +12,14 @@
|
||||
<zones>
|
||||
<zone>
|
||||
<id>1</id>
|
||||
<name>ZONE1</name>
|
||||
<dns1>72.52.126.11</dns1>
|
||||
<dns2>72.52.126.12</dns2>
|
||||
<internalDns1>192.168.10.253</internalDns1>
|
||||
<internalDns2>192.168.10.254</internalDns2>
|
||||
<gateway>172.16.0.1</gateway>
|
||||
<netmask>255.255.0.0</netmask>
|
||||
<ipAddressRange>172.16.1.1-172.16.255.253</ipAddressRange>
|
||||
<name>NM</name>
|
||||
<dns1>4.2.2.2</dns1>
|
||||
<dns2>10.10.10.14</dns2>
|
||||
<internalDns1>4.2.2.2</internalDns1>
|
||||
<internalDns2>4.2.2.2</internalDns2>
|
||||
<gateway>10.91.28.1</gateway>
|
||||
<netmask>255.255.255.0</netmask>
|
||||
<vnet>560-579</vnet>
|
||||
<guestNetworkCidr>10.1.1.0/24</guestNetworkCidr>
|
||||
</zone>
|
||||
</zones>
|
||||
@ -35,24 +35,46 @@
|
||||
<pods>
|
||||
<pod>
|
||||
<id>1</id>
|
||||
<name>POD1</name>
|
||||
<name>NM</name>
|
||||
<zoneId>1</zoneId>
|
||||
<gateway>192.168.2.1</gateway>
|
||||
<cidr>192.168.2.0/24</cidr>
|
||||
<ipAddressRange>192.168.2.20-192.168.2.170</ipAddressRange>
|
||||
<gateway>10.91.28.1</gateway>
|
||||
<cidr>10.91.28.0/24</cidr>
|
||||
<ipAddressRange>10.91.28.160-10.91.28.179</ipAddressRange>
|
||||
</pod>
|
||||
</pods>
|
||||
|
||||
<!--
|
||||
<storagePools>
|
||||
<storagePool>
|
||||
<zoneId>1</zoneId>
|
||||
<podId>1</podId>
|
||||
<name>idc-ss</name>
|
||||
<hostAddress>10.91.28.6</hostAddress>
|
||||
<hostPath>/export/home/nitin/primary</hostPath>
|
||||
</storagePool>
|
||||
</storagePools>
|
||||
-->
|
||||
|
||||
<!--
|
||||
<secondaryStorages>
|
||||
<secondaryStorage>
|
||||
<zoneId>1</zoneId>
|
||||
<podId>1</podId>
|
||||
<url>nfs://10.91.28.6/export/home/nitin/secondary</url>
|
||||
</secondaryStorage>
|
||||
</secondaryStorages>
|
||||
-->
|
||||
|
||||
<vlans>
|
||||
<vlan>
|
||||
<zoneId>1</zoneId>
|
||||
<vlanId>30</vlanId>
|
||||
<vlanType>VirtualNetwork</vlanType>
|
||||
<gateway>192.168.30.1</gateway>
|
||||
<gateway>10.91.30.1</gateway>
|
||||
<netmask>255.255.255.0</netmask>
|
||||
<ipAddressRange>192.168.30.10-192.168.30.19</ipAddressRange>
|
||||
<ipAddressRange>10.91.30.160-10.91.30.179</ipAddressRange>
|
||||
</vlan>
|
||||
</vlans>
|
||||
<!--
|
||||
<vlan>
|
||||
<zoneId>1</zoneId>
|
||||
<vlanId>31</vlanId>
|
||||
@ -61,7 +83,6 @@
|
||||
<netmask>255.255.255.0</netmask>
|
||||
<ipAddressRange>192.168.31.10-192.168.31.19</ipAddressRange>
|
||||
</vlan>
|
||||
</vlans>
|
||||
-->
|
||||
<!--
|
||||
* id is the unique id of the service offering
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user