CLOUDSTACK-4737: handling usage events for dynamic compute offering

Signed-off-by: Koushik Das <koushik@apache.org>
This commit is contained in:
Harikrishna Patnala 2013-11-26 14:52:19 +05:30 committed by Koushik Das
parent ef40e156ed
commit b2f0a0bce2
4 changed files with 111 additions and 9 deletions

View File

@ -16,12 +16,17 @@
// under the License. // under the License.
package com.cloud.event.dao; package com.cloud.event.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import javax.ejb.Local; import javax.ejb.Local;
import com.cloud.utils.exception.CloudRuntimeException;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -36,6 +41,8 @@ import com.cloud.utils.db.TransactionLegacy;
public class UsageEventDetailsDaoImpl extends GenericDaoBase<UsageEventDetailsVO, Long> implements UsageEventDetailsDao { public class UsageEventDetailsDaoImpl extends GenericDaoBase<UsageEventDetailsVO, Long> implements UsageEventDetailsDao {
public static final Logger s_logger = Logger.getLogger(UsageEventDetailsDaoImpl.class.getName()); public static final Logger s_logger = Logger.getLogger(UsageEventDetailsDaoImpl.class.getName());
private static final String EVENT_DETAILS_QUERY = "SELECT details.id, details.usage_event_id, details.name, details.value FROM `cloud`.`usage_event_details` details WHERE details.usage_event_id = ?";
protected final SearchBuilder<UsageEventDetailsVO> EventDetailsSearch; protected final SearchBuilder<UsageEventDetailsVO> EventDetailsSearch;
protected final SearchBuilder<UsageEventDetailsVO> DetailSearch; protected final SearchBuilder<UsageEventDetailsVO> DetailSearch;
@ -74,13 +81,38 @@ public class UsageEventDetailsDaoImpl extends GenericDaoBase<UsageEventDetailsVO
@Override @Override
public Map<String, String> findDetails(long eventId) { public Map<String, String> findDetails(long eventId) {
SearchCriteria<UsageEventDetailsVO> sc = EventDetailsSearch.create(); Connection conn = null;
sc.setParameters("eventId", eventId); PreparedStatement pstmt = null;
ResultSet resultSet = null;
Map<String, String> details = new HashMap<String, String>();
try {
conn = TransactionLegacy.getStandaloneConnection();
List<UsageEventDetailsVO> results = search(sc, null); pstmt = conn.prepareStatement(EVENT_DETAILS_QUERY);
Map<String, String> details = new HashMap<String, String>(results.size()); pstmt.setLong(1, eventId);
for (UsageEventDetailsVO result : results) { resultSet = pstmt.executeQuery();
details.put(result.getKey(), result.getValue());
while (resultSet.next()) {
details.put(resultSet.getString(3), resultSet.getString(4));
}
} catch (SQLException e) {
throw new CloudRuntimeException("Error while executing SQL prepared statement", e);
} catch (Throwable e) {
throw new CloudRuntimeException("Caught: " + e);
} finally {
if (pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
}
}
} }
return details; return details;

View File

@ -27,6 +27,10 @@ import javax.persistence.TemporalType;
@Entity @Entity
@Table(name = "usage_vm_instance") @Table(name = "usage_vm_instance")
public class UsageVMInstanceVO { public class UsageVMInstanceVO {
public enum DynamicParameters {
cpuSpeed, cpuNumber, memory
};
@Column(name = "usage_type") @Column(name = "usage_type")
private int usageType; private int usageType;
@ -45,6 +49,15 @@ public class UsageVMInstanceVO {
@Column(name = "service_offering_id") @Column(name = "service_offering_id")
private long serviceOfferingId; private long serviceOfferingId;
@Column(name="cpu_cores")
private Long cpuCores;
@Column(name="memory")
private Long memory;
@Column(name="cpu_speed")
private Long cpuSpeed;
@Column(name = "template_id") @Column(name = "template_id")
private long templateId; private long templateId;
@ -127,4 +140,28 @@ public class UsageVMInstanceVO {
public void setEndDate(Date endDate) { public void setEndDate(Date endDate) {
this.endDate = endDate; this.endDate = endDate;
} }
public Long getMemory() {
return memory;
}
public void setMemory(Long memory) {
this.memory = memory;
}
public Long getCpuCores() {
return cpuCores;
}
public void setCpuCores(Long cpuCores) {
this.cpuCores = cpuCores;
}
public Long getCpuSpeed() {
return cpuSpeed;
}
public void setCpuSpeed(Long cpuSpeed) {
this.cpuSpeed = cpuSpeed;
}
} }

View File

@ -755,6 +755,9 @@ CREATE VIEW `cloud`.`domain_router_view` AS
INSERT IGNORE INTO `cloud`.`configuration` VALUES ("Advanced", 'DEFAULT', 'management-server', "vmware.vcenter.session.timeout", "1200", "VMware client timeout in seconds", "1200", NULL,NULL,0); INSERT IGNORE INTO `cloud`.`configuration` VALUES ("Advanced", 'DEFAULT', 'management-server', "vmware.vcenter.session.timeout", "1200", "VMware client timeout in seconds", "1200", NULL,NULL,0);
INSERT IGNORE INTO `cloud`.`configuration` VALUES ("Advanced", 'DEFAULT', 'management-server', "mgt.server.vendor", "ACS", "the vendor of management server", "ACS", NULL,NULL,0); INSERT IGNORE INTO `cloud`.`configuration` VALUES ("Advanced", 'DEFAULT', 'management-server', "mgt.server.vendor", "ACS", "the vendor of management server", "ACS", NULL,NULL,0);
ALTER TABLE `cloud_usage`.`usage_vm_instance` ADD COLUMN `cpu_speed` INT(10) UNSIGNED NULL COMMENT 'speed per core in Mhz',
ADD COLUMN `cpu_cores` INT(10) UNSIGNED NULL COMMENT 'number of cpu cores',
ADD COLUMN `memory` INT(10) UNSIGNED NULL COMMENT 'memory in MB';
CREATE TABLE `cloud`.`vpc_details` ( CREATE TABLE `cloud`.`vpc_details` (
`id` bigint unsigned NOT NULL auto_increment, `id` bigint unsigned NOT NULL auto_increment,

View File

@ -85,6 +85,7 @@ import com.cloud.utils.db.Filter;
import com.cloud.utils.db.GlobalLock; import com.cloud.utils.db.GlobalLock;
import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.TransactionLegacy; import com.cloud.utils.db.TransactionLegacy;
import com.cloud.event.dao.UsageEventDetailsDao;
@Component @Component
@Local(value = {UsageManager.class}) @Local(value = {UsageManager.class})
@ -137,6 +138,8 @@ public class UsageManagerImpl extends ManagerBase implements UsageManager, Runna
@Inject @Inject
protected UsageEventDao _usageEventDao; protected UsageEventDao _usageEventDao;
@Inject @Inject
protected UsageEventDetailsDao _usageEventDetailsDao;
@Inject
ConfigurationDao _configDao; ConfigurationDao _configDao;
@Inject @Inject
private UsageVMSnapshotDao m_usageVMSnapshotDao; private UsageVMSnapshotDao m_usageVMSnapshotDao;
@ -1102,10 +1105,37 @@ public class UsageManagerImpl extends ManagerBase implements UsageManager, Runna
try { try {
Long templateId = event.getTemplateId(); Long templateId = event.getTemplateId();
String hypervisorType = event.getResourceType(); String hypervisorType = event.getResourceType();
Long cpuCores= null;
Long memory = null;
Long cpuSpeed = null;
//populate the cpu, memory and cpuSpeed of the vm when created from a dynamic offering.
Map<String, String> usageDetails = _usageEventDetailsDao.findDetails(event.getId());
if (usageDetails != null && usageDetails.size() != 0) {
if (usageDetails.get(UsageVMInstanceVO.DynamicParameters.cpuNumber.name()) != null) {
cpuCores = Long.parseLong(usageDetails.get(UsageVMInstanceVO.DynamicParameters.cpuNumber.name()));
}
if (usageDetails.get(UsageVMInstanceVO.DynamicParameters.cpuSpeed.name()) != null) {
cpuSpeed = Long.parseLong(usageDetails.get(UsageVMInstanceVO.DynamicParameters.cpuSpeed.name()));
}
if (usageDetails.get(UsageVMInstanceVO.DynamicParameters.memory.name()) != null) {
memory = Long.parseLong(usageDetails.get(UsageVMInstanceVO.DynamicParameters.memory.name()));
}
}
// add this VM to the usage helper table // add this VM to the usage helper table
UsageVMInstanceVO usageInstanceNew = UsageVMInstanceVO usageInstanceNew = new UsageVMInstanceVO(UsageTypes.ALLOCATED_VM, zoneId, event.getAccountId(), vmId, vmName,
new UsageVMInstanceVO(UsageTypes.ALLOCATED_VM, zoneId, event.getAccountId(), vmId, vmName, soId, templateId, hypervisorType, event.getCreateDate(), soId, templateId, hypervisorType, event.getCreateDate(), null);
null); if (cpuCores != null) {
usageInstanceNew.setCpuCores(cpuCores);
}
if (cpuSpeed != null) {
usageInstanceNew.setCpuSpeed(cpuSpeed);
}
if (memory != null) {
usageInstanceNew.setMemory(memory);
}
m_usageInstanceDao.persist(usageInstanceNew); m_usageInstanceDao.persist(usageInstanceNew);
} catch (Exception ex) { } catch (Exception ex) {
s_logger.error("Error saving usage instance for vm: " + vmId, ex); s_logger.error("Error saving usage instance for vm: " + vmId, ex);