CLOUDSTACK-2584: set Format value in CopyCommand.

This commit is contained in:
Min Chen 2013-05-22 14:31:53 -07:00
parent eb0a7489b4
commit 039098469a
5 changed files with 49 additions and 12 deletions

View File

@ -256,6 +256,10 @@ public class TemplateObject implements TemplateInfo {
} catch (NoTransitionException e) {
s_logger.debug("failed to update state", e);
throw new CloudRuntimeException("Failed to update state" + e.toString());
} catch (Exception ex){
s_logger.debug("failed to process event and answer", ex);
objectInStoreMgr.delete(this);
throw new CloudRuntimeException("Failed to process event", ex);
} finally{
// in case of OperationFailed, expunge the entry
if ( event == ObjectInDataStoreStateMachine.Event.OperationFailed){

View File

@ -25,6 +25,7 @@ import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
import org.apache.cloudstack.engine.subsystem.api.storage.TemplateEvent;
import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo;
import org.apache.cloudstack.engine.subsystem.api.storage.TemplateState;
import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.Event;
import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.State;
@ -43,6 +44,7 @@ import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
import com.cloud.agent.api.to.DataObjectType;
import com.cloud.agent.api.to.S3TO;
import com.cloud.storage.DataStoreRole;
import com.cloud.storage.VMTemplateStoragePoolVO;
import com.cloud.storage.dao.SnapshotDao;
@ -136,7 +138,12 @@ public class ObjectInDataStoreManagerImpl implements ObjectInDataStoreManager {
ts.setTemplateId(obj.getId());
ts.setDataStoreId(dataStore.getId());
ts.setDataStoreRole(dataStore.getRole());
ts.setInstallPath(TemplateConstants.DEFAULT_TMPLT_ROOT_DIR + "/" + TemplateConstants.DEFAULT_TMPLT_FIRST_LEVEL_DIR + templateDao.findById(obj.getId()).getAccountId() + "/" + obj.getId());
String installPath = TemplateConstants.DEFAULT_TMPLT_ROOT_DIR + "/" + TemplateConstants.DEFAULT_TMPLT_FIRST_LEVEL_DIR + templateDao.findById(obj.getId()).getAccountId() + "/" + obj.getId();
if ( dataStore.getTO() instanceof S3TO ){
TemplateInfo tmpl = (TemplateInfo)obj;
installPath += "/" + tmpl.getUniqueName(); // for S3, we append template name in the path for template sync since we don't have template.properties there
}
ts.setInstallPath(installPath);
ts.setState(ObjectInDataStoreStateMachine.State.Allocated);
ts = templateDataStoreDao.persist(ts);
break;

View File

@ -1456,7 +1456,9 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
if (privateTemplate == null) {
Transaction txn = Transaction.currentTxn();
txn.start();
// template_store_ref entries should have been removed using our DataObject.processEvent command in case of failure.
// template_store_ref entries should have been removed using our DataObject.processEvent command in case of failure, but clean it up here to avoid
// some leftovers which will cause removing template from vm_template table fail.
this._tmplStoreDao.deletePrimaryRecordsForTemplate(templateId);
// Remove the template_zone_ref record
this._tmpltZoneDao.deletePrimaryRecordsForTemplate(templateId);
// Remove the template record

View File

@ -426,11 +426,11 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
}
return new CopyCmdAnswer("");
}
protected Answer copyFromNfsToImage(CopyCommand cmd) {
DataTO destData = cmd.getDestTO();
DataStoreTO destDataStore = destData.getDataStore();
if (destDataStore instanceof S3TO) {
return copyFromNfsToS3(cmd);
} else {
@ -453,7 +453,7 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
NfsTO destImageStore = (NfsTO)destDataStore;
return this.copyFromS3ToNfs(cmd, srcData, s3, destData, destImageStore);
}
if (srcDataStore.getRole() == DataStoreRole.ImageCache && destDataStore.getRole() == DataStoreRole.Image) {
return copyFromNfsToImage(cmd);
}
@ -625,15 +625,40 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
}
}
private ImageFormat getTemplateFormat(String filePath){
String ext = null;
int extensionPos = filePath.lastIndexOf('.');
int lastSeparator = Math.max(filePath.lastIndexOf('/'), filePath.lastIndexOf('\\'));
int i = lastSeparator > extensionPos ? -1 : extensionPos;
if (i > 0 ) {
ext = filePath.substring(i+1);
}
if ( ext != null){
if ( ext.equalsIgnoreCase("vhd"))
return ImageFormat.VHD;
else if (ext.equalsIgnoreCase("qcow2"))
return ImageFormat.QCOW2;
else if (ext.equalsIgnoreCase("ova"))
return ImageFormat.OVA;
else if (ext.equalsIgnoreCase("tar"))
return ImageFormat.TAR;
else if (ext.equalsIgnoreCase("img"))
return ImageFormat.RAW;
}
return null;
}
protected Answer copyFromNfsToS3(CopyCommand cmd) {
final DataTO srcData = cmd.getSrcTO();
final DataTO destData = cmd.getDestTO();
DataStoreTO srcDataStore = srcData.getDataStore();
NfsTO srcStore = (NfsTO)srcDataStore;
DataStoreTO destDataStore = destData.getDataStore();
final S3TO s3 = (S3TO)destDataStore;
try {
final String templatePath = determineStorageTemplatePath(
srcStore.getUrl(), srcData.getPath());
@ -645,14 +670,16 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
final String bucket = s3.getBucketName();
final File srcFile = _storage.getFile(templatePath);
ImageFormat format = this.getTemplateFormat(templatePath);
String key = destData.getPath() + S3Utils.SEPARATOR + srcFile.getName();
putFile(s3, srcFile, bucket, key);
DataTO retObj = null;
if (destData.getObjectType() == DataObjectType.TEMPLATE) {
TemplateObjectTO newTemplate = new TemplateObjectTO();
newTemplate.setPath(key);
newTemplate.setSize(srcFile.length());
newTemplate.setFormat(format);
retObj = newTemplate;
} else if (destData.getObjectType() == DataObjectType.VOLUME) {
VolumeObjectTO newVol = new VolumeObjectTO();
@ -660,7 +687,7 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
newVol.setSize(srcFile.length());
retObj = newVol;
}
return new CopyCmdAnswer(retObj);
} catch (Exception e) {
s_logger.error("failed to upload" + srcData.getPath(), e);

View File

@ -697,9 +697,6 @@ public class DownloadManagerImpl extends ManagerBase implements DownloadManager
} else {
installPathPrefix = resource.getRootDir(cmd) + File.separator + installPathPrefix;
}
} else if (dstore instanceof S3TO) {
// S3 key has template name inside to help template sync
installPathPrefix = installPathPrefix + File.separator + cmd.getName();
}
String user = null;
String password = null;