This is an automated email from the ASF dual-hosted git repository.
dahn pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/main by this push:
new d6044fb5a63 Fix to make recovered volumes be accounted for by Usage
(#6772)
d6044fb5a63 is described below
commit d6044fb5a6354f88f62b0d5c17c40ef782166602
Author: João Jandre <[email protected]>
AuthorDate: Tue Oct 11 09:05:14 2022 -0300
Fix to make recovered volumes be accounted for by Usage (#6772)
---
.../java/com/cloud/storage/VolumeApiService.java | 2 +
.../com/cloud/storage/VolumeApiServiceImpl.java | 21 ++++++
.../main/java/com/cloud/vm/UserVmManagerImpl.java | 13 +---
.../cloud/storage/VolumeApiServiceImplTest.java | 80 +++++++++++++++++++++-
4 files changed, 101 insertions(+), 15 deletions(-)
diff --git a/api/src/main/java/com/cloud/storage/VolumeApiService.java
b/api/src/main/java/com/cloud/storage/VolumeApiService.java
index 3d37c2ec4fe..986326454b0 100644
--- a/api/src/main/java/com/cloud/storage/VolumeApiService.java
+++ b/api/src/main/java/com/cloud/storage/VolumeApiService.java
@@ -165,4 +165,6 @@ public interface VolumeApiService {
boolean validateVolumeSizeInBytes(long size);
Volume changeDiskOfferingForVolume(ChangeOfferingForVolumeCmd cmd) throws
ResourceAllocationException;
+
+ void publishVolumeCreationUsageEvent(Volume volume);
}
diff --git a/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java
b/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java
index e230c9b645f..bb4da36dd98 100644
--- a/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java
+++ b/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java
@@ -1709,9 +1709,30 @@ public class VolumeApiServiceImpl extends ManagerBase
implements VolumeApiServic
_resourceLimitMgr.incrementResourceCount(volume.getAccountId(),
ResourceType.volume, volume.isDisplay());
_resourceLimitMgr.incrementResourceCount(volume.getAccountId(),
ResourceType.primary_storage, volume.isDisplay(), new Long(volume.getSize()));
+
+ publishVolumeCreationUsageEvent(volume);
+
return volume;
}
+ public void publishVolumeCreationUsageEvent(Volume volume) {
+ Long diskOfferingId = volume.getDiskOfferingId();
+ Long offeringId = null;
+ if (diskOfferingId != null) {
+ DiskOfferingVO offering =
_diskOfferingDao.findById(diskOfferingId);
+ if (offering != null && !offering.isComputeOnly()) {
+ offeringId = offering.getId();
+ }
+ }
+ UsageEventUtils
+ .publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE,
volume.getAccountId(), volume.getDataCenterId(), volume.getId(),
volume.getName(), offeringId,
+ volume.getTemplateId(), volume.getSize(),
Volume.class.getName(), volume.getUuid(), volume.isDisplay());
+
+ s_logger.debug(String.format("Volume [%s] has been successfully
recovered, thus a new usage event %s has been published.", volume.getUuid(),
EventTypes.EVENT_VOLUME_CREATE));
+ }
+
+
+
@Override
@ActionEvent(eventType = EventTypes.EVENT_VOLUME_CHANGE_DISK_OFFERING,
eventDescription = "Changing disk offering of a volume")
public Volume changeDiskOfferingForVolume(ChangeOfferingForVolumeCmd cmd)
throws ResourceAllocationException {
diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
index 43fcd39c37b..4e646dff6a8 100644
--- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
@@ -2323,18 +2323,7 @@ public class UserVmManagerImpl extends ManagerBase
implements UserVmManager, Vir
for (VolumeVO volume : volumes) {
if (volume.getVolumeType().equals(Volume.Type.ROOT)) {
// Create an event
- Long templateId = volume.getTemplateId();
- Long diskOfferingId = volume.getDiskOfferingId();
- Long offeringId = null;
- if (diskOfferingId != null) {
- DiskOfferingVO offering =
_diskOfferingDao.findById(diskOfferingId);
- if (offering != null && !offering.isComputeOnly())
{
- offeringId = offering.getId();
- }
- }
- UsageEventUtils
- .publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE,
volume.getAccountId(), volume.getDataCenterId(), volume.getId(),
volume.getName(), offeringId,
- templateId, volume.getSize(),
Volume.class.getName(), volume.getUuid(), volume.isDisplayVolume());
+ _volumeService.publishVolumeCreationUsageEvent(volume);
}
}
diff --git
a/server/src/test/java/com/cloud/storage/VolumeApiServiceImplTest.java
b/server/src/test/java/com/cloud/storage/VolumeApiServiceImplTest.java
index acc9d5886f8..4c4bbf789b0 100644
--- a/server/src/test/java/com/cloud/storage/VolumeApiServiceImplTest.java
+++ b/server/src/test/java/com/cloud/storage/VolumeApiServiceImplTest.java
@@ -35,6 +35,8 @@ import java.util.List;
import java.util.UUID;
import java.util.concurrent.ExecutionException;
+import com.cloud.event.EventTypes;
+import com.cloud.event.UsageEventUtils;
import com.cloud.service.ServiceOfferingVO;
import com.cloud.service.dao.ServiceOfferingDao;
import org.apache.cloudstack.acl.ControlledEntity;
@@ -69,7 +71,10 @@ import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.Spy;
-import org.mockito.runners.MockitoJUnitRunner;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PowerMockIgnore;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
import org.springframework.test.util.ReflectionTestUtils;
import com.cloud.api.query.dao.ServiceOfferingJoinDao;
@@ -109,12 +114,13 @@ import com.cloud.vm.dao.VMInstanceDao;
import com.cloud.vm.snapshot.VMSnapshotVO;
import com.cloud.vm.snapshot.dao.VMSnapshotDao;
-@RunWith(MockitoJUnitRunner.class)
+@RunWith(PowerMockRunner.class)
+@PowerMockIgnore("javax.management.*")
public class VolumeApiServiceImplTest {
@Spy
@InjectMocks
- private VolumeApiServiceImpl volumeApiServiceImpl;
+ private VolumeApiServiceImpl volumeApiServiceImpl = new
VolumeApiServiceImpl();
@Mock
private SnapshotManager snapshotManagerMock;
@Mock
@@ -189,6 +195,10 @@ public class VolumeApiServiceImplTest {
private long vmInstanceMockId = 1123l;
private long volumeSizeMock = 456789921939l;
+ private long diskOfferingMockId = 100203L;
+
+ private long offeringMockId = 31902L;
+
@Before
public void setup() throws InterruptedException, ExecutionException {
Mockito.lenient().doReturn(volumeMockId).when(volumeDataStoreVoMock).getVolumeId();
@@ -1245,4 +1255,68 @@ public class VolumeApiServiceImplTest {
boolean result =
volumeApiServiceImpl.isNewDiskOfferingTheSameAndCustomServiceOffering(existingDiskOffering,
newDiskOffering);
Assert.assertEquals(expectedResult, result);
}
+
+ @Test
+ @PrepareForTest(UsageEventUtils.class)
+ public void publishVolumeCreationUsageEventTestNullDiskOfferingId() {
+ Mockito.doReturn(null).when(volumeVoMock).getDiskOfferingId();
+ PowerMockito.mockStatic(UsageEventUtils.class);
+
+ volumeApiServiceImpl.publishVolumeCreationUsageEvent(volumeVoMock);
+
+ PowerMockito.verifyStatic(UsageEventUtils.class);
+ UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE,
volumeVoMock.getAccountId(), volumeVoMock.getDataCenterId(),
volumeVoMock.getId(), volumeVoMock.getName(),
+ null, volumeVoMock.getTemplateId(), volumeVoMock.getSize(),
Volume.class.getName(), volumeVoMock.getUuid(), volumeVoMock.isDisplay());
+
+ }
+
+ @Test
+ @PrepareForTest(UsageEventUtils.class)
+ public void publishVolumeCreationUsageEventTestNullDiskOfferingVo() {
+
Mockito.doReturn(diskOfferingMockId).when(volumeVoMock).getDiskOfferingId();
+
Mockito.doReturn(null).when(_diskOfferingDao).findById(diskOfferingMockId);
+ PowerMockito.mockStatic(UsageEventUtils.class);
+
+ volumeApiServiceImpl.publishVolumeCreationUsageEvent(volumeVoMock);
+
+ PowerMockito.verifyStatic(UsageEventUtils.class);
+ UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE,
volumeVoMock.getAccountId(), volumeVoMock.getDataCenterId(),
volumeVoMock.getId(), volumeVoMock.getName(),
+ null, volumeVoMock.getTemplateId(), volumeVoMock.getSize(),
Volume.class.getName(), volumeVoMock.getUuid(), volumeVoMock.isDisplay());
+
+ }
+
+ @Test
+ @PrepareForTest(UsageEventUtils.class)
+ public void publishVolumeCreationUsageEventTestDiskOfferingVoTypeNotDisk()
{
+
Mockito.doReturn(diskOfferingMockId).when(volumeVoMock).getDiskOfferingId();
+
Mockito.doReturn(newDiskOfferingMock).when(_diskOfferingDao).findById(diskOfferingMockId);
+ Mockito.doReturn(true).when(newDiskOfferingMock).isComputeOnly();
+
+ PowerMockito.mockStatic(UsageEventUtils.class);
+
+ volumeApiServiceImpl.publishVolumeCreationUsageEvent(volumeVoMock);
+
+ PowerMockito.verifyStatic(UsageEventUtils.class);
+ UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE,
volumeVoMock.getAccountId(), volumeVoMock.getDataCenterId(),
volumeVoMock.getId(), volumeVoMock.getName(),
+ null, volumeVoMock.getTemplateId(), volumeVoMock.getSize(),
Volume.class.getName(), volumeVoMock.getUuid(), volumeVoMock.isDisplay());
+
+ }
+
+ @Test
+ @PrepareForTest(UsageEventUtils.class)
+ public void publishVolumeCreationUsageEventTestOfferingIdNotNull() {
+
Mockito.doReturn(diskOfferingMockId).when(volumeVoMock).getDiskOfferingId();
+
Mockito.doReturn(newDiskOfferingMock).when(_diskOfferingDao).findById(diskOfferingMockId);
+ Mockito.doReturn(false).when(newDiskOfferingMock).isComputeOnly();
+ Mockito.doReturn(offeringMockId).when(newDiskOfferingMock).getId();
+
+ PowerMockito.mockStatic(UsageEventUtils.class);
+
+ volumeApiServiceImpl.publishVolumeCreationUsageEvent(volumeVoMock);
+
+ PowerMockito.verifyStatic(UsageEventUtils.class);
+ UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE,
volumeVoMock.getAccountId(), volumeVoMock.getDataCenterId(),
volumeVoMock.getId(), volumeVoMock.getName(),
+ offeringMockId, volumeVoMock.getTemplateId(),
volumeVoMock.getSize(), Volume.class.getName(), volumeVoMock.getUuid(),
volumeVoMock.isDisplay());
+
+ }
}