Skip to content

Commit e5abbfb

Browse files
committed
Display VM snapshot tags on usage records
1 parent 7ac9f00 commit e5abbfb

9 files changed

Lines changed: 95 additions & 28 deletions

File tree

engine/schema/src/main/java/com/cloud/usage/UsageSnapshotOnPrimaryVO.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,13 @@ public class UsageSnapshotOnPrimaryVO implements InternalIdentity {
6666
@Column(name = "virtualsize")
6767
private Long virtualSize;
6868

69+
@Column(name = "vm_snapshot_id")
70+
private Long vmSnapshotId;
71+
6972
protected UsageSnapshotOnPrimaryVO() {
7073
}
7174

72-
public UsageSnapshotOnPrimaryVO(long id, long zoneId, long accountId, long domainId, long vmId, String name, int type, long virtualSize, long physicalSize, Date created, Date deleted) {
75+
public UsageSnapshotOnPrimaryVO(long id, long zoneId, long accountId, long domainId, long vmId, String name, int type, long virtualSize, long physicalSize, Date created, Date deleted, Long vmSnapshotId) {
7376
this.id = id;
7477
this.zoneId = zoneId;
7578
this.accountId = accountId;
@@ -81,6 +84,7 @@ public UsageSnapshotOnPrimaryVO(long id, long zoneId, long accountId, long domai
8184
this.vmId = vmId;
8285
this.name = name;
8386
this.deleted = deleted;
87+
this.vmSnapshotId = vmSnapshotId;
8488
}
8589

8690
public long getZoneId() {
@@ -131,6 +135,10 @@ public String getName() {
131135
return name;
132136
}
133137

138+
public Long getVmSnapshotId() {
139+
return vmSnapshotId;
140+
}
141+
134142
@Override
135143
public long getId() {
136144
return this.id;
@@ -139,7 +147,7 @@ public long getId() {
139147
@Override
140148
public String toString() {
141149
return "UsageSnapshotOnPrimaryVO [id=" + id + ", zoneId=" + zoneId + ", accountId=" + accountId + ", domainId=" + domainId + ", vmId=" + vmId + ", name=" + name
142-
+ ", snapshotType=" + snapshotType + ", physicalSize=" + physicalSize + ", created=" + created + ", deleted=" + deleted + ", virtualSize=" + virtualSize + "]";
150+
+ ", snapshotType=" + snapshotType + ", physicalSize=" + physicalSize + ", created=" + created + ", deleted=" + deleted + ", virtualSize=" + virtualSize + ", vmSnapshotId=" + vmSnapshotId + "]";
143151
}
144152

145153
}

engine/schema/src/main/java/com/cloud/usage/UsageVMSnapshotVO.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,17 @@ public class UsageVMSnapshotVO implements InternalIdentity {
6060
@Temporal(value = TemporalType.TIMESTAMP)
6161
private Date processed;
6262

63+
@Column(name = "name")
64+
private String name;
65+
66+
@Column(name = "vm_snapshot_id")
67+
private Long vmSnapshotId;
68+
6369
protected UsageVMSnapshotVO() {
6470
}
6571

66-
public UsageVMSnapshotVO(long id, long zoneId, long accountId, long domainId, long vmId, Long diskOfferingId, long size, Date created, Date processed) {
72+
public UsageVMSnapshotVO(long id, long zoneId, long accountId, long domainId, long vmId, Long diskOfferingId,
73+
long size, Date created, Date processed, String vmSnapshotName, Long vmSnapshotId) {
6774
this.zoneId = zoneId;
6875
this.accountId = accountId;
6976
this.domainId = domainId;
@@ -73,6 +80,8 @@ public UsageVMSnapshotVO(long id, long zoneId, long accountId, long domainId, lo
7380
this.created = created;
7481
this.vmId = vmId;
7582
this.processed = processed;
83+
this.name = vmSnapshotName;
84+
this.vmSnapshotId = vmSnapshotId;
7685
}
7786

7887
public long getZoneId() {
@@ -115,6 +124,14 @@ public long getVmId() {
115124
return vmId;
116125
}
117126

127+
public String getName() {
128+
return name;
129+
}
130+
131+
public Long getVmSnapshotId() {
132+
return vmSnapshotId;
133+
}
134+
118135
@Override
119136
public long getId() {
120137
return this.id;
@@ -123,7 +140,8 @@ public long getId() {
123140
@Override
124141
public String toString() {
125142
return "UsageVMSnapshotVO [id=" + id + ", zoneId=" + zoneId + ", accountId=" + accountId + ", domainId=" + domainId + ", vmId=" + vmId + ", diskOfferingId="
126-
+ diskOfferingId + ", size=" + size + ", created=" + created + ", processed=" + processed + "]";
143+
+ diskOfferingId + ", size=" + size + ", created=" + created + ", processed=" + processed
144+
+ ", name=" + name + ", vmSnapshotId=" + vmSnapshotId + "]";
127145
}
128146

129147
}

engine/schema/src/main/java/com/cloud/usage/dao/UsageVMSnapshotDaoImpl.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.util.TimeZone;
2626

2727

28+
import org.apache.commons.lang.StringUtils;
2829
import org.apache.log4j.Logger;
2930
import org.springframework.stereotype.Component;
3031

@@ -36,12 +37,12 @@
3637
@Component
3738
public class UsageVMSnapshotDaoImpl extends GenericDaoBase<UsageVMSnapshotVO, Long> implements UsageVMSnapshotDao {
3839
public static final Logger s_logger = Logger.getLogger(UsageVMSnapshotDaoImpl.class.getName());
39-
protected static final String GET_USAGE_RECORDS_BY_ACCOUNT = "SELECT id, zone_id, account_id, domain_id, vm_id, disk_offering_id, size, created, processed "
40+
protected static final String GET_USAGE_RECORDS_BY_ACCOUNT = "SELECT id, zone_id, account_id, domain_id, vm_id, disk_offering_id, size, created, processed, name, vm_snapshot_id "
4041
+ " FROM usage_vmsnapshot" + " WHERE account_id = ? " + " AND ( (created BETWEEN ? AND ?) OR "
4142
+ " (created < ? AND processed is NULL) ) ORDER BY created asc";
4243
protected static final String UPDATE_DELETED = "UPDATE usage_vmsnapshot SET processed = ? WHERE account_id = ? AND id = ? and vm_id = ? and created = ?";
4344

44-
protected static final String PREVIOUS_QUERY = "SELECT id, zone_id, account_id, domain_id, vm_id, disk_offering_id,size, created, processed "
45+
protected static final String PREVIOUS_QUERY = "SELECT id, zone_id, account_id, domain_id, vm_id, disk_offering_id,size, created, processed, name, vm_snapshot_id "
4546
+ "FROM usage_vmsnapshot " + "WHERE account_id = ? AND id = ? AND vm_id = ? AND created < ? AND processed IS NULL " + "ORDER BY created desc limit 1";
4647

4748
@Override
@@ -99,14 +100,17 @@ public List<UsageVMSnapshotVO> getUsageRecords(Long accountId, Long domainId, Da
99100
Date processDate = null;
100101
String createdTS = rs.getString(8);
101102
String processed = rs.getString(9);
103+
String name = String.valueOf(rs.getString(10));
104+
String vmSnapIdStr = rs.getString(11);
105+
Long vmSnapshotId = StringUtils.isNotBlank(vmSnapIdStr) ? Long.valueOf(vmSnapIdStr) : null;
102106

103107
if (createdTS != null) {
104108
createdDate = DateUtil.parseDateString(s_gmtTimeZone, createdTS);
105109
}
106110
if (processed != null) {
107111
processDate = DateUtil.parseDateString(s_gmtTimeZone, processed);
108112
}
109-
usageRecords.add(new UsageVMSnapshotVO(vId, zoneId, acctId, dId, vmId, doId, size, createdDate, processDate));
113+
usageRecords.add(new UsageVMSnapshotVO(vId, zoneId, acctId, dId, vmId, doId, size, createdDate, processDate, name, vmSnapshotId));
110114
}
111115
} catch (Exception e) {
112116
txn.rollback();
@@ -150,14 +154,17 @@ public UsageVMSnapshotVO getPreviousUsageRecord(UsageVMSnapshotVO rec) {
150154
Date processDate = null;
151155
String createdTS = rs.getString(8);
152156
String processed = rs.getString(9);
157+
String name = String.valueOf(rs.getString(10));
158+
String vmSnapIdStr = rs.getString(11);
159+
Long vmSnapshotId = StringUtils.isNotBlank(vmSnapIdStr) ? Long.valueOf(vmSnapIdStr) : null;
153160

154161
if (createdTS != null) {
155162
createdDate = DateUtil.parseDateString(s_gmtTimeZone, createdTS);
156163
}
157164
if (processed != null) {
158165
processDate = DateUtil.parseDateString(s_gmtTimeZone, processed);
159166
}
160-
usageRecords.add(new UsageVMSnapshotVO(vId, zoneId, acctId, dId, vmId, doId, size, createdDate, processDate));
167+
usageRecords.add(new UsageVMSnapshotVO(vId, zoneId, acctId, dId, vmId, doId, size, createdDate, processDate, name, vmSnapshotId));
161168
}
162169
} catch (Exception e) {
163170
txn.rollback();

engine/schema/src/main/java/com/cloud/usage/dao/UsageVMSnapshotOnPrimaryDaoImpl.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.util.TimeZone;
2626

2727

28+
import org.apache.commons.lang.StringUtils;
2829
import org.apache.log4j.Logger;
2930
import org.springframework.stereotype.Component;
3031

@@ -36,7 +37,7 @@
3637
@Component
3738
public class UsageVMSnapshotOnPrimaryDaoImpl extends GenericDaoBase<UsageSnapshotOnPrimaryVO, Long> implements UsageVMSnapshotOnPrimaryDao {
3839
public static final Logger s_logger = Logger.getLogger(UsageVMSnapshotOnPrimaryDaoImpl.class.getName());
39-
protected static final String GET_USAGE_RECORDS_BY_ACCOUNT = "SELECT id, zone_id, account_id, domain_id, vm_id, name, type, physicalsize, virtualsize, created, deleted "
40+
protected static final String GET_USAGE_RECORDS_BY_ACCOUNT = "SELECT id, zone_id, account_id, domain_id, vm_id, name, type, physicalsize, virtualsize, created, deleted, vm_snapshot_id "
4041
+ " FROM usage_snapshot_on_primary" + " WHERE account_id = ? " + " AND ( (created < ? AND deleted is NULL)"
4142
+ " OR ( deleted BETWEEN ? AND ?)) ORDER BY created asc";
4243
protected static final String UPDATE_DELETED = "UPDATE usage_snapshot_on_primary SET deleted = ? WHERE account_id = ? AND id = ? and vm_id = ? and created = ?";
@@ -95,14 +96,16 @@ public List<UsageSnapshotOnPrimaryVO> getUsageRecords(Long accountId, Long domai
9596
Date deleteDate = null;
9697
String createdTS = rs.getString(10);
9798
String deleted = rs.getString(11);
99+
String vmSnapIdStr = rs.getString(12);
100+
Long vmSnapshotId = StringUtils.isNotBlank(vmSnapIdStr) ? Long.valueOf(vmSnapIdStr) : null;
98101

99102
if (createdTS != null) {
100103
createdDate = DateUtil.parseDateString(s_gmtTimeZone, createdTS);
101104
}
102105
if (deleted != null) {
103106
deleteDate = DateUtil.parseDateString(s_gmtTimeZone, deleted);
104107
}
105-
usageRecords.add(new UsageSnapshotOnPrimaryVO(vId, zoneId, acctId, dId, vmId, name, type, virtaulSize, physicalSize, createdDate, deleteDate));
108+
usageRecords.add(new UsageSnapshotOnPrimaryVO(vId, zoneId, acctId, dId, vmId, name, type, virtaulSize, physicalSize, createdDate, deleteDate, vmSnapshotId));
106109
}
107110
} catch (Exception e) {
108111
txn.rollback();

engine/schema/src/main/resources/META-INF/db/schema-41200to41300.sql

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -531,3 +531,7 @@ CREATE TABLE `cloud`.`template_ovf_properties` (
531531
CONSTRAINT `fk_template_ovf_properties__template_id` FOREIGN KEY (`template_id`) REFERENCES `vm_template`(`id`)
532532
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
533533

534+
-- Add VM snapshot name on usage helper table
535+
ALTER TABLE `cloud_usage`.`usage_vmsnapshot` ADD COLUMN `name` VARCHAR(128);
536+
ALTER TABLE `cloud_usage`.`usage_vmsnapshot` ADD COLUMN `vm_snapshot_id` BIGINT(20);
537+
ALTER TABLE `cloud_usage`.`usage_snapshot_on_primary` ADD COLUMN `vm_snapshot_id` BIGINT(20);

server/src/main/java/com/cloud/api/ApiResponseHelper.java

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131

3232
import javax.inject.Inject;
3333

34+
import com.cloud.vm.snapshot.VMSnapshotVO;
35+
import com.cloud.vm.snapshot.dao.VMSnapshotDao;
3436
import org.apache.cloudstack.acl.ControlledEntity;
3537
import org.apache.cloudstack.acl.ControlledEntity.ACLType;
3638
import org.apache.cloudstack.affinity.AffinityGroup;
@@ -372,6 +374,8 @@ public class ApiResponseHelper implements ResponseGenerator {
372374
private IPAddressDao userIpAddressDao;
373375
@Inject
374376
NetworkDetailsDao networkDetailsDao;
377+
@Inject
378+
private VMSnapshotDao vmSnapshotDao;
375379

376380
@Override
377381
public UserResponse createUserResponse(User user) {
@@ -3643,11 +3647,12 @@ public UsageRecordResponse createUsageResponse(Usage usageRecord, Map<String, Se
36433647
usageRecResponse.setDescription(builder.toString());
36443648
}
36453649
} else if (usageRecord.getUsageType() == UsageTypes.VM_SNAPSHOT) {
3646-
resourceType = ResourceObjectType.UserVm;
3647-
if (vmInstance != null) {
3648-
resourceId = vmInstance.getId();
3649-
usageRecResponse.setResourceName(vmInstance.getInstanceName());
3650-
usageRecResponse.setUsageId(vmInstance.getUuid());
3650+
resourceType = ResourceObjectType.VMSnapshot;
3651+
VMSnapshotVO vmSnapshotVO = vmSnapshotDao.findByIdIncludingRemoved(usageRecord.getUsageId());
3652+
if (vmSnapshotVO != null) {
3653+
resourceId = vmSnapshotVO.getId();
3654+
usageRecResponse.setResourceName(vmSnapshotVO.getDisplayName());
3655+
usageRecResponse.setUsageId(vmSnapshotVO.getUuid());
36513656
}
36523657
usageRecResponse.setSize(usageRecord.getSize());
36533658
if (usageRecord.getOfferingId() != null) {
@@ -3684,6 +3689,13 @@ public UsageRecordResponse createUsageResponse(Usage usageRecord, Map<String, Se
36843689
usageRecResponse.setDescription(builder.toString());
36853690
}
36863691
} else if (usageRecord.getUsageType() == UsageTypes.VM_SNAPSHOT_ON_PRIMARY) {
3692+
resourceType = ResourceObjectType.VMSnapshot;
3693+
VMSnapshotVO vmSnapshotVO = vmSnapshotDao.findByIdIncludingRemoved(usageRecord.getUsageId());
3694+
if (vmSnapshotVO != null) {
3695+
resourceId = vmSnapshotVO.getId();
3696+
usageRecResponse.setResourceName(vmSnapshotVO.getDisplayName());
3697+
usageRecResponse.setUsageId(vmSnapshotVO.getUuid());
3698+
}
36873699
usageRecResponse.setSize(usageRecord.getVirtualSize());
36883700
if (!oldFormat) {
36893701
final StringBuilder builder = new StringBuilder();

usage/src/main/java/com/cloud/usage/UsageManagerImpl.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
import javax.inject.Inject;
3434
import javax.naming.ConfigurationException;
3535

36+
import com.cloud.vm.snapshot.VMSnapshotVO;
37+
import com.cloud.vm.snapshot.dao.VMSnapshotDao;
3638
import org.apache.cloudstack.quota.QuotaAlertManager;
3739
import org.apache.cloudstack.quota.QuotaManager;
3840
import org.apache.cloudstack.quota.QuotaStatement;
@@ -155,6 +157,8 @@ public class UsageManagerImpl extends ManagerBase implements UsageManager, Runna
155157
private QuotaAlertManager _alertManager;
156158
@Inject
157159
private QuotaStatement _quotaStatement;
160+
@Inject
161+
private VMSnapshotDao vmSnapshotDao;
158162

159163
private String _version = null;
160164
private final Calendar _jobExecTime = Calendar.getInstance();
@@ -1827,7 +1831,11 @@ private void createVMSnapshotEvent(UsageEventVO event) {
18271831
Date created = event.getCreateDate();
18281832
Account acct = _accountDao.findByIdIncludingRemoved(event.getAccountId());
18291833
Long domainId = acct.getDomainId();
1830-
UsageVMSnapshotVO vsVO = new UsageVMSnapshotVO(volumeId, zoneId, accountId, domainId, vmId, offeringId, size, created, null);
1834+
String vmSnapshotName = event.getResourceName();
1835+
VMSnapshotVO vmSnapshotVO = vmSnapshotDao.findByName(vmId, vmSnapshotName);
1836+
Long snapId = vmSnapshotVO != null ? vmSnapshotVO.getId() : null;
1837+
UsageVMSnapshotVO vsVO = new UsageVMSnapshotVO(volumeId, zoneId, accountId, domainId, vmId, offeringId, size,
1838+
created, null, vmSnapshotName, snapId);
18311839
_usageVMSnapshotDao.persist(vsVO);
18321840
}
18331841

@@ -1842,7 +1850,9 @@ private void createVmSnapshotOnPrimaryEvent(UsageEventVO event) {
18421850
Date created = event.getCreateDate();
18431851
Account acct = _accountDao.findByIdIncludingRemoved(event.getAccountId());
18441852
Long domainId = acct.getDomainId();
1845-
UsageSnapshotOnPrimaryVO vsVO = new UsageSnapshotOnPrimaryVO(vmId, zoneId, accountId, domainId, vmId, name, 0, virtualsize, physicalsize, created, null);
1853+
VMSnapshotVO vmSnapshotVO = vmSnapshotDao.findByName(vmId, name);
1854+
Long vmSnapId = vmSnapshotVO != null ? vmSnapshotVO.getId() : null;
1855+
UsageSnapshotOnPrimaryVO vsVO = new UsageSnapshotOnPrimaryVO(vmId, zoneId, accountId, domainId, vmId, name, 0, virtualsize, physicalsize, created, null, vmSnapId);
18461856
if (s_logger.isDebugEnabled()) {
18471857
s_logger.debug("createSnapshotOnPrimaryEvent UsageSnapshotOnPrimaryVO " + vsVO);
18481858
}

usage/src/main/java/com/cloud/usage/parser/VMSanpshotOnPrimaryParser.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -92,16 +92,17 @@ public static boolean parse(AccountVO account, Date startDate, Date endDate) {
9292
endDateEffective = usageRec.getDeleted();
9393
s_logger.debug("Remoevd vm snapshot found endDateEffective " + endDateEffective + " period end data " + endDate);
9494
}
95+
Long vmSnapshotId = usageRec.getVmSnapshotId();
9596
long duration = (endDateEffective.getTime() - created.getTime()) + 1;
9697
createUsageRecord(UsageTypes.VM_SNAPSHOT_ON_PRIMARY, duration, created, endDateEffective, account, usageRec.getId(), usageRec.getName(), usageRec.getZoneId(),
97-
usageRec.getVirtualSize(), usageRec.getPhysicalSize());
98+
usageRec.getVirtualSize(), usageRec.getPhysicalSize(), vmSnapshotId);
9899
}
99100

100101
return true;
101102
}
102103

103104
private static void createUsageRecord(int usageType, long runningTime, Date startDate, Date endDate, AccountVO account, long vmId, String name, long zoneId, long virtualSize,
104-
long physicalSize) {
105+
long physicalSize, Long vmSnapshotId) {
105106
// Our smallest increment is hourly for now
106107
if (s_logger.isDebugEnabled()) {
107108
s_logger.debug("Total running time " + runningTime + "ms");
@@ -113,16 +114,16 @@ private static void createUsageRecord(int usageType, long runningTime, Date star
113114
String usageDisplay = dFormat.format(usage);
114115

115116
if (s_logger.isDebugEnabled()) {
116-
s_logger.debug("Creating VMSnapshot On Primary usage record for vm: " + vmId + ", usage: " + usageDisplay + ", startDate: " + startDate + ", endDate: " + endDate
117+
s_logger.debug("Creating VMSnapshot Id=" + vmSnapshotId + " On Primary usage record for vm: " + vmId + ", usage: " + usageDisplay + ", startDate: " + startDate + ", endDate: " + endDate
117118
+ ", for account: " + account.getId());
118119
}
119120

120121
// Create the usage record
121-
String usageDesc = "VMSnapshot On Primary Usage: " + "VM Id: " + vmId;
122+
String usageDesc = "VMSnapshot On Primary Usage: VMSnapshot Id:" + vmSnapshotId + " VM Id: " + vmId;
122123
usageDesc += " Size: " + virtualSize;
123124

124125
UsageVO usageRecord = new UsageVO(zoneId, account.getId(), account.getDomainId(), usageDesc, usageDisplay + " Hrs", usageType, new Double(usage), vmId, name, null, null,
125-
vmId, physicalSize, virtualSize, startDate, endDate);
126+
vmSnapshotId, physicalSize, virtualSize, startDate, endDate);
126127
s_usageDao.persist(usageRecord);
127128
}
128129

0 commit comments

Comments
 (0)