Skip to content

Commit 7442b56

Browse files
committed
CLOUDSTACK-6247: Usage Events - hide them when display flag is off in the context of "Ability to have better control over first class objects in CS" feature
And when the flag is updated on the resource accordingly generate usage events again. Also when display flag is false in deployvm cmd it should be false for the volumes associated with the vm as well
1 parent 0288a87 commit 7442b56

8 files changed

Lines changed: 200 additions & 69 deletions

File tree

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,4 +96,6 @@ public interface VolumeApiService {
9696
String extractVolume(ExtractVolumeCmd cmd);
9797

9898
boolean isDisplayResourceEnabled(Long id);
99+
100+
void updateDisplay(Volume volume, Boolean displayVolume);
99101
}

engine/api/src/org/apache/cloudstack/engine/orchestration/service/VolumeOrchestrationService.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,4 +118,5 @@ DiskProfile allocateTemplatedVolume(Type type, String name, DiskOffering offerin
118118
StoragePool findStoragePool(DiskProfile dskCh, DataCenter dc, Pod pod, Long clusterId, Long hostId, VirtualMachine vm, Set<StoragePool> avoid);
119119

120120
void updateVolumeDiskChain(long volumeId, String path, String chainInfo);
121+
121122
}

engine/components-api/src/com/cloud/event/UsageEventUtils.java

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,15 @@ public static void publishUsageEvent(String usageType, long accountId, long zone
7070
publishUsageEvent(usageType, accountId, zoneId, entityType, entityUUID);
7171
}
7272

