Skip to content

Commit d6044fb

Browse files
authored
Fix to make recovered volumes be accounted for by Usage (#6772)
1 parent f7b2985 commit d6044fb

File tree

4 files changed

+101
-15
lines changed

4 files changed

+101
-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: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1709,9 +1709,30 @@ public Volume recoverVolume(long volumeId) {
17091709
_resourceLimitMgr.incrementResourceCount(volume.getAccountId(), ResourceType.volume, volume.isDisplay());
17101710
_resourceLimitMgr.incrementResourceCount(volume.getAccountId(), ResourceType.primary_storage, volume.isDisplay(), new Long(volume.getSize()));
17111711

1712+
1713+
publishVolumeCreationUsageEvent(volume);
1714+
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.isDisplay());
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+
1734+
1735+
17151736
@Override
17161737
@ActionEvent(eventType = EventTypes.EVENT_VOLUME_CHANGE_DISK_OFFERING, eventDescription = "Changing disk offering of a volume")
17171738
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
@@ -2323,18 +2323,7 @@ public UserVm recoverVirtualMachine(RecoverVMCmd cmd) throws ResourceAllocationE
23232323
for (VolumeVO volume : volumes) {
23242324
if (volume.getVolumeType().equals(Volume.Type.ROOT)) {
23252325
// Create an event
2326-
Long templateId = volume.getTemplateId();
2327-
Long diskOfferingId = volume.getDiskOfferingId();
2328-
Long offeringId = null;
2329-
if (diskOfferingId != null) {
2330-
DiskOfferingVO offering = _diskOfferingDao.findById(diskOfferingId);
2331-
if (offering != null && !offering.isComputeOnly()) {
2332-
offeringId = offering.getId();
2333-
}
2334-
}
2335-
UsageEventUtils
2336-
.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE, volume.getAccountId(), volume.getDataCenterId(), volume.getId(), volume.getName(), offeringId,
2337-
templateId, volume.getSize(), Volume.class.getName(), volume.getUuid(), volume.isDisplayVolume());
2326+
_volumeService.publishVolumeCreationUsageEvent(volume);
23382327
}
23392328
}
23402329

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

Lines changed: 77 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@
3535
import java.util.UUID;
3636
import java.util.concurrent.ExecutionException;
3737

38+
import com.cloud.event.EventTypes;
39+
import com.cloud.event.UsageEventUtils;
3840
import com.cloud.service.ServiceOfferingVO;
3941
import com.cloud.service.dao.ServiceOfferingDao;
4042
import org.apache.cloudstack.acl.ControlledEntity;
@@ -69,7 +71,10 @@
6971
import org.mockito.Mock;
7072
import org.mockito.Mockito;
7173
import org.mockito.Spy;
72-
import org.mockito.runners.MockitoJUnitRunner;
74+
import org.powermock.api.mockito.PowerMockito;
75+
import org.powermock.core.classloader.annotations.PowerMockIgnore;
76+
import org.powermock.core.classloader.annotations.PrepareForTest;
77+
import org.powermock.modules.junit4.PowerMockRunner;
7378
import org.springframework.test.util.ReflectionTestUtils;
7479

7580
import com.cloud.api.query.dao.ServiceOfferingJoinDao;
@@ -109,12 +114,13 @@
109114
import com.cloud.vm.snapshot.VMSnapshotVO;
110115
import com.cloud.vm.snapshot.dao.VMSnapshotDao;
111116

