Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -158,10 +158,12 @@ public void deleteAsync(DataStore store, DataObject data, AsyncCompletionCallbac
throw new CloudRuntimeException("deleteAsync : Storage Pool not found for id: " + store.getId());
}
Map<String, String> details = storagePoolDetailsDao.listDetailsKeyPairs(store.getId());
if (ProtocolType.NFS3.name().equalsIgnoreCase(details.get(Constants.PROTOCOL))) {
// ManagedNFS qcow2 backing file deletion handled by KVM host/libvirt; nothing to do via ONTAP REST.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you can keep this comment since this stands valid

s_logger.info("deleteAsync: ManagedNFS volume {} no-op ONTAP deletion", data.getId());
}
StorageStrategy storageStrategy = Utility.getStrategyByStoragePoolDetails(details);
s_logger.info("createCloudStackVolumeForTypeVolume: Connection to Ontap SVM [{}] successful, preparing CloudStackVolumeRequest", details.get(Constants.SVM_NAME));
VolumeInfo volumeInfo = (VolumeInfo) data;
CloudStackVolume cloudStackVolumeRequest = createDeleteCloudStackVolumeRequest(storagePool,details,volumeInfo);
storageStrategy.deleteCloudStackVolume(cloudStackVolumeRequest);
s_logger.error("deleteAsync : Volume deleted: " + volumeInfo.getId());
}
} catch (Exception e) {
commandResult.setResult(e.getMessage());
Expand Down Expand Up @@ -291,6 +293,24 @@ public boolean isStorageSupportHA(Storage.StoragePoolType type) {

@Override
public void detachVolumeFromAllStorageNodes(Volume volume) {
}

private CloudStackVolume createDeleteCloudStackVolumeRequest(StoragePool storagePool, Map<String, String> details, VolumeInfo volumeInfo) {
CloudStackVolume cloudStackVolumeRequest = null;

String protocol = details.get(Constants.PROTOCOL);
ProtocolType protocolType = ProtocolType.valueOf(protocol);
switch (protocolType) {
case NFS3:
cloudStackVolumeRequest = new CloudStackVolume();
cloudStackVolumeRequest.setDatastoreId(String.valueOf(storagePool.getId()));
cloudStackVolumeRequest.setVolumeInfo(volumeInfo);
break;
default:
throw new CloudRuntimeException("createDeleteCloudStackVolumeRequest: Unsupported protocol " + protocol);

}
return cloudStackVolumeRequest;

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -472,7 +472,7 @@ public String getNetworkInterface() {
*
* @param cloudstackVolume the CloudStack volume to delete
*/
abstract void deleteCloudStackVolume(CloudStackVolume cloudstackVolume);
abstract public void deleteCloudStackVolume(CloudStackVolume cloudstackVolume);

/**
* Method encapsulates the behavior based on the opted protocol in subclasses.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import org.apache.cloudstack.engine.subsystem.api.storage.EndPointSelector;
import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo;
import org.apache.cloudstack.storage.command.CreateObjectCommand;
import org.apache.cloudstack.storage.command.DeleteCommand;
import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao;
import org.apache.cloudstack.storage.feign.FeignClientFactory;
import org.apache.cloudstack.storage.feign.client.JobFeignClient;
Expand Down Expand Up @@ -93,12 +94,12 @@ public CloudStackVolume createCloudStackVolume(CloudStackVolume cloudstackVolume
Answer answer = createVolumeOnKVMHost(cloudstackVolume.getVolumeInfo());
if (answer == null || !answer.getResult()) {
String errMsg = answer != null ? answer.getDetails() : "Failed to create qcow2 on KVM host";
s_logger.error("createCloudStackVolumeForTypeVolume: " + errMsg);
s_logger.error("createCloudStackVolume: " + errMsg);
throw new CloudRuntimeException(errMsg);
}
return cloudstackVolume;
}catch (Exception e) {
s_logger.error("createCloudStackVolumeForTypeVolume: error occured " + e);
s_logger.error("createCloudStackVolume: error occured " + e);
throw new CloudRuntimeException(e);
}
}
Expand All @@ -110,8 +111,20 @@ CloudStackVolume updateCloudStackVolume(CloudStackVolume cloudstackVolume) {
}

@Override
void deleteCloudStackVolume(CloudStackVolume cloudstackVolume) {
//TODO
public void deleteCloudStackVolume(CloudStackVolume cloudstackVolume) {
s_logger.info("deleteCloudStackVolume: Delete cloudstack volume " + cloudstackVolume);
try {
// Step 1: Send command to KVM host to delete qcow2 file using qemu-img
Answer answer = deleteVolumeOnKVMHost(cloudstackVolume.getVolumeInfo());
if (answer == null || !answer.getResult()) {
String errMsg = answer != null ? answer.getDetails() : "Failed to delete qcow2 on KVM host";
s_logger.error("deleteCloudStackVolume: " + errMsg);
throw new CloudRuntimeException(errMsg);
}
}catch (Exception e) {
s_logger.error("deleteCloudStackVolume: error occured " + e);
throw new CloudRuntimeException(e);
}
}

@Override
Expand Down Expand Up @@ -493,4 +506,31 @@ private Answer createVolumeOnKVMHost(DataObject volumeInfo) {
return new Answer(null, false, e.toString());
}
}

private Answer deleteVolumeOnKVMHost(DataObject volumeInfo) {
s_logger.info("deleteVolumeOnKVMHost called with volumeInfo: {} ", volumeInfo);

try {
s_logger.info("deleteVolumeOnKVMHost: Sending DeleteCommand to KVM agent for volume: {}", volumeInfo.getUuid());
DeleteCommand cmd = new DeleteCommand(volumeInfo.getTO());
EndPoint ep = epSelector.select(volumeInfo);
if (ep == null) {
String errMsg = "No remote endpoint to send DeleteCommand, check if host is up";
s_logger.error(errMsg);
return new Answer(cmd, false, errMsg);
}
s_logger.info("deleteVolumeOnKVMHost: Sending command to endpoint: {}", ep.getHostAddr());
Answer answer = ep.sendMessage(cmd);
if (answer != null && answer.getResult()) {
s_logger.info("deleteVolumeOnKVMHost: Successfully deleted qcow2 file on KVM host");
} else {
s_logger.error("deleteVolumeOnKVMHost: Failed to delete qcow2 file: {}",
answer != null ? answer.getDetails() : "null answer");
}
return answer;
} catch (Exception e) {
s_logger.error("deleteVolumeOnKVMHost: Exception sending DeleteCommand", e);
return new Answer(null, false, e.toString());
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ CloudStackVolume updateCloudStackVolume(CloudStackVolume cloudstackVolume) {
}

@Override
void deleteCloudStackVolume(CloudStackVolume cloudstackVolume) {
public void deleteCloudStackVolume(CloudStackVolume cloudstackVolume) {
//TODO
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ org.apache.cloudstack.storage.service.model.CloudStackVolume updateCloudStackVol
}

@Override
void deleteCloudStackVolume(org.apache.cloudstack.storage.service.model.CloudStackVolume cloudstackVolume) {
public void deleteCloudStackVolume(org.apache.cloudstack.storage.service.model.CloudStackVolume cloudstackVolume) {
}

@Override
Expand Down
Loading