73+
public static void publishUsageEvent(String usageType, long accountId, long zoneId, long resourceId, String resourceName, Long offeringId, Long templateId,
74+
Long size, String entityType, String entityUUID, boolean displayResource) {
75+
if(displayResource){
76+
saveUsageEvent(usageType, accountId, zoneId, resourceId, resourceName, offeringId, templateId, size);
77+
}
78+
publishUsageEvent(usageType, accountId, zoneId, entityType, entityUUID);
79+
80+
}
81+
7382
public static void publishUsageEvent(String usageType, long accountId, long zoneId, long resourceId, String resourceName, Long offeringId, Long templateId,
7483
Long size, Long virtualSize, String entityType, String entityUUID) {
7584
saveUsageEvent(usageType, accountId, zoneId, resourceId, resourceName, offeringId, templateId, size, virtualSize);
@@ -81,16 +90,26 @@ public static void publishUsageEvent(String usageType, long accountId, long zone
8190
publishUsageEvent(usageType, accountId, zoneId, entityType, entityUUID);
8291
}
8392

93+
public static void publishUsageEvent(String usageType, long accountId, long zoneId, long resourceId, String resourceName, String entityType, String entityUUID, boolean diplayResource) {
94+
if (diplayResource){
95+
saveUsageEvent(usageType, accountId, zoneId, resourceId, resourceName);
96+
publishUsageEvent(usageType, accountId, zoneId, entityType, entityUUID);
97+
}
98+
}
99+
84100
public static void publishUsageEvent(String usageType, long accountId, long zoneId, long ipAddressId, String ipAddress, boolean isSourceNat, String guestType,
85101
boolean isSystem, String entityType, String entityUUID) {
86102
saveUsageEvent(usageType, accountId, zoneId, ipAddressId, ipAddress, isSourceNat, guestType, isSystem);
87103
publishUsageEvent(usageType, accountId, zoneId, entityType, entityUUID);
88104
}
89105

90106
public static void publishUsageEvent(String usageType, long accountId, long zoneId, long resourceId, String resourceName, Long offeringId, Long templateId,
91-
String resourceType, String entityType, String entityUUID) {
92-
saveUsageEvent(usageType, accountId, zoneId, resourceId, resourceName, offeringId, templateId, resourceType);
107+
String resourceType, String entityType, String entityUUID, boolean displayResource) {
108+
if(displayResource){
109+
saveUsageEvent(usageType, accountId, zoneId, resourceId, resourceName, offeringId, templateId, resourceType);
110+
}
93111
publishUsageEvent(usageType, accountId, zoneId, entityType, entityUUID);
112+
94113
}
95114

96115
public static void publishUsageEvent(String usageType, long accountId, long zoneId, long vmId, long securityGroupId, String entityType, String entityUUID) {
@@ -99,9 +118,12 @@ public static void publishUsageEvent(String usageType, long accountId, long zone
99118
}
100119

101120
public static void publishUsageEvent(String usageType, long accountId, long zoneId, long resourceId, String resourceName, Long offeringId, Long templateId,
102-
String resourceType, String entityType, String entityUUID, Map<String, String> details) {
103-
saveUsageEvent(usageType, accountId, zoneId, resourceId, resourceName, offeringId, templateId, resourceType, details);
121+
String resourceType, String entityType, String entityUUID, Map<String, String> details, boolean displayResource) {
122+
if(displayResource){
123+
saveUsageEvent(usageType, accountId, zoneId, resourceId, resourceName, offeringId, templateId, resourceType, details);
124+
}
104125
publishUsageEvent(usageType, accountId, zoneId, entityType, entityUUID);
126+
105127
}
106128

107129
private static void saveUsageEvent(String usageType, long accountId, long zoneId, long resourceId, String resourceName, Long offeringId, Long templateId,

engine/orchestration/src/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
import javax.inject.Inject;
3131
import javax.naming.ConfigurationException;
3232

33+
import com.cloud.vm.UserVmVO;
34+
import com.cloud.vm.dao.UserVmDao;
3335
import org.apache.log4j.Logger;
3436

3537
import org.apache.cloudstack.engine.orchestration.service.VolumeOrchestrationService;
@@ -149,6 +151,8 @@ public class VolumeOrchestrator extends ManagerBase implements VolumeOrchestrati
149151
HostDao _hostDao;
150152
@Inject
151153
SnapshotService _snapshotSrv;
154+
@Inject
155+
protected UserVmDao _userVmDao;
152156

153157
private final StateMachine2<Volume.State, Volume.Event, Volume> _volStateMachine;
154158
protected List<StoragePoolAllocator> _storagePoolAllocators;
@@ -592,17 +596,22 @@ public DiskProfile allocateRawVolume(Type type, String name, DiskOffering offeri
592596
if (template.getFormat() == ImageFormat.ISO) {
593597
vol.setIsoId(template.getId());
594598
}
599+
// display flag matters only for the User vms
600+
if (vm.getType() == VirtualMachine.Type.User) {
601+
UserVmVO userVm = _userVmDao.findById(vm.getId());
602+
vol.setDisplayVolume(userVm.isDisplayVm());
603+
}
595604

596605
vol.setFormat(getSupportedImageFormatForCluster(vm.getHypervisorType()));
597606
vol = _volsDao.persist(vol);
598607

599608
// Save usage event and update resource count for user vm volumes
600609
if (vm.getType() == VirtualMachine.Type.User) {
601610
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE, vol.getAccountId(), vol.getDataCenterId(), vol.getId(), vol.getName(), offering.getId(), null, size,
602-
Volume.class.getName(), vol.getUuid());
611+
Volume.class.getName(), vol.getUuid(), vol.isDisplayVolume());
603612

604-
_resourceLimitMgr.incrementResourceCount(vm.getAccountId(), ResourceType.volume);
605-
_resourceLimitMgr.incrementResourceCount(vm.getAccountId(), ResourceType.primary_storage, new Long(vol.getSize()));
613+
_resourceLimitMgr.incrementResourceCount(vm.getAccountId(), ResourceType.volume, vol.isDisplayVolume());
614+
_resourceLimitMgr.incrementResourceCount(vm.getAccountId(), ResourceType.primary_storage, vol.isDisplayVolume(), new Long(vol.getSize()));
606615
}
607616
return toDiskProfile(vol, offering);
608617
}
@@ -642,6 +651,12 @@ public DiskProfile allocateTemplatedVolume(Type type, String name, DiskOffering
642651
vol.setDeviceId(1l);
643652
}
644653

654+
if (vm.getType() == VirtualMachine.Type.User) {
655+
UserVmVO userVm = _userVmDao.findById(vm.getId());
656+
vol.setDisplayVolume(userVm.isDisplayVm());
657+
}
658+
659+
645660
vol = _volsDao.persist(vol);
646661

647662
// Create event and update resource count for volumes if vm is a user vm
@@ -652,10 +667,10 @@ public DiskProfile allocateTemplatedVolume(Type type, String name, DiskOffering
652667
offeringId = offering.getId();
653668

654669
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE, vol.getAccountId(), vol.getDataCenterId(), vol.getId(), vol.getName(), offeringId, null, size,
655-
Volume.class.getName(), vol.getUuid());
670+
Volume.class.getName(), vol.getUuid(), vol.isDisplayVolume());
656671