112-
@RunWith(MockitoJUnitRunner.class)
117+
@RunWith(PowerMockRunner.class)
118+
@PowerMockIgnore("javax.management.*")
113119
public class VolumeApiServiceImplTest {
114120

115121
@Spy
116122
@InjectMocks
117-
private VolumeApiServiceImpl volumeApiServiceImpl;
123+
private VolumeApiServiceImpl volumeApiServiceImpl = new VolumeApiServiceImpl();
118124
@Mock
119125
private SnapshotManager snapshotManagerMock;
120126
@Mock
@@ -189,6 +195,10 @@ public class VolumeApiServiceImplTest {
189195
private long vmInstanceMockId = 1123l;
190196
private long volumeSizeMock = 456789921939l;
191197

198+
private long diskOfferingMockId = 100203L;
199+
200+
private long offeringMockId = 31902L;
201+
192202
@Before
193203
public void setup() throws InterruptedException, ExecutionException {
194204
Mockito.lenient().doReturn(volumeMockId).when(volumeDataStoreVoMock).getVolumeId();
@@ -1245,4 +1255,68 @@ private void prepareAndRunIsNewDiskOfferingTheSameAndCustomServiceOffering(long
12451255
boolean result = volumeApiServiceImpl.isNewDiskOfferingTheSameAndCustomServiceOffering(existingDiskOffering, newDiskOffering);
12461256
Assert.assertEquals(expectedResult, result);
12471257
}
1258+
1259+
@Test
1260+
@PrepareForTest(UsageEventUtils.class)
1261+
public void publishVolumeCreationUsageEventTestNullDiskOfferingId() {
1262+
Mockito.doReturn(null).when(volumeVoMock).getDiskOfferingId();
1263+
PowerMockito.mockStatic(UsageEventUtils.class);
1264+
1265+
volumeApiServiceImpl.publishVolumeCreationUsageEvent(volumeVoMock);
1266+
1267+
PowerMockito.verifyStatic(UsageEventUtils.class);
1268+
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE, volumeVoMock.getAccountId(), volumeVoMock.getDataCenterId(), volumeVoMock.getId(), volumeVoMock.getName(),
1269+
null, volumeVoMock.getTemplateId(), volumeVoMock.getSize(), Volume.class.getName(), volumeVoMock.getUuid(), volumeVoMock.isDisplay());
1270+
1271+
}
1272+
1273+
@Test
1274+
@PrepareForTest(UsageEventUtils.class)
1275+
public void publishVolumeCreationUsageEventTestNullDiskOfferingVo() {
1276+
Mockito.doReturn(diskOfferingMockId).when(volumeVoMock).getDiskOfferingId();
1277+
Mockito.doReturn(null).when(_diskOfferingDao).findById(diskOfferingMockId);
1278+
PowerMockito.mockStatic(UsageEventUtils.class);
1279+
1280+
volumeApiServiceImpl.publishVolumeCreationUsageEvent(volumeVoMock);
1281+
1282+
PowerMockito.verifyStatic(UsageEventUtils.class);
1283+
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE, volumeVoMock.getAccountId(), volumeVoMock.getDataCenterId(), volumeVoMock.getId(), volumeVoMock.getName(),
1284+
null, volumeVoMock.getTemplateId(), volumeVoMock.getSize(), Volume.class.getName(), volumeVoMock.getUuid(), volumeVoMock.isDisplay());
1285+
1286+
}
1287+
1288+
@Test
1289+
@PrepareForTest(UsageEventUtils.class)
1290+
public void publishVolumeCreationUsageEventTestDiskOfferingVoTypeNotDisk() {
1291+
Mockito.doReturn(diskOfferingMockId).when(volumeVoMock).getDiskOfferingId();
1292+
Mockito.doReturn(newDiskOfferingMock).when(_diskOfferingDao).findById(diskOfferingMockId);
1293+
Mockito.doReturn(true).when(newDiskOfferingMock).isComputeOnly();
1294+
1295+
PowerMockito.mockStatic(UsageEventUtils.class);
1296+
1297+
volumeApiServiceImpl.publishVolumeCreationUsageEvent(volumeVoMock);
1298+
1299+
PowerMockito.verifyStatic(UsageEventUtils.class);
1300+
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE, volumeVoMock.getAccountId(), volumeVoMock.getDataCenterId(), volumeVoMock.getId(), volumeVoMock.getName(),
1301+
null, volumeVoMock.getTemplateId(), volumeVoMock.getSize(), Volume.class.getName(), volumeVoMock.getUuid(), volumeVoMock.isDisplay());
1302+
1303+
}
1304+
1305+
@Test
1306+
@PrepareForTest(UsageEventUtils.class)
1307+
public void publishVolumeCreationUsageEventTestOfferingIdNotNull() {
1308+
Mockito.doReturn(diskOfferingMockId).when(volumeVoMock).getDiskOfferingId();
1309+
Mockito.doReturn(newDiskOfferingMock).when(_diskOfferingDao).findById(diskOfferingMockId);
1310+
Mockito.doReturn(false).when(newDiskOfferingMock).isComputeOnly();
1311+
Mockito.doReturn(offeringMockId).when(newDiskOfferingMock).getId();
1312+
1313+
PowerMockito.mockStatic(UsageEventUtils.class);
1314+
1315+
volumeApiServiceImpl.publishVolumeCreationUsageEvent(volumeVoMock);
1316+
1317+
PowerMockito.verifyStatic(UsageEventUtils.class);
1318+
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE, volumeVoMock.getAccountId(), volumeVoMock.getDataCenterId(), volumeVoMock.getId(), volumeVoMock.getName(),
1319+
offeringMockId, volumeVoMock.getTemplateId(), volumeVoMock.getSize(), Volume.class.getName(), volumeVoMock.getUuid(), volumeVoMock.isDisplay());
1320+
1321+
}
12481322
}

0 commit comments

Comments
 (0)