Return embedded Volume object for create/attach/detach Volume commands.

This commit is contained in:
alena 2010-11-03 13:06:08 -07:00
parent cb6a3d627e
commit 4a645cdeb0
7 changed files with 117 additions and 162 deletions

View File

@ -23,6 +23,8 @@ import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.apache.log4j.Logger;
import com.cloud.api.response.AccountResponse;
import com.cloud.api.response.ConfigurationResponse;
import com.cloud.api.response.DiskOfferingResponse;
@ -40,6 +42,7 @@ import com.cloud.api.response.SystemVmResponse;
import com.cloud.api.response.UserResponse;
import com.cloud.api.response.UserVmResponse;
import com.cloud.api.response.VlanIpRangeResponse;
import com.cloud.api.response.VolumeResponse;
import com.cloud.api.response.ZoneResponse;
import com.cloud.async.AsyncJobVO;
import com.cloud.configuration.ConfigurationVO;
@ -51,6 +54,7 @@ import com.cloud.dc.HostPodVO;
import com.cloud.dc.Vlan.VlanType;
import com.cloud.dc.VlanVO;
import com.cloud.domain.DomainVO;
import com.cloud.exception.InvalidParameterValueException;
import com.cloud.host.Host;
import com.cloud.host.HostStats;
import com.cloud.host.HostVO;
@ -68,6 +72,7 @@ import com.cloud.storage.Snapshot.SnapshotType;
import com.cloud.storage.SnapshotPolicyVO;
import com.cloud.storage.StoragePoolVO;
import com.cloud.storage.VMTemplateVO;
import com.cloud.storage.Volume;
import com.cloud.storage.VolumeVO;
import com.cloud.test.PodZoneConfig;
import com.cloud.user.Account;
@ -87,6 +92,8 @@ import com.cloud.vm.VmStats;
public class ApiResponseHelper {
public static final Logger s_logger = Logger.getLogger(ApiResponseHelper.class.getName());
public static UserResponse createUserResponse (UserAccount user) {
UserResponse userResponse = new UserResponse();
userResponse.setAccountName(user.getAccountName());
@ -761,6 +768,86 @@ public class ApiResponseHelper {
return zoneResponse;
}
public static VolumeResponse createVolumeResponse (VolumeVO volume) {
VolumeResponse volResponse = new VolumeResponse();
volResponse.setId(volume.getId());
AsyncJobVO asyncJob = ApiDBUtils.findInstancePendingAsyncJob("volume", volume.getId());
if (asyncJob != null) {
volResponse.setJobId(asyncJob.getId());
volResponse.setJobStatus(asyncJob.getStatus());
}
if (volume.getName() != null) {
volResponse.setName(volume.getName());
} else {
volResponse.setName("");
}
volResponse.setZoneId(volume.getDataCenterId());
volResponse.setZoneName(ApiDBUtils.findZoneById(volume.getDataCenterId()).getName());
volResponse.setVolumeType(volume.getVolumeType().toString());
volResponse.setDeviceId(volume.getDeviceId());
Long instanceId = volume.getInstanceId();
if (instanceId != null) {
VMInstanceVO vm = ApiDBUtils.findVMInstanceById(instanceId);
volResponse.setVirtualMachineId(vm.getId());
volResponse.setVirtualMachineName(vm.getName());
volResponse.setVirtualMachineDisplayName(vm.getName());
volResponse.setVirtualMachineState(vm.getState().toString());
}
// Show the virtual size of the volume
volResponse.setSize(volume.getSize());
volResponse.setCreated(volume.getCreated());
volResponse.setState(volume.getStatus().toString());
Account accountTemp = ApiDBUtils.findAccountById(volume.getAccountId());
if (accountTemp != null) {
volResponse.setAccountName(accountTemp.getAccountName());
volResponse.setDomainId(accountTemp.getDomainId());
volResponse.setDomainName(ApiDBUtils.findDomainById(accountTemp.getDomainId()).getName());
}
String storageType;
try {
if(volume.getPoolId() == null){
if (volume.getState() == Volume.State.Allocated) {
/*set it as shared, so the UI can attach it to VM*/
storageType = "shared";
} else {
storageType = "unknown";
}
} else {
storageType = ApiDBUtils.volumeIsOnSharedStorage(volume.getId()) ? "shared" : "local";
}
} catch (InvalidParameterValueException e) {
s_logger.error(e.getMessage(), e);
throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Volume " + volume.getName() + " does not have a valid ID");
}
volResponse.setStorageType(storageType);
volResponse.setDiskOfferingId(volume.getDiskOfferingId());
DiskOfferingVO diskOffering = ApiDBUtils.findDiskOfferingById(volume.getDiskOfferingId());
volResponse.setDiskOfferingName(diskOffering.getName());
volResponse.setDiskOfferingDisplayText(diskOffering.getDisplayText());
Long poolId = volume.getPoolId();
String poolName = (poolId == null) ? "none" : ApiDBUtils.findStoragePoolById(poolId).getName();
volResponse.setStoragePoolName(poolName);
volResponse.setSourceId(volume.getSourceId());
if (volume.getSourceType() != null) {
volResponse.setSourceType(volume.getSourceType().toString());
}
volResponse.setHypervisor(ApiDBUtils.getVolumeHyperType(volume.getId()).toString());
volResponse.setAttached(volume.getAttached());
return volResponse;
}
}

View File

@ -22,6 +22,7 @@ import org.apache.log4j.Logger;
import com.cloud.api.ApiConstants;
import com.cloud.api.ApiDBUtils;
import com.cloud.api.ApiResponseHelper;
import com.cloud.api.BaseAsyncCmd;
import com.cloud.api.Implementation;
import com.cloud.api.Parameter;
@ -29,7 +30,6 @@ import com.cloud.api.response.VolumeResponse;
import com.cloud.event.EventTypes;
import com.cloud.storage.VolumeVO;
import com.cloud.user.Account;
import com.cloud.uservm.UserVm;
import com.cloud.vm.UserVmManager;
@Implementation(method="attachVolumeToVM", manager=UserVmManager.class, description="Attaches a disk volume to a virtual machine.")
@ -106,22 +106,11 @@ public class AttachVolumeCmd extends BaseAsyncCmd {
return "attaching volume: " + getId() + " to vm: " + getVirtualMachineId();
}
@Override @SuppressWarnings("unchecked")
public VolumeResponse getResponse() {
VolumeVO volume = ApiDBUtils.findVolumeById(id);
VolumeResponse response = new VolumeResponse();
UserVm instance = ApiDBUtils.findUserVmById(volume.getInstanceId());
response.setVirtualMachineName(instance.getName());
response.setVirtualMachineDisplayName(instance.getDisplayName());
response.setVirtualMachineId(instance.getId());
response.setVirtualMachineState(instance.getState().toString());
response.setStorageType("shared"); // NOTE: You can never attach a local disk volume but if that changes, we need to change this
response.setId(volume.getId());
response.setName(volume.getName());
response.setVolumeType(volume.getVolumeType().toString());
response.setResponseName(getName());
if(volume.getDeviceId() != null)
response.setDeviceId(volume.getDeviceId());
return response;
}
@Override @SuppressWarnings("unchecked")
public VolumeResponse getResponse() {
VolumeVO volume = (VolumeVO)getResponseObject();
VolumeResponse response = ApiResponseHelper.createVolumeResponse(volume);
response.setResponseName(getName());
return response;
}
}

