Updated Branches: refs/heads/object_store 0229c75b5 -> abf40435f
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/abf40435/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java index ab91059..36fcbb7 100755 --- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java +++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java @@ -120,6 +120,7 @@ import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.OperationTimedoutException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.exception.StorageUnavailableException; +import com.cloud.host.Host; import com.cloud.host.HostVO; import com.cloud.host.Status; import com.cloud.host.dao.HostDao; @@ -3539,7 +3540,7 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V } @Override - public void processConnect(HostVO host, StartupCommand cmd, boolean forRebalance) throws ConnectionException { + public void processConnect(Host host, StartupCommand cmd, boolean forRebalance) throws ConnectionException { UserContext context = UserContext.current(); context.setAccountId(1); List<DomainRouterVO> routers = _routerDao.listIsolatedByHostId(host.getId()); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/abf40435/server/src/com/cloud/network/security/SecurityGroupListener.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/network/security/SecurityGroupListener.java b/server/src/com/cloud/network/security/SecurityGroupListener.java index 3245253..0c101f2 100755 --- a/server/src/com/cloud/network/security/SecurityGroupListener.java +++ b/server/src/com/cloud/network/security/SecurityGroupListener.java @@ -38,7 +38,7 @@ import com.cloud.agent.api.StartupRoutingCommand; import com.cloud.agent.api.SecurityGroupRuleAnswer.FailureReason; import com.cloud.agent.manager.Commands; import com.cloud.exception.AgentUnavailableException; -import com.cloud.host.HostVO; +import com.cloud.host.Host; import com.cloud.host.Status; import com.cloud.network.security.SecurityGroupWork.Step; import com.cloud.network.security.dao.SecurityGroupWorkDao; @@ -157,7 +157,7 @@ public class SecurityGroupListener implements Listener { @Override - public void processConnect(HostVO host, StartupCommand cmd, boolean forRebalance) { + public void processConnect(Host host, StartupCommand cmd, boolean forRebalance) { if(s_logger.isInfoEnabled()) s_logger.info("Received a host startup notification"); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/abf40435/server/src/com/cloud/storage/LocalStoragePoolListener.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/storage/LocalStoragePoolListener.java b/server/src/com/cloud/storage/LocalStoragePoolListener.java index 244f7fb..088d601 100755 --- a/server/src/com/cloud/storage/LocalStoragePoolListener.java +++ b/server/src/com/cloud/storage/LocalStoragePoolListener.java @@ -32,7 +32,7 @@ import com.cloud.agent.api.StoragePoolInfo; import com.cloud.capacity.dao.CapacityDao; import com.cloud.dc.dao.DataCenterDao; import com.cloud.exception.ConnectionException; -import com.cloud.host.HostVO; +import com.cloud.host.Host; import com.cloud.host.Status; import com.cloud.storage.dao.StoragePoolHostDao; import com.cloud.utils.db.DB; @@ -67,7 +67,7 @@ public class LocalStoragePoolListener implements Listener { @Override @DB - public void processConnect(HostVO host, StartupCommand cmd, boolean forRebalance) throws ConnectionException { + public void processConnect(Host host, StartupCommand cmd, boolean forRebalance) throws ConnectionException { if (!(cmd instanceof StartupStorageCommand)) { return; } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/abf40435/server/src/com/cloud/storage/download/DownloadAbandonedState.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/storage/download/DownloadAbandonedState.java b/server/src/com/cloud/storage/download/DownloadAbandonedState.java index 200683c..ef053ce 100644 --- a/server/src/com/cloud/storage/download/DownloadAbandonedState.java +++ b/server/src/com/cloud/storage/download/DownloadAbandonedState.java @@ -16,6 +16,7 @@ // under the License. package com.cloud.storage.download; +import com.cloud.agent.api.storage.DownloadAnswer; import com.cloud.agent.api.storage.DownloadProgressCommand.RequestType; import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; @@ -34,7 +35,8 @@ public class DownloadAbandonedState extends DownloadInactiveState { public void onEntry(String prevState, DownloadEvent event, Object evtObj) { super.onEntry(prevState, event, evtObj); if (!prevState.equalsIgnoreCase(getName())){ - getDownloadListener().updateDatabase(Status.ABANDONED, "Download canceled"); + DownloadAnswer answer = new DownloadAnswer("Download canceled", Status.ABANDONED); + getDownloadListener().callback(answer); getDownloadListener().cancelStatusTask(); getDownloadListener().cancelTimeoutTask(); getDownloadListener().sendCommand(RequestType.ABORT); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/abf40435/server/src/com/cloud/storage/download/DownloadActiveState.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/storage/download/DownloadActiveState.java b/server/src/com/cloud/storage/download/DownloadActiveState.java index f2cd5af..09d103e 100644 --- a/server/src/com/cloud/storage/download/DownloadActiveState.java +++ b/server/src/com/cloud/storage/download/DownloadActiveState.java @@ -64,7 +64,7 @@ public abstract class DownloadActiveState extends DownloadState { } if (event==DownloadEvent.DOWNLOAD_ANSWER) { - getDownloadListener().updateDatabase((DownloadAnswer)evtObj); + getDownloadListener().callback((DownloadAnswer)evtObj); getDownloadListener().setLastUpdated(); } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/abf40435/server/src/com/cloud/storage/download/DownloadErrorState.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/storage/download/DownloadErrorState.java b/server/src/com/cloud/storage/download/DownloadErrorState.java index 0fdfd52..e5c8820 100644 --- a/server/src/com/cloud/storage/download/DownloadErrorState.java +++ b/server/src/com/cloud/storage/download/DownloadErrorState.java @@ -76,10 +76,12 @@ public class DownloadErrorState extends DownloadInactiveState { getDownloadListener().logDisconnect(); getDownloadListener().cancelStatusTask(); getDownloadListener().cancelTimeoutTask(); - getDownloadListener().updateDatabase(Status.DOWNLOAD_ERROR, "Storage agent or storage VM disconnected"); + DownloadAnswer answer = new DownloadAnswer("Storage agent or storage VM disconnected", Status.DOWNLOAD_ERROR); + getDownloadListener().callback(answer); getDownloadListener().log("Entering download error state because the storage host disconnected", Level.WARN); } else if (event==DownloadEvent.TIMEOUT_CHECK){ - getDownloadListener().updateDatabase(Status.DOWNLOAD_ERROR, "Timeout waiting for response from storage host"); + DownloadAnswer answer = new DownloadAnswer("Timeout waiting for response from storage host", Status.DOWNLOAD_ERROR); + getDownloadListener().callback(answer); getDownloadListener().log("Entering download error state: timeout waiting for response from storage host", Level.WARN); } getDownloadListener().setDownloadInactive(Status.DOWNLOAD_ERROR); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/abf40435/server/src/com/cloud/storage/download/DownloadListener.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/storage/download/DownloadListener.java b/server/src/com/cloud/storage/download/DownloadListener.java index 3eb2233..e54e879 100755 --- a/server/src/com/cloud/storage/download/DownloadListener.java +++ b/server/src/com/cloud/storage/download/DownloadListener.java @@ -25,17 +25,15 @@ import java.util.TimerTask; import javax.inject.Inject; -import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult; +import org.apache.cloudstack.engine.subsystem.api.storage.DataObject; +import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectType; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; +import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint; import org.apache.cloudstack.engine.subsystem.api.storage.TemplateService; -import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine; import org.apache.cloudstack.engine.subsystem.api.storage.VolumeService; import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope; import org.apache.cloudstack.framework.async.AsyncCompletionCallback; -import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao; -import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO; -import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao; import org.apache.log4j.Level; import org.apache.log4j.Logger; @@ -47,35 +45,19 @@ import com.cloud.agent.api.Command; import com.cloud.agent.api.StartupCommand; import com.cloud.agent.api.StartupRoutingCommand; import com.cloud.agent.api.StartupSecondaryStorageCommand; -import com.cloud.agent.api.StartupStorageCommand; import com.cloud.agent.api.storage.DownloadAnswer; import com.cloud.agent.api.storage.DownloadCommand; import com.cloud.agent.api.storage.DownloadCommand.ResourceType; import com.cloud.agent.api.storage.DownloadProgressCommand; import com.cloud.agent.api.storage.DownloadProgressCommand.RequestType; -import com.cloud.alert.AlertManager; import com.cloud.exception.AgentUnavailableException; import com.cloud.exception.ConnectionException; -import com.cloud.exception.ResourceAllocationException; -import com.cloud.host.HostVO; -import com.cloud.host.dao.HostDao; +import com.cloud.host.Host; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.resource.ResourceManager; -import com.cloud.storage.Storage; -import com.cloud.storage.StorageManager; import com.cloud.storage.VMTemplateHostVO; import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; -import com.cloud.storage.VMTemplateVO; -import com.cloud.storage.VolumeHostVO; -import com.cloud.storage.VolumeVO; -import com.cloud.storage.dao.VMTemplateDao; -import com.cloud.storage.dao.VMTemplateHostDao; -import com.cloud.storage.dao.VolumeDao; -import com.cloud.storage.dao.VolumeHostDao; import com.cloud.storage.download.DownloadState.DownloadEvent; -import com.cloud.user.AccountManager; -import com.cloud.user.ResourceLimitService; -import com.cloud.utils.UriUtils; import com.cloud.utils.exception.CloudRuntimeException; /** @@ -125,25 +107,11 @@ public class DownloadListener implements Listener { public static final String DOWNLOAD_IN_PROGRESS=Status.DOWNLOAD_IN_PROGRESS.toString(); public static final String DOWNLOAD_ABANDONED=Status.ABANDONED.toString(); + private EndPoint _ssAgent; - private HostVO _sserver; - private HostVO _ssAgent; + private DataObject object; - private VMTemplateVO _template; - private VolumeVO _volume; private boolean _downloadActive = true; - - private VolumeHostDao _volumeHostDao; - private VolumeDataStoreDao _volumeStoreDao; - private VolumeDao _volumeDao; - private StorageManager _storageMgr; - private VMTemplateHostDao _vmTemplateHostDao; - private TemplateDataStoreDao _vmTemplateStoreDao; - private VMTemplateDao _vmTemplateDao; - private ResourceLimitService _resourceLimitMgr; - private AccountManager _accountMgr; - private AlertManager _alertMgr; - private final DownloadMonitorImpl _downloadMonitor; private DownloadState _currState; @@ -158,13 +126,7 @@ public class DownloadListener implements Listener { private String _jobId; private final Map<String, DownloadState> _stateMap = new HashMap<String, DownloadState>(); - private Long _templateHostId; - private Long _volumeHostId; - - private DataStore _sstore; - private Long _templateStoreId; - private Long _volumeStoreId; - private AsyncCompletionCallback<CreateCmdResult> _callback; + private AsyncCompletionCallback<DownloadAnswer> _callback; @Inject private ResourceManager _resourceMgr; @@ -175,71 +137,25 @@ public class DownloadListener implements Listener { @Inject private VolumeService _volumeSrv; - public DownloadListener(HostVO ssAgent, HostVO host, VMTemplateVO template, Timer _timer, VMTemplateHostDao dao, Long templHostId, DownloadMonitorImpl downloadMonitor, DownloadCommand cmd, VMTemplateDao templateDao, ResourceLimitService _resourceLimitMgr, AlertManager _alertMgr, AccountManager _accountMgr) { - this._ssAgent = ssAgent; - this._sserver = host; - this._template = template; - this._vmTemplateHostDao = dao; - this._downloadMonitor = downloadMonitor; - this._cmd = cmd; - this._templateHostId = templHostId; - initStateMachine(); - this._currState=getState(Status.NOT_DOWNLOADED.toString()); - this._timer = _timer; - this._timeoutTask = new TimeoutTask(this); - this._timer.schedule(_timeoutTask, 3*STATUS_POLL_INTERVAL); - this._vmTemplateDao = templateDao; - this._resourceLimitMgr = _resourceLimitMgr; - this._accountMgr = _accountMgr; - this._alertMgr = _alertMgr; - updateDatabase(Status.NOT_DOWNLOADED, ""); - } - // TODO: this constructor should be the one used for template only, remove other template constructor later - public DownloadListener(HostVO ssAgent, DataStore store, VMTemplateVO template, Timer _timer, TemplateDataStoreDao dao, Long templStoreId, DownloadMonitorImpl downloadMonitor, DownloadCommand cmd, VMTemplateDao templateDao, ResourceLimitService _resourceLimitMgr, AlertManager _alertMgr, AccountManager _accountMgr, AsyncCompletionCallback<CreateCmdResult> callback) { + public DownloadListener(EndPoint ssAgent, DataStore store, DataObject object, Timer _timer, DownloadMonitorImpl downloadMonitor, DownloadCommand cmd, AsyncCompletionCallback<DownloadAnswer> callback) { this._ssAgent = ssAgent; - this._sstore = store; - this._template = template; - this._vmTemplateStoreDao = dao; + this.object = object; this._downloadMonitor = downloadMonitor; this._cmd = cmd; - this._templateStoreId = templStoreId; initStateMachine(); this._currState=getState(Status.NOT_DOWNLOADED.toString()); this._timer = _timer; this._timeoutTask = new TimeoutTask(this); this._timer.schedule(_timeoutTask, 3*STATUS_POLL_INTERVAL); - this._vmTemplateDao = templateDao; - this._resourceLimitMgr = _resourceLimitMgr; - this._accountMgr = _accountMgr; - this._alertMgr = _alertMgr; this._callback = callback; - updateDatabase(Status.NOT_DOWNLOADED, ""); + DownloadAnswer answer = new DownloadAnswer("", Status.NOT_DOWNLOADED); + callback(answer); + } + + public AsyncCompletionCallback<DownloadAnswer> getCallback() { + return this._callback; } - - - public DownloadListener(HostVO ssAgent, DataStore store, VolumeVO volume, Timer _timer, VolumeDataStoreDao dao, Long volStoreId, DownloadMonitorImpl downloadMonitor, DownloadCommand cmd, VolumeDao volumeDao, StorageManager storageMgr, ResourceLimitService _resourceLimitMgr, AlertManager _alertMgr, AccountManager _accountMgr, AsyncCompletionCallback<CreateCmdResult> callback) { - this._ssAgent = ssAgent; - this._sstore = store; - this._volume = volume; - this._volumeStoreDao = dao; - this._downloadMonitor = downloadMonitor; - this._cmd = cmd; - this._volumeStoreId = volStoreId; - initStateMachine(); - this._currState=getState(Status.NOT_DOWNLOADED.toString()); - this._timer = _timer; - this._timeoutTask = new TimeoutTask(this); - this._timer.schedule(_timeoutTask, 3*STATUS_POLL_INTERVAL); - this._volumeDao = volumeDao; - this._storageMgr = storageMgr; - this._resourceLimitMgr = _resourceLimitMgr; - this._accountMgr = _accountMgr; - this._alertMgr = _alertMgr; - this._callback = callback; - updateDatabase(Status.NOT_DOWNLOADED, ""); - } - public void setCurrState(VMTemplateHostVO.Status currState) { this._currState = getState(currState.toString()); @@ -264,7 +180,7 @@ public class DownloadListener implements Listener { } try { DownloadProgressCommand dcmd = new DownloadProgressCommand(getCommand(), getJobId(), reqType); - if (_template == null){ + if (this.object.getType() == DataObjectType.VOLUME) { dcmd.setResourceType(ResourceType.VOLUME); } _downloadMonitor.send(_ssAgent.getId(), dcmd, this); @@ -285,59 +201,12 @@ public class DownloadListener implements Listener { } public void logDisconnect() { - if (_template != null){ - s_logger.warn("Unable to monitor download progress of " + _template.getName() + " at host " + _sserver.getName()); - }else { - s_logger.warn("Unable to monitor download progress of " + _volume.getName() + " at host " + _sserver.getName()); - } - } - - public synchronized void updateDatabase(Status state, String errorString) { - if (_template != null){ - VMTemplateHostVO vo = _vmTemplateHostDao.createForUpdate(); - vo.setDownloadState(state); - vo.setLastUpdated(new Date()); - vo.setErrorString(errorString); - _vmTemplateHostDao.update(getTemplateHostId(), vo); - }else { - VolumeHostVO vo = _volumeHostDao.createForUpdate(); - vo.setDownloadState(state); - vo.setLastUpdated(new Date()); - vo.setErrorString(errorString); - _volumeHostDao.update(getVolumeHostId(), vo); - } + s_logger.warn("Unable to monitor download progress of " + this.object.getType() + ": " + + this.object.getId() + " at host " + _ssAgent.getId()); } public void log(String message, Level level) { - if (_template != null){ - s_logger.log(level, message + ", template=" + _template.getName() + " at host " + _sserver.getName()); - }else { - s_logger.log(level, message + ", volume=" + _volume.getName() + " at host " + _sserver.getName()); - } - } - - private Long getTemplateHostId() { - if (_templateHostId == null){ - VMTemplateHostVO templHost = _vmTemplateHostDao.findByHostTemplate(_sserver.getId(), _template.getId()); - _templateHostId = templHost.getId(); - } - return _templateHostId; - } - - private Long getTemplateStoreId() { - if (_templateStoreId == null){ - TemplateDataStoreVO templStore = _vmTemplateStoreDao.findByStoreTemplate(_sstore.getId(), _template.getId()); - _templateStoreId = templStore.getId(); - } - return _templateStoreId; - } - - private Long getVolumeHostId() { - if (_volumeHostId == null){ - VolumeHostVO volHost = _volumeHostDao.findByHostVolume(_sserver.getId(), _volume.getId()); - _volumeHostId = volHost.getId(); - } - return _volumeHostId; + s_logger.log(level, message + ", " + this.object.getType() + ": " + this.object.getId() + " at host " + _ssAgent.getId()); } public DownloadListener(DownloadMonitorImpl monitor) { @@ -388,112 +257,10 @@ public class DownloadListener implements Listener { } } - public synchronized void updateDatabase(DownloadAnswer answer) { - if (_template != null){ - TemplateDataStoreVO updateBuilder = _vmTemplateStoreDao.createForUpdate(); - updateBuilder.setDownloadPercent(answer.getDownloadPct()); - updateBuilder.setDownloadState(answer.getDownloadStatus()); - updateBuilder.setLastUpdated(new Date()); - updateBuilder.setErrorString(answer.getErrorString()); - updateBuilder.setJobId(answer.getJobId()); - updateBuilder.setLocalDownloadPath(answer.getDownloadPath()); - updateBuilder.setInstallPath(answer.getInstallPath()); - updateBuilder.setSize(answer.getTemplateSize()); - updateBuilder.setPhysicalSize(answer.getTemplatePhySicalSize()); - - // only invoke callback when Download is completed or errored so that callback will update template_store_ref state column - Status dndStatus = answer.getDownloadStatus(); - // if (dndStatus == Status.DOWNLOAD_ERROR || dndStatus == Status.DOWNLOADED ){ - if ( _callback != null ){ - if (dndStatus == Status.DOWNLOAD_ERROR){ - CreateCmdResult result = new CreateCmdResult(null, null); - result.setSucess(false); - result.setResult("Download template failed"); - _callback.complete(result); - } else if (dndStatus == Status.DOWNLOADED){ - CreateCmdResult result = new CreateCmdResult(null, null); - _callback.complete(result); - } - } - else{ - // no callback specified, just update state here - if (dndStatus == Status.DOWNLOAD_ERROR){ - updateBuilder.setState(ObjectInDataStoreStateMachine.State.Failed); - } else if (dndStatus == Status.DOWNLOAD_IN_PROGRESS){ - updateBuilder.setState(ObjectInDataStoreStateMachine.State.Creating2); - } else if (dndStatus == Status.DOWNLOADED){ - updateBuilder.setState(ObjectInDataStoreStateMachine.State.Ready); - } - } - // } - _vmTemplateStoreDao.update(getTemplateStoreId(), updateBuilder); - - if (answer.getCheckSum() != null) { - VMTemplateVO templateDaoBuilder = _vmTemplateDao.createForUpdate(); - templateDaoBuilder.setChecksum(answer.getCheckSum()); - _vmTemplateDao.update(_template.getId(), templateDaoBuilder); - } - - if (answer.getTemplateSize() > 0) { - //long hostId = vmTemplateHostDao.findByTemplateId(template.getId()).getHostId(); - long accountId = _template.getAccountId(); - try { - _resourceLimitMgr.checkResourceLimit(_accountMgr.getAccount(accountId), - com.cloud.configuration.Resource.ResourceType.secondary_storage, - answer.getTemplateSize() - UriUtils.getRemoteSize(_template.getUrl())); - } catch (ResourceAllocationException e) { - s_logger.warn(e.getMessage()); - _alertMgr.sendAlert(_alertMgr.ALERT_TYPE_RESOURCE_LIMIT_EXCEEDED, _sserver.getDataCenterId(), - null, e.getMessage(), e.getMessage()); - } finally { - _resourceLimitMgr.recalculateResourceCount(accountId, _accountMgr.getAccount(accountId).getDomainId(), - com.cloud.configuration.Resource.ResourceType.secondary_storage.getOrdinal()); - } - } - - } else { - VolumeHostVO updateBuilder = _volumeHostDao.createForUpdate(); - updateBuilder.setDownloadPercent(answer.getDownloadPct()); - updateBuilder.setDownloadState(answer.getDownloadStatus()); - updateBuilder.setLastUpdated(new Date()); - updateBuilder.setErrorString(answer.getErrorString()); - updateBuilder.setJobId(answer.getJobId()); - updateBuilder.setLocalDownloadPath(answer.getDownloadPath()); - updateBuilder.setInstallPath(answer.getInstallPath()); - updateBuilder.setSize(answer.getTemplateSize()); - updateBuilder.setPhysicalSize(answer.getTemplatePhySicalSize()); - - _volumeHostDao.update(getVolumeHostId(), updateBuilder); - - // Update volume size in Volume table. - VolumeVO updateVolume = _volumeDao.createForUpdate(); - updateVolume.setSize(answer.getTemplateSize()); - _volumeDao.update(_volume.getId(), updateVolume); - - if (answer.getTemplateSize() > 0) { - try { - String url = _volumeHostDao.findByVolumeId(_volume.getId()).getDownloadUrl(); - _resourceLimitMgr.checkResourceLimit(_accountMgr.getAccount(_volume.getAccountId()), - com.cloud.configuration.Resource.ResourceType.secondary_storage, - answer.getTemplateSize() - UriUtils.getRemoteSize(url)); - } catch (ResourceAllocationException e) { - s_logger.warn(e.getMessage()); - _alertMgr.sendAlert(_alertMgr.ALERT_TYPE_RESOURCE_LIMIT_EXCEEDED, _volume.getDataCenterId(), - _volume.getPodId(), e.getMessage(), e.getMessage()); - } finally { - _resourceLimitMgr.recalculateResourceCount(_volume.getAccountId(), _volume.getDomainId(), - com.cloud.configuration.Resource.ResourceType.secondary_storage.getOrdinal()); - } - } - - /*if (answer.getCheckSum() != null) { - VMTemplateVO templateDaoBuilder = _vmTemplateDao.createForUpdate(); - templateDaoBuilder.setChecksum(answer.getCheckSum()); - _vmTemplateDao.update(template.getId(), templateDaoBuilder); - }*/ - } - } - + public void callback(DownloadAnswer answer) { + this._callback.complete(answer); + } + @Override public boolean processCommands(long agentId, long seq, Command[] req) { return false; @@ -511,7 +278,7 @@ public class DownloadListener implements Listener { } @Override - public void processConnect(HostVO agent, StartupCommand cmd, boolean forRebalance) throws ConnectionException { + public void processConnect(Host agent, StartupCommand cmd, boolean forRebalance) throws ConnectionException { if (cmd instanceof StartupRoutingCommand) { List<HypervisorType> hypers = _resourceMgr.listAvailHypervisorInZone(agent.getId(), agent.getDataCenterId()); HypervisorType hostHyper = agent.getHypervisorType(); @@ -601,11 +368,6 @@ public class DownloadListener implements Listener { public void setDownloadInactive(Status reason) { _downloadActive=false; - if (_template != null){ - _downloadMonitor.handleDownloadEvent(_sserver, _template, reason); - }else { - _downloadMonitor.handleDownloadEvent(_sserver, _volume, reason); - } } public void cancelTimeoutTask() { http://git-wip-us.apache.org/repos/asf/cloudstack/blob/abf40435/server/src/com/cloud/storage/download/DownloadMonitor.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/storage/download/DownloadMonitor.java b/server/src/com/cloud/storage/download/DownloadMonitor.java index efbdbe2..7bc210f 100644 --- a/server/src/com/cloud/storage/download/DownloadMonitor.java +++ b/server/src/com/cloud/storage/download/DownloadMonitor.java @@ -16,15 +16,15 @@ // under the License. package com.cloud.storage.download; -import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult; +import org.apache.cloudstack.engine.subsystem.api.storage.DataObject; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.framework.async.AsyncCompletionCallback; - +import com.cloud.agent.api.storage.DownloadAnswer; import com.cloud.exception.StorageUnavailableException; +import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.VMTemplateVO; import com.cloud.storage.VolumeVO; -import com.cloud.storage.Storage.ImageFormat; import com.cloud.utils.component.Manager; /** @@ -34,19 +34,15 @@ import com.cloud.utils.component.Manager; public interface DownloadMonitor extends Manager{ // when ssvm is not available yet - public void downloadBootstrapSysTemplateToStorage(VMTemplateVO template, DataStore store, AsyncCompletionCallback<CreateCmdResult> callback); - - public void downloadTemplateToStorage(VMTemplateVO template, DataStore store, AsyncCompletionCallback<CreateCmdResult> callback); - - public void cancelAllDownloads(Long templateId); + public void downloadBootstrapSysTemplateToStorage(VMTemplateVO template, DataStore store, AsyncCompletionCallback<DownloadAnswer> callback); - public boolean copyTemplate(VMTemplateVO template, DataStore sourceStore, DataStore Store) - throws StorageUnavailableException; + public void downloadTemplateToStorage(DataObject template, DataStore store, AsyncCompletionCallback<DownloadAnswer> callback); - //void addSystemVMTemplatesToHost(HostVO host, Map<String, TemplateProp> templateInfos); + //public void cancelAllDownloads(Long templateId); - //public boolean downloadVolumeToStorage(VolumeVO volume, Long zoneId, String url, String checkSum, ImageFormat format); + //public boolean copyTemplate(VMTemplateVO template, DataStore sourceStore, DataStore Store) + // throws StorageUnavailableException; - public void downloadVolumeToStorage(VolumeVO volume, DataStore store, String url, String checkSum, ImageFormat format, AsyncCompletionCallback<CreateCmdResult> callback); + public void downloadVolumeToStorage(DataObject volume, DataStore store, String url, String checkSum, ImageFormat format, AsyncCompletionCallback<DownloadAnswer> callback); } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/cloudstack/blob/abf40435/server/src/com/cloud/storage/download/DownloadMonitorImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/storage/download/DownloadMonitorImpl.java b/server/src/com/cloud/storage/download/DownloadMonitorImpl.java index c7b360a..b72c202 100755 --- a/server/src/com/cloud/storage/download/DownloadMonitorImpl.java +++ b/server/src/com/cloud/storage/download/DownloadMonitorImpl.java @@ -27,14 +27,14 @@ import java.util.concurrent.ConcurrentHashMap; import javax.ejb.Local; import javax.inject.Inject; -import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult; +import org.apache.cloudstack.engine.subsystem.api.storage.DataObject; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint; import org.apache.cloudstack.engine.subsystem.api.storage.EndPointSelector; import org.apache.cloudstack.engine.subsystem.api.storage.TemplateDataFactory; +import org.apache.cloudstack.framework.async.AsyncCompletionCallback; import org.apache.cloudstack.storage.datastore.db.ImageStoreDao; -import org.apache.cloudstack.storage.datastore.db.ImageStoreVO; import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao; import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO; import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao; @@ -45,55 +45,35 @@ import org.springframework.stereotype.Component; import com.cloud.agent.AgentManager; import com.cloud.agent.Listener; import com.cloud.agent.api.Command; - +import com.cloud.agent.api.storage.DownloadAnswer; import com.cloud.agent.api.storage.DownloadCommand; - import com.cloud.agent.api.storage.DownloadCommand.Proxy; import com.cloud.agent.api.storage.DownloadCommand.ResourceType; +import com.cloud.agent.api.storage.DownloadProgressCommand; import com.cloud.agent.api.storage.DownloadProgressCommand.RequestType; import com.cloud.agent.api.storage.DownloadSystemTemplateCommand; - -import com.cloud.agent.api.storage.DownloadProgressCommand; import com.cloud.agent.manager.Commands; import com.cloud.alert.AlertManager; import com.cloud.configuration.Config; import com.cloud.configuration.dao.ConfigurationDao; -import com.cloud.dc.dao.ClusterDao; -import com.cloud.dc.dao.DataCenterDao; -import com.cloud.event.EventTypes; -import com.cloud.event.UsageEventUtils; -import com.cloud.event.dao.UsageEventDao; import com.cloud.exception.AgentUnavailableException; -import com.cloud.exception.InvalidParameterValueException; -import com.cloud.exception.StorageUnavailableException; import com.cloud.host.HostVO; -import com.cloud.host.dao.HostDao; -import com.cloud.hypervisor.Hypervisor.HypervisorType; -import com.cloud.resource.ResourceManager; import com.cloud.storage.Storage.ImageFormat; - import com.cloud.storage.StorageManager; import com.cloud.storage.VMTemplateHostVO; import com.cloud.storage.VMTemplateStorageResourceAssoc; -import com.cloud.storage.VMTemplateVO; import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; +import com.cloud.storage.VMTemplateVO; +import com.cloud.storage.Volume; import com.cloud.storage.VolumeHostVO; -import com.cloud.storage.VolumeVO; -import com.cloud.storage.dao.StoragePoolHostDao; -import com.cloud.storage.dao.SwiftDao; import com.cloud.storage.dao.VMTemplateDao; -import com.cloud.storage.dao.VMTemplateHostDao; -import com.cloud.storage.dao.VMTemplatePoolDao; -import com.cloud.storage.dao.VMTemplateSwiftDao; -import com.cloud.storage.dao.VMTemplateZoneDao; import com.cloud.storage.dao.VolumeDao; import com.cloud.storage.dao.VolumeHostDao; - import com.cloud.storage.secondary.SecondaryStorageVmManager; import com.cloud.storage.swift.SwiftManager; import com.cloud.storage.template.TemplateConstants; import com.cloud.template.TemplateManager; -import com.cloud.user.Account; +import com.cloud.template.VirtualMachineTemplate; import com.cloud.user.AccountManager; import com.cloud.user.ResourceLimitService; import com.cloud.utils.component.ManagerBase; @@ -101,37 +81,17 @@ import com.cloud.utils.db.DB; import com.cloud.utils.db.JoinBuilder; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; -import com.cloud.utils.db.Transaction; -import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.vm.SecondaryStorageVm; -import com.cloud.vm.SecondaryStorageVmVO; import com.cloud.vm.UserVmManager; -import com.cloud.vm.VirtualMachine.State; -import com.cloud.vm.dao.SecondaryStorageVmDao; import com.cloud.vm.dao.UserVmDao; -import org.apache.cloudstack.framework.async.AsyncCompletionCallback; - @Component @Local(value = { DownloadMonitor.class }) public class DownloadMonitorImpl extends ManagerBase implements DownloadMonitor { static final Logger s_logger = Logger.getLogger(DownloadMonitorImpl.class); @Inject - VMTemplateHostDao _vmTemplateHostDao; - @Inject TemplateDataStoreDao _vmTemplateStoreDao; @Inject - VMTemplateZoneDao _vmTemplateZoneDao; - @Inject - VMTemplatePoolDao _vmTemplatePoolDao; - @Inject - VMTemplateSwiftDao _vmTemplateSwiftlDao; - @Inject - StoragePoolHostDao _poolHostDao; - @Inject - SecondaryStorageVmDao _secStorageVmDao; - @Inject ImageStoreDao _imageStoreDao; @Inject VolumeDao _volumeDao; @@ -147,9 +107,6 @@ public class DownloadMonitorImpl extends ManagerBase implements DownloadMonitor SecondaryStorageVmManager _ssvmMgr; @Inject StorageManager _storageMgr; - - @Inject - private final DataCenterDao _dcDao = null; @Inject VMTemplateDao _templateDao = null; @Inject @@ -165,17 +122,6 @@ public class DownloadMonitorImpl extends ManagerBase implements DownloadMonitor TemplateManager templateMgr; @Inject - private UsageEventDao _usageEventDao; - - @Inject - private ClusterDao _clusterDao; - @Inject - private HostDao _hostDao; - @Inject - private ResourceManager _resourceMgr; - @Inject - private SwiftDao _swiftDao; - @Inject protected ResourceLimitService _resourceLimitMgr; @Inject protected UserVmDao _userVmDao; @@ -254,6 +200,7 @@ public class DownloadMonitorImpl extends ManagerBase implements DownloadMonitor } // TODO: consider using dataMotionStrategy later + /* @Override public boolean copyTemplate(VMTemplateVO template, DataStore sourceStore, DataStore destStore) throws StorageUnavailableException { @@ -363,15 +310,15 @@ public class DownloadMonitorImpl extends ManagerBase implements DownloadMonitor VMTemplateVO tmplt = _templateDao.findById(srcTmpltStore.getTemplateId()); HypervisorType hyperType = tmplt.getHypervisorType(); - /*No secondary storage vm yet*/ + if (hyperType != null && hyperType == HypervisorType.KVM) { //return "file://" + sourceServer.getParent() + "/" + srcTmpltStore.getInstallPath(); return "file://" + "/" + srcTmpltStore.getInstallPath(); } return null; - } + }*/ - private void initiateTemplateDownload(VMTemplateVO template, DataStore store, AsyncCompletionCallback<CreateCmdResult> callback) { + private void initiateTemplateDownload(DataObject template, DataStore store, AsyncCompletionCallback<DownloadAnswer> callback) { boolean downloadJobExists = false; TemplateDataStoreVO vmTemplateStore = null; @@ -380,7 +327,7 @@ public class DownloadMonitorImpl extends ManagerBase implements DownloadMonitor // This method can be invoked other places, for example, // handleTemplateSync, in that case, vmTemplateStore may be null vmTemplateStore = new TemplateDataStoreVO(store.getId(), template.getId(), new Date(), 0, - VMTemplateStorageResourceAssoc.Status.NOT_DOWNLOADED, null, null, "jobid0000", null, template.getUrl()); + VMTemplateStorageResourceAssoc.Status.NOT_DOWNLOADED, null, null, "jobid0000", null, template.getUri()); _vmTemplateStoreDao.persist(vmTemplateStore); } else if ((vmTemplateStore.getJobId() != null) && (vmTemplateStore.getJobId().length() > 2)) { downloadJobExists = true; @@ -390,7 +337,8 @@ public class DownloadMonitorImpl extends ManagerBase implements DownloadMonitor String secUrl = store.getUri(); if (vmTemplateStore != null) { start(); - DownloadCommand dcmd = new DownloadCommand(store.getTO(), secUrl, template, maxTemplateSizeInBytes); + VirtualMachineTemplate tmpl = this._templateDao.findById(template.getId()); + DownloadCommand dcmd = new DownloadCommand(store.getTO(), secUrl, tmpl, maxTemplateSizeInBytes); dcmd.setProxy(getHttpProxy()); if (downloadJobExists) { dcmd = new DownloadProgressCommand(dcmd, vmTemplateStore.getJobId(), RequestType.GET_OR_RESTART); @@ -398,13 +346,13 @@ public class DownloadMonitorImpl extends ManagerBase implements DownloadMonitor if (vmTemplateStore.isCopy()) { dcmd.setCreds(TemplateConstants.DEFAULT_HTTP_AUTH_USER, _copyAuthPasswd); } - HostVO ssAhost = _ssvmMgr.pickSsvmHost(store); - if (ssAhost == null) { + EndPoint ep = _epSelector.select(template); + if (ep == null) { s_logger.warn("There is no secondary storage VM for downloading template to image store " + store.getName()); return; } - DownloadListener dl = new DownloadListener(ssAhost, store, template, _timer, _vmTemplateStoreDao, vmTemplateStore.getId(), this, dcmd, - _templateDao, _resourceLimitMgr, _alertMgr, _accountMgr, callback); + DownloadListener dl = new DownloadListener(ep, store, template, _timer, this, dcmd, + callback); if (downloadJobExists) { // due to handling existing download job issues, we still keep // downloadState in template_store_ref to avoid big change in @@ -422,9 +370,9 @@ public class DownloadMonitorImpl extends ManagerBase implements DownloadMonitor } try { - send(ssAhost.getId(), dcmd, dl); - } catch (AgentUnavailableException e) { - s_logger.warn("Unable to start /resume download of template " + template.getUniqueName() + " to " + store.getName(), e); + ep.sendMessageAsyncWithListener(dcmd, dl); + } catch (Exception e) { + s_logger.warn("Unable to start /resume download of template " + template.getId() + " to " + store.getName(), e); dl.setDisconnected(); dl.scheduleStatusCheck(RequestType.GET_OR_RESTART); } @@ -433,7 +381,7 @@ public class DownloadMonitorImpl extends ManagerBase implements DownloadMonitor @Override - public void downloadBootstrapSysTemplateToStorage(VMTemplateVO template, DataStore store, AsyncCompletionCallback<CreateCmdResult> callback) { + public void downloadBootstrapSysTemplateToStorage(VMTemplateVO template, DataStore store, AsyncCompletionCallback<DownloadAnswer> callback) { boolean downloadJobExists = false; TemplateDataStoreVO vmTemplateStore = null; @@ -495,18 +443,18 @@ public class DownloadMonitorImpl extends ManagerBase implements DownloadMonitor } @Override - public void downloadTemplateToStorage(VMTemplateVO template, DataStore store, AsyncCompletionCallback<CreateCmdResult> callback) { + public void downloadTemplateToStorage(DataObject template, DataStore store, AsyncCompletionCallback<DownloadAnswer> callback) { long templateId = template.getId(); if (isTemplateUpdateable(templateId, store.getId())) { - if (template != null && template.getUrl() != null) { + if (template != null && template.getUri() != null) { initiateTemplateDownload(template, store, callback); } } } @Override - public void downloadVolumeToStorage(VolumeVO volume, DataStore store, String url, String checkSum, ImageFormat format, - AsyncCompletionCallback<CreateCmdResult> callback) { + public void downloadVolumeToStorage(DataObject volume, DataStore store, String url, String checkSum, ImageFormat format, + AsyncCompletionCallback<DownloadAnswer> callback) { boolean downloadJobExists = false; VolumeDataStoreVO volumeHost = null; @@ -523,20 +471,20 @@ public class DownloadMonitorImpl extends ManagerBase implements DownloadMonitor String secUrl = store.getUri(); if (volumeHost != null) { start(); - DownloadCommand dcmd = new DownloadCommand(secUrl, volume, maxVolumeSizeInBytes, checkSum, url, format); + Volume vol = this._volumeDao.findById(volume.getId()); + DownloadCommand dcmd = new DownloadCommand(secUrl, vol, maxVolumeSizeInBytes, checkSum, url, format); dcmd.setProxy(getHttpProxy()); if (downloadJobExists) { dcmd = new DownloadProgressCommand(dcmd, volumeHost.getJobId(), RequestType.GET_OR_RESTART); dcmd.setResourceType(ResourceType.VOLUME); } - HostVO ssAhost = _ssvmMgr.pickSsvmHost(store); - if (ssAhost == null) { + EndPoint ep = this._epSelector.select(volume); + if (ep == null) { s_logger.warn("There is no secondary storage VM for image store " + store.getName()); return; } - DownloadListener dl = new DownloadListener(ssAhost, store, volume, _timer, _volumeStoreDao, volumeHost.getId(), this, dcmd, _volumeDao, - _storageMgr, _resourceLimitMgr, _alertMgr, _accountMgr, callback); + DownloadListener dl = new DownloadListener(ep, store, volume, _timer, this, dcmd, callback); if (downloadJobExists) { dl.setCurrState(volumeHost.getDownloadState()); @@ -550,59 +498,26 @@ public class DownloadMonitorImpl extends ManagerBase implements DownloadMonitor } try { - send(ssAhost.getId(), dcmd, dl); - } catch (AgentUnavailableException e) { - s_logger.warn("Unable to start /resume download of volume " + volume.getName() + " to " + store.getName(), e); + ep.sendMessageAsyncWithListener(dcmd, dl); + } catch (Exception e) { + s_logger.warn("Unable to start /resume download of volume " + volume.getId() + " to " + store.getName(), e); dl.setDisconnected(); dl.scheduleStatusCheck(RequestType.GET_OR_RESTART); } } } - @DB - public void handleDownloadEvent(HostVO host, VMTemplateVO template, Status dnldStatus) { - if ((dnldStatus == VMTemplateStorageResourceAssoc.Status.DOWNLOADED) || (dnldStatus == Status.ABANDONED)) { - VMTemplateHostVO vmTemplateHost = new VMTemplateHostVO(host.getId(), template.getId()); - synchronized (_listenerMap) { - _listenerMap.remove(vmTemplateHost); - } - } - - VMTemplateHostVO vmTemplateHost = _vmTemplateHostDao.findByHostTemplate(host.getId(), template.getId()); - - Transaction txn = Transaction.currentTxn(); - txn.start(); - - if (dnldStatus == Status.DOWNLOADED) { - long size = -1; - if (vmTemplateHost != null) { - size = vmTemplateHost.getPhysicalSize(); - template.setSize(size); - this._templateDao.update(template.getId(), template); - } else { - s_logger.warn("Failed to get size for template" + template.getName()); - } - String eventType = EventTypes.EVENT_TEMPLATE_CREATE; - if ((template.getFormat()).equals(ImageFormat.ISO)) { - eventType = EventTypes.EVENT_ISO_CREATE; - } - if (template.getAccountId() != Account.ACCOUNT_ID_SYSTEM) { - UsageEventUtils.publishUsageEvent(eventType, template.getAccountId(), host.getDataCenterId(), template.getId(), template.getName(), - null, template.getSourceTemplateId(), size, template.getClass().getName(), template.getUuid()); - } - } - txn.commit(); - } @DB - public void handleDownloadEvent(HostVO host, VolumeVO volume, Status dnldStatus) { - if ((dnldStatus == VMTemplateStorageResourceAssoc.Status.DOWNLOADED) || (dnldStatus == Status.ABANDONED)) { + public void handleDownloadEvent(HostVO host, DataObject object, Status dnldStatus) { + /* if ((dnldStatus == VMTemplateStorageResourceAssoc.Status.DOWNLOADED) || (dnldStatus == Status.ABANDONED)) { VolumeHostVO volumeHost = new VolumeHostVO(host.getId(), volume.getId()); synchronized (_listenerVolumeMap) { _listenerVolumeMap.remove(volumeHost); } - } + }*/ + /* VolumeHostVO volumeHost = _volumeHostDao.findByHostVolume(host.getId(), volume.getId()); Transaction txn = Transaction.currentTxn(); @@ -631,6 +546,7 @@ public class DownloadMonitorImpl extends ManagerBase implements DownloadMonitor com.cloud.configuration.Resource.ResourceType.secondary_storage.getOrdinal()); } txn.commit(); + */ } /* @@ -657,7 +573,7 @@ public class DownloadMonitorImpl extends ManagerBase implements DownloadMonitor } */ - @Override + /*@Override public void cancelAllDownloads(Long templateId) { List<VMTemplateHostVO> downloadsInProgress = _vmTemplateHostDao.listByTemplateStates(templateId, VMTemplateHostVO.Status.DOWNLOAD_IN_PROGRESS, VMTemplateHostVO.Status.NOT_DOWNLOADED); @@ -673,7 +589,7 @@ public class DownloadMonitorImpl extends ManagerBase implements DownloadMonitor } } } - } + }*/ /* private void checksumSync(long hostId){ http://git-wip-us.apache.org/repos/asf/cloudstack/blob/abf40435/server/src/com/cloud/storage/download/DownloadState.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/storage/download/DownloadState.java b/server/src/com/cloud/storage/download/DownloadState.java index 471ab61..9d404f0 100644 --- a/server/src/com/cloud/storage/download/DownloadState.java +++ b/server/src/com/cloud/storage/download/DownloadState.java @@ -62,7 +62,7 @@ public abstract class DownloadState { getDownloadListener().log("onEntry, event type=" + event + ", curr state=" + getName(), Level.TRACE); } if (event==DownloadEvent.DOWNLOAD_ANSWER) { - getDownloadListener().updateDatabase((DownloadAnswer)evtObj); + getDownloadListener().callback((DownloadAnswer)evtObj); } } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/abf40435/server/src/com/cloud/storage/listener/StoragePoolMonitor.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/storage/listener/StoragePoolMonitor.java b/server/src/com/cloud/storage/listener/StoragePoolMonitor.java index e035fd7..8c89440 100755 --- a/server/src/com/cloud/storage/listener/StoragePoolMonitor.java +++ b/server/src/com/cloud/storage/listener/StoragePoolMonitor.java @@ -32,7 +32,7 @@ import com.cloud.agent.api.Command; import com.cloud.agent.api.StartupCommand; import com.cloud.agent.api.StartupRoutingCommand; import com.cloud.exception.ConnectionException; -import com.cloud.host.HostVO; +import com.cloud.host.Host; import com.cloud.host.Status; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.storage.OCFS2Manager; @@ -71,7 +71,7 @@ public class StoragePoolMonitor implements Listener { } @Override - public void processConnect(HostVO host, StartupCommand cmd, boolean forRebalance) throws ConnectionException { + public void processConnect(Host host, StartupCommand cmd, boolean forRebalance) throws ConnectionException { if (cmd instanceof StartupRoutingCommand) { StartupRoutingCommand scCmd = (StartupRoutingCommand)cmd; if (scCmd.getHypervisorType() == HypervisorType.XenServer || scCmd.getHypervisorType() == HypervisorType.KVM || http://git-wip-us.apache.org/repos/asf/cloudstack/blob/abf40435/server/src/com/cloud/storage/listener/StorageSyncListener.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/storage/listener/StorageSyncListener.java b/server/src/com/cloud/storage/listener/StorageSyncListener.java index d9282a3..5b7c7f7 100755 --- a/server/src/com/cloud/storage/listener/StorageSyncListener.java +++ b/server/src/com/cloud/storage/listener/StorageSyncListener.java @@ -24,7 +24,7 @@ import com.cloud.agent.api.AgentControlCommand; import com.cloud.agent.api.Answer; import com.cloud.agent.api.Command; import com.cloud.agent.api.StartupCommand; -import com.cloud.host.HostVO; +import com.cloud.host.Host; import com.cloud.host.Status; public class StorageSyncListener implements Listener { @@ -51,7 +51,7 @@ public class StorageSyncListener implements Listener { } @Override - public void processConnect(HostVO agent, StartupCommand cmd, boolean forRebalance) { + public void processConnect(Host agent, StartupCommand cmd, boolean forRebalance) { } @Override http://git-wip-us.apache.org/repos/asf/cloudstack/blob/abf40435/server/src/com/cloud/storage/secondary/SecondaryStorageListener.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/storage/secondary/SecondaryStorageListener.java b/server/src/com/cloud/storage/secondary/SecondaryStorageListener.java index 6635b3c..d524f29 100755 --- a/server/src/com/cloud/storage/secondary/SecondaryStorageListener.java +++ b/server/src/com/cloud/storage/secondary/SecondaryStorageListener.java @@ -27,7 +27,7 @@ import com.cloud.agent.api.Command; import com.cloud.agent.api.StartupCommand; import com.cloud.agent.api.StartupSecondaryStorageCommand; import com.cloud.agent.api.StartupStorageCommand; -import com.cloud.host.HostVO; +import com.cloud.host.Host; import com.cloud.host.Status; import com.cloud.storage.Storage; @@ -68,7 +68,7 @@ public class SecondaryStorageListener implements Listener { } @Override - public void processConnect(HostVO agent, StartupCommand cmd, boolean forRebalance) { + public void processConnect(Host agent, StartupCommand cmd, boolean forRebalance) { if ((cmd instanceof StartupStorageCommand) ) { StartupStorageCommand scmd = (StartupStorageCommand)cmd; if (scmd.getResourceType() == Storage.StorageResourceType.SECONDARY_STORAGE ) { http://git-wip-us.apache.org/repos/asf/cloudstack/blob/abf40435/server/src/com/cloud/storage/upload/UploadListener.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/storage/upload/UploadListener.java b/server/src/com/cloud/storage/upload/UploadListener.java index ee13cf9..891610f 100755 --- a/server/src/com/cloud/storage/upload/UploadListener.java +++ b/server/src/com/cloud/storage/upload/UploadListener.java @@ -47,6 +47,7 @@ import com.cloud.api.ApiDBUtils; import com.cloud.async.AsyncJobManager; import com.cloud.async.AsyncJobResult; import com.cloud.exception.AgentUnavailableException; +import com.cloud.host.Host; import com.cloud.host.HostVO; import com.cloud.storage.Storage; import com.cloud.storage.Upload.Status; @@ -248,7 +249,7 @@ public class UploadListener implements Listener { } @Override - public void processConnect(HostVO agent, StartupCommand cmd, boolean forRebalance) { + public void processConnect(Host agent, StartupCommand cmd, boolean forRebalance) { if (!(cmd instanceof StartupStorageCommand)) { return; } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/abf40435/server/src/com/cloud/template/HypervisorTemplateAdapter.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/template/HypervisorTemplateAdapter.java b/server/src/com/cloud/template/HypervisorTemplateAdapter.java index 34efdcb..cb0bee9 100755 --- a/server/src/com/cloud/template/HypervisorTemplateAdapter.java +++ b/server/src/com/cloud/template/HypervisorTemplateAdapter.java @@ -35,16 +35,21 @@ import org.apache.cloudstack.engine.subsystem.api.storage.CommandResult; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; import org.apache.cloudstack.engine.subsystem.api.storage.TemplateDataFactory; +import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo; import org.apache.cloudstack.engine.subsystem.api.storage.TemplateService; import org.apache.cloudstack.engine.subsystem.api.storage.TemplateService.TemplateApiResult; import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope; import org.apache.cloudstack.framework.async.AsyncCallFuture; +import org.apache.cloudstack.framework.async.AsyncCallbackDispatcher; +import org.apache.cloudstack.framework.async.AsyncCompletionCallback; +import org.apache.cloudstack.framework.async.AsyncRpcConext; import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO; import org.apache.log4j.Logger; import com.cloud.agent.AgentManager; import com.cloud.agent.api.Answer; import com.cloud.agent.api.storage.DeleteTemplateCommand; +import com.cloud.alert.AlertManager; import com.cloud.configuration.Resource.ResourceType; import com.cloud.dc.DataCenterVO; import com.cloud.event.EventTypes; @@ -80,6 +85,7 @@ public class HypervisorTemplateAdapter extends TemplateAdapterBase implements Te @Inject TemplateService imageService; @Inject TemplateDataFactory imageFactory; @Inject TemplateManager templateMgr; + @Inject AlertManager alertMgr; @Override public String getName() { @@ -181,23 +187,37 @@ public class HypervisorTemplateAdapter extends TemplateAdapterBase implements Te throw new CloudRuntimeException("Unable to find image store to download template "+ profile.getTemplate()); } for (DataStore imageStore : imageStores) { - AsyncCallFuture<TemplateApiResult> future = this.imageService - .createTemplateAsync(this.imageFactory.getTemplate(template.getId(), imageStore), imageStore); - try { - future.get(); - } catch (InterruptedException e) { - s_logger.debug("create template Failed", e); - throw new CloudRuntimeException("create template Failed", e); - } catch (ExecutionException e) { - s_logger.debug("create template Failed", e); - throw new CloudRuntimeException("create template Failed", e); - } + TemplateInfo tmpl = this.imageFactory.getTemplate(template.getId(), imageStore); + CreateTemplateContext<TemplateApiResult> context = new CreateTemplateContext<TemplateApiResult>(null, tmpl); + AsyncCallbackDispatcher<HypervisorTemplateAdapter, TemplateApiResult> caller = AsyncCallbackDispatcher.create(this); + caller.setCallback(this.createTemplateAsyncCallBack(null, null)); + caller.setContext(context); + this.imageService + .createTemplateAsync(tmpl, imageStore, caller); } _resourceLimitMgr.incrementResourceCount(profile.getAccountId(), ResourceType.template); - _resourceLimitMgr.incrementResourceCount(profile.getAccountId(), ResourceType.secondary_storage, - UriUtils.getRemoteSize(profile.getUrl())); + return template; } + + private class CreateTemplateContext<T> extends AsyncRpcConext<T> { + final TemplateInfo template; + public CreateTemplateContext(AsyncCompletionCallback<T> callback, TemplateInfo template) { + super(callback); + this.template = template; + } + } + + protected Void createTemplateAsyncCallBack(AsyncCallbackDispatcher<HypervisorTemplateAdapter, + TemplateApiResult> callback, CreateTemplateContext<TemplateApiResult> context) { + TemplateInfo template = context.template; + VMTemplateVO tmplt = this._tmpltDao.findById(template.getId()); + long accountId = tmplt.getAccountId(); + _resourceLimitMgr.incrementResourceCount(accountId, ResourceType.secondary_storage, + template.getSize()); + + return null; + } @Override @DB public boolean delete(TemplateProfile profile) { http://git-wip-us.apache.org/repos/asf/cloudstack/blob/abf40435/server/src/com/cloud/vm/VirtualMachineManagerImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java index af22716..ea20dd5 100755 --- a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java @@ -2285,7 +2285,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac } @Override - public void processConnect(HostVO agent, StartupCommand cmd, boolean forRebalance) throws ConnectionException { + public void processConnect(Host agent, StartupCommand cmd, boolean forRebalance) throws ConnectionException { if (!(cmd instanceof StartupRoutingCommand)) { return; }