657-
_resourceLimitMgr.incrementResourceCount(vm.getAccountId(), ResourceType.volume);
658-
_resourceLimitMgr.incrementResourceCount(vm.getAccountId(), ResourceType.primary_storage, new Long(vol.getSize()));
672+
_resourceLimitMgr.incrementResourceCount(vm.getAccountId(), ResourceType.volume, vol.isDisplayVolume());
673+
_resourceLimitMgr.incrementResourceCount(vm.getAccountId(), ResourceType.primary_storage, vol.isDisplayVolume(), new Long(vol.getSize()));
659674
}
660675
return toDiskProfile(vol, offering);
661676
}

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

Lines changed: 59 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -591,10 +591,10 @@ public VolumeVO doInTransaction(TransactionStatus status) {
591591
}
592592

593593
volume = _volsDao.persist(volume);
594-
if (cmd.getSnapshotId() == null) {
594+
if (cmd.getSnapshotId() == null && displayVolume) {
595595
// for volume created from snapshot, create usage event after volume creation
596-
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE, volume.getAccountId(), volume.getDataCenterId(), volume.getId(), volume.getName(),
597-
diskOfferingId, null, size, Volume.class.getName(), volume.getUuid());
596+
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE, volume.getAccountId(), volume.getDataCenterId(), volume.getId(), volume.getName(),
597+
diskOfferingId, null, size, Volume.class.getName(), volume.getUuid(), displayVolume);
598598
}
599599

600600
CallContext.current().setEventDetails("Volume Id: " + volume.getId());
@@ -677,11 +677,11 @@ protected VolumeVO createVolumeFromSnapshot(VolumeVO volume, long snapshotId, Lo
677677
// sync old snapshots to region store if necessary
678678

679679
createdVolume = _volumeMgr.createVolumeFromSnapshot(volume, snapshot, vm);
680-
680+
VolumeVO volumeVo = _volsDao.findById(createdVolume.getId());
681681
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE, createdVolume.getAccountId(), createdVolume.getDataCenterId(), createdVolume.getId(),
682-
createdVolume.getName(), createdVolume.getDiskOfferingId(), null, createdVolume.getSize(), Volume.class.getName(), createdVolume.getUuid());
682+
createdVolume.getName(), createdVolume.getDiskOfferingId(), null, createdVolume.getSize(), Volume.class.getName(), createdVolume.getUuid(), volumeVo.isDisplayVolume());
683683

684-
return _volsDao.findById(createdVolume.getId());
684+
return volumeVo;
685685
}
686686

687687
@Override
@@ -972,7 +972,7 @@ storage count (in case of upload volume). */
972972

973973
// Log usage event for volumes belonging user VM's only
974974
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_DELETE, volume.getAccountId(), volume.getDataCenterId(), volume.getId(), volume.getName(),
975-
Volume.class.getName(), volume.getUuid());
975+
Volume.class.getName(), volume.getUuid(), volume.isDisplayVolume());
976976
}
977977
}
978978
// Mark volume as removed if volume has not been created on primary or secondary
@@ -1225,14 +1225,13 @@ public Volume updateVolume(long volumeId, String path, String state, Long storag
12251225

12261226
VolumeVO volume = _volumeDao.findById(volumeId);
12271227

1228+
if(volume == null)
1229+
throw new InvalidParameterValueException("The volume id doesn't exist");
1230+
12281231
if (path != null) {
12291232
volume.setPath(path);
12301233
}
12311234

1232-
if (displayVolume != null) {
1233-
volume.setDisplayVolume(displayVolume);
1234-
}
1235-
12361235
if(chainInfo != null){
12371236
volume.setChainInfo(chainInfo);
12381237
}
@@ -1258,17 +1257,61 @@ public Volume updateVolume(long volumeId, String path, String state, Long storag
12581257
volume.setUuid(customId);
12591258
}
12601259

1261-
if (displayVolume != null && displayVolume != volume.isDisplayVolume()) { // No need to check permissions since only Admin allowed to call this API.
1262-
volume.setDisplayVolume(displayVolume);
1263-
_resourceLimitMgr.changeResourceCount(entityOwnerId, ResourceType.volume, displayVolume);
1264-
_resourceLimitMgr.changeResourceCount(entityOwnerId, ResourceType.primary_storage, displayVolume, new Long(volume.getSize()));
1265-
}
1260+
updateDisplay(volume, displayVolume);
12661261

12671262
_volumeDao.update(volumeId, volume);
12681263

12691264
return volume;
12701265
}
12711266

