Skip to content

Commit 2dbe96a

Browse files
João ParaquettiJoaoJandre
authored andcommitted
Fix to make recovered volumes be accounted for by Usage
# Conflicts: # api/src/main/java/com/cloud/storage/VolumeApiService.java # server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java # server/src/main/java/com/cloud/vm/UserVmManagerImpl.java # server/src/test/java/com/cloud/storage/VolumeApiServiceImplTest.java
1 parent 8ab8fdc commit 2dbe96a

File tree

4 files changed

+107
-15
lines changed

4 files changed

+107
-15
lines changed

api/src/main/java/com/cloud/storage/VolumeApiService.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,4 +165,6 @@ Snapshot takeSnapshot(Long volumeId, Long policyId, Long snapshotId, Account acc
165165
boolean validateVolumeSizeInBytes(long size);
166166

167167
Volume changeDiskOfferingForVolume(ChangeOfferingForVolumeCmd cmd) throws ResourceAllocationException;
168+
169+
void publishVolumeCreationUsageEvent(Volume volume);
168170
}

server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1706,12 +1706,31 @@ public Volume recoverVolume(long volumeId) {
17061706
s_logger.debug("Failed to recover volume" + volume.getId(), e);
17071707
throw new CloudRuntimeException("Failed to recover volume" + volume.getId(), e);
17081708
}
1709+
1710+
publishVolumeCreationUsageEvent(volume);
1711+
17091712
_resourceLimitMgr.incrementResourceCount(volume.getAccountId(), ResourceType.volume, volume.isDisplay());
17101713
_resourceLimitMgr.incrementResourceCount(volume.getAccountId(), ResourceType.primary_storage, volume.isDisplay(), new Long(volume.getSize()));
17111714

17121715
return volume;
17131716
}
17141717

1718+
public void publishVolumeCreationUsageEvent(Volume volume) {
1719+
Long diskOfferingId = volume.getDiskOfferingId();
1720+
Long offeringId = null;
1721+
if (diskOfferingId != null) {
1722+
DiskOfferingVO offering = _diskOfferingDao.findById(diskOfferingId);
1723+
if (offering != null && !offering.isComputeOnly()) {
1724+
offeringId = offering.getId();
1725+
}
1726+
}
1727+
UsageEventUtils
1728+
.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE, volume.getAccountId(), volume.getDataCenterId(), volume.getId(), volume.getName(), offeringId,
1729+
volume.getTemplateId(), volume.getSize(), Volume.class.getName(), volume.getUuid(), volume.isDisplayVolume());
1730+
1731+
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));
1732+
}
1733+
17151734
@Override
17161735
@ActionEvent(eventType = EventTypes.EVENT_VOLUME_CHANGE_DISK_OFFERING, eventDescription = "Changing disk offering of a volume")
17171736
public Volume changeDiskOfferingForVolume(ChangeOfferingForVolumeCmd cmd) throws ResourceAllocationException {

server/src/main/java/com/cloud/vm/UserVmManagerImpl.java

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2268,18 +2268,7 @@ public UserVm recoverVirtualMachine(RecoverVMCmd cmd) throws ResourceAllocationE
22682268
for (VolumeVO volume : volumes) {
22692269
if (volume.getVolumeType().equals(Volume.Type.ROOT)) {
22702270
// Create an event
2271-
Long templateId = volume.getTemplateId();
2272-
Long diskOfferingId = volume.getDiskOfferingId();
2273-
Long offeringId = null;
2274-
if (diskOfferingId != null) {
2275-
DiskOfferingVO offering = _diskOfferingDao.findById(diskOfferingId);
2276-
if (offering != null && !offering.isComputeOnly()) {
2277-
offeringId = offering.getId();
2278-
}
2279-
}
2280-
UsageEventUtils
2281-
.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE, volume.getAccountId(), volume.getDataCenterId(), volume.getId(), volume.getName(), offeringId,
2282-
templateId, volume.getSize(), Volume.class.getName(), volume.getUuid(), volume.isDisplayVolume());
2271+
_volumeService.publishVolumeCreationUsageEvent(volume);
22832272
}
22842273
}
22852274

