Remove DeleteObjectFromSwiftCommand, which can be achieved through

DeleteTemplateCommand.
This commit is contained in:
Min Chen 2013-04-26 17:52:50 -07:00
parent c2e9be8d31
commit 5b7ea8b0fe
8 changed files with 55 additions and 123 deletions

View File

@ -1,61 +0,0 @@
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
package com.cloud.agent.api;
import com.cloud.agent.api.LogLevel.Log4jLevel;
import com.cloud.agent.api.to.SwiftTO;
/**
*
*
*/
public class DeleteObjectFromSwiftCommand extends Command {
@LogLevel(Log4jLevel.Off)
private SwiftTO swift;
private String container;
private String object;
protected DeleteObjectFromSwiftCommand() {
}
public DeleteObjectFromSwiftCommand(SwiftTO swift, String container, String object) {
this.swift = swift;
this.container = container;
this.object = object;
}
public SwiftTO getSwift() {
return this.swift;
}
public String getContainer() {
return container;
}
public String getObject() {
return object;
}
@Override
public boolean executeInSequence() {
// TODO Auto-generated method stub
return true;
}
}

View File

@ -21,12 +21,14 @@ import com.cloud.agent.api.to.DataStoreTO;
public class DeleteVolumeCommand extends ssCommand {
private DataStoreTO store;
private String volumePath;
private Long volumeId;
public DeleteVolumeCommand() {
}
public DeleteVolumeCommand(DataStoreTO store, String volumePath) {
public DeleteVolumeCommand(DataStoreTO store, Long volumeId, String volumePath) {
this.store = store;
this.volumeId = volumeId;
this.volumePath = volumePath;
}
@ -43,5 +45,10 @@ public class DeleteVolumeCommand extends ssCommand {
return store;
}
public Long getVolumeId() {
return volumeId;
}
}

View File

@ -61,7 +61,6 @@ import com.cloud.agent.api.CheckHealthCommand;
import com.cloud.agent.api.CleanupSnapshotBackupCommand;
import com.cloud.agent.api.Command;
import com.cloud.agent.api.ComputeChecksumCommand;
import com.cloud.agent.api.DeleteObjectFromSwiftCommand;
import com.cloud.agent.api.DeleteSnapshotBackupCommand;
import com.cloud.agent.api.DeleteSnapshotsDirCommand;
import com.cloud.agent.api.DownloadSnapshotFromS3Command;
@ -215,8 +214,6 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
return execute((uploadTemplateToSwiftFromSecondaryStorageCommand) cmd);
} else if (cmd instanceof UploadTemplateToS3FromSecondaryStorageCommand) {
return execute((UploadTemplateToS3FromSecondaryStorageCommand) cmd);
} else if (cmd instanceof DeleteObjectFromSwiftCommand) {
return execute((DeleteObjectFromSwiftCommand) cmd);
} else if (cmd instanceof CleanupSnapshotBackupCommand) {
return execute((CleanupSnapshotBackupCommand) cmd);
} else if (cmd instanceof CopyCommand) {
@ -321,7 +318,7 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
}
@SuppressWarnings("unchecked")
private String determineS3TemplateNameFromKey(String key){
private String determineS3TemplateNameFromKey(String key) {
return StringUtils.substringAfterLast(StringUtils.substringBeforeLast(key, S3Utils.SEPARATOR), S3Utils.SEPARATOR);
}
@ -330,7 +327,6 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
return join(asList(VOLUME_ROOT_DIR, accountId, volId), S3Utils.SEPARATOR);
}
@SuppressWarnings("unchecked")
private String determineStorageTemplatePath(final String storagePath, String dataPath) {
return join(asList(getRootDir(storagePath), dataPath), File.separator);
@ -413,7 +409,9 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
// convention is no / in the end for install path based on
// S3Utils implementation.
// template key is
// TEMPLATE_ROOT_DIR/account_id/template_id/template_name, by adding template_name in the key, I can avoid generating a template.properties file
// TEMPLATE_ROOT_DIR/account_id/template_id/template_name, by
// adding template_name in the key, I can avoid generating a
// template.properties file
// for listTemplateCommand.
path = determineS3TemplateDirectory(cmd.getAccountId(), cmd.getResourceId(), cmd.getName());
} else {
@ -426,8 +424,8 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
if (s3Obj == null || s3Obj.size() == 0) {
return new Answer(cmd, false, "Failed to download to S3 bucket: " + bucket + " with key: " + key);
} else {
return new DownloadAnswer(null, 100, null, Status.DOWNLOADED, path, path, s3Obj.get(0).getSize(), s3Obj.get(0).getSize(), s3Obj.get(0)
.getETag());
return new DownloadAnswer(null, 100, null, Status.DOWNLOADED, path, path, s3Obj.get(0).getSize(), s3Obj.get(0).getSize(), s3Obj
.get(0).getETag());
}
} else if (dstore instanceof SwiftTO) {
// TODO: need to move code from
@ -548,31 +546,6 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
return new Answer(cmd, false, "not supported ");
}
private Answer execute(DeleteObjectFromSwiftCommand cmd) {
SwiftTO swift = cmd.getSwift();
String container = cmd.getContainer();
String object = cmd.getObject();
if (object == null) {
object = "";
}
try {
String result = swiftDelete(swift, container, object);
if (result != null) {
String errMsg = "failed to delete object " + container + "/" + object + " , err=" + result;
s_logger.warn(errMsg);
return new Answer(cmd, false, errMsg);
}
return new Answer(cmd, true, "success");
} catch (Exception e) {
String errMsg = cmd + " Command failed due to " + e.toString();
s_logger.warn(errMsg, e);
return new Answer(cmd, false, errMsg);
}
}
String swiftDownload(SwiftTO swift, String container, String rfilename, String lFullPath) {
Script command = new Script("/bin/bash", s_logger);
command.add("-c");
@ -722,6 +695,10 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
return null;
}
// TODO: this DeleteSnapshotsDirCommand should be removed after
// SnapshotManager refactor, this is used to delete those snapshot directory
// in the cachestorage. This should be able to be done through
// DeleteSnapshotBackupCommand with deleteAll flag set to true.
public Answer execute(DeleteSnapshotsDirCommand cmd) {
String secondaryStorageUrl = cmd.getSecondaryStorageUrl();
Long accountId = cmd.getAccountId();
@ -804,9 +781,6 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
}
private String determineSnapshotS3Directory(final Long accountId, final Long volumeId) {
return join(S3Utils.SEPARATOR, SNAPSHOT_ROOT_DIR, accountId, volumeId);
}
@ -1014,8 +988,7 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
}
private String deleteSnapshotBackupfromS3(final S3TO s3, final String secondaryStorageUrl, final Long accountId, final Long volumeId,
final String name, final Boolean deleteAllFlag) {
private String deleteSnapshotBackupfromS3(final S3TO s3, final Long accountId, final Long volumeId, final String name, final Boolean deleteAllFlag) {
try {
@ -1026,11 +999,6 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
@Override
public String call() throws Exception {
final String innerResult = deleteSnapshotBackupFromLocalFileSystem(secondaryStorageUrl, accountId, volumeId, name, deleteAllFlag);
if (innerResult != null) {
return innerResult;
}
if (deleteAllFlag) {
S3Utils.deleteDirectory(s3, bucket, determineSnapshotS3Directory(accountId, volumeId));
} else {
@ -1063,19 +1031,18 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
}
protected Answer execute(final DeleteSnapshotBackupCommand cmd) {
String secondaryStorageUrl = cmd.getSecondaryStorageUrl();
Long accountId = cmd.getAccountId();
Long volumeId = cmd.getVolumeId();
String name = cmd.getSnapshotUuid();
DataStoreTO dstore = cmd.getDataStore();
if (dstore instanceof NfsTO) {
final String result = deleteSnapshotBackupFromLocalFileSystem(secondaryStorageUrl, accountId, volumeId, name, cmd.isAll());
final String result = deleteSnapshotBackupFromLocalFileSystem(((NfsTO) dstore).getUrl(), accountId, volumeId, name, cmd.isAll());
if (result != null) {
s_logger.warn(result);
return new Answer(cmd, false, result);
}
} else if (dstore instanceof S3TO) {
final String result = deleteSnapshotBackupfromS3((S3TO) dstore, secondaryStorageUrl, accountId, volumeId, name, cmd.isAll());
final String result = deleteSnapshotBackupfromS3((S3TO) dstore, accountId, volumeId, name, cmd.isAll());
if (result != null) {
s_logger.warn(result);
return new Answer(cmd, false, result);
@ -1136,14 +1103,14 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
String bucket = s3.getBucketName();
// List the objects in the source directory on S3
final List<S3ObjectSummary> objectSummaries = S3Utils.getDirectory(s3, bucket, this.TEMPLATE_ROOT_DIR);
if ( objectSummaries == null )
if (objectSummaries == null)
return null;
Map<String, TemplateProp> tmpltInfos = new HashMap<String, TemplateProp>();
for (S3ObjectSummary objectSummary : objectSummaries){
for (S3ObjectSummary objectSummary : objectSummaries) {
String key = objectSummary.getKey();
String installPath = StringUtils.substringBeforeLast(key, S3Utils.SEPARATOR);
String uniqueName = this.determineS3TemplateNameFromKey(key);
//TODO: isPublic value, where to get?
// TODO: isPublic value, where to get?
TemplateProp tInfo = new TemplateProp(uniqueName, installPath, objectSummary.getSize(), objectSummary.getSize(), true, false);
tmpltInfos.put(uniqueName, tInfo);
}
@ -1158,7 +1125,7 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
DataStoreTO store = cmd.getDataStore();
if (store instanceof NfsTO) {
NfsTO nfs = (NfsTO)store;
NfsTO nfs = (NfsTO) store;
String root = getRootDir(nfs.getUrl());
Map<String, TemplateProp> templateInfos = _dlMgr.gatherTemplateInfo(root);
return new ListTemplateAnswer(nfs.getUrl(), templateInfos);
@ -1324,7 +1291,7 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
protected Answer execute(final DeleteTemplateCommand cmd) {
DataStoreTO dstore = cmd.getDataStore();
if (dstore instanceof NfsTO) {
NfsTO nfs = (NfsTO)dstore;
NfsTO nfs = (NfsTO) dstore;
String relativeTemplatePath = cmd.getTemplatePath();
String parent = getRootDir(nfs.getUrl());
@ -1376,8 +1343,8 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
S3Utils.deleteDirectory(s3, bucket, path);
return new Answer(cmd, true, String.format("Deleted template %1%s from bucket %2$s.", path, bucket));
} catch (Exception e) {
final String errorMessage = String.format("Failed to delete template %1$s from bucket %2$s due to the following error: %3$s",
path, bucket, e.getMessage());
final String errorMessage = String.format("Failed to delete template %1$s from bucket %2$s due to the following error: %3$s", path,
bucket, e.getMessage());
s_logger.error(errorMessage, e);
return new Answer(cmd, false, errorMessage);
}
@ -1465,6 +1432,25 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
return new Answer(cmd, false, errorMessage);
}
} else if (dstore instanceof SwiftTO) {
Long volumeId = cmd.getVolumeId();
String path = cmd.getVolumePath();
String filename = StringUtils.substringAfterLast(path, "/"); // assuming
// that
// the
// filename
// is
// the
// last
// section
// in
// the
// path
String result = swiftDelete((SwiftTO) dstore, "V-" + volumeId.toString(), filename);
if (result != null) {
String errMsg = "failed to delete volume " + filename + " , err=" + result;
s_logger.warn(errMsg);
return new Answer(cmd, false, errMsg);
}
return new Answer(cmd, false, "Swift is not currently support DeleteVolumeCommand");
} else {
return new Answer(cmd, false, "Unsupported image data store: " + dstore);

View File

@ -237,7 +237,7 @@ public class CloudStackImageStoreDriverImpl implements ImageStoreDriver {
DataStore store = this._dataStoreMgr.getDataStore(volumeStore.getDataStoreId(), DataStoreRole.Image);
EndPoint ep = _epSelector.select(store);
DeleteVolumeCommand dtCommand = new DeleteVolumeCommand(
store.getTO(), volumeStore.getInstallPath());
store.getTO(), volumeStore.getVolumeId(), volumeStore.getInstallPath());
Answer answer = ep.sendMessage(dtCommand);
if (answer == null || !answer.getResult()) {
s_logger.debug("Failed to delete "

View File

@ -195,7 +195,7 @@ public class S3ImageStoreDriverImpl implements ImageStoreDriver {
DataStore store = this._dataStoreMgr.getDataStore(volumeStore.getDataStoreId(), DataStoreRole.Image);
EndPoint ep = _epSelector.select(store);
DeleteVolumeCommand dtCommand = new DeleteVolumeCommand(
store.getTO(), volumeStore.getInstallPath());
store.getTO(), volumeStore.getVolumeId(), volumeStore.getInstallPath());
Answer answer = ep.sendMessage(dtCommand);
if (answer == null || !answer.getResult()) {
s_logger.debug("Failed to delete "

View File

@ -189,7 +189,7 @@ public class SwiftImageStoreDriverImpl implements ImageStoreDriver {
DataStore store = this._dataStoreMgr.getDataStore(volumeStore.getDataStoreId(), DataStoreRole.Image);
EndPoint ep = _epSelector.select(store);
DeleteVolumeCommand dtCommand = new DeleteVolumeCommand(
store.getTO(), volumeStore.getInstallPath());
store.getTO(), volumeStore.getVolumeId(), volumeStore.getInstallPath());
Answer answer = ep.sendMessage(dtCommand);
if (answer == null || !answer.getResult()) {
s_logger.debug("Failed to delete "

View File

@ -1325,7 +1325,7 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
if (installPath != null) {
EndPoint ep = _epSelector.select(store);
DeleteVolumeCommand cmd = new DeleteVolumeCommand(store.getTO(), destroyedStoreVO.getInstallPath());
DeleteVolumeCommand cmd = new DeleteVolumeCommand(store.getTO(), destroyedStoreVO.getVolumeId(), destroyedStoreVO.getInstallPath());
Answer answer = ep.sendMessage(cmd);
if (answer == null || !answer.getResult()) {
s_logger.debug("Failed to delete " + destroyedStoreVO + " due to "

View File

@ -34,7 +34,7 @@ import org.springframework.stereotype.Component;
import com.cloud.agent.AgentManager;
import com.cloud.agent.api.Answer;
import com.cloud.agent.api.DeleteObjectFromSwiftCommand;
import com.cloud.agent.api.storage.DeleteTemplateCommand;
import com.cloud.agent.api.to.SwiftTO;
import org.apache.cloudstack.api.command.admin.swift.AddSwiftCmd;
import com.cloud.configuration.Config;
@ -144,7 +144,7 @@ public class SwiftManagerImpl extends ManagerBase implements SwiftManager {
s_logger.warn(msg);
throw new CloudRuntimeException(msg);
}
Answer answer = _agentMgr.sendToSSVM(null, new DeleteObjectFromSwiftCommand(swift, "T-" + cmd.getId(), null));
Answer answer = _agentMgr.sendToSSVM(null, new DeleteTemplateCommand(swift, null, cmd.getId(), null));
if (answer == null || !answer.getResult()) {
msg = "Failed to delete " + tmpltSwiftRef + " due to " + ((answer == null) ? "answer is null" : answer.getDetails());
s_logger.warn(msg);
@ -170,7 +170,7 @@ public class SwiftManagerImpl extends ManagerBase implements SwiftManager {
s_logger.warn(msg);
throw new CloudRuntimeException(msg);
}
Answer answer = _agentMgr.sendToSSVM(null, new DeleteObjectFromSwiftCommand(swift, "T-" + cmd.getId(), null));
Answer answer = _agentMgr.sendToSSVM(null, new DeleteTemplateCommand(swift, null, cmd.getId(), null));
if (answer == null || !answer.getResult()) {
msg = "Failed to delete " + tmpltSwiftRef + " due to " + ((answer == null) ? "answer is null" : answer.getDetails());
s_logger.warn(msg);
@ -236,7 +236,7 @@ public class SwiftManagerImpl extends ManagerBase implements SwiftManager {
if (swift == null) {
return null;
}
List<VMTemplateHostVO> tmpltHosts = _vmTmpltHostDao.listByOnlyTemplateId(tmpltId);
if (tmpltHosts != null) {
Collections.shuffle(tmpltHosts);