View File

@ -22,12 +22,12 @@ import org.apache.log4j.Logger;
import com.cloud.api.ApiConstants;
import com.cloud.api.ApiDBUtils;
import com.cloud.api.ApiResponseHelper;
import com.cloud.api.BaseAsyncCreateCmd;
import com.cloud.api.Implementation;
import com.cloud.api.Parameter;
import com.cloud.api.response.VolumeResponse;
import com.cloud.event.EventTypes;
import com.cloud.storage.DiskOfferingVO;
import com.cloud.storage.StorageManager;
import com.cloud.storage.VolumeVO;
import com.cloud.user.Account;
@ -143,35 +143,9 @@ public class CreateVolumeCmd extends BaseAsyncCreateCmd {
@Override @SuppressWarnings("unchecked")
public VolumeResponse getResponse() {
VolumeVO volume = (VolumeVO)getResponseObject();
VolumeResponse response = new VolumeResponse();
response.setId(volume.getId());
response.setName(volume.getName());
response.setVolumeType(volume.getVolumeType().toString());
response.setSize(volume.getSize());
response.setCreated(volume.getCreated());
response.setState(volume.getStatus().toString());
response.setAccountName(ApiDBUtils.findAccountById(volume.getAccountId()).getAccountName());
response.setDomainId(volume.getDomainId());
response.setDiskOfferingId(volume.getDiskOfferingId());
DiskOfferingVO diskOffering = ApiDBUtils.findDiskOfferingById(volume.getDiskOfferingId());
response.setDiskOfferingName(diskOffering.getName());
response.setDiskOfferingDisplayText(diskOffering.getDisplayText());
response.setDomainName(ApiDBUtils.findDomainById(volume.getDomainId()).getName());
response.setStorageType("shared"); // NOTE: You can never create a local disk volume but if that changes, we need to change this
if (volume.getPoolId() != null) {
response.setStoragePoolName(ApiDBUtils.findStoragePoolById(volume.getPoolId()).getName());
}
// if the volume was created from a snapshot, snapshotId will be set so we pass it back in the response
response.setSnapshotId(getSnapshotId());
response.setZoneId(volume.getDataCenterId());
response.setZoneName(ApiDBUtils.findZoneById(volume.getDataCenterId()).getName());
if(volume.getDeviceId() != null){
response.setDeviceId(volume.getDeviceId());
}
VolumeResponse response = ApiResponseHelper.createVolumeResponse(volume);
//FIXME - have to be moved to ApiResponseHelper
response.setSnapshotId(getSnapshotId()); // if the volume was created from a snapshot, snapshotId will be set so we pass it back in the response
response.setResponseName(getName());
return response;
}

View File

@ -21,6 +21,7 @@ import org.apache.log4j.Logger;
import com.cloud.api.ApiConstants;
import com.cloud.api.ApiDBUtils;
import com.cloud.api.ApiResponseHelper;
import com.cloud.api.BaseAsyncCmd;
import com.cloud.api.Implementation;
import com.cloud.api.Parameter;
@ -115,11 +116,11 @@ public class DetachVolumeCmd extends BaseAsyncCmd {
return "detaching volume" + sb.toString();
}
@Override @SuppressWarnings("unchecked")
public VolumeResponse getResponse() {
VolumeResponse response = (VolumeResponse)getResponseObject();
if(deviceId!=null)
response.setDeviceId(deviceId);
@Override @SuppressWarnings("unchecked")
public VolumeResponse getResponse() {
VolumeVO volume = (VolumeVO)getResponseObject();
VolumeResponse response = ApiResponseHelper.createVolumeResponse(volume);
response.setResponseName(getName());
return response;
}
}
}