server/src/test/java/com/cloud/storage/VolumeApiServiceImplTest.java

Lines changed: 85 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@
3636
import java.util.concurrent.ExecutionException;
3737

3838
import com.cloud.service.ServiceOfferingVO;
39+
import com.cloud.event.EventTypes;
40+
import com.cloud.event.UsageEventUtils;
41+
import com.cloud.offering.DiskOffering;
42+
import com.cloud.storage.dao.DiskOfferingDao;
3943
import com.cloud.service.dao.ServiceOfferingDao;
4044
import org.apache.cloudstack.acl.ControlledEntity;
4145
import org.apache.cloudstack.acl.SecurityChecker.AccessType;
@@ -69,7 +73,10 @@
6973
import org.mockito.Mock;
7074
import org.mockito.Mockito;
7175
import org.mockito.Spy;
72-
import org.mockito.runners.MockitoJUnitRunner;
76+
import org.powermock.api.mockito.PowerMockito;
77+
import org.powermock.core.classloader.annotations.PowerMockIgnore;
78+
import org.powermock.core.classloader.annotations.PrepareForTest;
79+
import org.powermock.modules.junit4.PowerMockRunner;
7380
import org.springframework.test.util.ReflectionTestUtils;
7481

7582
import com.cloud.api.query.dao.ServiceOfferingJoinDao;
@@ -109,12 +116,13 @@
109116
import com.cloud.vm.snapshot.VMSnapshotVO;
110117
import com.cloud.vm.snapshot.dao.VMSnapshotDao;
111118

