diff --git a/framework/quota/src/main/java/org/apache/cloudstack/quota/QuotaManagerImpl.java b/framework/quota/src/main/java/org/apache/cloudstack/quota/QuotaManagerImpl.java index b17d27b0adf..d6499b91485 100644 --- a/framework/quota/src/main/java/org/apache/cloudstack/quota/QuotaManagerImpl.java +++ b/framework/quota/src/main/java/org/apache/cloudstack/quota/QuotaManagerImpl.java @@ -455,7 +455,7 @@ public class QuotaManagerImpl extends ManagerBase implements QuotaManager { } - jsInterpreter.injectVariable("resourceType", presetVariables.getResourceType()); + jsInterpreter.injectStringVariable("resourceType", presetVariables.getResourceType()); jsInterpreter.injectVariable("value", presetVariables.getValue().toString()); jsInterpreter.injectVariable("zone", presetVariables.getZone().toString()); } diff --git a/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/PresetVariableHelper.java b/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/PresetVariableHelper.java index 1cf4f864ab9..6ce8bd889a6 100644 --- a/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/PresetVariableHelper.java +++ b/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/PresetVariableHelper.java @@ -27,6 +27,7 @@ import java.util.stream.Collectors; import javax.inject.Inject; +import com.cloud.hypervisor.Hypervisor; import org.apache.cloudstack.acl.RoleVO; import org.apache.cloudstack.acl.dao.RoleDao; import org.apache.cloudstack.backup.BackupOfferingVO; @@ -65,6 +66,7 @@ import com.cloud.storage.DiskOfferingVO; import com.cloud.storage.GuestOSVO; import com.cloud.storage.Snapshot; import com.cloud.storage.SnapshotVO; +import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.VMTemplateVO; import com.cloud.storage.VolumeVO; import com.cloud.storage.dao.DiskOfferingDao; @@ -318,6 +320,10 @@ public class PresetVariableHelper { value.setTags(getPresetVariableValueResourceTags(vmId, ResourceObjectType.UserVm)); value.setTemplate(getPresetVariableValueTemplate(vmVo.getTemplateId())); + Hypervisor.HypervisorType hypervisorType = vmVo.getHypervisorType(); + if (hypervisorType != null) { + value.setHypervisorType(hypervisorType.name()); + } } protected void logNotLoadingMessageInTrace(String resource, int usageType) { @@ -470,6 +476,11 @@ public class PresetVariableHelper { value.setTags(getPresetVariableValueResourceTags(volumeId, ResourceObjectType.Volume)); value.setSize(ByteScaleUtils.bytesToMebibytes(volumeVo.getSize())); + + ImageFormat format = volumeVo.getFormat(); + if (format != null) { + value.setVolumeFormat(format.name()); + } } protected GenericPresetVariable getPresetVariableValueDiskOffering(Long diskOfferingId) { @@ -558,6 +569,10 @@ public class PresetVariableHelper { value.setSnapshotType(Snapshot.Type.values()[snapshotVo.getSnapshotType()]); value.setStorage(getPresetVariableValueStorage(getSnapshotDataStoreId(snapshotId, usageRecord.getZoneId()), usageType)); value.setTags(getPresetVariableValueResourceTags(snapshotId, ResourceObjectType.Snapshot)); + Hypervisor.HypervisorType hypervisorType = snapshotVo.getHypervisorType(); + if (hypervisorType != null) { + value.setHypervisorType(hypervisorType.name()); + } } protected SnapshotDataStoreVO getSnapshotImageStoreRef(long snapshotId, long zoneId) { @@ -621,6 +636,11 @@ public class PresetVariableHelper { value.setName(vmSnapshotVo.getName()); value.setTags(getPresetVariableValueResourceTags(vmSnapshotId, ResourceObjectType.VMSnapshot)); value.setVmSnapshotType(vmSnapshotVo.getType()); + + VMInstanceVO vmVo = vmInstanceDao.findByIdIncludingRemoved(vmSnapshotVo.getVmId()); + if (vmVo != null && vmVo.getHypervisorType() != null) { + value.setHypervisorType(vmVo.getHypervisorType().name()); + } } protected void loadPresetVariableValueForBackup(UsageVO usageRecord, Value value) { diff --git a/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/Value.java b/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/Value.java index 87fefe3a363..f3accd83be8 100644 --- a/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/Value.java +++ b/framework/quota/src/main/java/org/apache/cloudstack/quota/activationrule/presetvariables/Value.java @@ -41,6 +41,8 @@ public class Value extends GenericPresetVariable { private Storage storage; private ComputingResources computingResources; private BackupOffering backupOffering; + private String hypervisorType; + private String volumeFormat; public Host getHost() { return host; @@ -185,4 +187,22 @@ public class Value extends GenericPresetVariable { this.backupOffering = backupOffering; fieldNamesToIncludeInToString.add("backupOffering"); } + + public void setHypervisorType(String hypervisorType) { + this.hypervisorType = hypervisorType; + fieldNamesToIncludeInToString.add("hypervisorType"); + } + + public String getHypervisorType() { + return hypervisorType; + } + + public void setVolumeFormat(String volumeFormat) { + this.volumeFormat = volumeFormat; + fieldNamesToIncludeInToString.add("volumeFormat"); + } + + public String getVolumeFormat() { + return volumeFormat; + } } diff --git a/framework/quota/src/test/java/org/apache/cloudstack/quota/QuotaManagerImplTest.java b/framework/quota/src/test/java/org/apache/cloudstack/quota/QuotaManagerImplTest.java index 5978dcf5fc4..e42e03dbe8e 100644 --- a/framework/quota/src/test/java/org/apache/cloudstack/quota/QuotaManagerImplTest.java +++ b/framework/quota/src/test/java/org/apache/cloudstack/quota/QuotaManagerImplTest.java @@ -267,7 +267,7 @@ public class QuotaManagerImplTest { Mockito.verify(jsInterpreterMock).injectVariable(Mockito.eq("account"), Mockito.anyString()); Mockito.verify(jsInterpreterMock).injectVariable(Mockito.eq("domain"), Mockito.anyString()); Mockito.verify(jsInterpreterMock, Mockito.never()).injectVariable(Mockito.eq("project"), Mockito.anyString()); - Mockito.verify(jsInterpreterMock).injectVariable(Mockito.eq("resourceType"), Mockito.anyString()); + Mockito.verify(jsInterpreterMock).injectStringVariable(Mockito.eq("resourceType"), Mockito.anyString()); Mockito.verify(jsInterpreterMock).injectVariable(Mockito.eq("value"), Mockito.anyString()); Mockito.verify(jsInterpreterMock).injectVariable(Mockito.eq("zone"), Mockito.anyString()); } @@ -288,7 +288,7 @@ public class QuotaManagerImplTest { Mockito.verify(jsInterpreterMock).injectVariable(Mockito.eq("account"), Mockito.anyString()); Mockito.verify(jsInterpreterMock).injectVariable(Mockito.eq("domain"), Mockito.anyString()); Mockito.verify(jsInterpreterMock).injectVariable(Mockito.eq("project"), Mockito.anyString()); - Mockito.verify(jsInterpreterMock).injectVariable(Mockito.eq("resourceType"), Mockito.anyString()); + Mockito.verify(jsInterpreterMock).injectStringVariable(Mockito.eq("resourceType"), Mockito.anyString()); Mockito.verify(jsInterpreterMock).injectVariable(Mockito.eq("value"), Mockito.anyString()); Mockito.verify(jsInterpreterMock).injectVariable(Mockito.eq("zone"), Mockito.anyString()); } diff --git a/framework/quota/src/test/java/org/apache/cloudstack/quota/activationrule/presetvariables/PresetVariableHelperTest.java b/framework/quota/src/test/java/org/apache/cloudstack/quota/activationrule/presetvariables/PresetVariableHelperTest.java index cf1a680f2bb..ae15e573fa8 100644 --- a/framework/quota/src/test/java/org/apache/cloudstack/quota/activationrule/presetvariables/PresetVariableHelperTest.java +++ b/framework/quota/src/test/java/org/apache/cloudstack/quota/activationrule/presetvariables/PresetVariableHelperTest.java @@ -27,6 +27,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import com.cloud.hypervisor.Hypervisor; import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.acl.RoleVO; import org.apache.cloudstack.acl.dao.RoleDao; @@ -70,6 +71,7 @@ import com.cloud.storage.GuestOSVO; import com.cloud.storage.ScopeType; import com.cloud.storage.Snapshot; import com.cloud.storage.SnapshotVO; +import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.Storage.ProvisioningType; import com.cloud.storage.VMTemplateVO; import com.cloud.storage.VolumeVO; @@ -485,38 +487,42 @@ public class PresetVariableHelperTest { @Test public void loadPresetVariableValueForRunningAndAllocatedVmTestRecordIsRunningOrAllocatedVmSetFields() { - Value expected = getValueForTests(); + for (Hypervisor.HypervisorType hypervisorType : Hypervisor.HypervisorType.values()) { + Value expected = getValueForTests(); - Mockito.doReturn(vmInstanceVoMock).when(vmInstanceDaoMock).findByIdIncludingRemoved(Mockito.anyLong()); + Mockito.doReturn(vmInstanceVoMock).when(vmInstanceDaoMock).findByIdIncludingRemoved(Mockito.anyLong()); - mockMethodValidateIfObjectIsNull(); + mockMethodValidateIfObjectIsNull(); - Mockito.doNothing().when(presetVariableHelperSpy).setPresetVariableHostInValueIfUsageTypeIsRunningVm(Mockito.any(Value.class), Mockito.anyInt(), - Mockito.any(VMInstanceVO.class)); + Mockito.doNothing().when(presetVariableHelperSpy).setPresetVariableHostInValueIfUsageTypeIsRunningVm(Mockito.any(Value.class), Mockito.anyInt(), + Mockito.any(VMInstanceVO.class)); - Mockito.doReturn(expected.getId()).when(vmInstanceVoMock).getUuid(); - Mockito.doReturn(expected.getName()).when(vmInstanceVoMock).getHostName(); - Mockito.doReturn(expected.getOsName()).when(presetVariableHelperSpy).getPresetVariableValueOsName(Mockito.anyLong()); - Mockito.doNothing().when(presetVariableHelperSpy).setPresetVariableValueServiceOfferingAndComputingResources(Mockito.any(), Mockito.anyInt(), Mockito.any()); - Mockito.doReturn(expected.getTags()).when(presetVariableHelperSpy).getPresetVariableValueResourceTags(Mockito.anyLong(), Mockito.any(ResourceObjectType.class)); - Mockito.doReturn(expected.getTemplate()).when(presetVariableHelperSpy).getPresetVariableValueTemplate(Mockito.anyLong()); + Mockito.doReturn(expected.getId()).when(vmInstanceVoMock).getUuid(); + Mockito.doReturn(expected.getName()).when(vmInstanceVoMock).getHostName(); + Mockito.doReturn(expected.getOsName()).when(presetVariableHelperSpy).getPresetVariableValueOsName(Mockito.anyLong()); + Mockito.doNothing().when(presetVariableHelperSpy).setPresetVariableValueServiceOfferingAndComputingResources(Mockito.any(), Mockito.anyInt(), Mockito.any()); + Mockito.doReturn(expected.getTags()).when(presetVariableHelperSpy).getPresetVariableValueResourceTags(Mockito.anyLong(), Mockito.any(ResourceObjectType.class)); + Mockito.doReturn(expected.getTemplate()).when(presetVariableHelperSpy).getPresetVariableValueTemplate(Mockito.anyLong()); + Mockito.doReturn(hypervisorType).when(vmInstanceVoMock).getHypervisorType(); - runningAndAllocatedVmUsageTypes.forEach(type -> { - Mockito.doReturn(type).when(usageVoMock).getUsageType(); + runningAndAllocatedVmUsageTypes.forEach(type -> { + Mockito.doReturn(type).when(usageVoMock).getUsageType(); - Value result = new Value(); - presetVariableHelperSpy.loadPresetVariableValueForRunningAndAllocatedVm(usageVoMock, result); + Value result = new Value(); + presetVariableHelperSpy.loadPresetVariableValueForRunningAndAllocatedVm(usageVoMock, result); - assertPresetVariableIdAndName(expected, result); - Assert.assertEquals(expected.getOsName(), result.getOsName()); - Assert.assertEquals(expected.getTags(), result.getTags()); - Assert.assertEquals(expected.getTemplate(), result.getTemplate()); + assertPresetVariableIdAndName(expected, result); + Assert.assertEquals(expected.getOsName(), result.getOsName()); + Assert.assertEquals(expected.getTags(), result.getTags()); + Assert.assertEquals(expected.getTemplate(), result.getTemplate()); + Assert.assertEquals(hypervisorType.name(), result.getHypervisorType()); - validateFieldNamesToIncludeInToString(Arrays.asList("id", "name", "osName", "tags", "template"), result); - }); + validateFieldNamesToIncludeInToString(Arrays.asList("id", "name", "osName", "tags", "template", "hypervisorType"), result); + }); + } - Mockito.verify(presetVariableHelperSpy, Mockito.times(runningAndAllocatedVmUsageTypes.size())).getPresetVariableValueResourceTags(Mockito.anyLong(), - Mockito.eq(ResourceObjectType.UserVm)); + Mockito.verify(presetVariableHelperSpy, Mockito.times(runningAndAllocatedVmUsageTypes.size() * Hypervisor.HypervisorType.values().length)) + .getPresetVariableValueResourceTags(Mockito.anyLong(), Mockito.eq(ResourceObjectType.UserVm)); } @Test @@ -636,75 +642,85 @@ public class PresetVariableHelperTest { @Test public void loadPresetVariableValueForVolumeTestRecordIsVolumeAndHasStorageSetFields() { - Value expected = getValueForTests(); + for (ImageFormat imageFormat : ImageFormat.values()) { + Value expected = getValueForTests(); - VolumeVO volumeVoMock = Mockito.mock(VolumeVO.class); - Mockito.doReturn(volumeVoMock).when(volumeDaoMock).findByIdIncludingRemoved(Mockito.anyLong()); - Mockito.doReturn(1l).when(volumeVoMock).getPoolId(); + VolumeVO volumeVoMock = Mockito.mock(VolumeVO.class); + Mockito.doReturn(volumeVoMock).when(volumeDaoMock).findByIdIncludingRemoved(Mockito.anyLong()); + Mockito.doReturn(1l).when(volumeVoMock).getPoolId(); - mockMethodValidateIfObjectIsNull(); + mockMethodValidateIfObjectIsNull(); - Mockito.doReturn(expected.getId()).when(volumeVoMock).getUuid(); - Mockito.doReturn(expected.getName()).when(volumeVoMock).getName(); - Mockito.doReturn(expected.getDiskOffering()).when(presetVariableHelperSpy).getPresetVariableValueDiskOffering(Mockito.anyLong()); - Mockito.doReturn(expected.getProvisioningType()).when(volumeVoMock).getProvisioningType(); - Mockito.doReturn(expected.getStorage()).when(presetVariableHelperSpy).getPresetVariableValueStorage(Mockito.anyLong(), Mockito.anyInt()); - Mockito.doReturn(expected.getTags()).when(presetVariableHelperSpy).getPresetVariableValueResourceTags(Mockito.anyLong(), Mockito.any(ResourceObjectType.class)); - Mockito.doReturn(expected.getSize()).when(volumeVoMock).getSize(); + Mockito.doReturn(expected.getId()).when(volumeVoMock).getUuid(); + Mockito.doReturn(expected.getName()).when(volumeVoMock).getName(); + Mockito.doReturn(expected.getDiskOffering()).when(presetVariableHelperSpy).getPresetVariableValueDiskOffering(Mockito.anyLong()); + Mockito.doReturn(expected.getProvisioningType()).when(volumeVoMock).getProvisioningType(); + Mockito.doReturn(expected.getStorage()).when(presetVariableHelperSpy).getPresetVariableValueStorage(Mockito.anyLong(), Mockito.anyInt()); + Mockito.doReturn(expected.getTags()).when(presetVariableHelperSpy).getPresetVariableValueResourceTags(Mockito.anyLong(), Mockito.any(ResourceObjectType.class)); + Mockito.doReturn(expected.getSize()).when(volumeVoMock).getSize(); + Mockito.doReturn(imageFormat).when(volumeVoMock).getFormat(); - Mockito.doReturn(UsageTypes.VOLUME).when(usageVoMock).getUsageType(); + Mockito.doReturn(UsageTypes.VOLUME).when(usageVoMock).getUsageType(); - Value result = new Value(); - presetVariableHelperSpy.loadPresetVariableValueForVolume(usageVoMock, result); + Value result = new Value(); + presetVariableHelperSpy.loadPresetVariableValueForVolume(usageVoMock, result); - Long expectedSize = ByteScaleUtils.bytesToMebibytes(expected.getSize()); + Long expectedSize = ByteScaleUtils.bytesToMebibytes(expected.getSize()); - assertPresetVariableIdAndName(expected, result); - Assert.assertEquals(expected.getDiskOffering(), result.getDiskOffering()); - Assert.assertEquals(expected.getProvisioningType(), result.getProvisioningType()); - Assert.assertEquals(expected.getStorage(), result.getStorage()); - Assert.assertEquals(expected.getTags(), result.getTags()); - Assert.assertEquals(expectedSize, result.getSize()); + assertPresetVariableIdAndName(expected, result); + Assert.assertEquals(expected.getDiskOffering(), result.getDiskOffering()); + Assert.assertEquals(expected.getProvisioningType(), result.getProvisioningType()); + Assert.assertEquals(expected.getStorage(), result.getStorage()); + Assert.assertEquals(expected.getTags(), result.getTags()); + Assert.assertEquals(expectedSize, result.getSize()); + Assert.assertEquals(imageFormat.name(), result.getVolumeFormat()); - validateFieldNamesToIncludeInToString(Arrays.asList("id", "name", "diskOffering", "provisioningType", "storage", "tags", "size"), result); + validateFieldNamesToIncludeInToString(Arrays.asList("id", "name", "diskOffering", "provisioningType", "storage", "tags", "size", "volumeFormat"), result); + } - Mockito.verify(presetVariableHelperSpy).getPresetVariableValueResourceTags(Mockito.anyLong(), Mockito.eq(ResourceObjectType.Volume)); + Mockito.verify(presetVariableHelperSpy, Mockito.times(ImageFormat.values().length)).getPresetVariableValueResourceTags(Mockito.anyLong(), + Mockito.eq(ResourceObjectType.Volume)); } @Test public void loadPresetVariableValueForVolumeTestRecordIsVolumeAndDoesNotHaveStorageSetFields() { - Value expected = getValueForTests(); + for (ImageFormat imageFormat : ImageFormat.values()) { + Value expected = getValueForTests(); - VolumeVO volumeVoMock = Mockito.mock(VolumeVO.class); - Mockito.doReturn(volumeVoMock).when(volumeDaoMock).findByIdIncludingRemoved(Mockito.anyLong()); - Mockito.doReturn(null).when(volumeVoMock).getPoolId(); + VolumeVO volumeVoMock = Mockito.mock(VolumeVO.class); + Mockito.doReturn(volumeVoMock).when(volumeDaoMock).findByIdIncludingRemoved(Mockito.anyLong()); + Mockito.doReturn(null).when(volumeVoMock).getPoolId(); - mockMethodValidateIfObjectIsNull(); + mockMethodValidateIfObjectIsNull(); - Mockito.doReturn(expected.getId()).when(volumeVoMock).getUuid(); - Mockito.doReturn(expected.getName()).when(volumeVoMock).getName(); - Mockito.doReturn(expected.getDiskOffering()).when(presetVariableHelperSpy).getPresetVariableValueDiskOffering(Mockito.anyLong()); - Mockito.doReturn(expected.getProvisioningType()).when(volumeVoMock).getProvisioningType(); - Mockito.doReturn(expected.getTags()).when(presetVariableHelperSpy).getPresetVariableValueResourceTags(Mockito.anyLong(), Mockito.any(ResourceObjectType.class)); - Mockito.doReturn(expected.getSize()).when(volumeVoMock).getSize(); + Mockito.doReturn(expected.getId()).when(volumeVoMock).getUuid(); + Mockito.doReturn(expected.getName()).when(volumeVoMock).getName(); + Mockito.doReturn(expected.getDiskOffering()).when(presetVariableHelperSpy).getPresetVariableValueDiskOffering(Mockito.anyLong()); + Mockito.doReturn(expected.getProvisioningType()).when(volumeVoMock).getProvisioningType(); + Mockito.doReturn(expected.getTags()).when(presetVariableHelperSpy).getPresetVariableValueResourceTags(Mockito.anyLong(), Mockito.any(ResourceObjectType.class)); + Mockito.doReturn(expected.getSize()).when(volumeVoMock).getSize(); + Mockito.doReturn(imageFormat).when(volumeVoMock).getFormat(); - Mockito.doReturn(UsageTypes.VOLUME).when(usageVoMock).getUsageType(); + Mockito.doReturn(UsageTypes.VOLUME).when(usageVoMock).getUsageType(); - Value result = new Value(); - presetVariableHelperSpy.loadPresetVariableValueForVolume(usageVoMock, result); + Value result = new Value(); + presetVariableHelperSpy.loadPresetVariableValueForVolume(usageVoMock, result); - Long expectedSize = ByteScaleUtils.bytesToMebibytes(expected.getSize()); + Long expectedSize = ByteScaleUtils.bytesToMebibytes(expected.getSize()); - assertPresetVariableIdAndName(expected, result); - Assert.assertEquals(expected.getDiskOffering(), result.getDiskOffering()); - Assert.assertEquals(expected.getProvisioningType(), result.getProvisioningType()); - Assert.assertEquals(null, result.getStorage()); - Assert.assertEquals(expected.getTags(), result.getTags()); - Assert.assertEquals(expectedSize, result.getSize()); + assertPresetVariableIdAndName(expected, result); + Assert.assertEquals(expected.getDiskOffering(), result.getDiskOffering()); + Assert.assertEquals(expected.getProvisioningType(), result.getProvisioningType()); + Assert.assertNull(result.getStorage()); + Assert.assertEquals(expected.getTags(), result.getTags()); + Assert.assertEquals(expectedSize, result.getSize()); + Assert.assertEquals(imageFormat.name(), result.getVolumeFormat()); - validateFieldNamesToIncludeInToString(Arrays.asList("id", "name", "diskOffering", "provisioningType", "tags", "size"), result); + validateFieldNamesToIncludeInToString(Arrays.asList("id", "name", "diskOffering", "provisioningType", "tags", "size", "volumeFormat"), result); + } - Mockito.verify(presetVariableHelperSpy).getPresetVariableValueResourceTags(Mockito.anyLong(), Mockito.eq(ResourceObjectType.Volume)); + Mockito.verify(presetVariableHelperSpy, Mockito.times(ImageFormat.values().length)).getPresetVariableValueResourceTags(Mockito.anyLong(), + Mockito.eq(ResourceObjectType.Volume)); } @Test @@ -852,37 +868,42 @@ public class PresetVariableHelperTest { @Test public void loadPresetVariableValueForSnapshotTestRecordIsSnapshotSetFields() { - Value expected = getValueForTests(); + for (Hypervisor.HypervisorType hypervisorType : Hypervisor.HypervisorType.values()) { + Value expected = getValueForTests(); - SnapshotVO snapshotVoMock = Mockito.mock(SnapshotVO.class); - Mockito.doReturn(snapshotVoMock).when(snapshotDaoMock).findByIdIncludingRemoved(Mockito.anyLong()); + SnapshotVO snapshotVoMock = Mockito.mock(SnapshotVO.class); + Mockito.doReturn(snapshotVoMock).when(snapshotDaoMock).findByIdIncludingRemoved(Mockito.anyLong()); - mockMethodValidateIfObjectIsNull(); + mockMethodValidateIfObjectIsNull(); - Mockito.doReturn(expected.getId()).when(snapshotVoMock).getUuid(); - Mockito.doReturn(expected.getName()).when(snapshotVoMock).getName(); - Mockito.doReturn(expected.getSize()).when(snapshotVoMock).getSize(); - Mockito.doReturn((short) 3).when(snapshotVoMock).getSnapshotType(); - Mockito.doReturn(1l).when(presetVariableHelperSpy).getSnapshotDataStoreId(Mockito.anyLong(), Mockito.anyLong()); - Mockito.doReturn(expected.getStorage()).when(presetVariableHelperSpy).getPresetVariableValueStorage(Mockito.anyLong(), Mockito.anyInt()); - Mockito.doReturn(expected.getTags()).when(presetVariableHelperSpy).getPresetVariableValueResourceTags(Mockito.anyLong(), Mockito.any(ResourceObjectType.class)); + Mockito.doReturn(expected.getId()).when(snapshotVoMock).getUuid(); + Mockito.doReturn(expected.getName()).when(snapshotVoMock).getName(); + Mockito.doReturn(expected.getSize()).when(snapshotVoMock).getSize(); + Mockito.doReturn((short) 3).when(snapshotVoMock).getSnapshotType(); + Mockito.doReturn(1l).when(presetVariableHelperSpy).getSnapshotDataStoreId(Mockito.anyLong(), Mockito.anyLong()); + Mockito.doReturn(expected.getStorage()).when(presetVariableHelperSpy).getPresetVariableValueStorage(Mockito.anyLong(), Mockito.anyInt()); + Mockito.doReturn(expected.getTags()).when(presetVariableHelperSpy).getPresetVariableValueResourceTags(Mockito.anyLong(), Mockito.any(ResourceObjectType.class)); + Mockito.doReturn(hypervisorType).when(snapshotVoMock).getHypervisorType(); - Mockito.doReturn(UsageTypes.SNAPSHOT).when(usageVoMock).getUsageType(); + Mockito.doReturn(UsageTypes.SNAPSHOT).when(usageVoMock).getUsageType(); - Value result = new Value(); - presetVariableHelperSpy.loadPresetVariableValueForSnapshot(usageVoMock, result); + Value result = new Value(); + presetVariableHelperSpy.loadPresetVariableValueForSnapshot(usageVoMock, result); - Long expectedSize = ByteScaleUtils.bytesToMebibytes(expected.getSize()); + Long expectedSize = ByteScaleUtils.bytesToMebibytes(expected.getSize()); - assertPresetVariableIdAndName(expected, result); - Assert.assertEquals(expected.getSnapshotType(), result.getSnapshotType()); - Assert.assertEquals(expected.getStorage(), result.getStorage()); - Assert.assertEquals(expected.getTags(), result.getTags()); - Assert.assertEquals(expectedSize, result.getSize()); + assertPresetVariableIdAndName(expected, result); + Assert.assertEquals(expected.getSnapshotType(), result.getSnapshotType()); + Assert.assertEquals(expected.getStorage(), result.getStorage()); + Assert.assertEquals(expected.getTags(), result.getTags()); + Assert.assertEquals(expectedSize, result.getSize()); + Assert.assertEquals(hypervisorType.name(), result.getHypervisorType()); - validateFieldNamesToIncludeInToString(Arrays.asList("id", "name", "snapshotType", "storage", "tags", "size"), result); + validateFieldNamesToIncludeInToString(Arrays.asList("id", "name", "snapshotType", "storage", "tags", "size", "hypervisorType"), result); + } - Mockito.verify(presetVariableHelperSpy).getPresetVariableValueResourceTags(Mockito.anyLong(), Mockito.eq(ResourceObjectType.Snapshot)); + Mockito.verify(presetVariableHelperSpy, Mockito.times(Hypervisor.HypervisorType.values().length)).getPresetVariableValueResourceTags(Mockito.anyLong(), + Mockito.eq(ResourceObjectType.Snapshot)); } diff --git a/framework/quota/src/test/java/org/apache/cloudstack/quota/activationrule/presetvariables/ValueTest.java b/framework/quota/src/test/java/org/apache/cloudstack/quota/activationrule/presetvariables/ValueTest.java index c9d14401b3f..9e65de754c8 100644 --- a/framework/quota/src/test/java/org/apache/cloudstack/quota/activationrule/presetvariables/ValueTest.java +++ b/framework/quota/src/test/java/org/apache/cloudstack/quota/activationrule/presetvariables/ValueTest.java @@ -136,4 +136,18 @@ public class ValueTest { variable.setBackupOffering(null); Assert.assertTrue(variable.fieldNamesToIncludeInToString.contains("backupOffering")); } + + @Test + public void setHypervisorTypeTestAddFieldHypervisorTypeToCollection() { + Value variable = new Value(); + variable.setHypervisorType(null); + Assert.assertTrue(variable.fieldNamesToIncludeInToString.contains("hypervisorType")); + } + + @Test + public void setVolumeFormatTestAddFieldVolumeFormatToCollection() { + Value variable = new Value(); + variable.setVolumeFormat(null); + Assert.assertTrue(variable.fieldNamesToIncludeInToString.contains("volumeFormat")); + } } diff --git a/utils/src/main/java/org/apache/cloudstack/utils/jsinterpreter/JsInterpreter.java b/utils/src/main/java/org/apache/cloudstack/utils/jsinterpreter/JsInterpreter.java index 03ad3b401b8..b15bd31a15f 100644 --- a/utils/src/main/java/org/apache/cloudstack/utils/jsinterpreter/JsInterpreter.java +++ b/utils/src/main/java/org/apache/cloudstack/utils/jsinterpreter/JsInterpreter.java @@ -78,7 +78,7 @@ public class JsInterpreter implements Closeable { } /** - * Adds the parameters to a Map that will be converted to JS variables right before executing the scripts.. + * Adds the parameters to a Map that will be converted to JS variables right before executing the script. * @param key The name of the variable. * @param value The value of the variable. */ @@ -87,6 +87,21 @@ public class JsInterpreter implements Closeable { variables.put(key, value); } + /** + * Adds the parameter, surrounded by double quotes, to a Map that will be converted to a JS variable right before executing the script. + * @param key The name of the variable. + * @param value The value of the variable. + */ + public void injectStringVariable(String key, String value) { + if (value == null) { + logger.trace(String.format("Not injecting [%s] because its value is null.", key)); + return; + } + value = String.format("\"%s\"", value); + logger.trace(String.format(injectingLogMessage, key, value)); + variables.put(key, value); + } + /** * Injects the variables to the script and execute it. * @param script Code to be executed. diff --git a/utils/src/test/java/org/apache/cloudstack/utils/jsinterpreter/JsInterpreterTest.java b/utils/src/test/java/org/apache/cloudstack/utils/jsinterpreter/JsInterpreterTest.java index d1814625929..a8c2e6ec0d3 100644 --- a/utils/src/test/java/org/apache/cloudstack/utils/jsinterpreter/JsInterpreterTest.java +++ b/utils/src/test/java/org/apache/cloudstack/utils/jsinterpreter/JsInterpreterTest.java @@ -179,4 +179,22 @@ public class JsInterpreterTest { Assert.assertEquals(scriptEngineMock, jsInterpreterSpy.interpreter); Mockito.verify(nashornScriptEngineFactoryMock).getScriptEngine("--no-java"); } + + @Test + public void injectStringVariableTestNullValueDoNothing() { + jsInterpreterSpy.variables = new LinkedHashMap<>(); + + jsInterpreterSpy.injectStringVariable("a", null); + + Assert.assertTrue(jsInterpreterSpy.variables.isEmpty()); + } + + @Test + public void injectStringVariableTestNotNullValueSurroundWithDoubleQuotes() { + jsInterpreterSpy.variables = new LinkedHashMap<>(); + + jsInterpreterSpy.injectStringVariable("a", "b"); + + Assert.assertEquals(jsInterpreterSpy.variables.get("a"), "\"b\""); + } }