View File

@ -23,21 +23,13 @@ import java.util.List;
import org.apache.log4j.Logger;
import com.cloud.api.ApiConstants;
import com.cloud.api.ApiDBUtils;
import com.cloud.api.BaseCmd;
import com.cloud.api.ApiResponseHelper;
import com.cloud.api.BaseListCmd;
import com.cloud.api.Implementation;
import com.cloud.api.Parameter;
import com.cloud.api.ServerApiException;
import com.cloud.api.response.ListResponse;
import com.cloud.api.response.VolumeResponse;
import com.cloud.async.AsyncJobVO;
import com.cloud.exception.InvalidParameterValueException;
import com.cloud.storage.DiskOfferingVO;
import com.cloud.storage.Volume;
import com.cloud.storage.VolumeVO;
import com.cloud.user.Account;
import com.cloud.vm.VMInstanceVO;
@Implementation(method="searchForVolumes", description="Lists all volumes.")
public class ListVolumesCmd extends BaseListCmd {
@ -132,83 +124,7 @@ public class ListVolumesCmd extends BaseListCmd {
ListResponse<VolumeResponse> response = new ListResponse<VolumeResponse>();
List<VolumeResponse> volResponses = new ArrayList<VolumeResponse>();
for (VolumeVO volume : volumes) {
VolumeResponse volResponse = new VolumeResponse();
volResponse.setId(volume.getId());
AsyncJobVO asyncJob = ApiDBUtils.findInstancePendingAsyncJob("volume", volume.getId());
if (asyncJob != null) {
volResponse.setJobId(asyncJob.getId());
volResponse.setJobStatus(asyncJob.getStatus());
}
if (volume.getName() != null) {
volResponse.setName(volume.getName());
} else {
volResponse.setName("");
}
volResponse.setZoneId(volume.getDataCenterId());
volResponse.setZoneName(ApiDBUtils.findZoneById(volume.getDataCenterId()).getName());
volResponse.setVolumeType(volume.getVolumeType().toString());
volResponse.setDeviceId(volume.getDeviceId());
Long instanceId = volume.getInstanceId();
if (instanceId != null) {
VMInstanceVO vm = ApiDBUtils.findVMInstanceById(instanceId);
volResponse.setVirtualMachineId(vm.getId());
volResponse.setVirtualMachineName(vm.getName());
volResponse.setVirtualMachineDisplayName(vm.getName());
volResponse.setVirtualMachineState(vm.getState().toString());
}
// Show the virtual size of the volume
volResponse.setSize(volume.getSize());
volResponse.setCreated(volume.getCreated());
volResponse.setState(volume.getStatus().toString());
Account accountTemp = ApiDBUtils.findAccountById(volume.getAccountId());
if (accountTemp != null) {
volResponse.setAccountName(accountTemp.getAccountName());
volResponse.setDomainId(accountTemp.getDomainId());
volResponse.setDomainName(ApiDBUtils.findDomainById(accountTemp.getDomainId()).getName());
}
String storageType;
try {
if(volume.getPoolId() == null){
if (volume.getState() == Volume.State.Allocated) {
/*set it as shared, so the UI can attach it to VM*/
storageType = "shared";
} else {
storageType = "unknown";
}
} else {
storageType = ApiDBUtils.volumeIsOnSharedStorage(volume.getId()) ? "shared" : "local";
}
} catch (InvalidParameterValueException e) {
s_logger.error(e.getMessage(), e);
throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Volume " + volume.getName() + " does not have a valid ID");
}
volResponse.setStorageType(storageType);
volResponse.setDiskOfferingId(volume.getDiskOfferingId());
DiskOfferingVO diskOffering = ApiDBUtils.findDiskOfferingById(volume.getDiskOfferingId());
volResponse.setDiskOfferingName(diskOffering.getName());
volResponse.setDiskOfferingDisplayText(diskOffering.getDisplayText());
Long poolId = volume.getPoolId();
String poolName = (poolId == null) ? "none" : ApiDBUtils.findStoragePoolById(poolId).getName();
volResponse.setStoragePoolName(poolName);
volResponse.setSourceId(volume.getSourceId());
if (volume.getSourceType() != null) {
volResponse.setSourceType(volume.getSourceType().toString());
}
volResponse.setHypervisor(ApiDBUtils.getVolumeHyperType(volume.getId()).toString());
volResponse.setAttached(volume.getAttached());
VolumeResponse volResponse = ApiResponseHelper.createVolumeResponse(volume);
volResponse.setResponseName("volume");
volResponses.add(volResponse);
}

View File

@ -79,7 +79,6 @@ import com.cloud.api.commands.StartVMCmd;
import com.cloud.api.commands.StopVMCmd;
import com.cloud.api.commands.UpdateVMCmd;
import com.cloud.api.commands.UpgradeVMCmd;
import com.cloud.api.response.VolumeResponse;
import com.cloud.async.AsyncJobExecutor;
import com.cloud.async.AsyncJobManager;
import com.cloud.async.AsyncJobResult;
@ -357,7 +356,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM
}
@Override
public void attachVolumeToVM(AttachVolumeCmd command) {
public Volume attachVolumeToVM(AttachVolumeCmd command) {
Long vmId = command.getVirtualMachineId();
Long volumeId = command.getId();
Long deviceId = command.getDeviceId();
@ -584,6 +583,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM
event.setDescription("Volume: " +volume.getName()+ " successfully attached to VM: "+vm.getName());
event.setLevel(EventVO.LEVEL_INFO);
_eventDao.persist(event);
return _volsDao.findById(volumeId);
} else {
if (answer != null) {
String details = answer.getDetails();
@ -595,7 +595,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM
}
@Override
public VolumeResponse detachVolumeFromVM(DetachVolumeCmd cmmd) {
public Volume detachVolumeFromVM(DetachVolumeCmd cmmd) {
Account account = UserContext.current().getAccount();
if ((cmmd.getId() == null && cmmd.getDeviceId() == null && cmmd.getVirtualMachineId() == null) ||
(cmmd.getId() != null && (cmmd.getDeviceId() != null || cmmd.getVirtualMachineId() != null)) ||
@ -710,20 +710,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM
event.setLevel(EventVO.LEVEL_INFO);
_eventDao.persist(event);
// Prepare the response object
VolumeResponse response = new VolumeResponse();
response.setVirtualMachineName(vm.getName());
response.setVirtualMachineDisplayName(vm.getDisplayName());
response.setVirtualMachineId(vm.getId());
response.setVirtualMachineState(vm.getState().toString());
response.setStorageType("shared"); // NOTE: You can never attach a local disk volume but if that changes, we need to change this
response.setId(volume.getId());
response.setName(volume.getName());
response.setVolumeType(volume.getVolumeType().toString());
response.setResponseName(cmmd.getName());
if(volume.getDeviceId() != null)
response.setDeviceId(volume.getDeviceId());
return response;
return _volsDao.findById(volumeId);
} else {
if (answer != null) {

View File

@ -31,7 +31,6 @@ import com.cloud.api.commands.StartVMCmd;
import com.cloud.api.commands.StopVMCmd;
import com.cloud.api.commands.UpdateVMCmd;
import com.cloud.api.commands.UpgradeVMCmd;
import com.cloud.api.response.VolumeResponse;
import com.cloud.async.executor.OperationResponse;
import com.cloud.async.executor.RebootVMExecutor;
import com.cloud.async.executor.VMOperationParam;
@ -43,6 +42,7 @@ import com.cloud.exception.ResourceAllocationException;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.exception.StorageUnavailableException;
import com.cloud.storage.VMTemplateVO;
import com.cloud.storage.Volume;
import com.cloud.uservm.UserVm;
import com.cloud.utils.component.Manager;
import com.cloud.utils.exception.ExecutionException;
@ -65,17 +65,18 @@ public interface UserVmService extends Manager {
/**
* Attaches the specified volume to the specified VM
* @param cmd - the command specifying volumeId and vmId
* @return the Volume object if attach worked successfully.
* @throws InvalidParameterValueException, PermissionDeniedException
*/
void attachVolumeToVM(AttachVolumeCmd cmd);
Volume attachVolumeToVM(AttachVolumeCmd cmd);
/**
* Detaches the specified volume from the VM it is currently attached to.
* @param cmd - the command specifying volumeId
* @return the VolumeResponse object if detach worked successfully.
* @return the Volume object if detach worked successfully.
* @throws InvalidParameterValueException
*/
VolumeResponse detachVolumeFromVM(DetachVolumeCmd cmmd);
Volume detachVolumeFromVM(DetachVolumeCmd cmmd);
UserVm startVirtualMachine(StartVMCmd cmd) throws StorageUnavailableException, ExecutionException, ConcurrentOperationException;
UserVm stopVirtualMachine(StopVMCmd cmd);