112-
@RunWith(MockitoJUnitRunner.class)
119+
@RunWith(PowerMockRunner.class)
120+
@PowerMockIgnore("javax.management.*")
113121
public class VolumeApiServiceImplTest {
114122

115123
@Spy
116124
@InjectMocks
117-
private VolumeApiServiceImpl volumeApiServiceImpl;
125+
private VolumeApiServiceImpl volumeApiServiceImpl = new VolumeApiServiceImpl();
118126
@Mock
119127
private SnapshotManager snapshotManagerMock;
120128
@Mock
@@ -184,11 +192,21 @@ public class VolumeApiServiceImplTest {
184192
@Mock
185193
private AsyncCallFuture<VolumeApiResult> asyncCallFutureVolumeapiResultMock;
186194

195+
@Mock
196+
private DiskOfferingDao diskOfferingDaoMock;
197+
198+
@Mock
199+
private DiskOfferingVO diskOfferingVoMock;
200+
187201
private long accountMockId = 456l;
188202
private long volumeMockId = 12313l;
189203
private long vmInstanceMockId = 1123l;
190204
private long volumeSizeMock = 456789921939l;
191205

206+
private long diskOfferingMockId = 100203L;
207+
208+
private long offeringMockId = 31902L;
209+
192210
@Before
193211
public void setup() throws InterruptedException, ExecutionException {
194212
Mockito.lenient().doReturn(volumeMockId).when(volumeDataStoreVoMock).getVolumeId();
@@ -1245,4 +1263,68 @@ private void prepareAndRunIsNewDiskOfferingTheSameAndCustomServiceOffering(long
12451263
boolean result = volumeApiServiceImpl.isNewDiskOfferingTheSameAndCustomServiceOffering(existingDiskOffering, newDiskOffering);
12461264
Assert.assertEquals(expectedResult, result);
12471265
}
1266+
1267+
@Test
1268+
@PrepareForTest(UsageEventUtils.class)
1269+
public void publishVolumeCreationUsageEventTestNullDiskOfferingId() {
1270+
Mockito.doReturn(null).when(volumeVoMock).getDiskOfferingId();
1271+
PowerMockito.mockStatic(UsageEventUtils.class);
1272+
1273+
volumeApiServiceImpl.publishVolumeCreationUsageEvent(volumeVoMock);
1274+
1275+
PowerMockito.verifyStatic(UsageEventUtils.class);
1276+
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE, volumeVoMock.getAccountId(), volumeVoMock.getDataCenterId(), volumeVoMock.getId(), volumeVoMock.getName(),
1277+
null, volumeVoMock.getTemplateId(), volumeVoMock.getSize(), Volume.class.getName(), volumeVoMock.getUuid(), volumeVoMock.isDisplayVolume());
1278+
1279+
}
1280+
1281+
@Test
1282+
@PrepareForTest(UsageEventUtils.class)
1283+
public void publishVolumeCreationUsageEventTestNullDiskOfferingVo() {
1284+
Mockito.doReturn(diskOfferingMockId).when(volumeVoMock).getDiskOfferingId();
1285+
Mockito.doReturn(null).when(diskOfferingDaoMock).findById(diskOfferingMockId);
1286+
PowerMockito.mockStatic(UsageEventUtils.class);
1287+
1288+
volumeApiServiceImpl.publishVolumeCreationUsageEvent(volumeVoMock);
1289+
1290+
PowerMockito.verifyStatic(UsageEventUtils.class);
1291+
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE, volumeVoMock.getAccountId(), volumeVoMock.getDataCenterId(), volumeVoMock.getId(), volumeVoMock.getName(),
1292+
null, volumeVoMock.getTemplateId(), volumeVoMock.getSize(), Volume.class.getName(), volumeVoMock.getUuid(), volumeVoMock.isDisplayVolume());
1293+
1294+
}
1295+
1296+
@Test
1297+
@PrepareForTest(UsageEventUtils.class)
1298+
public void publishVolumeCreationUsageEventTestDiskOfferingVoTypeNotDisk() {
1299+
Mockito.doReturn(diskOfferingMockId).when(volumeVoMock).getDiskOfferingId();
1300+
Mockito.doReturn(diskOfferingVoMock).when(diskOfferingDaoMock).findById(diskOfferingMockId);
1301+
Mockito.doReturn(DiskOffering.Type.Service).when(diskOfferingVoMock).getType();
1302+
1303+
PowerMockito.mockStatic(UsageEventUtils.class);
1304+
1305+
volumeApiServiceImpl.publishVolumeCreationUsageEvent(volumeVoMock);
1306+
1307+
PowerMockito.verifyStatic(UsageEventUtils.class);
1308+
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE, volumeVoMock.getAccountId(), volumeVoMock.getDataCenterId(), volumeVoMock.getId(), volumeVoMock.getName(),
1309+
null, volumeVoMock.getTemplateId(), volumeVoMock.getSize(), Volume.class.getName(), volumeVoMock.getUuid(), volumeVoMock.isDisplayVolume());
1310+
1311+
}
1312+
1313+
@Test
1314+
@PrepareForTest(UsageEventUtils.class)
1315+
public void publishVolumeCreationUsageEventTestOfferingIdNotNull() {
1316+
Mockito.doReturn(diskOfferingMockId).when(volumeVoMock).getDiskOfferingId();
1317+
Mockito.doReturn(diskOfferingVoMock).when(diskOfferingDaoMock).findById(diskOfferingMockId);
1318+
Mockito.doReturn(DiskOffering.Type.Disk).when(diskOfferingVoMock).getType();
1319+
Mockito.doReturn(offeringMockId).when(diskOfferingVoMock).getId();
1320+
1321+
PowerMockito.mockStatic(UsageEventUtils.class);
1322+
1323+
volumeApiServiceImpl.publishVolumeCreationUsageEvent(volumeVoMock);
1324+
1325+
PowerMockito.verifyStatic(UsageEventUtils.class);
1326+
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE, volumeVoMock.getAccountId(), volumeVoMock.getDataCenterId(), volumeVoMock.getId(), volumeVoMock.getName(),
1327+
offeringMockId, volumeVoMock.getTemplateId(), volumeVoMock.getSize(), Volume.class.getName(), volumeVoMock.getUuid(), volumeVoMock.isDisplayVolume());
1328+
1329+
}
12481330
}

0 commit comments

Comments
 (0)