1267+
1268+
@Override
1269+
public void updateDisplay(Volume volume, Boolean displayVolume){
1270+
// 1. Resource limit changes
1271+
updateResourceCount(volume, displayVolume);
1272+
1273+
// 2. generate usage event if not in destroyed state
1274+
saveUsageEvent(volume, displayVolume);
1275+
1276+
// 3. Set the flag
1277+
if (displayVolume != null && displayVolume != volume.isDisplayVolume()){
1278+
// FIXME - Confused - typecast for now.
1279+
((VolumeVO)volume).setDisplayVolume(displayVolume);
1280+
_volumeDao.update(volume.getId(), (VolumeVO)volume);
1281+
}
1282+
1283+
}
1284+
1285+
private void updateResourceCount(Volume volume, Boolean displayVolume){
1286+
// Update only when the flag has changed.
1287+
if (displayVolume != null && displayVolume != volume.isDisplayVolume()){
1288+
_resourceLimitMgr.changeResourceCount(volume.getAccountId(), ResourceType.volume, displayVolume);
1289+
_resourceLimitMgr.changeResourceCount(volume.getAccountId(), ResourceType.primary_storage, displayVolume, new Long(volume.getSize()));
1290+
}
1291+
}
1292+
1293+
private void saveUsageEvent(Volume volume, Boolean displayVolume){
1294+
1295+
// Update only when the flag has changed && only when volume in a non-destroyed state.
1296+
if ((displayVolume != null && displayVolume != volume.isDisplayVolume()) && !isVolumeDestroyed(volume)){
1297+
if (displayVolume){
1298+
// flag turned 1 equivalent to freshly created volume
1299+
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE, volume.getAccountId(), volume.getDataCenterId(), volume.getId(), volume.getName(),
1300+
volume.getDiskOfferingId(), volume.getTemplateId(), volume.getSize(), Volume.class.getName(), volume.getUuid());
1301+
}else {
1302+
// flag turned 0 equivalent to deleting a volume
1303+
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_DELETE, volume.getAccountId(), volume.getDataCenterId(), volume.getId(), volume.getName(),
1304+
Volume.class.getName(), volume.getUuid());
1305+
}
1306+
}
1307+
}
1308+
1309+
private boolean isVolumeDestroyed(Volume volume){
1310+
if(volume.getState() == Volume.State.Destroy || volume.getState() == Volume.State.Expunging && volume.getState() == Volume.State.Expunged)
1311+
return true;
1312+
return false;
1313+
}
1314+
12721315
@Override
12731316
@ActionEvent(eventType = EventTypes.EVENT_VOLUME_DETACH, eventDescription = "detaching volume", async = true)
12741317
public Volume detachVolumeFromVM(DetachVolumeCmd cmmd) {

server/src/com/cloud/vm/UserVmManager.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,4 +109,6 @@ UserVm updateVirtualMachine(long id, String displayName, String group, Boolean h
109109
public void saveCustomOfferingDetails(long vmId, ServiceOffering serviceOffering);
110110

111111
public void removeCustomOfferingDetails(long vmId);
112+
113+
void generateUsageEvent(VirtualMachine vm, boolean isDisplay, String eventType);
112114
}

0 commit comments

Comments
 (0)