mirror of
https://github.com/apache/cloudstack.git
synced 2025-12-16 10:32:34 +01:00
merge conflicts 4.19 -> main
This commit is contained in:
commit
abfa92928c
@ -18,6 +18,7 @@ package com.cloud.hypervisor.kvm.storage;
|
|||||||
|
|
||||||
import org.apache.cloudstack.utils.qemu.QemuImg.PhysicalDiskFormat;
|
import org.apache.cloudstack.utils.qemu.QemuImg.PhysicalDiskFormat;
|
||||||
import org.apache.cloudstack.utils.qemu.QemuObject;
|
import org.apache.cloudstack.utils.qemu.QemuObject;
|
||||||
|
import org.apache.cloudstack.utils.reflectiontostringbuilderutils.ReflectionToStringBuilderUtils;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@ -25,8 +26,10 @@ import java.util.List;
|
|||||||
|
|
||||||
public class KVMPhysicalDisk {
|
public class KVMPhysicalDisk {
|
||||||
private String path;
|
private String path;
|
||||||
private String name;
|
private final String name;
|
||||||
private KVMStoragePool pool;
|
private final KVMStoragePool pool;
|
||||||
|
private String dispName;
|
||||||
|
private String vmName;
|
||||||
private boolean useAsTemplate;
|
private boolean useAsTemplate;
|
||||||
|
|
||||||
public static String RBDStringBuilder(String monHost, int monPort, String authUserName, String authSecret, String image) {
|
public static String RBDStringBuilder(String monHost, int monPort, String authUserName, String authSecret, String image) {
|
||||||
@ -81,7 +84,9 @@ public class KVMPhysicalDisk {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "KVMPhysicalDisk [path=" + path + ", name=" + name + ", pool=" + pool + ", format=" + format + ", size=" + size + ", virtualSize=" + virtualSize + "]";
|
return String.format("KVMPhysicalDisk %s",
|
||||||
|
ReflectionToStringBuilderUtils.reflectOnlySelectedFields(
|
||||||
|
this, "path", "name", "pool", "format", "size", "virtualSize", "dispName", "vmName"));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setFormat(PhysicalDiskFormat format) {
|
public void setFormat(PhysicalDiskFormat format) {
|
||||||
@ -135,4 +140,20 @@ public class KVMPhysicalDisk {
|
|||||||
public void setUseAsTemplate() { this.useAsTemplate = true; }
|
public void setUseAsTemplate() { this.useAsTemplate = true; }
|
||||||
|
|
||||||
public boolean useAsTemplate() { return this.useAsTemplate; }
|
public boolean useAsTemplate() { return this.useAsTemplate; }
|
||||||
|
|
||||||
|
public String getDispName() {
|
||||||
|
return dispName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDispName(String dispName) {
|
||||||
|
this.dispName = dispName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getVmName() {
|
||||||
|
return vmName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setVmName(String vmName) {
|
||||||
|
this.vmName = vmName;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -435,6 +435,7 @@ public class KVMStorageProcessor implements StorageProcessor {
|
|||||||
if (!storagePoolMgr.connectPhysicalDisk(primaryStore.getPoolType(), primaryStore.getUuid(), path, details)) {
|
if (!storagePoolMgr.connectPhysicalDisk(primaryStore.getPoolType(), primaryStore.getUuid(), path, details)) {
|
||||||
logger.warn("Failed to connect new volume at path: " + path + ", in storage pool id: " + primaryStore.getUuid());
|
logger.warn("Failed to connect new volume at path: " + path + ", in storage pool id: " + primaryStore.getUuid());
|
||||||
}
|
}
|
||||||
|
BaseVol.setDispName(template.getName());
|
||||||
|
|
||||||
vol = storagePoolMgr.copyPhysicalDisk(BaseVol, path != null ? path : volume.getUuid(), primaryPool, cmd.getWaitInMillSeconds(), null, volume.getPassphrase(), volume.getProvisioningType());
|
vol = storagePoolMgr.copyPhysicalDisk(BaseVol, path != null ? path : volume.getUuid(), primaryPool, cmd.getWaitInMillSeconds(), null, volume.getPassphrase(), volume.getProvisioningType());
|
||||||
|
|
||||||
@ -527,6 +528,8 @@ public class KVMStorageProcessor implements StorageProcessor {
|
|||||||
final KVMPhysicalDisk volume = secondaryStoragePool.getPhysicalDisk(srcVolumeName);
|
final KVMPhysicalDisk volume = secondaryStoragePool.getPhysicalDisk(srcVolumeName);
|
||||||
|
|
||||||
volume.setFormat(PhysicalDiskFormat.valueOf(srcFormat.toString()));
|
volume.setFormat(PhysicalDiskFormat.valueOf(srcFormat.toString()));
|
||||||
|
volume.setDispName(srcVol.getName());
|
||||||
|
volume.setVmName(srcVol.getVmName());
|
||||||
|
|
||||||
final KVMPhysicalDisk newDisk = storagePoolMgr.copyPhysicalDisk(volume, path != null ? path : volumeName, primaryPool, cmd.getWaitInMillSeconds());
|
final KVMPhysicalDisk newDisk = storagePoolMgr.copyPhysicalDisk(volume, path != null ? path : volumeName, primaryPool, cmd.getWaitInMillSeconds());
|
||||||
|
|
||||||
@ -2492,6 +2495,8 @@ public class KVMStorageProcessor implements StorageProcessor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
volume.setFormat(PhysicalDiskFormat.valueOf(srcFormat.toString()));
|
volume.setFormat(PhysicalDiskFormat.valueOf(srcFormat.toString()));
|
||||||
|
volume.setDispName(srcVol.getName());
|
||||||
|
volume.setVmName(srcVol.getVmName());
|
||||||
|
|
||||||
String destVolumeName = null;
|
String destVolumeName = null;
|
||||||
if (destPrimaryStore.isManaged()) {
|
if (destPrimaryStore.isManaged()) {
|
||||||
|
|||||||
@ -1409,7 +1409,10 @@ public class LibvirtStorageAdaptor implements StorageAdaptor {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
KVMStoragePool srcPool = disk.getPool();
|
KVMStoragePool srcPool = disk.getPool();
|
||||||
PhysicalDiskFormat sourceFormat = disk.getFormat();
|
/* Linstor images are always stored as RAW, but Linstor uses qcow2 in DB,
|
||||||
|
to support snapshots(backuped) as qcow2 files. */
|
||||||
|
PhysicalDiskFormat sourceFormat = srcPool.getType() != StoragePoolType.Linstor ?
|
||||||
|
disk.getFormat() : PhysicalDiskFormat.RAW;
|
||||||
String sourcePath = disk.getPath();
|
String sourcePath = disk.getPath();
|
||||||
|
|
||||||
KVMPhysicalDisk newDisk;
|
KVMPhysicalDisk newDisk;
|
||||||
|
|||||||
@ -521,6 +521,15 @@ public class LinstorStorageAdaptor implements StorageAdaptor {
|
|||||||
final KVMPhysicalDisk dstDisk = destPools.createPhysicalDisk(
|
final KVMPhysicalDisk dstDisk = destPools.createPhysicalDisk(
|
||||||
name, QemuImg.PhysicalDiskFormat.RAW, provisioningType, disk.getVirtualSize(), null);
|
name, QemuImg.PhysicalDiskFormat.RAW, provisioningType, disk.getVirtualSize(), null);
|
||||||
|
|
||||||
|
final DevelopersApi api = getLinstorAPI(destPools);
|
||||||
|
final String rscName = LinstorUtil.RSC_PREFIX + name;
|
||||||
|
try {
|
||||||
|
LinstorUtil.applyAuxProps(api, rscName, disk.getDispName(), disk.getVmName());
|
||||||
|
} catch (ApiException apiExc) {
|
||||||
|
s_logger.error(String.format("Error setting aux properties for %s", rscName));
|
||||||
|
logLinstorAnswers(apiExc.getApiCallRcList());
|
||||||
|
}
|
||||||
|
|
||||||
logger.debug(String.format("Linstor.copyPhysicalDisk: dstPath: %s", dstDisk.getPath()));
|
logger.debug(String.format("Linstor.copyPhysicalDisk: dstPath: %s", dstDisk.getPath()));
|
||||||
final QemuImgFile destFile = new QemuImgFile(dstDisk.getPath());
|
final QemuImgFile destFile = new QemuImgFile(dstDisk.getPath());
|
||||||
destFile.setFormat(dstDisk.getFormat());
|
destFile.setFormat(dstDisk.getFormat());
|
||||||
|
|||||||
@ -26,7 +26,6 @@ import com.linbit.linstor.api.model.ResourceDefinition;
|
|||||||
import com.linbit.linstor.api.model.ResourceDefinitionCloneRequest;
|
import com.linbit.linstor.api.model.ResourceDefinitionCloneRequest;
|
||||||
import com.linbit.linstor.api.model.ResourceDefinitionCloneStarted;
|
import com.linbit.linstor.api.model.ResourceDefinitionCloneStarted;
|
||||||
import com.linbit.linstor.api.model.ResourceDefinitionCreate;
|
import com.linbit.linstor.api.model.ResourceDefinitionCreate;
|
||||||
import com.linbit.linstor.api.model.ResourceDefinitionModify;
|
|
||||||
import com.linbit.linstor.api.model.ResourceGroupSpawn;
|
import com.linbit.linstor.api.model.ResourceGroupSpawn;
|
||||||
import com.linbit.linstor.api.model.ResourceMakeAvailable;
|
import com.linbit.linstor.api.model.ResourceMakeAvailable;
|
||||||
import com.linbit.linstor.api.model.Snapshot;
|
import com.linbit.linstor.api.model.Snapshot;
|
||||||
@ -62,8 +61,8 @@ import com.cloud.resource.ResourceState;
|
|||||||
import com.cloud.storage.DataStoreRole;
|
import com.cloud.storage.DataStoreRole;
|
||||||
import com.cloud.storage.ResizeVolumePayload;
|
import com.cloud.storage.ResizeVolumePayload;
|
||||||
import com.cloud.storage.SnapshotVO;
|
import com.cloud.storage.SnapshotVO;
|
||||||
import com.cloud.storage.Storage.StoragePoolType;
|
|
||||||
import com.cloud.storage.Storage;
|
import com.cloud.storage.Storage;
|
||||||
|
import com.cloud.storage.Storage.StoragePoolType;
|
||||||
import com.cloud.storage.StorageManager;
|
import com.cloud.storage.StorageManager;
|
||||||
import com.cloud.storage.StoragePool;
|
import com.cloud.storage.StoragePool;
|
||||||
import com.cloud.storage.VMTemplateStoragePoolVO;
|
import com.cloud.storage.VMTemplateStoragePoolVO;
|
||||||
@ -390,27 +389,6 @@ public class LinstorPrimaryDataStoreDriverImpl implements PrimaryDataStoreDriver
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void applyAuxProps(DevelopersApi api, String rscName, String dispName, String vmName)
|
|
||||||
throws ApiException
|
|
||||||
{
|
|
||||||
ResourceDefinitionModify rdm = new ResourceDefinitionModify();
|
|
||||||
Properties props = new Properties();
|
|
||||||
if (dispName != null)
|
|
||||||
{
|
|
||||||
props.put("Aux/cs-name", dispName);
|
|
||||||
}
|
|
||||||
if (vmName != null)
|
|
||||||
{
|
|
||||||
props.put("Aux/cs-vm-name", vmName);
|
|
||||||
}
|
|
||||||
if (!props.isEmpty())
|
|
||||||
{
|
|
||||||
rdm.setOverrideProps(props);
|
|
||||||
ApiCallRcList answers = api.resourceDefinitionModify(rscName, rdm);
|
|
||||||
checkLinstorAnswersThrow(answers);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getRscGrp(StoragePoolVO storagePoolVO) {
|
private String getRscGrp(StoragePoolVO storagePoolVO) {
|
||||||
return storagePoolVO.getUserInfo() != null && !storagePoolVO.getUserInfo().isEmpty() ?
|
return storagePoolVO.getUserInfo() != null && !storagePoolVO.getUserInfo().isEmpty() ?
|
||||||
storagePoolVO.getUserInfo() : "DfltRscGrp";
|
storagePoolVO.getUserInfo() : "DfltRscGrp";
|
||||||
@ -428,7 +406,8 @@ public class LinstorPrimaryDataStoreDriverImpl implements PrimaryDataStoreDriver
|
|||||||
ApiCallRcList answers = api.resourceGroupSpawn(rscGrp, rscGrpSpawn);
|
ApiCallRcList answers = api.resourceGroupSpawn(rscGrp, rscGrpSpawn);
|
||||||
checkLinstorAnswersThrow(answers);
|
checkLinstorAnswersThrow(answers);
|
||||||
|
|
||||||
applyAuxProps(api, rscName, volName, vmName);
|
answers = LinstorUtil.applyAuxProps(api, rscName, volName, vmName);
|
||||||
|
checkLinstorAnswersThrow(answers);
|
||||||
|
|
||||||
return LinstorUtil.getDevicePath(api, rscName);
|
return LinstorUtil.getDevicePath(api, rscName);
|
||||||
} catch (ApiException apiEx)
|
} catch (ApiException apiEx)
|
||||||
@ -499,7 +478,8 @@ public class LinstorPrimaryDataStoreDriverImpl implements PrimaryDataStoreDriver
|
|||||||
if (volumeInfo.getSize() != null && volumeInfo.getSize() > 0) {
|
if (volumeInfo.getSize() != null && volumeInfo.getSize() > 0) {
|
||||||
resizeResource(linstorApi, rscName, volumeInfo.getSize());
|
resizeResource(linstorApi, rscName, volumeInfo.getSize());
|
||||||
}
|
}
|
||||||
applyAuxProps(linstorApi, rscName, volumeInfo.getName(), volumeInfo.getAttachedVmName());
|
|
||||||
|
LinstorUtil.applyAuxProps(linstorApi, rscName, volumeInfo.getName(), volumeInfo.getAttachedVmName());
|
||||||
applyQoSSettings(storagePoolVO, linstorApi, rscName, volumeInfo.getMaxIops());
|
applyQoSSettings(storagePoolVO, linstorApi, rscName, volumeInfo.getMaxIops());
|
||||||
|
|
||||||
return LinstorUtil.getDevicePath(linstorApi, rscName);
|
return LinstorUtil.getDevicePath(linstorApi, rscName);
|
||||||
@ -551,7 +531,7 @@ public class LinstorPrimaryDataStoreDriverImpl implements PrimaryDataStoreDriver
|
|||||||
answers = linstorApi.resourceSnapshotRestore(cloneRes, snapName, snapshotRestore);
|
answers = linstorApi.resourceSnapshotRestore(cloneRes, snapName, snapshotRestore);
|
||||||
checkLinstorAnswersThrow(answers);
|
checkLinstorAnswersThrow(answers);
|
||||||
|
|
||||||
applyAuxProps(linstorApi, rscName, volumeVO.getName(), null);
|
LinstorUtil.applyAuxProps(linstorApi, rscName, volumeVO.getName(), null);
|
||||||
applyQoSSettings(storagePoolVO, linstorApi, rscName, volumeVO.getMaxIops());
|
applyQoSSettings(storagePoolVO, linstorApi, rscName, volumeVO.getMaxIops());
|
||||||
|
|
||||||
return LinstorUtil.getDevicePath(linstorApi, rscName);
|
return LinstorUtil.getDevicePath(linstorApi, rscName);
|
||||||
@ -833,7 +813,7 @@ public class LinstorPrimaryDataStoreDriverImpl implements PrimaryDataStoreDriver
|
|||||||
VolumeInfo volume = sinfo.getBaseVolume();
|
VolumeInfo volume = sinfo.getBaseVolume();
|
||||||
deleteSnapshot(
|
deleteSnapshot(
|
||||||
srcData.getDataStore(),
|
srcData.getDataStore(),
|
||||||
LinstorUtil.RSC_PREFIX + volume.getUuid(),
|
LinstorUtil.RSC_PREFIX + volume.getPath(),
|
||||||
LinstorUtil.RSC_PREFIX + sinfo.getUuid());
|
LinstorUtil.RSC_PREFIX + sinfo.getUuid());
|
||||||
}
|
}
|
||||||
res = new CopyCommandResult(null, answer);
|
res = new CopyCommandResult(null, answer);
|
||||||
@ -969,7 +949,7 @@ public class LinstorPrimaryDataStoreDriverImpl implements PrimaryDataStoreDriver
|
|||||||
VolumeInfo srcVolInfo = (VolumeInfo) srcData;
|
VolumeInfo srcVolInfo = (VolumeInfo) srcData;
|
||||||
final StoragePoolVO pool = _storagePoolDao.findById(srcVolInfo.getDataStore().getId());
|
final StoragePoolVO pool = _storagePoolDao.findById(srcVolInfo.getDataStore().getId());
|
||||||
final DevelopersApi api = LinstorUtil.getLinstorAPI(pool.getHostAddress());
|
final DevelopersApi api = LinstorUtil.getLinstorAPI(pool.getHostAddress());
|
||||||
final String rscName = LinstorUtil.RSC_PREFIX + srcVolInfo.getUuid();
|
final String rscName = LinstorUtil.RSC_PREFIX + srcVolInfo.getPath();
|
||||||
|
|
||||||
VolumeObjectTO to = (VolumeObjectTO) srcVolInfo.getTO();
|
VolumeObjectTO to = (VolumeObjectTO) srcVolInfo.getTO();
|
||||||
// patch source format
|
// patch source format
|
||||||
@ -1082,7 +1062,7 @@ public class LinstorPrimaryDataStoreDriverImpl implements PrimaryDataStoreDriver
|
|||||||
options.put("volumeSize", snapshotObject.getBaseVolume().getSize() + "");
|
options.put("volumeSize", snapshotObject.getBaseVolume().getSize() + "");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
final String rscName = LinstorUtil.RSC_PREFIX + snapshotObject.getBaseVolume().getUuid();
|
final String rscName = LinstorUtil.RSC_PREFIX + snapshotObject.getBaseVolume().getPath();
|
||||||
String snapshotName = setCorrectSnapshotPath(api, rscName, snapshotObject);
|
String snapshotName = setCorrectSnapshotPath(api, rscName, snapshotObject);
|
||||||
|
|
||||||
CopyCommand cmd = new LinstorBackupSnapshotCommand(
|
CopyCommand cmd = new LinstorBackupSnapshotCommand(
|
||||||
|
|||||||
@ -22,8 +22,10 @@ import com.linbit.linstor.api.DevelopersApi;
|
|||||||
import com.linbit.linstor.api.model.ApiCallRc;
|
import com.linbit.linstor.api.model.ApiCallRc;
|
||||||
import com.linbit.linstor.api.model.ApiCallRcList;
|
import com.linbit.linstor.api.model.ApiCallRcList;
|
||||||
import com.linbit.linstor.api.model.Node;
|
import com.linbit.linstor.api.model.Node;
|
||||||
|
import com.linbit.linstor.api.model.Properties;
|
||||||
import com.linbit.linstor.api.model.ProviderKind;
|
import com.linbit.linstor.api.model.ProviderKind;
|
||||||
import com.linbit.linstor.api.model.Resource;
|
import com.linbit.linstor.api.model.Resource;
|
||||||
|
import com.linbit.linstor.api.model.ResourceDefinitionModify;
|
||||||
import com.linbit.linstor.api.model.ResourceGroup;
|
import com.linbit.linstor.api.model.ResourceGroup;
|
||||||
import com.linbit.linstor.api.model.ResourceWithVolumes;
|
import com.linbit.linstor.api.model.ResourceWithVolumes;
|
||||||
import com.linbit.linstor.api.model.StoragePool;
|
import com.linbit.linstor.api.model.StoragePool;
|
||||||
@ -240,4 +242,26 @@ public class LinstorUtil {
|
|||||||
LOGGER.error(errMsg);
|
LOGGER.error(errMsg);
|
||||||
throw new CloudRuntimeException("Linstor: " + errMsg);
|
throw new CloudRuntimeException("Linstor: " + errMsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static ApiCallRcList applyAuxProps(DevelopersApi api, String rscName, String dispName, String vmName)
|
||||||
|
throws ApiException
|
||||||
|
{
|
||||||
|
ResourceDefinitionModify rdm = new ResourceDefinitionModify();
|
||||||
|
Properties props = new Properties();
|
||||||
|
if (dispName != null)
|
||||||
|
{
|
||||||
|
props.put("Aux/cs-name", dispName);
|
||||||
|
}
|
||||||
|
if (vmName != null)
|
||||||
|
{
|
||||||
|
props.put("Aux/cs-vm-name", vmName);
|
||||||
|
}
|
||||||
|
ApiCallRcList answers = new ApiCallRcList();
|
||||||
|
if (!props.isEmpty())
|
||||||
|
{
|
||||||
|
rdm.setOverrideProps(props);
|
||||||
|
answers = api.resourceDefinitionModify(rscName, rdm);
|
||||||
|
}
|
||||||
|
return answers;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -240,7 +240,7 @@ public class LinstorVMSnapshotStrategy extends DefaultVMSnapshotStrategy {
|
|||||||
final String snapshotName = vmSnapshotVO.getName();
|
final String snapshotName = vmSnapshotVO.getName();
|
||||||
final List<String> failedToDelete = new ArrayList<>();
|
final List<String> failedToDelete = new ArrayList<>();
|
||||||
for (VolumeObjectTO volumeObjectTO : volumeTOs) {
|
for (VolumeObjectTO volumeObjectTO : volumeTOs) {
|
||||||
final String rscName = LinstorUtil.RSC_PREFIX + volumeObjectTO.getUuid();
|
final String rscName = LinstorUtil.RSC_PREFIX + volumeObjectTO.getPath();
|
||||||
String err = linstorDeleteSnapshot(api, rscName, snapshotName);
|
String err = linstorDeleteSnapshot(api, rscName, snapshotName);
|
||||||
|
|
||||||
if (err != null)
|
if (err != null)
|
||||||
@ -293,7 +293,7 @@ public class LinstorVMSnapshotStrategy extends DefaultVMSnapshotStrategy {
|
|||||||
final String snapshotName = vmSnapshotVO.getName();
|
final String snapshotName = vmSnapshotVO.getName();
|
||||||
|
|
||||||
for (VolumeObjectTO volumeObjectTO : volumeTOs) {
|
for (VolumeObjectTO volumeObjectTO : volumeTOs) {
|
||||||
final String rscName = LinstorUtil.RSC_PREFIX + volumeObjectTO.getUuid();
|
final String rscName = LinstorUtil.RSC_PREFIX + volumeObjectTO.getPath();
|
||||||
String err = linstorRevertSnapshot(api, rscName, snapshotName);
|
String err = linstorRevertSnapshot(api, rscName, snapshotName);
|
||||||
if (err != null) {
|
if (err != null) {
|
||||||
throw new CloudRuntimeException(String.format(
|
throw new CloudRuntimeException(String.format(
|
||||||
|
|||||||
@ -126,8 +126,6 @@ import com.cloud.agent.api.ModifyTargetsCommand;
|
|||||||
import com.cloud.agent.api.to.DataTO;
|
import com.cloud.agent.api.to.DataTO;
|
||||||
import com.cloud.agent.api.to.DiskTO;
|
import com.cloud.agent.api.to.DiskTO;
|
||||||
import com.cloud.api.ApiDBUtils;
|
import com.cloud.api.ApiDBUtils;
|
||||||
import com.cloud.api.query.dao.ServiceOfferingJoinDao;
|
|
||||||
import com.cloud.api.query.vo.ServiceOfferingJoinVO;
|
|
||||||
import com.cloud.configuration.Config;
|
import com.cloud.configuration.Config;
|
||||||
import com.cloud.configuration.ConfigurationManager;
|
import com.cloud.configuration.ConfigurationManager;
|
||||||
import com.cloud.configuration.Resource.ResourceType;
|
import com.cloud.configuration.Resource.ResourceType;
|
||||||
@ -274,8 +272,6 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
|
|||||||
@Inject
|
@Inject
|
||||||
private ServiceOfferingDetailsDao _serviceOfferingDetailsDao;
|
private ServiceOfferingDetailsDao _serviceOfferingDetailsDao;
|
||||||
@Inject
|
@Inject
|
||||||
private ServiceOfferingJoinDao serviceOfferingJoinDao;
|
|
||||||
@Inject
|
|
||||||
private UserVmDao _userVmDao;
|
private UserVmDao _userVmDao;
|
||||||
@Inject
|
@Inject
|
||||||
private UserVmDetailsDao userVmDetailsDao;
|
private UserVmDetailsDao userVmDetailsDao;
|
||||||
@ -1362,8 +1358,7 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
|
|||||||
boolean isNotIso = format != null && format != ImageFormat.ISO;
|
boolean isNotIso = format != null && format != ImageFormat.ISO;
|
||||||
boolean isRoot = Volume.Type.ROOT.equals(volume.getVolumeType());
|
boolean isRoot = Volume.Type.ROOT.equals(volume.getVolumeType());
|
||||||
|
|
||||||
ServiceOfferingJoinVO serviceOfferingView = serviceOfferingJoinDao.findById(diskOffering.getId());
|
boolean isOfferingEnforcingRootDiskSize = diskOffering.isComputeOnly() && diskOffering.getDiskSize() > 0;
|
||||||
boolean isOfferingEnforcingRootDiskSize = serviceOfferingView != null && serviceOfferingView.getRootDiskSize() > 0;
|
|
||||||
|
|
||||||
return isOfferingEnforcingRootDiskSize && isRoot && isNotIso;
|
return isOfferingEnforcingRootDiskSize && isRoot && isNotIso;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -85,7 +85,6 @@ import org.mockito.junit.MockitoJUnitRunner;
|
|||||||
import org.springframework.test.util.ReflectionTestUtils;
|
import org.springframework.test.util.ReflectionTestUtils;
|
||||||
|
|
||||||
import com.cloud.api.query.dao.ServiceOfferingJoinDao;
|
import com.cloud.api.query.dao.ServiceOfferingJoinDao;
|
||||||
import com.cloud.api.query.vo.ServiceOfferingJoinVO;
|
|
||||||
import com.cloud.configuration.Resource;
|
import com.cloud.configuration.Resource;
|
||||||
import com.cloud.configuration.Resource.ResourceType;
|
import com.cloud.configuration.Resource.ResourceType;
|
||||||
import com.cloud.dc.DataCenterVO;
|
import com.cloud.dc.DataCenterVO;
|
||||||
@ -1366,10 +1365,8 @@ public class VolumeApiServiceImplTest {
|
|||||||
|
|
||||||
when(volume.getTemplateId()).thenReturn(1l);
|
when(volume.getTemplateId()).thenReturn(1l);
|
||||||
DiskOfferingVO diskOffering = Mockito.mock(DiskOfferingVO.class);
|
DiskOfferingVO diskOffering = Mockito.mock(DiskOfferingVO.class);
|
||||||
|
when(diskOffering.isComputeOnly()).thenReturn(true);
|
||||||
ServiceOfferingJoinVO serviceOfferingJoinVO = Mockito.mock(ServiceOfferingJoinVO.class);
|
when(diskOffering.getDiskSize()).thenReturn(rootDisk);
|
||||||
when(serviceOfferingJoinVO.getRootDiskSize()).thenReturn(rootDisk);
|
|
||||||
when(serviceOfferingJoinDao.findById(anyLong())).thenReturn(serviceOfferingJoinVO);
|
|
||||||
|
|
||||||
VMTemplateVO template = Mockito.mock(VMTemplateVO.class);
|
VMTemplateVO template = Mockito.mock(VMTemplateVO.class);
|
||||||
when(template.getFormat()).thenReturn(imageFormat);
|
when(template.getFormat()).thenReturn(imageFormat);
|
||||||
|
|||||||
@ -122,7 +122,13 @@ export default {
|
|||||||
groupAction: true,
|
groupAction: true,
|
||||||
popup: true,
|
popup: true,
|
||||||
groupMap: (selection, values) => { return selection.map(x => { return { id: x, considerlasthost: values.considerlasthost } }) },
|
groupMap: (selection, values) => { return selection.map(x => { return { id: x, considerlasthost: values.considerlasthost } }) },
|
||||||
args: ['considerlasthost'],
|
args: (record, store) => {
|
||||||
|
if (['Admin'].includes(store.userInfo.roletype)) {
|
||||||
|
return ['considerlasthost']
|
||||||
|
}
|
||||||
|
|
||||||
|
return []
|
||||||
|
},
|
||||||
show: (record) => { return ['Stopped'].includes(record.state) },
|
show: (record) => { return ['Stopped'].includes(record.state) },
|
||||||
component: shallowRef(defineAsyncComponent(() => import('@/views/compute/StartVirtualMachine.vue')))
|
component: shallowRef(defineAsyncComponent(() => import('@/views/compute/StartVirtualMachine.vue')))
|
||||||
},
|
},
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user