mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
CLOUDSTACK-5017: If SSVM is unavailable DownloadCommands will be routed
to mgmt server.
This commit is contained in:
parent
c2e2f6ce63
commit
6eecb0b3b5
@ -25,7 +25,6 @@ import javax.inject.Inject;
|
|||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import org.apache.cloudstack.engine.orchestration.service.VolumeOrchestrationService;
|
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.ClusterScope;
|
import org.apache.cloudstack.engine.subsystem.api.storage.ClusterScope;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
|
import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.DataMotionStrategy;
|
import org.apache.cloudstack.engine.subsystem.api.storage.DataMotionStrategy;
|
||||||
@ -46,10 +45,6 @@ import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope;
|
|||||||
import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
|
import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
|
||||||
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
|
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
|
||||||
import org.apache.cloudstack.storage.command.CopyCommand;
|
import org.apache.cloudstack.storage.command.CopyCommand;
|
||||||
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
|
|
||||||
import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao;
|
|
||||||
import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
|
|
||||||
import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao;
|
|
||||||
import org.apache.cloudstack.storage.image.datastore.ImageStoreEntity;
|
import org.apache.cloudstack.storage.image.datastore.ImageStoreEntity;
|
||||||
|
|
||||||
import com.cloud.agent.api.Answer;
|
import com.cloud.agent.api.Answer;
|
||||||
@ -62,19 +57,11 @@ import com.cloud.agent.api.to.NfsTO;
|
|||||||
import com.cloud.agent.api.to.VirtualMachineTO;
|
import com.cloud.agent.api.to.VirtualMachineTO;
|
||||||
import com.cloud.configuration.Config;
|
import com.cloud.configuration.Config;
|
||||||
import com.cloud.host.Host;
|
import com.cloud.host.Host;
|
||||||
import com.cloud.host.dao.HostDao;
|
|
||||||
import com.cloud.server.ManagementService;
|
import com.cloud.server.ManagementService;
|
||||||
import com.cloud.storage.DataStoreRole;
|
import com.cloud.storage.DataStoreRole;
|
||||||
import com.cloud.storage.StorageManager;
|
|
||||||
import com.cloud.storage.StoragePool;
|
import com.cloud.storage.StoragePool;
|
||||||
import com.cloud.storage.VolumeVO;
|
import com.cloud.storage.VolumeVO;
|
||||||
import com.cloud.storage.dao.DiskOfferingDao;
|
|
||||||
import com.cloud.storage.dao.SnapshotDao;
|
|
||||||
import com.cloud.storage.dao.VMTemplateDao;
|
|
||||||
import com.cloud.storage.dao.VMTemplatePoolDao;
|
|
||||||
import com.cloud.storage.dao.VolumeDao;
|
import com.cloud.storage.dao.VolumeDao;
|
||||||
import com.cloud.storage.snapshot.SnapshotManager;
|
|
||||||
import com.cloud.template.TemplateManager;
|
|
||||||
import com.cloud.utils.NumbersUtil;
|
import com.cloud.utils.NumbersUtil;
|
||||||
import com.cloud.utils.db.DB;
|
import com.cloud.utils.db.DB;
|
||||||
import com.cloud.utils.exception.CloudRuntimeException;
|
import com.cloud.utils.exception.CloudRuntimeException;
|
||||||
@ -177,7 +164,13 @@ AncientDataMotionStrategy implements DataMotionStrategy {
|
|||||||
|
|
||||||
CopyCommand cmd = new CopyCommand(srcForCopy.getTO(), destData.getTO(), _primaryStorageDownloadWait, _mgmtServer.getExecuteInSequence());
|
CopyCommand cmd = new CopyCommand(srcForCopy.getTO(), destData.getTO(), _primaryStorageDownloadWait, _mgmtServer.getExecuteInSequence());
|
||||||
EndPoint ep = selector.select(srcForCopy, destData);
|
EndPoint ep = selector.select(srcForCopy, destData);
|
||||||
answer = ep.sendMessage(cmd);
|
if (ep == null) {
|
||||||
|
String errMsg = "No remote endpoint to send command, check if host or ssvm is down?";
|
||||||
|
s_logger.error(errMsg);
|
||||||
|
answer = new Answer(cmd, false, errMsg);
|
||||||
|
} else {
|
||||||
|
answer = ep.sendMessage(cmd);
|
||||||
|
}
|
||||||
|
|
||||||
if (cacheData != null) {
|
if (cacheData != null) {
|
||||||
if (srcData.getType() == DataObjectType.VOLUME && destData.getType() == DataObjectType.VOLUME) {
|
if (srcData.getType() == DataObjectType.VOLUME && destData.getType() == DataObjectType.VOLUME) {
|
||||||
@ -255,7 +248,14 @@ AncientDataMotionStrategy implements DataMotionStrategy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
CopyCommand cmd = new CopyCommand(srcData.getTO(), volObj.getTO(), _createVolumeFromSnapshotWait, _mgmtServer.getExecuteInSequence());
|
CopyCommand cmd = new CopyCommand(srcData.getTO(), volObj.getTO(), _createVolumeFromSnapshotWait, _mgmtServer.getExecuteInSequence());
|
||||||
Answer answer = ep.sendMessage(cmd);
|
Answer answer = null;
|
||||||
|
if (ep == null) {
|
||||||
|
String errMsg = "No remote endpoint to send command, check if host or ssvm is down?";
|
||||||
|
s_logger.error(errMsg);
|
||||||
|
answer = new Answer(cmd, false, errMsg);
|
||||||
|
} else {
|
||||||
|
answer = ep.sendMessage(cmd);
|
||||||
|
}
|
||||||
|
|
||||||
return answer;
|
return answer;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
@ -273,7 +273,14 @@ AncientDataMotionStrategy implements DataMotionStrategy {
|
|||||||
CopyCommand cmd = new CopyCommand(template.getTO(), volume.getTO(), 0, _mgmtServer.getExecuteInSequence());
|
CopyCommand cmd = new CopyCommand(template.getTO(), volume.getTO(), 0, _mgmtServer.getExecuteInSequence());
|
||||||
try {
|
try {
|
||||||
EndPoint ep = selector.select(volume.getDataStore());
|
EndPoint ep = selector.select(volume.getDataStore());
|
||||||
Answer answer = ep.sendMessage(cmd);
|
Answer answer = null;
|
||||||
|
if (ep == null) {
|
||||||
|
String errMsg = "No remote endpoint to send command, check if host or ssvm is down?";
|
||||||
|
s_logger.error(errMsg);
|
||||||
|
answer = new Answer(cmd, false, errMsg);
|
||||||
|
} else {
|
||||||
|
answer = ep.sendMessage(cmd);
|
||||||
|
}
|
||||||
return answer;
|
return answer;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
s_logger.debug("Failed to send to storage pool", e);
|
s_logger.debug("Failed to send to storage pool", e);
|
||||||
@ -315,7 +322,13 @@ AncientDataMotionStrategy implements DataMotionStrategy {
|
|||||||
|
|
||||||
CopyCommand cmd = new CopyCommand(objOnImageStore.getTO(), destData.getTO(), _copyvolumewait, _mgmtServer.getExecuteInSequence());
|
CopyCommand cmd = new CopyCommand(objOnImageStore.getTO(), destData.getTO(), _copyvolumewait, _mgmtServer.getExecuteInSequence());
|
||||||
EndPoint ep = selector.select(objOnImageStore, destData);
|
EndPoint ep = selector.select(objOnImageStore, destData);
|
||||||
answer = ep.sendMessage(cmd);
|
if (ep == null) {
|
||||||
|
String errMsg = "No remote endpoint to send command, check if host or ssvm is down?";
|
||||||
|
s_logger.error(errMsg);
|
||||||
|
answer = new Answer(cmd, false, errMsg);
|
||||||
|
} else {
|
||||||
|
answer = ep.sendMessage(cmd);
|
||||||
|
}
|
||||||
|
|
||||||
if (answer == null || !answer.getResult()) {
|
if (answer == null || !answer.getResult()) {
|
||||||
if (answer != null) {
|
if (answer != null) {
|
||||||
@ -333,7 +346,14 @@ AncientDataMotionStrategy implements DataMotionStrategy {
|
|||||||
DataObject cacheData = cacheMgr.createCacheObject(srcData, destScope);
|
DataObject cacheData = cacheMgr.createCacheObject(srcData, destScope);
|
||||||
CopyCommand cmd = new CopyCommand(cacheData.getTO(), destData.getTO(), _copyvolumewait, _mgmtServer.getExecuteInSequence());
|
CopyCommand cmd = new CopyCommand(cacheData.getTO(), destData.getTO(), _copyvolumewait, _mgmtServer.getExecuteInSequence());
|
||||||
EndPoint ep = selector.select(cacheData, destData);
|
EndPoint ep = selector.select(cacheData, destData);
|
||||||
Answer answer = ep.sendMessage(cmd);
|
Answer answer = null;
|
||||||
|
if (ep == null) {
|
||||||
|
String errMsg = "No remote endpoint to send command, check if host or ssvm is down?";
|
||||||
|
s_logger.error(errMsg);
|
||||||
|
answer = new Answer(cmd, false, errMsg);
|
||||||
|
} else {
|
||||||
|
answer = ep.sendMessage(cmd);
|
||||||
|
}
|
||||||
// delete volume on cache store
|
// delete volume on cache store
|
||||||
if (cacheData != null) {
|
if (cacheData != null) {
|
||||||
cacheMgr.deleteCacheObject(cacheData);
|
cacheMgr.deleteCacheObject(cacheData);
|
||||||
@ -348,7 +368,14 @@ AncientDataMotionStrategy implements DataMotionStrategy {
|
|||||||
StoragePool destPool = (StoragePool)dataStoreMgr.getDataStore(destData.getDataStore().getId(), DataStoreRole.Primary);
|
StoragePool destPool = (StoragePool)dataStoreMgr.getDataStore(destData.getDataStore().getId(), DataStoreRole.Primary);
|
||||||
MigrateVolumeCommand command = new MigrateVolumeCommand(volume.getId(), volume.getPath(), destPool);
|
MigrateVolumeCommand command = new MigrateVolumeCommand(volume.getId(), volume.getPath(), destPool);
|
||||||
EndPoint ep = selector.select(volume.getDataStore());
|
EndPoint ep = selector.select(volume.getDataStore());
|
||||||
MigrateVolumeAnswer answer = (MigrateVolumeAnswer) ep.sendMessage(command);
|
Answer answer = null;
|
||||||
|
if (ep == null) {
|
||||||
|
String errMsg = "No remote endpoint to send command, check if host or ssvm is down?";
|
||||||
|
s_logger.error(errMsg);
|
||||||
|
answer = new Answer(command, false, errMsg);
|
||||||
|
} else {
|
||||||
|
answer = ep.sendMessage(command);
|
||||||
|
}
|
||||||
|
|
||||||
if (answer == null || !answer.getResult()) {
|
if (answer == null || !answer.getResult()) {
|
||||||
throw new CloudRuntimeException("Failed to migrate volume " + volume + " to storage pool " + destPool);
|
throw new CloudRuntimeException("Failed to migrate volume " + volume + " to storage pool " + destPool);
|
||||||
@ -356,7 +383,7 @@ AncientDataMotionStrategy implements DataMotionStrategy {
|
|||||||
// Update the volume details after migration.
|
// Update the volume details after migration.
|
||||||
VolumeVO volumeVo = volDao.findById(volume.getId());
|
VolumeVO volumeVo = volDao.findById(volume.getId());
|
||||||
Long oldPoolId = volume.getPoolId();
|
Long oldPoolId = volume.getPoolId();
|
||||||
volumeVo.setPath(answer.getVolumePath());
|
volumeVo.setPath(((MigrateVolumeAnswer)answer).getVolumePath());
|
||||||
volumeVo.setFolder(destPool.getPath());
|
volumeVo.setFolder(destPool.getPath());
|
||||||
volumeVo.setPodId(destPool.getPodId());
|
volumeVo.setPodId(destPool.getPodId());
|
||||||
volumeVo.setPoolId(destPool.getId());
|
volumeVo.setPoolId(destPool.getId());
|
||||||
@ -431,7 +458,14 @@ AncientDataMotionStrategy implements DataMotionStrategy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
CopyCommand cmd = new CopyCommand(srcData.getTO(), destData.getTO(), _createprivatetemplatefromsnapshotwait, _mgmtServer.getExecuteInSequence());
|
CopyCommand cmd = new CopyCommand(srcData.getTO(), destData.getTO(), _createprivatetemplatefromsnapshotwait, _mgmtServer.getExecuteInSequence());
|
||||||
Answer answer = ep.sendMessage(cmd);
|
Answer answer = null;
|
||||||
|
if (ep == null) {
|
||||||
|
String errMsg = "No remote endpoint to send command, check if host or ssvm is down?";
|
||||||
|
s_logger.error(errMsg);
|
||||||
|
answer = new Answer(cmd, false, errMsg);
|
||||||
|
} else {
|
||||||
|
answer = ep.sendMessage(cmd);
|
||||||
|
}
|
||||||
|
|
||||||
// clean up snapshot copied to staging
|
// clean up snapshot copied to staging
|
||||||
if (needCache && srcData != null) {
|
if (needCache && srcData != null) {
|
||||||
@ -455,11 +489,23 @@ AncientDataMotionStrategy implements DataMotionStrategy {
|
|||||||
CopyCommand cmd = new CopyCommand(srcData.getTO(), destData.getTO(), _backupsnapshotwait, _mgmtServer.getExecuteInSequence());
|
CopyCommand cmd = new CopyCommand(srcData.getTO(), destData.getTO(), _backupsnapshotwait, _mgmtServer.getExecuteInSequence());
|
||||||
cmd.setCacheTO(cacheData.getTO());
|
cmd.setCacheTO(cacheData.getTO());
|
||||||
EndPoint ep = selector.select(srcData, destData);
|
EndPoint ep = selector.select(srcData, destData);
|
||||||
answer = ep.sendMessage(cmd);
|
if (ep == null) {
|
||||||
|
String errMsg = "No remote endpoint to send command, check if host or ssvm is down?";
|
||||||
|
s_logger.error(errMsg);
|
||||||
|
answer = new Answer(cmd, false, errMsg);
|
||||||
|
} else {
|
||||||
|
answer = ep.sendMessage(cmd);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
CopyCommand cmd = new CopyCommand(srcData.getTO(), destData.getTO(), _backupsnapshotwait, _mgmtServer.getExecuteInSequence());
|
CopyCommand cmd = new CopyCommand(srcData.getTO(), destData.getTO(), _backupsnapshotwait, _mgmtServer.getExecuteInSequence());
|
||||||
EndPoint ep = selector.select(srcData, destData);
|
EndPoint ep = selector.select(srcData, destData);
|
||||||
answer = ep.sendMessage(cmd);
|
if (ep == null) {
|
||||||
|
String errMsg = "No remote endpoint to send command, check if host or ssvm is down?";
|
||||||
|
s_logger.error(errMsg);
|
||||||
|
answer = new Answer(cmd, false, errMsg);
|
||||||
|
} else {
|
||||||
|
answer = ep.sendMessage(cmd);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// clean up cache entry in case of failure
|
// clean up cache entry in case of failure
|
||||||
if (answer == null || !answer.getResult()) {
|
if (answer == null || !answer.getResult()) {
|
||||||
|
|||||||
@ -441,7 +441,14 @@ public class TemplateServiceImpl implements TemplateService {
|
|||||||
tmplTO.setId(tInfo.getId());
|
tmplTO.setId(tInfo.getId());
|
||||||
DeleteCommand dtCommand = new DeleteCommand(tmplTO);
|
DeleteCommand dtCommand = new DeleteCommand(tmplTO);
|
||||||
EndPoint ep = _epSelector.select(store);
|
EndPoint ep = _epSelector.select(store);
|
||||||
Answer answer = ep.sendMessage(dtCommand);
|
Answer answer = null;
|
||||||
|
if (ep == null) {
|
||||||
|
String errMsg = "No remote endpoint to send command, check if host or ssvm is down?";
|
||||||
|
s_logger.error(errMsg);
|
||||||
|
answer = new Answer(dtCommand, false, errMsg);
|
||||||
|
} else {
|
||||||
|
answer = ep.sendMessage(dtCommand);
|
||||||
|
}
|
||||||
if (answer == null || !answer.getResult()) {
|
if (answer == null || !answer.getResult()) {
|
||||||
s_logger.info("Failed to deleted template at store: " + store.getName());
|
s_logger.info("Failed to deleted template at store: " + store.getName());
|
||||||
|
|
||||||
@ -513,7 +520,14 @@ public class TemplateServiceImpl implements TemplateService {
|
|||||||
private Map<String, TemplateProp> listTemplate(DataStore ssStore) {
|
private Map<String, TemplateProp> listTemplate(DataStore ssStore) {
|
||||||
ListTemplateCommand cmd = new ListTemplateCommand(ssStore.getTO());
|
ListTemplateCommand cmd = new ListTemplateCommand(ssStore.getTO());
|
||||||
EndPoint ep = _epSelector.select(ssStore);
|
EndPoint ep = _epSelector.select(ssStore);
|
||||||
Answer answer = ep.sendMessage(cmd);
|
Answer answer = null;
|
||||||
|
if (ep == null) {
|
||||||
|
String errMsg = "No remote endpoint to send command, check if host or ssvm is down?";
|
||||||
|
s_logger.error(errMsg);
|
||||||
|
answer = new Answer(cmd, false, errMsg);
|
||||||
|
} else {
|
||||||
|
answer = ep.sendMessage(cmd);
|
||||||
|
}
|
||||||
if (answer != null && answer.getResult()) {
|
if (answer != null && answer.getResult()) {
|
||||||
ListTemplateAnswer tanswer = (ListTemplateAnswer) answer;
|
ListTemplateAnswer tanswer = (ListTemplateAnswer) answer;
|
||||||
return tanswer.getTemplateInfo();
|
return tanswer.getTemplateInfo();
|
||||||
|
|||||||
@ -27,15 +27,17 @@ import java.util.List;
|
|||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
|
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.DataStore;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
|
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.EndPointSelector;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.Scope;
|
import org.apache.cloudstack.engine.subsystem.api.storage.Scope;
|
||||||
|
import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo;
|
||||||
import org.apache.cloudstack.storage.LocalHostEndpoint;
|
import org.apache.cloudstack.storage.LocalHostEndpoint;
|
||||||
import org.apache.cloudstack.storage.RemoteHostEndPoint;
|
import org.apache.cloudstack.storage.RemoteHostEndPoint;
|
||||||
import org.apache.log4j.Logger;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
import com.cloud.host.Host;
|
import com.cloud.host.Host;
|
||||||
import com.cloud.host.HostVO;
|
import com.cloud.host.HostVO;
|
||||||
@ -43,10 +45,10 @@ import com.cloud.host.Status;
|
|||||||
import com.cloud.host.dao.HostDao;
|
import com.cloud.host.dao.HostDao;
|
||||||
import com.cloud.storage.DataStoreRole;
|
import com.cloud.storage.DataStoreRole;
|
||||||
import com.cloud.storage.ScopeType;
|
import com.cloud.storage.ScopeType;
|
||||||
|
import com.cloud.storage.Storage.TemplateType;
|
||||||
import com.cloud.utils.db.DB;
|
import com.cloud.utils.db.DB;
|
||||||
import com.cloud.utils.db.QueryBuilder;
|
import com.cloud.utils.db.QueryBuilder;
|
||||||
import com.cloud.utils.db.SearchCriteria.Op;
|
import com.cloud.utils.db.SearchCriteria.Op;
|
||||||
import com.cloud.utils.db.Transaction;
|
|
||||||
import com.cloud.utils.db.TransactionLegacy;
|
import com.cloud.utils.db.TransactionLegacy;
|
||||||
import com.cloud.utils.exception.CloudRuntimeException;
|
import com.cloud.utils.exception.CloudRuntimeException;
|
||||||
|
|
||||||
@ -209,9 +211,7 @@ public class DefaultEndPointSelector implements EndPointSelector {
|
|||||||
// we can arbitrarily pick one ssvm to do that task
|
// we can arbitrarily pick one ssvm to do that task
|
||||||
List<HostVO> ssAHosts = listUpAndConnectingSecondaryStorageVmHost(dcId);
|
List<HostVO> ssAHosts = listUpAndConnectingSecondaryStorageVmHost(dcId);
|
||||||
if (ssAHosts == null || ssAHosts.isEmpty()) {
|
if (ssAHosts == null || ssAHosts.isEmpty()) {
|
||||||
s_logger.info("No running ssvm is found, so command will be sent to LocalHostEndPoint");
|
return null;
|
||||||
return LocalHostEndpoint.getEndpoint(); // use local host as endpoint in
|
|
||||||
// case of no ssvm existing
|
|
||||||
}
|
}
|
||||||
Collections.shuffle(ssAHosts);
|
Collections.shuffle(ssAHosts);
|
||||||
HostVO host = ssAHosts.get(0);
|
HostVO host = ssAHosts.get(0);
|
||||||
@ -232,7 +232,16 @@ public class DefaultEndPointSelector implements EndPointSelector {
|
|||||||
@Override
|
@Override
|
||||||
public EndPoint select(DataObject object) {
|
public EndPoint select(DataObject object) {
|
||||||
DataStore store = object.getDataStore();
|
DataStore store = object.getDataStore();
|
||||||
return select(store);
|
EndPoint ep = select(store);
|
||||||
|
if (ep != null)
|
||||||
|
return ep;
|
||||||
|
if (object instanceof TemplateInfo) {
|
||||||
|
TemplateInfo tmplInfo = (TemplateInfo)object;
|
||||||
|
if (store.getScope().getScopeType() == ScopeType.ZONE && store.getScope().getScopeId() == null && tmplInfo.getTemplateType() == TemplateType.SYSTEM) {
|
||||||
|
return LocalHostEndpoint.getEndpoint(); // for bootstrap system vm template downloading to region image store
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@ -23,6 +23,8 @@ import java.util.UUID;
|
|||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
|
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.EndPointSelector;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.Scope;
|
import org.apache.cloudstack.engine.subsystem.api.storage.Scope;
|
||||||
@ -32,7 +34,6 @@ import org.apache.cloudstack.storage.command.IntroduceObjectAnswer;
|
|||||||
import org.apache.cloudstack.storage.command.IntroduceObjectCmd;
|
import org.apache.cloudstack.storage.command.IntroduceObjectCmd;
|
||||||
import org.apache.cloudstack.storage.vmsnapshot.VMSnapshotHelper;
|
import org.apache.cloudstack.storage.vmsnapshot.VMSnapshotHelper;
|
||||||
import org.apache.cloudstack.storage.to.VolumeObjectTO;
|
import org.apache.cloudstack.storage.to.VolumeObjectTO;
|
||||||
import org.apache.log4j.Logger;
|
|
||||||
|
|
||||||
import com.cloud.agent.AgentManager;
|
import com.cloud.agent.AgentManager;
|
||||||
import com.cloud.agent.api.Answer;
|
import com.cloud.agent.api.Answer;
|
||||||
@ -66,7 +67,14 @@ public class HypervisorHelperImpl implements HypervisorHelper {
|
|||||||
public DataTO introduceObject(DataTO object, Scope scope, Long storeId) {
|
public DataTO introduceObject(DataTO object, Scope scope, Long storeId) {
|
||||||
EndPoint ep = selector.select(scope, storeId);
|
EndPoint ep = selector.select(scope, storeId);
|
||||||
IntroduceObjectCmd cmd = new IntroduceObjectCmd(object);
|
IntroduceObjectCmd cmd = new IntroduceObjectCmd(object);
|
||||||
Answer answer = ep.sendMessage(cmd);
|
Answer answer = null;
|
||||||
|
if (ep == null) {
|
||||||
|
String errMsg = "No remote endpoint to send command, check if host or ssvm is down?";
|
||||||
|
s_logger.error(errMsg);
|
||||||
|
answer = new Answer(cmd, false, errMsg);
|
||||||
|
} else {
|
||||||
|
answer = ep.sendMessage(cmd);
|
||||||
|
}
|
||||||
if (answer == null || !answer.getResult()) {
|
if (answer == null || !answer.getResult()) {
|
||||||
String errMsg = answer == null ? null : answer.getDetails();
|
String errMsg = answer == null ? null : answer.getDetails();
|
||||||
throw new CloudRuntimeException("Failed to introduce object, due to " + errMsg);
|
throw new CloudRuntimeException("Failed to introduce object, due to " + errMsg);
|
||||||
@ -79,7 +87,14 @@ public class HypervisorHelperImpl implements HypervisorHelper {
|
|||||||
public boolean forgetObject(DataTO object, Scope scope, Long storeId) {
|
public boolean forgetObject(DataTO object, Scope scope, Long storeId) {
|
||||||
EndPoint ep = selector.select(scope, storeId);
|
EndPoint ep = selector.select(scope, storeId);
|
||||||
ForgetObjectCmd cmd = new ForgetObjectCmd(object);
|
ForgetObjectCmd cmd = new ForgetObjectCmd(object);
|
||||||
Answer answer = ep.sendMessage(cmd);
|
Answer answer = null;
|
||||||
|
if (ep == null) {
|
||||||
|
String errMsg = "No remote endpoint to send command, check if host or ssvm is down?";
|
||||||
|
s_logger.error(errMsg);
|
||||||
|
answer = new Answer(cmd, false, errMsg);
|
||||||
|
} else {
|
||||||
|
answer = ep.sendMessage(cmd);
|
||||||
|
}
|
||||||
if (answer == null || !answer.getResult()) {
|
if (answer == null || !answer.getResult()) {
|
||||||
String errMsg = answer == null ? null : answer.getDetails();
|
String errMsg = answer == null ? null : answer.getDetails();
|
||||||
if (errMsg != null) {
|
if (errMsg != null) {
|
||||||
|
|||||||
@ -18,17 +18,13 @@
|
|||||||
*/
|
*/
|
||||||
package org.apache.cloudstack.storage.image;
|
package org.apache.cloudstack.storage.image;
|
||||||
|
|
||||||
import com.cloud.agent.api.Answer;
|
import java.net.URI;
|
||||||
import com.cloud.agent.api.storage.DownloadAnswer;
|
import java.net.URISyntaxException;
|
||||||
import com.cloud.agent.api.storage.Proxy;
|
import java.util.Date;
|
||||||
import com.cloud.agent.api.to.DataObjectType;
|
|
||||||
import com.cloud.agent.api.to.DataTO;
|
import javax.inject.Inject;
|
||||||
import com.cloud.storage.VMTemplateStorageResourceAssoc;
|
|
||||||
import com.cloud.storage.VMTemplateVO;
|
import org.apache.log4j.Logger;
|
||||||
import com.cloud.storage.VolumeVO;
|
|
||||||
import com.cloud.storage.dao.VMTemplateDao;
|
|
||||||
import com.cloud.storage.dao.VolumeDao;
|
|
||||||
import com.cloud.storage.download.DownloadMonitor;
|
|
||||||
|
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
|
import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult;
|
import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult;
|
||||||
@ -47,13 +43,17 @@ import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO;
|
|||||||
import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao;
|
import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao;
|
||||||
import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreVO;
|
import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreVO;
|
||||||
|
|
||||||
import org.apache.log4j.Logger;
|
import com.cloud.agent.api.Answer;
|
||||||
|
import com.cloud.agent.api.storage.DownloadAnswer;
|
||||||
import javax.inject.Inject;
|
import com.cloud.agent.api.storage.Proxy;
|
||||||
|
import com.cloud.agent.api.to.DataObjectType;
|
||||||
import java.net.URI;
|
import com.cloud.agent.api.to.DataTO;
|
||||||
import java.net.URISyntaxException;
|
import com.cloud.storage.VMTemplateStorageResourceAssoc;
|
||||||
import java.util.Date;
|
import com.cloud.storage.VMTemplateVO;
|
||||||
|
import com.cloud.storage.VolumeVO;
|
||||||
|
import com.cloud.storage.dao.VMTemplateDao;
|
||||||
|
import com.cloud.storage.dao.VolumeDao;
|
||||||
|
import com.cloud.storage.download.DownloadMonitor;
|
||||||
|
|
||||||
public abstract class BaseImageStoreDriverImpl implements ImageStoreDriver {
|
public abstract class BaseImageStoreDriverImpl implements ImageStoreDriver {
|
||||||
private static final Logger s_logger = Logger.getLogger(BaseImageStoreDriverImpl.class);
|
private static final Logger s_logger = Logger.getLogger(BaseImageStoreDriverImpl.class);
|
||||||
@ -239,7 +239,14 @@ public abstract class BaseImageStoreDriverImpl implements ImageStoreDriver {
|
|||||||
try {
|
try {
|
||||||
DeleteCommand cmd = new DeleteCommand(data.getTO());
|
DeleteCommand cmd = new DeleteCommand(data.getTO());
|
||||||
EndPoint ep = _epSelector.select(data);
|
EndPoint ep = _epSelector.select(data);
|
||||||
Answer answer = ep.sendMessage(cmd);
|
Answer answer = null;
|
||||||
|
if (ep == null) {
|
||||||
|
String errMsg = "No remote endpoint to send command, check if host or ssvm is down?";
|
||||||
|
s_logger.error(errMsg);
|
||||||
|
answer = new Answer(cmd, false, errMsg);
|
||||||
|
} else {
|
||||||
|
answer = ep.sendMessage(cmd);
|
||||||
|
}
|
||||||
if (answer != null && !answer.getResult()) {
|
if (answer != null && !answer.getResult()) {
|
||||||
result.setResult(answer.getDetails());
|
result.setResult(answer.getDetails());
|
||||||
}
|
}
|
||||||
|
|||||||
@ -18,37 +18,16 @@
|
|||||||
*/
|
*/
|
||||||
package org.apache.cloudstack.storage.volume;
|
package org.apache.cloudstack.storage.volume;
|
||||||
|
|
||||||
import com.cloud.agent.api.Answer;
|
import java.util.ArrayList;
|
||||||
import com.cloud.agent.api.storage.ListVolumeAnswer;
|
import java.util.Date;
|
||||||
import com.cloud.agent.api.storage.ListVolumeCommand;
|
import java.util.List;
|
||||||
import com.cloud.agent.api.to.VirtualMachineTO;
|
import java.util.Map;
|
||||||
import com.cloud.alert.AlertManager;
|
|
||||||
import com.cloud.configuration.Config;
|
import javax.inject.Inject;
|
||||||
import com.cloud.configuration.Resource.ResourceType;
|
|
||||||
import com.cloud.event.EventTypes;
|
import org.apache.log4j.Logger;
|
||||||
import com.cloud.event.UsageEventUtils;
|
import org.springframework.stereotype.Component;
|
||||||
import com.cloud.exception.ConcurrentOperationException;
|
|
||||||
import com.cloud.exception.ResourceAllocationException;
|
|
||||||
import com.cloud.host.Host;
|
|
||||||
import com.cloud.storage.DataStoreRole;
|
|
||||||
import com.cloud.storage.ScopeType;
|
|
||||||
import com.cloud.storage.StoragePool;
|
|
||||||
import com.cloud.storage.VMTemplateStoragePoolVO;
|
|
||||||
import com.cloud.storage.VMTemplateStorageResourceAssoc;
|
|
||||||
import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
|
|
||||||
import com.cloud.storage.Volume;
|
|
||||||
import com.cloud.storage.Volume.State;
|
|
||||||
import com.cloud.storage.VolumeVO;
|
|
||||||
import com.cloud.storage.dao.VMTemplatePoolDao;
|
|
||||||
import com.cloud.storage.dao.VolumeDao;
|
|
||||||
import com.cloud.storage.snapshot.SnapshotManager;
|
|
||||||
import com.cloud.storage.template.TemplateProp;
|
|
||||||
import com.cloud.user.AccountManager;
|
|
||||||
import com.cloud.user.ResourceLimitService;
|
|
||||||
import com.cloud.utils.NumbersUtil;
|
|
||||||
import com.cloud.utils.db.DB;
|
|
||||||
import com.cloud.utils.db.GlobalLock;
|
|
||||||
import com.cloud.utils.exception.CloudRuntimeException;
|
|
||||||
import org.apache.cloudstack.engine.cloud.entity.api.VolumeEntity;
|
import org.apache.cloudstack.engine.cloud.entity.api.VolumeEntity;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.ChapInfo;
|
import org.apache.cloudstack.engine.subsystem.api.storage.ChapInfo;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
|
import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
|
||||||
@ -81,14 +60,38 @@ import org.apache.cloudstack.storage.datastore.PrimaryDataStoreProviderManager;
|
|||||||
import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao;
|
import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao;
|
||||||
import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreVO;
|
import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreVO;
|
||||||
import org.apache.cloudstack.storage.to.VolumeObjectTO;
|
import org.apache.cloudstack.storage.to.VolumeObjectTO;
|
||||||
import org.apache.log4j.Logger;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import com.cloud.agent.api.Answer;
|
||||||
import java.util.ArrayList;
|
import com.cloud.agent.api.storage.ListVolumeAnswer;
|
||||||
import java.util.Date;
|
import com.cloud.agent.api.storage.ListVolumeCommand;
|
||||||
import java.util.List;
|
import com.cloud.agent.api.to.VirtualMachineTO;
|
||||||
import java.util.Map;
|
import com.cloud.alert.AlertManager;
|
||||||
|
import com.cloud.configuration.Config;
|
||||||
|
import com.cloud.configuration.Resource.ResourceType;
|
||||||
|
import com.cloud.event.EventTypes;
|
||||||
|
import com.cloud.event.UsageEventUtils;
|
||||||
|
import com.cloud.exception.ConcurrentOperationException;
|
||||||
|
import com.cloud.exception.ResourceAllocationException;
|
||||||
|
import com.cloud.host.Host;
|
||||||
|
import com.cloud.storage.DataStoreRole;
|
||||||
|
import com.cloud.storage.ScopeType;
|
||||||
|
import com.cloud.storage.StoragePool;
|
||||||
|
import com.cloud.storage.VMTemplateStoragePoolVO;
|
||||||
|
import com.cloud.storage.VMTemplateStorageResourceAssoc;
|
||||||
|
import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
|
||||||
|
import com.cloud.storage.Volume;
|
||||||
|
import com.cloud.storage.Volume.State;
|
||||||
|
import com.cloud.storage.VolumeVO;
|
||||||
|
import com.cloud.storage.dao.VMTemplatePoolDao;
|
||||||
|
import com.cloud.storage.dao.VolumeDao;
|
||||||
|
import com.cloud.storage.snapshot.SnapshotManager;
|
||||||
|
import com.cloud.storage.template.TemplateProp;
|
||||||
|
import com.cloud.user.AccountManager;
|
||||||
|
import com.cloud.user.ResourceLimitService;
|
||||||
|
import com.cloud.utils.NumbersUtil;
|
||||||
|
import com.cloud.utils.db.DB;
|
||||||
|
import com.cloud.utils.db.GlobalLock;
|
||||||
|
import com.cloud.utils.exception.CloudRuntimeException;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
public class VolumeServiceImpl implements VolumeService {
|
public class VolumeServiceImpl implements VolumeService {
|
||||||
@ -1255,7 +1258,14 @@ public class VolumeServiceImpl implements VolumeService {
|
|||||||
tmplTO.setId(tInfo.getId());
|
tmplTO.setId(tInfo.getId());
|
||||||
DeleteCommand dtCommand = new DeleteCommand(tmplTO);
|
DeleteCommand dtCommand = new DeleteCommand(tmplTO);
|
||||||
EndPoint ep = _epSelector.select(store);
|
EndPoint ep = _epSelector.select(store);
|
||||||
Answer answer = ep.sendMessage(dtCommand);
|
Answer answer = null;
|
||||||
|
if (ep == null) {
|
||||||
|
String errMsg = "No remote endpoint to send command, check if host or ssvm is down?";
|
||||||
|
s_logger.error(errMsg);
|
||||||
|
answer = new Answer(dtCommand, false, errMsg);
|
||||||
|
} else {
|
||||||
|
answer = ep.sendMessage(dtCommand);
|
||||||
|
}
|
||||||
if (answer == null || !answer.getResult()) {
|
if (answer == null || !answer.getResult()) {
|
||||||
s_logger.info("Failed to deleted volume at store: " + store.getName());
|
s_logger.info("Failed to deleted volume at store: " + store.getName());
|
||||||
|
|
||||||
@ -1280,7 +1290,14 @@ public class VolumeServiceImpl implements VolumeService {
|
|||||||
private Map<Long, TemplateProp> listVolume(DataStore store) {
|
private Map<Long, TemplateProp> listVolume(DataStore store) {
|
||||||
ListVolumeCommand cmd = new ListVolumeCommand(store.getTO(), store.getUri());
|
ListVolumeCommand cmd = new ListVolumeCommand(store.getTO(), store.getUri());
|
||||||
EndPoint ep = _epSelector.select(store);
|
EndPoint ep = _epSelector.select(store);
|
||||||
Answer answer = ep.sendMessage(cmd);
|
Answer answer = null;
|
||||||
|
if (ep == null) {
|
||||||
|
String errMsg = "No remote endpoint to send command, check if host or ssvm is down?";
|
||||||
|
s_logger.error(errMsg);
|
||||||
|
answer = new Answer(cmd, false, errMsg);
|
||||||
|
} else {
|
||||||
|
answer = ep.sendMessage(cmd);
|
||||||
|
}
|
||||||
if (answer != null && answer.getResult()) {
|
if (answer != null && answer.getResult()) {
|
||||||
ListVolumeAnswer tanswer = (ListVolumeAnswer) answer;
|
ListVolumeAnswer tanswer = (ListVolumeAnswer) answer;
|
||||||
return tanswer.getTemplateInfo();
|
return tanswer.getTemplateInfo();
|
||||||
|
|||||||
@ -20,14 +20,12 @@
|
|||||||
package org.apache.cloudstack.storage.datastore.driver;
|
package org.apache.cloudstack.storage.datastore.driver;
|
||||||
|
|
||||||
|
|
||||||
import com.cloud.agent.api.storage.DownloadAnswer;
|
import java.util.UUID;
|
||||||
import com.cloud.agent.api.to.DataObjectType;
|
|
||||||
import com.cloud.agent.api.to.DataStoreTO;
|
import javax.inject.Inject;
|
||||||
import com.cloud.agent.api.to.NfsTO;
|
|
||||||
import com.cloud.storage.Storage;
|
import org.apache.log4j.Logger;
|
||||||
import com.cloud.storage.VMTemplateStorageResourceAssoc;
|
|
||||||
import com.cloud.storage.dao.VMTemplateDao;
|
|
||||||
import com.cloud.storage.dao.VolumeDao;
|
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult;
|
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.DataObject;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
|
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
|
||||||
@ -39,10 +37,15 @@ import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
|
|||||||
import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao;
|
import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao;
|
||||||
import org.apache.cloudstack.storage.image.BaseImageStoreDriverImpl;
|
import org.apache.cloudstack.storage.image.BaseImageStoreDriverImpl;
|
||||||
import org.apache.cloudstack.storage.image.store.ImageStoreImpl;
|
import org.apache.cloudstack.storage.image.store.ImageStoreImpl;
|
||||||
import org.apache.log4j.Logger;
|
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import com.cloud.agent.api.storage.DownloadAnswer;
|
||||||
import java.util.UUID;
|
import com.cloud.agent.api.to.DataObjectType;
|
||||||
|
import com.cloud.agent.api.to.DataStoreTO;
|
||||||
|
import com.cloud.agent.api.to.NfsTO;
|
||||||
|
import com.cloud.storage.Storage;
|
||||||
|
import com.cloud.storage.VMTemplateStorageResourceAssoc;
|
||||||
|
import com.cloud.storage.dao.VMTemplateDao;
|
||||||
|
import com.cloud.storage.dao.VolumeDao;
|
||||||
|
|
||||||
public class SimulatorImageStoreDriverImpl extends BaseImageStoreDriverImpl {
|
public class SimulatorImageStoreDriverImpl extends BaseImageStoreDriverImpl {
|
||||||
private static final Logger s_logger = Logger.getLogger(SimulatorImageStoreDriverImpl.class);
|
private static final Logger s_logger = Logger.getLogger(SimulatorImageStoreDriverImpl.class);
|
||||||
@ -71,9 +74,9 @@ public class SimulatorImageStoreDriverImpl extends BaseImageStoreDriverImpl {
|
|||||||
@Override
|
@Override
|
||||||
public void createAsync(DataStore dataStore, DataObject data, AsyncCompletionCallback<CreateCmdResult> callback) {
|
public void createAsync(DataStore dataStore, DataObject data, AsyncCompletionCallback<CreateCmdResult> callback) {
|
||||||
if (data.getType() == DataObjectType.TEMPLATE) {
|
if (data.getType() == DataObjectType.TEMPLATE) {
|
||||||
this.createTemplate(data, callback);
|
createTemplate(data, callback);
|
||||||
} else if (data.getType() == DataObjectType.VOLUME) {
|
} else if (data.getType() == DataObjectType.VOLUME) {
|
||||||
this.createVolume(data, callback);
|
createVolume(data, callback);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -108,6 +111,11 @@ public class SimulatorImageStoreDriverImpl extends BaseImageStoreDriverImpl {
|
|||||||
@Override
|
@Override
|
||||||
public String createEntityExtractUrl(DataStore store, String installPath, Storage.ImageFormat format, DataObject dataObject) {
|
public String createEntityExtractUrl(DataStore store, String installPath, Storage.ImageFormat format, DataObject dataObject) {
|
||||||
EndPoint ep = _epSelector.select(store);
|
EndPoint ep = _epSelector.select(store);
|
||||||
|
if (ep == null) {
|
||||||
|
String errMsg = "No remote endpoint to send command, check if host or ssvm is down?";
|
||||||
|
s_logger.error(errMsg);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
// Create Symlink at ssvm
|
// Create Symlink at ssvm
|
||||||
String path = installPath;
|
String path = installPath;
|
||||||
String uuid = UUID.randomUUID().toString() + "." + format.getFileExtension();
|
String uuid = UUID.randomUUID().toString() + "." + format.getFileExtension();
|
||||||
|
|||||||
@ -22,18 +22,17 @@ import java.util.UUID;
|
|||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
|
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.DataStore;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
|
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.EndPointSelector;
|
||||||
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
|
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
|
||||||
|
import org.apache.cloudstack.storage.image.BaseImageStoreDriverImpl;
|
||||||
import org.apache.cloudstack.storage.image.datastore.ImageStoreEntity;
|
import org.apache.cloudstack.storage.image.datastore.ImageStoreEntity;
|
||||||
import org.apache.cloudstack.storage.image.store.ImageStoreImpl;
|
import org.apache.cloudstack.storage.image.store.ImageStoreImpl;
|
||||||
|
|
||||||
import org.apache.log4j.Logger;
|
|
||||||
|
|
||||||
import org.apache.cloudstack.storage.image.BaseImageStoreDriverImpl;
|
|
||||||
|
|
||||||
import com.cloud.agent.api.Answer;
|
import com.cloud.agent.api.Answer;
|
||||||
import com.cloud.agent.api.storage.CreateEntityDownloadURLCommand;
|
import com.cloud.agent.api.storage.CreateEntityDownloadURLCommand;
|
||||||
import com.cloud.agent.api.to.DataStoreTO;
|
import com.cloud.agent.api.to.DataStoreTO;
|
||||||
@ -68,7 +67,14 @@ public class CloudStackImageStoreDriverImpl extends BaseImageStoreDriverImpl {
|
|||||||
String path = installPath;
|
String path = installPath;
|
||||||
String uuid = UUID.randomUUID().toString() + "." + format.getFileExtension();
|
String uuid = UUID.randomUUID().toString() + "." + format.getFileExtension();
|
||||||
CreateEntityDownloadURLCommand cmd = new CreateEntityDownloadURLCommand(((ImageStoreEntity) store).getMountPoint(), path, uuid, dataObject.getTO());
|
CreateEntityDownloadURLCommand cmd = new CreateEntityDownloadURLCommand(((ImageStoreEntity) store).getMountPoint(), path, uuid, dataObject.getTO());
|
||||||
Answer ans = ep.sendMessage(cmd);
|
Answer ans = null;
|
||||||
|
if (ep == null) {
|
||||||
|
String errMsg = "No remote endpoint to send command, check if host or ssvm is down?";
|
||||||
|
s_logger.error(errMsg);
|
||||||
|
ans = new Answer(cmd, false, errMsg);
|
||||||
|
} else {
|
||||||
|
ans = ep.sendMessage(cmd);
|
||||||
|
}
|
||||||
if (ans == null || !ans.getResult()) {
|
if (ans == null || !ans.getResult()) {
|
||||||
String errorString = "Unable to create a link for entity at " + installPath + " on ssvm," + ans.getDetails();
|
String errorString = "Unable to create a link for entity at " + installPath + " on ssvm," + ans.getDetails();
|
||||||
s_logger.error(errorString);
|
s_logger.error(errorString);
|
||||||
|
|||||||
@ -19,32 +19,34 @@
|
|||||||
package org.apache.cloudstack.storage.datastore.driver;
|
package org.apache.cloudstack.storage.datastore.driver;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Timer;
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import com.cloud.agent.api.storage.DownloadAnswer;
|
import org.apache.log4j.Logger;
|
||||||
import com.cloud.agent.api.to.DataObjectType;
|
|
||||||
import com.cloud.storage.download.DownloadListener;
|
|
||||||
import com.cloud.storage.template.TemplateConstants;
|
|
||||||
import com.cloud.storage.upload.UploadListener;
|
|
||||||
import com.cloud.template.VirtualMachineTemplate;
|
|
||||||
import com.cloud.utils.component.ComponentContext;
|
|
||||||
import org.apache.cloudstack.api.ApiConstants;
|
import org.apache.cloudstack.api.ApiConstants;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.*;
|
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.EndPoint;
|
||||||
|
import org.apache.cloudstack.engine.subsystem.api.storage.EndPointSelector;
|
||||||
|
import org.apache.cloudstack.engine.subsystem.api.storage.StorageCacheManager;
|
||||||
import org.apache.cloudstack.framework.async.AsyncCallbackDispatcher;
|
import org.apache.cloudstack.framework.async.AsyncCallbackDispatcher;
|
||||||
import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
|
import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
|
||||||
import org.apache.cloudstack.storage.command.DownloadCommand;
|
import org.apache.cloudstack.storage.command.DownloadCommand;
|
||||||
import org.apache.cloudstack.storage.command.DownloadProgressCommand;
|
|
||||||
import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailsDao;
|
import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailsDao;
|
||||||
import org.apache.cloudstack.storage.image.BaseImageStoreDriverImpl;
|
import org.apache.cloudstack.storage.image.BaseImageStoreDriverImpl;
|
||||||
import org.apache.cloudstack.storage.image.store.ImageStoreImpl;
|
import org.apache.cloudstack.storage.image.store.ImageStoreImpl;
|
||||||
import org.apache.cloudstack.storage.to.TemplateObjectTO;
|
import org.apache.cloudstack.storage.to.TemplateObjectTO;
|
||||||
import org.apache.log4j.Logger;
|
|
||||||
|
|
||||||
|
import com.cloud.agent.api.storage.DownloadAnswer;
|
||||||
|
import com.cloud.agent.api.to.DataObjectType;
|
||||||
import com.cloud.agent.api.to.DataStoreTO;
|
import com.cloud.agent.api.to.DataStoreTO;
|
||||||
import com.cloud.agent.api.to.SwiftTO;
|
import com.cloud.agent.api.to.SwiftTO;
|
||||||
import com.cloud.exception.UnsupportedServiceException;
|
import com.cloud.exception.UnsupportedServiceException;
|
||||||
import com.cloud.storage.Storage.ImageFormat;
|
import com.cloud.storage.Storage.ImageFormat;
|
||||||
|
import com.cloud.template.VirtualMachineTemplate;
|
||||||
|
import com.cloud.utils.exception.CloudRuntimeException;
|
||||||
|
|
||||||
public class SwiftImageStoreDriverImpl extends BaseImageStoreDriverImpl {
|
public class SwiftImageStoreDriverImpl extends BaseImageStoreDriverImpl {
|
||||||
private static final Logger s_logger = Logger.getLogger(SwiftImageStoreDriverImpl.class);
|
private static final Logger s_logger = Logger.getLogger(SwiftImageStoreDriverImpl.class);
|
||||||
@ -80,8 +82,9 @@ public class SwiftImageStoreDriverImpl extends BaseImageStoreDriverImpl {
|
|||||||
|
|
||||||
EndPoint ep = _epSelector.select(data);
|
EndPoint ep = _epSelector.select(data);
|
||||||
if (ep == null) {
|
if (ep == null) {
|
||||||
s_logger.warn("There is no secondary storage VM for downloading template to image store " + dataStore.getName());
|
String errMsg = "No remote endpoint to send command, check if host or ssvm is down?";
|
||||||
return;
|
s_logger.error(errMsg);
|
||||||
|
throw new CloudRuntimeException(errMsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
CreateContext<CreateCmdResult> context = new CreateContext<CreateCmdResult>(callback, data);
|
CreateContext<CreateCmdResult> context = new CreateContext<CreateCmdResult>(callback, data);
|
||||||
@ -96,7 +99,6 @@ public class SwiftImageStoreDriverImpl extends BaseImageStoreDriverImpl {
|
|||||||
}
|
}
|
||||||
ep.sendMessageAsync(dcmd, caller);
|
ep.sendMessageAsync(dcmd, caller);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -22,6 +22,8 @@ import java.util.UUID;
|
|||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
import org.apache.cloudstack.engine.orchestration.service.VolumeOrchestrationService;
|
import org.apache.cloudstack.engine.orchestration.service.VolumeOrchestrationService;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.ChapInfo;
|
import org.apache.cloudstack.engine.subsystem.api.storage.ChapInfo;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
|
import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
|
||||||
@ -45,7 +47,6 @@ import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
|
|||||||
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
|
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
|
||||||
import org.apache.cloudstack.storage.to.TemplateObjectTO;
|
import org.apache.cloudstack.storage.to.TemplateObjectTO;
|
||||||
import org.apache.cloudstack.storage.volume.VolumeObject;
|
import org.apache.cloudstack.storage.volume.VolumeObject;
|
||||||
import org.apache.log4j.Logger;
|
|
||||||
|
|
||||||
import com.cloud.agent.api.Answer;
|
import com.cloud.agent.api.Answer;
|
||||||
import com.cloud.agent.api.storage.ResizeVolumeAnswer;
|
import com.cloud.agent.api.storage.ResizeVolumeAnswer;
|
||||||
@ -214,7 +215,14 @@ public class CloudStackPrimaryDataStoreDriverImpl implements PrimaryDataStoreDri
|
|||||||
|
|
||||||
CopyCommand cmd = new CopyCommand(srcData.getTO(), destData.getTO(), _primaryStorageDownloadWait, true);
|
CopyCommand cmd = new CopyCommand(srcData.getTO(), destData.getTO(), _primaryStorageDownloadWait, true);
|
||||||
EndPoint ep = epSelector.select(srcData, destData);
|
EndPoint ep = epSelector.select(srcData, destData);
|
||||||
Answer answer = ep.sendMessage(cmd);
|
Answer answer = null;
|
||||||
|
if (ep == null) {
|
||||||
|
String errMsg = "No remote endpoint to send command, check if host or ssvm is down?";
|
||||||
|
s_logger.error(errMsg);
|
||||||
|
answer = new Answer(cmd, false, errMsg);
|
||||||
|
} else {
|
||||||
|
answer = ep.sendMessage(cmd);
|
||||||
|
}
|
||||||
CopyCommandResult result = new CopyCommandResult("", answer);
|
CopyCommandResult result = new CopyCommandResult("", answer);
|
||||||
callback.complete(result);
|
callback.complete(result);
|
||||||
}
|
}
|
||||||
@ -245,7 +253,7 @@ public class CloudStackPrimaryDataStoreDriverImpl implements PrimaryDataStoreDri
|
|||||||
|
|
||||||
|
|
||||||
CreateObjectCommand cmd = new CreateObjectCommand(snapshotTO);
|
CreateObjectCommand cmd = new CreateObjectCommand(snapshotTO);
|
||||||
EndPoint ep = this.epSelector.select(snapshot);
|
EndPoint ep = epSelector.select(snapshot);
|
||||||
Answer answer = null;
|
Answer answer = null;
|
||||||
if ( ep == null ){
|
if ( ep == null ){
|
||||||
String errMsg = "No remote endpoint to send DeleteCommand, check if host or ssvm is down?";
|
String errMsg = "No remote endpoint to send DeleteCommand, check if host or ssvm is down?";
|
||||||
@ -284,7 +292,7 @@ public class CloudStackPrimaryDataStoreDriverImpl implements PrimaryDataStoreDri
|
|||||||
resizeParameter.newSize, resizeParameter.shrinkOk, resizeParameter.instanceName);
|
resizeParameter.newSize, resizeParameter.shrinkOk, resizeParameter.instanceName);
|
||||||
CreateCmdResult result = new CreateCmdResult(null, null);
|
CreateCmdResult result = new CreateCmdResult(null, null);
|
||||||
try {
|
try {
|
||||||
ResizeVolumeAnswer answer = (ResizeVolumeAnswer) this.storageMgr.sendToPool(pool, resizeParameter.hosts,
|
ResizeVolumeAnswer answer = (ResizeVolumeAnswer) storageMgr.sendToPool(pool, resizeParameter.hosts,
|
||||||
resizeCmd);
|
resizeCmd);
|
||||||
if (answer != null && answer.getResult()) {
|
if (answer != null && answer.getResult()) {
|
||||||
long finalSize = answer.getNewSize();
|
long finalSize = answer.getNewSize();
|
||||||
|
|||||||
@ -18,6 +18,8 @@ package org.apache.cloudstack.storage.datastore.driver;
|
|||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.ChapInfo;
|
import org.apache.cloudstack.engine.subsystem.api.storage.ChapInfo;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
|
import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult;
|
import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult;
|
||||||
@ -34,12 +36,12 @@ import org.apache.cloudstack.framework.async.AsyncRpcContext;
|
|||||||
import org.apache.cloudstack.storage.command.CommandResult;
|
import org.apache.cloudstack.storage.command.CommandResult;
|
||||||
import org.apache.cloudstack.storage.command.CreateObjectCommand;
|
import org.apache.cloudstack.storage.command.CreateObjectCommand;
|
||||||
import org.apache.cloudstack.storage.datastore.DataObjectManager;
|
import org.apache.cloudstack.storage.datastore.DataObjectManager;
|
||||||
import org.apache.log4j.Logger;
|
|
||||||
|
|
||||||
import com.cloud.agent.api.Answer;
|
import com.cloud.agent.api.Answer;
|
||||||
import com.cloud.agent.api.to.DataStoreTO;
|
import com.cloud.agent.api.to.DataStoreTO;
|
||||||
import com.cloud.agent.api.to.DataTO;
|
import com.cloud.agent.api.to.DataTO;
|
||||||
import com.cloud.storage.dao.StoragePoolHostDao;
|
import com.cloud.storage.dao.StoragePoolHostDao;
|
||||||
|
import com.cloud.utils.exception.CloudRuntimeException;
|
||||||
|
|
||||||
public class SamplePrimaryDataStoreDriverImpl implements PrimaryDataStoreDriver {
|
public class SamplePrimaryDataStoreDriverImpl implements PrimaryDataStoreDriver {
|
||||||
private static final Logger s_logger = Logger.getLogger(SamplePrimaryDataStoreDriverImpl.class);
|
private static final Logger s_logger = Logger.getLogger(SamplePrimaryDataStoreDriverImpl.class);
|
||||||
@ -163,6 +165,11 @@ public class SamplePrimaryDataStoreDriverImpl implements PrimaryDataStoreDriver
|
|||||||
@Override
|
@Override
|
||||||
public void createAsync(DataStore dataStore, DataObject vol, AsyncCompletionCallback<CreateCmdResult> callback) {
|
public void createAsync(DataStore dataStore, DataObject vol, AsyncCompletionCallback<CreateCmdResult> callback) {
|
||||||
EndPoint ep = selector.select(vol);
|
EndPoint ep = selector.select(vol);
|
||||||
|
if (ep == null) {
|
||||||
|
String errMsg = "No remote endpoint to send command, check if host or ssvm is down?";
|
||||||
|
s_logger.error(errMsg);
|
||||||
|
throw new CloudRuntimeException(errMsg);
|
||||||
|
}
|
||||||
CreateObjectCommand createCmd = new CreateObjectCommand(null);
|
CreateObjectCommand createCmd = new CreateObjectCommand(null);
|
||||||
|
|
||||||
CreateVolumeContext<CreateCmdResult> context = new CreateVolumeContext<CreateCmdResult>(callback, vol);
|
CreateVolumeContext<CreateCmdResult> context = new CreateVolumeContext<CreateCmdResult>(callback, vol);
|
||||||
|
|||||||
@ -22,11 +22,13 @@ import java.util.Date;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Timer;
|
import java.util.Timer;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
|
||||||
|
|
||||||
import javax.ejb.Local;
|
import javax.ejb.Local;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
|
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.DataStore;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
|
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
|
||||||
@ -48,16 +50,13 @@ import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreVO;
|
|||||||
import org.apache.cloudstack.storage.to.TemplateObjectTO;
|
import org.apache.cloudstack.storage.to.TemplateObjectTO;
|
||||||
import org.apache.cloudstack.storage.to.VolumeObjectTO;
|
import org.apache.cloudstack.storage.to.VolumeObjectTO;
|
||||||
|
|
||||||
import org.apache.log4j.Logger;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
import com.cloud.agent.AgentManager;
|
import com.cloud.agent.AgentManager;
|
||||||
import com.cloud.agent.api.storage.DownloadAnswer;
|
import com.cloud.agent.api.storage.DownloadAnswer;
|
||||||
import com.cloud.agent.api.storage.Proxy;
|
import com.cloud.agent.api.storage.Proxy;
|
||||||
import com.cloud.configuration.Config;
|
import com.cloud.configuration.Config;
|
||||||
import com.cloud.storage.RegisterVolumePayload;
|
import com.cloud.storage.RegisterVolumePayload;
|
||||||
import com.cloud.storage.VMTemplateStorageResourceAssoc;
|
|
||||||
import com.cloud.storage.Storage.ImageFormat;
|
import com.cloud.storage.Storage.ImageFormat;
|
||||||
|
import com.cloud.storage.VMTemplateStorageResourceAssoc;
|
||||||
import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
|
import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
|
||||||
import com.cloud.storage.Volume;
|
import com.cloud.storage.Volume;
|
||||||
import com.cloud.storage.dao.VMTemplateDao;
|
import com.cloud.storage.dao.VMTemplateDao;
|
||||||
@ -159,7 +158,7 @@ public class DownloadMonitorImpl extends ManagerBase implements DownloadMonitor
|
|||||||
Long maxTemplateSizeInBytes = getMaxTemplateSizeInBytes();
|
Long maxTemplateSizeInBytes = getMaxTemplateSizeInBytes();
|
||||||
if (vmTemplateStore != null) {
|
if (vmTemplateStore != null) {
|
||||||
start();
|
start();
|
||||||
VirtualMachineTemplate tmpl = this._templateDao.findById(template.getId());
|
VirtualMachineTemplate tmpl = _templateDao.findById(template.getId());
|
||||||
DownloadCommand dcmd = new DownloadCommand((TemplateObjectTO)(template.getTO()), maxTemplateSizeInBytes);
|
DownloadCommand dcmd = new DownloadCommand((TemplateObjectTO)(template.getTO()), maxTemplateSizeInBytes);
|
||||||
dcmd.setProxy(getHttpProxy());
|
dcmd.setProxy(getHttpProxy());
|
||||||
if (downloadJobExists) {
|
if (downloadJobExists) {
|
||||||
@ -239,7 +238,7 @@ public class DownloadMonitorImpl extends ManagerBase implements DownloadMonitor
|
|||||||
Long maxVolumeSizeInBytes = getMaxVolumeSizeInBytes();
|
Long maxVolumeSizeInBytes = getMaxVolumeSizeInBytes();
|
||||||
if (volumeHost != null) {
|
if (volumeHost != null) {
|
||||||
start();
|
start();
|
||||||
Volume vol = this._volumeDao.findById(volume.getId());
|
Volume vol = _volumeDao.findById(volume.getId());
|
||||||
DownloadCommand dcmd = new DownloadCommand((VolumeObjectTO)(volume.getTO()), maxVolumeSizeInBytes, checkSum, url, format);
|
DownloadCommand dcmd = new DownloadCommand((VolumeObjectTO)(volume.getTO()), maxVolumeSizeInBytes, checkSum, url, format);
|
||||||
dcmd.setProxy(getHttpProxy());
|
dcmd.setProxy(getHttpProxy());
|
||||||
if (downloadJobExists) {
|
if (downloadJobExists) {
|
||||||
@ -247,7 +246,7 @@ public class DownloadMonitorImpl extends ManagerBase implements DownloadMonitor
|
|||||||
dcmd.setResourceType(ResourceType.VOLUME);
|
dcmd.setResourceType(ResourceType.VOLUME);
|
||||||
}
|
}
|
||||||
|
|
||||||
EndPoint ep = this._epSelector.select(volume);
|
EndPoint ep = _epSelector.select(volume);
|
||||||
if (ep == null) {
|
if (ep == null) {
|
||||||
s_logger.warn("There is no secondary storage VM for image store " + store.getName());
|
s_logger.warn("There is no secondary storage VM for image store " + store.getName());
|
||||||
return;
|
return;
|
||||||
|
|||||||
@ -26,6 +26,9 @@ import javax.ejb.Local;
|
|||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import javax.naming.ConfigurationException;
|
import javax.naming.ConfigurationException;
|
||||||
|
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import org.apache.cloudstack.api.command.user.snapshot.CreateSnapshotPolicyCmd;
|
import org.apache.cloudstack.api.command.user.snapshot.CreateSnapshotPolicyCmd;
|
||||||
import org.apache.cloudstack.api.command.user.snapshot.DeleteSnapshotPoliciesCmd;
|
import org.apache.cloudstack.api.command.user.snapshot.DeleteSnapshotPoliciesCmd;
|
||||||
import org.apache.cloudstack.api.command.user.snapshot.ListSnapshotPoliciesCmd;
|
import org.apache.cloudstack.api.command.user.snapshot.ListSnapshotPoliciesCmd;
|
||||||
@ -41,10 +44,7 @@ import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
|
|||||||
import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotService;
|
import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotService;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotStrategy;
|
import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotStrategy;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotStrategy.SnapshotOperation;
|
import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotStrategy.SnapshotOperation;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.StrategyPriority;
|
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.StorageStrategyFactory;
|
import org.apache.cloudstack.engine.subsystem.api.storage.StorageStrategyFactory;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotStrategy.SnapshotOperation;
|
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.StrategyPriority;
|
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory;
|
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
|
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope;
|
import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope;
|
||||||
@ -53,8 +53,6 @@ import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
|
|||||||
import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao;
|
import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao;
|
||||||
import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO;
|
import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO;
|
||||||
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
|
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
|
||||||
import org.apache.log4j.Logger;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
import com.cloud.agent.AgentManager;
|
import com.cloud.agent.AgentManager;
|
||||||
import com.cloud.agent.api.Answer;
|
import com.cloud.agent.api.Answer;
|
||||||
@ -593,7 +591,14 @@ public class SnapshotManagerImpl extends ManagerBase implements SnapshotManager,
|
|||||||
String snapshotDir = TemplateConstants.DEFAULT_SNAPSHOT_ROOT_DIR + "/" + accountId + "/" + volumeId;
|
String snapshotDir = TemplateConstants.DEFAULT_SNAPSHOT_ROOT_DIR + "/" + accountId + "/" + volumeId;
|
||||||
DeleteSnapshotsDirCommand cmd = new DeleteSnapshotsDirCommand(ssHost.getTO(), snapshotDir);
|
DeleteSnapshotsDirCommand cmd = new DeleteSnapshotsDirCommand(ssHost.getTO(), snapshotDir);
|
||||||
EndPoint ep = _epSelector.select(ssHost);
|
EndPoint ep = _epSelector.select(ssHost);
|
||||||
Answer answer = ep.sendMessage(cmd);
|
Answer answer = null;
|
||||||
|
if (ep == null) {
|
||||||
|
String errMsg = "No remote endpoint to send command, check if host or ssvm is down?";
|
||||||
|
s_logger.error(errMsg);
|
||||||
|
answer = new Answer(cmd, false, errMsg);
|
||||||
|
} else {
|
||||||
|
answer = ep.sendMessage(cmd);
|
||||||
|
}
|
||||||
if ((answer != null) && answer.getResult()) {
|
if ((answer != null) && answer.getResult()) {
|
||||||
s_logger.debug("Deleted all snapshots for volume: " + volumeId + " under account: " + accountId);
|
s_logger.debug("Deleted all snapshots for volume: " + volumeId + " under account: " + accountId);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@ -21,12 +21,12 @@ import java.util.Date;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Timer;
|
import java.util.Timer;
|
||||||
import java.util.TimerTask;
|
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import org.apache.log4j.Level;
|
import org.apache.log4j.Level;
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
import org.apache.cloudstack.api.command.user.iso.ExtractIsoCmd;
|
import org.apache.cloudstack.api.command.user.iso.ExtractIsoCmd;
|
||||||
import org.apache.cloudstack.api.command.user.template.ExtractTemplateCmd;
|
import org.apache.cloudstack.api.command.user.template.ExtractTemplateCmd;
|
||||||
import org.apache.cloudstack.api.command.user.volume.ExtractVolumeCmd;
|
import org.apache.cloudstack.api.command.user.volume.ExtractVolumeCmd;
|
||||||
@ -437,6 +437,11 @@ public class UploadListener implements Listener {
|
|||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
EndPoint ep = _epSelector.select(sserver);
|
EndPoint ep = _epSelector.select(sserver);
|
||||||
|
if (ep == null) {
|
||||||
|
String errMsg = "No remote endpoint to send command, check if host or ssvm is down?";
|
||||||
|
s_logger.error(errMsg);
|
||||||
|
return;
|
||||||
|
}
|
||||||
ep.sendMessageAsync(new UploadProgressCommand(getCommand(), getJobId(), reqType), new Callback(ep.getId(), this));
|
ep.sendMessageAsync(new UploadProgressCommand(getCommand(), getJobId(), reqType), new Callback(ep.getId(), this));
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
s_logger.debug("Send command failed", e);
|
s_logger.debug("Send command failed", e);
|
||||||
|
|||||||
@ -34,6 +34,7 @@ import javax.naming.ConfigurationException;
|
|||||||
|
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
|
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.DataStoreManager;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
|
import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
|
||||||
@ -167,6 +168,11 @@ public class UploadMonitorImpl extends ManagerBase implements UploadMonitor {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
EndPoint ep = _epSelector.select(secStore);
|
EndPoint ep = _epSelector.select(secStore);
|
||||||
|
if (ep == null) {
|
||||||
|
String errMsg = "No remote endpoint to send command, check if host or ssvm is down?";
|
||||||
|
s_logger.error(errMsg);
|
||||||
|
return;
|
||||||
|
}
|
||||||
ep.sendMessageAsync(ucmd, new UploadListener.Callback(ep.getId(), ul));
|
ep.sendMessageAsync(ucmd, new UploadListener.Callback(ep.getId(), ul));
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
s_logger.warn("Unable to start upload of volume " + volume.getName() + " from " + secStore.getName() + " to " +url, e);
|
s_logger.warn("Unable to start upload of volume " + volume.getName() + " from " + secStore.getName() + " to " +url, e);
|
||||||
@ -194,6 +200,11 @@ public class UploadMonitorImpl extends ManagerBase implements UploadMonitor {
|
|||||||
_listenerMap.put(uploadTemplateObj, ul);
|
_listenerMap.put(uploadTemplateObj, ul);
|
||||||
try{
|
try{
|
||||||
EndPoint ep = _epSelector.select(secStore);
|
EndPoint ep = _epSelector.select(secStore);
|
||||||
|
if (ep == null) {
|
||||||
|
String errMsg = "No remote endpoint to send command, check if host or ssvm is down?";
|
||||||
|
s_logger.error(errMsg);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
ep.sendMessageAsync(ucmd, new UploadListener.Callback(ep.getId(), ul));
|
ep.sendMessageAsync(ucmd, new UploadListener.Callback(ep.getId(), ul));
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
s_logger.warn("Unable to start upload of " + template.getUniqueName() + " from " + secStore.getName() + " to " +url, e);
|
s_logger.warn("Unable to start upload of " + template.getUniqueName() + " from " + secStore.getName() + " to " +url, e);
|
||||||
@ -205,61 +216,66 @@ public class UploadMonitorImpl extends ManagerBase implements UploadMonitor {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public UploadVO createEntityDownloadURL(VMTemplateVO template, TemplateDataStoreVO vmTemplateHost, Long dataCenterId, long eventId) {
|
public UploadVO createEntityDownloadURL(VMTemplateVO template, TemplateDataStoreVO vmTemplateHost, Long dataCenterId, long eventId) {
|
||||||
|
|
||||||
String errorString = "";
|
String errorString = "";
|
||||||
boolean success = false;
|
boolean success = false;
|
||||||
Type type = (template.getFormat() == ImageFormat.ISO) ? Type.ISO : Type.TEMPLATE ;
|
Type type = (template.getFormat() == ImageFormat.ISO) ? Type.ISO : Type.TEMPLATE;
|
||||||
|
|
||||||
// find an endpoint to send command
|
// find an endpoint to send command
|
||||||
DataStore store = storeMgr.getDataStore(vmTemplateHost.getDataStoreId(), DataStoreRole.Image);
|
DataStore store = storeMgr.getDataStore(vmTemplateHost.getDataStoreId(), DataStoreRole.Image);
|
||||||
EndPoint ep = _epSelector.select(store);
|
EndPoint ep = _epSelector.select(store);
|
||||||
|
if (ep == null) {
|
||||||
//Check if it already exists.
|
String errMsg = "No remote endpoint to send command, check if host or ssvm is down?";
|
||||||
List<UploadVO> extractURLList = _uploadDao.listByTypeUploadStatus(template.getId(), type, UploadVO.Status.DOWNLOAD_URL_CREATED);
|
s_logger.error(errMsg);
|
||||||
if (extractURLList.size() > 0) {
|
return null;
|
||||||
// do some check here
|
|
||||||
UploadVO upload = extractURLList.get(0);
|
|
||||||
String uploadUrl = extractURLList.get(0).getUploadUrl();
|
|
||||||
String[] token = uploadUrl.split("/");
|
|
||||||
// example: uploadUrl = https://10-11-101-112.realhostip.com/userdata/2fdd9a70-9c4a-4a04-b1d5-1e41c221a1f9.iso
|
|
||||||
// then token[2] = 10-11-101-112.realhostip.com, token[4] = 2fdd9a70-9c4a-4a04-b1d5-1e41c221a1f9.iso
|
|
||||||
String hostname = ep.getPublicAddr().replace(".", "-") + ".";
|
|
||||||
if ((token != null) && (token.length == 5) && (token[2].equals(hostname + _ssvmUrlDomain))) // ssvm publicip and domain suffix not changed
|
|
||||||
return extractURLList.get(0);
|
|
||||||
else if ((token != null) && (token.length == 5) && (token[2].startsWith(hostname))) { // domain suffix changed
|
|
||||||
String uuid = token[4];
|
|
||||||
uploadUrl = generateCopyUrl(ep.getPublicAddr(), uuid);
|
|
||||||
UploadVO vo = _uploadDao.createForUpdate();
|
|
||||||
vo.setLastUpdated(new Date());
|
|
||||||
vo.setUploadUrl(uploadUrl);
|
|
||||||
_uploadDao.update(upload.getId(), vo);
|
|
||||||
return _uploadDao.findById(upload.getId(), true);
|
|
||||||
} else { // ssvm publicip changed
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// It doesn't exist so create a DB entry.
|
//Check if it already exists.
|
||||||
UploadVO uploadTemplateObj = new UploadVO(vmTemplateHost.getDataStoreId(), template.getId(), new Date(),
|
List<UploadVO> extractURLList = _uploadDao.listByTypeUploadStatus(template.getId(), type, UploadVO.Status.DOWNLOAD_URL_CREATED);
|
||||||
Status.DOWNLOAD_URL_NOT_CREATED, 0, type, Mode.HTTP_DOWNLOAD);
|
if (extractURLList.size() > 0) {
|
||||||
uploadTemplateObj.setInstallPath(vmTemplateHost.getInstallPath());
|
// do some check here
|
||||||
_uploadDao.persist(uploadTemplateObj);
|
UploadVO upload = extractURLList.get(0);
|
||||||
|
String uploadUrl = extractURLList.get(0).getUploadUrl();
|
||||||
|
String[] token = uploadUrl.split("/");
|
||||||
|
// example: uploadUrl = https://10-11-101-112.realhostip.com/userdata/2fdd9a70-9c4a-4a04-b1d5-1e41c221a1f9.iso
|
||||||
|
// then token[2] = 10-11-101-112.realhostip.com, token[4] = 2fdd9a70-9c4a-4a04-b1d5-1e41c221a1f9.iso
|
||||||
|
String hostname = ep.getPublicAddr().replace(".", "-") + ".";
|
||||||
|
if ((token != null) && (token.length == 5) && (token[2].equals(hostname + _ssvmUrlDomain))) // ssvm publicip and domain suffix not changed
|
||||||
|
return extractURLList.get(0);
|
||||||
|
else if ((token != null) && (token.length == 5) && (token[2].startsWith(hostname))) { // domain suffix changed
|
||||||
|
String uuid = token[4];
|
||||||
|
uploadUrl = generateCopyUrl(ep.getPublicAddr(), uuid);
|
||||||
|
UploadVO vo = _uploadDao.createForUpdate();
|
||||||
|
vo.setLastUpdated(new Date());
|
||||||
|
vo.setUploadUrl(uploadUrl);
|
||||||
|
_uploadDao.update(upload.getId(), vo);
|
||||||
|
return _uploadDao.findById(upload.getId(), true);
|
||||||
|
} else { // ssvm publicip changed
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
try{
|
// It doesn't exist so create a DB entry.
|
||||||
// Create Symlink at ssvm
|
UploadVO uploadTemplateObj = new UploadVO(vmTemplateHost.getDataStoreId(), template.getId(), new Date(),
|
||||||
String path = vmTemplateHost.getInstallPath();
|
Status.DOWNLOAD_URL_NOT_CREATED, 0, type, Mode.HTTP_DOWNLOAD);
|
||||||
String uuid = UUID.randomUUID().toString() + "." + template.getFormat().getFileExtension(); // adding "." + vhd/ova... etc.
|
uploadTemplateObj.setInstallPath(vmTemplateHost.getInstallPath());
|
||||||
CreateEntityDownloadURLCommand cmd = new CreateEntityDownloadURLCommand(((ImageStoreEntity)store).getMountPoint(), path, uuid, null);
|
_uploadDao.persist(uploadTemplateObj);
|
||||||
Answer ans = ep.sendMessage(cmd);
|
|
||||||
if (ans == null || !ans.getResult()) {
|
try {
|
||||||
errorString = "Unable to create a link for " +type+ " id:"+template.getId() + "," + ans.getDetails();
|
// Create Symlink at ssvm
|
||||||
|
String path = vmTemplateHost.getInstallPath();
|
||||||
|
String uuid = UUID.randomUUID().toString() + "." + template.getFormat().getFileExtension(); // adding "." + vhd/ova... etc.
|
||||||
|
CreateEntityDownloadURLCommand cmd = new CreateEntityDownloadURLCommand(((ImageStoreEntity)store).getMountPoint(), path, uuid, null);
|
||||||
|
Answer ans = ep.sendMessage(cmd);
|
||||||
|
if (ans == null || !ans.getResult()) {
|
||||||
|
errorString = "Unable to create a link for " + type + " id:" + template.getId() + "," + ans.getDetails();
|
||||||
s_logger.error(errorString);
|
s_logger.error(errorString);
|
||||||
throw new CloudRuntimeException(errorString);
|
throw new CloudRuntimeException(errorString);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Construct actual URL locally now that the symlink exists at SSVM
|
//Construct actual URL locally now that the symlink exists at SSVM
|
||||||
String extractURL = generateCopyUrl(ep.getPublicAddr(), uuid);
|
String extractURL = generateCopyUrl(ep.getPublicAddr(), uuid);
|
||||||
UploadVO vo = _uploadDao.createForUpdate();
|
UploadVO vo = _uploadDao.createForUpdate();
|
||||||
vo.setLastUpdated(new Date());
|
vo.setLastUpdated(new Date());
|
||||||
@ -268,17 +284,17 @@ public class UploadMonitorImpl extends ManagerBase implements UploadMonitor {
|
|||||||
_uploadDao.update(uploadTemplateObj.getId(), vo);
|
_uploadDao.update(uploadTemplateObj.getId(), vo);
|
||||||
success = true;
|
success = true;
|
||||||
return _uploadDao.findById(uploadTemplateObj.getId(), true);
|
return _uploadDao.findById(uploadTemplateObj.getId(), true);
|
||||||
}finally{
|
} finally {
|
||||||
if(!success){
|
if (!success) {
|
||||||
UploadVO uploadJob = _uploadDao.createForUpdate(uploadTemplateObj.getId());
|
UploadVO uploadJob = _uploadDao.createForUpdate(uploadTemplateObj.getId());
|
||||||
uploadJob.setLastUpdated(new Date());
|
uploadJob.setLastUpdated(new Date());
|
||||||
uploadJob.setErrorString(errorString);
|
uploadJob.setErrorString(errorString);
|
||||||
uploadJob.setUploadState(Status.ERROR);
|
uploadJob.setUploadState(Status.ERROR);
|
||||||
_uploadDao.update(uploadTemplateObj.getId(), uploadJob);
|
_uploadDao.update(uploadTemplateObj.getId(), uploadJob);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void createVolumeDownloadURL(Long entityId, String path, Type type, Long dataCenterId, Long uploadId, ImageFormat format) {
|
public void createVolumeDownloadURL(Long entityId, String path, Type type, Long dataCenterId, Long uploadId, ImageFormat format) {
|
||||||
|
|||||||
@ -583,7 +583,14 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
|
|||||||
public String getChecksum(DataStore store, String templatePath) {
|
public String getChecksum(DataStore store, String templatePath) {
|
||||||
EndPoint ep = _epSelector.select(store);
|
EndPoint ep = _epSelector.select(store);
|
||||||
ComputeChecksumCommand cmd = new ComputeChecksumCommand(store.getTO(), templatePath);
|
ComputeChecksumCommand cmd = new ComputeChecksumCommand(store.getTO(), templatePath);
|
||||||
Answer answer = ep.sendMessage(cmd);
|
Answer answer = null;
|
||||||
|
if (ep == null) {
|
||||||
|
String errMsg = "No remote endpoint to send command, check if host or ssvm is down?";
|
||||||
|
s_logger.error(errMsg);
|
||||||
|
answer = new Answer(cmd, false, errMsg);
|
||||||
|
} else {
|
||||||
|
answer = ep.sendMessage(cmd);
|
||||||
|
}
|
||||||
if (answer != null && answer.getResult()) {
|
if (answer != null && answer.getResult()) {
|
||||||
return answer.getDetails();
|
return answer.getDetails();
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user