diff --git a/usage/src/com/cloud/usage/UsageAlertManagerImpl.java b/usage/src/com/cloud/usage/UsageAlertManagerImpl.java
index 0fe8dc83e83..1a7f62c0b20 100644
--- a/usage/src/com/cloud/usage/UsageAlertManagerImpl.java
+++ b/usage/src/com/cloud/usage/UsageAlertManagerImpl.java
@@ -1,37 +1,51 @@
-/**
- * * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved
-*
- *
- */
-
+
+/**
+ * * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved
+*
+ *
+ * This software is licensed under the GNU General Public License v3 or later.
+ *
+ * It is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
package com.cloud.usage;
-import java.io.UnsupportedEncodingException;
-import java.util.Date;
-import java.util.Map;
-import java.util.Properties;
-
-import javax.ejb.Local;
-import javax.mail.Authenticator;
-import javax.mail.MessagingException;
-import javax.mail.PasswordAuthentication;
-import javax.mail.Session;
-import javax.mail.URLName;
-import javax.mail.Message.RecipientType;
-import javax.mail.internet.InternetAddress;
-import javax.naming.ConfigurationException;
-
-import org.apache.log4j.Logger;
-
-import com.cloud.alert.AlertManager;
-import com.cloud.alert.AlertVO;
-import com.cloud.alert.dao.AlertDao;
-import com.cloud.configuration.dao.ConfigurationDao;
-import com.cloud.utils.NumbersUtil;
-import com.cloud.utils.component.ComponentLocator;
-import com.sun.mail.smtp.SMTPMessage;
-import com.sun.mail.smtp.SMTPSSLTransport;
-import com.sun.mail.smtp.SMTPTransport;
+import java.io.UnsupportedEncodingException;
+import java.util.Date;
+import java.util.Map;
+import java.util.Properties;
+
+import javax.ejb.Local;
+import javax.mail.Authenticator;
+import javax.mail.MessagingException;
+import javax.mail.PasswordAuthentication;
+import javax.mail.Session;
+import javax.mail.URLName;
+import javax.mail.Message.RecipientType;
+import javax.mail.internet.InternetAddress;
+import javax.naming.ConfigurationException;
+
+import org.apache.log4j.Logger;
+
+import com.cloud.alert.AlertManager;
+import com.cloud.alert.AlertVO;
+import com.cloud.alert.dao.AlertDao;
+import com.cloud.configuration.dao.ConfigurationDao;
+import com.cloud.utils.NumbersUtil;
+import com.cloud.utils.component.ComponentLocator;
+import com.sun.mail.smtp.SMTPMessage;
+import com.sun.mail.smtp.SMTPSSLTransport;
+import com.sun.mail.smtp.SMTPTransport;
@Local(value={AlertManager.class})
public class UsageAlertManagerImpl implements AlertManager {
@@ -188,7 +202,7 @@ public class UsageAlertManagerImpl implements AlertManager {
// TODO: make sure this handles SSL transport (useAuth is true) and regular
public void sendAlert(short alertType, long dataCenterId, Long podId, String subject, String content) throws MessagingException, UnsupportedEncodingException {
- AlertVO alert = null;
+ AlertVO alert = null;
if ((alertType != AlertManager.ALERT_TYPE_HOST) &&
(alertType != AlertManager.ALERT_TYPE_USERVM) &&
@@ -252,9 +266,9 @@ public class UsageAlertManagerImpl implements AlertManager {
}
}
- @Override
- public void recalculateCapacity() {
- // TODO Auto-generated method stub
-
+ @Override
+ public void recalculateCapacity() {
+ // TODO Auto-generated method stub
+
}
}
diff --git a/usage/src/com/cloud/usage/UsageManager.java b/usage/src/com/cloud/usage/UsageManager.java
index 42b583975ef..ca12bbef48f 100644
--- a/usage/src/com/cloud/usage/UsageManager.java
+++ b/usage/src/com/cloud/usage/UsageManager.java
@@ -1,9 +1,23 @@
-/**
- * * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved
-*
- *
- */
-
+
+/**
+ * * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved
+*
+ *
+ * This software is licensed under the GNU General Public License v3 or later.
+ *
+ * It is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
package com.cloud.usage;
import com.cloud.usage.UsageJobVO;
diff --git a/usage/src/com/cloud/usage/UsageManagerImpl.java b/usage/src/com/cloud/usage/UsageManagerImpl.java
index 9b82a3c86e3..684cbd07730 100644
--- a/usage/src/com/cloud/usage/UsageManagerImpl.java
+++ b/usage/src/com/cloud/usage/UsageManagerImpl.java
@@ -1,13 +1,27 @@
-/**
- * * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved
-*
- *
- */
-
+
+/**
+ * * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved
+*
+ *
+ * This software is licensed under the GNU General Public License v3 or later.
+ *
+ * It is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
package com.cloud.usage;
import java.net.InetAddress;
-import java.sql.SQLException;
+import java.sql.SQLException;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
@@ -39,7 +53,7 @@ import com.cloud.usage.dao.UsagePortForwardingRuleDao;
import com.cloud.usage.dao.UsageStorageDao;
import com.cloud.usage.dao.UsageVMInstanceDao;
import com.cloud.usage.dao.UsageVolumeDao;
-import com.cloud.usage.parser.IPAddressUsageParser;
+import com.cloud.usage.parser.IPAddressUsageParser;
import com.cloud.usage.parser.LoadBalancerUsageParser;
import com.cloud.usage.parser.NetworkOfferingUsageParser;
import com.cloud.usage.parser.NetworkUsageParser;
@@ -94,7 +108,7 @@ public class UsageManagerImpl implements UsageManager, Runnable {
private String m_version = null;
private String m_name = null;
private final Calendar m_jobExecTime = Calendar.getInstance();
- private int m_aggregationDuration = 0;
+ private int m_aggregationDuration = 0;
private int m_sanityCheckInterval = 0;
String m_hostname = null;
int m_pid = 0;
@@ -102,10 +116,10 @@ public class UsageManagerImpl implements UsageManager, Runnable {
private final GlobalLock m_heartbeatLock = GlobalLock.getInternLock("usage.job.heartbeat.check");
private final ScheduledExecutorService m_executor = Executors.newSingleThreadScheduledExecutor(new NamedThreadFactory("Usage-Job"));
- private final ScheduledExecutorService m_heartbeatExecutor = Executors.newSingleThreadScheduledExecutor(new NamedThreadFactory("Usage-HB"));
+ private final ScheduledExecutorService m_heartbeatExecutor = Executors.newSingleThreadScheduledExecutor(new NamedThreadFactory("Usage-HB"));
private final ScheduledExecutorService m_sanityExecutor = Executors.newSingleThreadScheduledExecutor(new NamedThreadFactory("Usage-Sanity"));
private Future m_scheduledFuture = null;
- private Future m_heartbeat = null;
+ private Future m_heartbeat = null;
private Future m_sanity = null;
protected UsageManagerImpl() {
@@ -151,15 +165,15 @@ public class UsageManagerImpl implements UsageManager, Runnable {
String execTime = configs.get("usage.stats.job.exec.time");
String aggregationRange = configs.get("usage.stats.job.aggregation.range");
- String execTimeZone = configs.get("usage.execution.timezone");
- String aggreagationTimeZone = configs.get("usage.aggregation.timezone");
- String sanityCheckInterval = configs.get("usage.sanity.check.interval");
- if(sanityCheckInterval != null){
- m_sanityCheckInterval = Integer.parseInt(sanityCheckInterval);
+ String execTimeZone = configs.get("usage.execution.timezone");
+ String aggreagationTimeZone = configs.get("usage.aggregation.timezone");
+ String sanityCheckInterval = configs.get("usage.sanity.check.interval");
+ if(sanityCheckInterval != null){
+ m_sanityCheckInterval = Integer.parseInt(sanityCheckInterval);
}
m_usageTimezone = TimeZone.getTimeZone(aggreagationTimeZone);
- s_logger.debug("Usage stats aggregation time zone: "+aggreagationTimeZone);
+ s_logger.debug("Usage stats aggregation time zone: "+aggreagationTimeZone);
try {
if ((execTime == null) || (aggregationRange == null)) {
@@ -221,10 +235,10 @@ public class UsageManagerImpl implements UsageManager, Runnable {
// use the configured exec time and aggregation duration for scheduling the job
m_scheduledFuture = m_executor.scheduleAtFixedRate(this, m_jobExecTime.getTimeInMillis() - System.currentTimeMillis(), m_aggregationDuration * 60 * 1000, TimeUnit.MILLISECONDS);
- m_heartbeat = m_heartbeatExecutor.scheduleAtFixedRate(new Heartbeat(), /* start in 15 seconds...*/15*1000, /* check database every minute*/60*1000, TimeUnit.MILLISECONDS);
-
- if(m_sanityCheckInterval > 0){
- m_sanity = m_sanityExecutor.scheduleAtFixedRate(new SanityCheck(), 1, m_sanityCheckInterval, TimeUnit.DAYS);
+ m_heartbeat = m_heartbeatExecutor.scheduleAtFixedRate(new Heartbeat(), /* start in 15 seconds...*/15*1000, /* check database every minute*/60*1000, TimeUnit.MILLISECONDS);
+
+ if(m_sanityCheckInterval > 0){
+ m_sanity = m_sanityExecutor.scheduleAtFixedRate(new SanityCheck(), 1, m_sanityCheckInterval, TimeUnit.DAYS);
}
Transaction usageTxn = Transaction.open(Transaction.USAGE_DB);
@@ -251,7 +265,7 @@ public class UsageManagerImpl implements UsageManager, Runnable {
public boolean stop() {
m_heartbeat.cancel(true);
- m_scheduledFuture.cancel(true);
+ m_scheduledFuture.cancel(true);
m_sanity.cancel(true);
return true;
}
@@ -469,13 +483,13 @@ public class UsageManagerImpl implements UsageManager, Runnable {
} finally {
userTxn.close();
}
-
- // TODO: Fetch a maximum number of events and process them before moving on to the next range of events
-
- // - get a list of the latest events
- // - insert the latest events into the usage.events table
- List events = _usageEventDao.getRecentEvents(new Date(endDateMillis));
-
+
+ // TODO: Fetch a maximum number of events and process them before moving on to the next range of events
+
+ // - get a list of the latest events
+ // - insert the latest events into the usage.events table
+ List events = _usageEventDao.getRecentEvents(new Date(endDateMillis));
+
Transaction usageTxn = Transaction.open(Transaction.USAGE_DB);
try {
@@ -726,13 +740,13 @@ public class UsageManagerImpl implements UsageManager, Runnable {
if (!parsed) {
s_logger.debug("network offering usage successfully parsed? " + parsed + " (for account: " + account.getAccountName() + ", id: " + account.getId() + ")");
}
- }
-
- parsed = IPAddressUsageParser.parse(account, currentStartDate, currentEndDate);
- if (s_logger.isDebugEnabled()) {
- if (!parsed) {
- s_logger.debug("IPAddress usage successfully parsed? " + parsed + " (for account: " + account.getAccountName() + ", id: " + account.getId() + ")");
- }
+ }
+
+ parsed = IPAddressUsageParser.parse(account, currentStartDate, currentEndDate);
+ if (s_logger.isDebugEnabled()) {
+ if (!parsed) {
+ s_logger.debug("IPAddress usage successfully parsed? " + parsed + " (for account: " + account.getAccountName() + ", id: " + account.getId() + ")");
+ }
}
return parsed;
@@ -841,16 +855,16 @@ public class UsageManagerImpl implements UsageManager, Runnable {
usageInstance.setEndDate(event.getCreateDate());
m_usageInstanceDao.update(usageInstance);
}
- }
- }
-
- sc = m_usageInstanceDao.createSearchCriteria();
- sc.addAnd("vmInstanceId", SearchCriteria.Op.EQ, Long.valueOf(vmId));
- sc.addAnd("endDate", SearchCriteria.Op.NULL);
- sc.addAnd("usageType", SearchCriteria.Op.EQ, UsageTypes.ALLOCATED_VM);
- usageInstances = m_usageInstanceDao.search(sc, null);
- if (usageInstances == null || (usageInstances.size() == 0)) {
- s_logger.error("Cannot find allocated vm entry for a vm running with id: " + vmId);
+ }
+ }
+
+ sc = m_usageInstanceDao.createSearchCriteria();
+ sc.addAnd("vmInstanceId", SearchCriteria.Op.EQ, Long.valueOf(vmId));
+ sc.addAnd("endDate", SearchCriteria.Op.NULL);
+ sc.addAnd("usageType", SearchCriteria.Op.EQ, UsageTypes.ALLOCATED_VM);
+ usageInstances = m_usageInstanceDao.search(sc, null);
+ if (usageInstances == null || (usageInstances.size() == 0)) {
+ s_logger.error("Cannot find allocated vm entry for a vm running with id: " + vmId);
}
Long templateId = event.getTemplateId();
@@ -1021,22 +1035,22 @@ public class UsageManagerImpl implements UsageManager, Runnable {
size = event.getSize();
}
- if (EventTypes.EVENT_VOLUME_CREATE.equals(event.getType())) {
- SearchCriteria sc = m_usageVolumeDao.createSearchCriteria();
- sc.addAnd("accountId", SearchCriteria.Op.EQ, event.getAccountId());
- sc.addAnd("id", SearchCriteria.Op.EQ, volId);
- sc.addAnd("deleted", SearchCriteria.Op.NULL);
- List volumesVOs = m_usageVolumeDao.search(sc, null);
- if (volumesVOs.size() > 0) {
- //This is a safeguard to avoid double counting of volumes.
- s_logger.error("Found duplicate usage entry for volume: " + volId + " assigned to account: " + event.getAccountId() + "; marking as deleted...");
- }
- for (UsageVolumeVO volumesVO : volumesVOs) {
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("deleting volume: " + volumesVO.getId() + " from account: " + volumesVO.getAccountId());
- }
- volumesVO.setDeleted(event.getCreateDate());
- m_usageVolumeDao.update(volumesVO);
+ if (EventTypes.EVENT_VOLUME_CREATE.equals(event.getType())) {
+ SearchCriteria sc = m_usageVolumeDao.createSearchCriteria();
+ sc.addAnd("accountId", SearchCriteria.Op.EQ, event.getAccountId());
+ sc.addAnd("id", SearchCriteria.Op.EQ, volId);
+ sc.addAnd("deleted", SearchCriteria.Op.NULL);
+ List volumesVOs = m_usageVolumeDao.search(sc, null);
+ if (volumesVOs.size() > 0) {
+ //This is a safeguard to avoid double counting of volumes.
+ s_logger.error("Found duplicate usage entry for volume: " + volId + " assigned to account: " + event.getAccountId() + "; marking as deleted...");
+ }
+ for (UsageVolumeVO volumesVO : volumesVOs) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("deleting volume: " + volumesVO.getId() + " from account: " + volumesVO.getAccountId());
+ }
+ volumesVO.setDeleted(event.getCreateDate());
+ m_usageVolumeDao.update(volumesVO);
}
if (s_logger.isDebugEnabled()) {
s_logger.debug("create volume with id : " + volId + " for account: " + event.getAccountId());
@@ -1391,21 +1405,21 @@ public class UsageManagerImpl implements UsageManager, Runnable {
sc.addAnd("scheduled", SearchCriteria.Op.EQ, Integer.valueOf(0));
m_usageJobDao.expunge(sc);
}
- }
-
- private class SanityCheck implements Runnable {
- public void run() {
- UsageSanityChecker usc = new UsageSanityChecker();
- try {
- String errors = usc.runSanityCheck();
- if(errors.length() > 0){
- _alertMgr.sendAlert(AlertManager.ALERT_TYPE_USAGE_SANITY_RESULT, 0, new Long(0), "Usage Sanity Check failed", errors);
- } else {
- _alertMgr.clearAlert(AlertManager.ALERT_TYPE_USAGE_SANITY_RESULT, 0, 0);
- }
- } catch (SQLException e) {
- s_logger.error("Error in sanity check", e);
- }
- }
+ }
+
+ private class SanityCheck implements Runnable {
+ public void run() {
+ UsageSanityChecker usc = new UsageSanityChecker();
+ try {
+ String errors = usc.runSanityCheck();
+ if(errors.length() > 0){
+ _alertMgr.sendAlert(AlertManager.ALERT_TYPE_USAGE_SANITY_RESULT, 0, new Long(0), "Usage Sanity Check failed", errors);
+ } else {
+ _alertMgr.clearAlert(AlertManager.ALERT_TYPE_USAGE_SANITY_RESULT, 0, 0);
+ }
+ } catch (SQLException e) {
+ s_logger.error("Error in sanity check", e);
+ }
+ }
}
}
diff --git a/usage/src/com/cloud/usage/UsageSanityChecker.java b/usage/src/com/cloud/usage/UsageSanityChecker.java
index ef47de6465c..8d45a0cdc3c 100644
--- a/usage/src/com/cloud/usage/UsageSanityChecker.java
+++ b/usage/src/com/cloud/usage/UsageSanityChecker.java
@@ -1,7 +1,21 @@
+
/**
* * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved
*
- *
+ *
+ * This software is licensed under the GNU General Public License v3 or later.
+ *
+ * It is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
*/
package com.cloud.usage;
diff --git a/usage/src/com/cloud/usage/UsageServer.java b/usage/src/com/cloud/usage/UsageServer.java
index 83876d89959..cc0fa116cef 100644
--- a/usage/src/com/cloud/usage/UsageServer.java
+++ b/usage/src/com/cloud/usage/UsageServer.java
@@ -1,9 +1,23 @@
-/**
- * * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved
-*
- *
- */
-
+
+/**
+ * * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved
+*
+ *
+ * This software is licensed under the GNU General Public License v3 or later.
+ *
+ * It is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
package com.cloud.usage;
import org.apache.log4j.Logger;
diff --git a/usage/src/com/cloud/usage/parser/IPAddressUsageParser.java b/usage/src/com/cloud/usage/parser/IPAddressUsageParser.java
index 892117a7b97..02e39f3c621 100644
--- a/usage/src/com/cloud/usage/parser/IPAddressUsageParser.java
+++ b/usage/src/com/cloud/usage/parser/IPAddressUsageParser.java
@@ -1,16 +1,30 @@
-/**
- * * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved
-*
- *
- */
-
+
+/**
+ * * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved
+*
+ *
+ * This software is licensed under the GNU General Public License v3 or later.
+ *
+ * It is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
package com.cloud.usage.parser;
-import java.text.DecimalFormat;
+import java.text.DecimalFormat;
import java.util.Date;
-import java.util.HashMap;
+import java.util.HashMap;
import java.util.List;
-import java.util.Map;
+import java.util.Map;
import org.apache.log4j.Logger;
@@ -21,7 +35,7 @@ import com.cloud.usage.UsageVO;
import com.cloud.usage.dao.UsageDao;
import com.cloud.usage.dao.UsageIPAddressDao;
import com.cloud.user.AccountVO;
-import com.cloud.utils.Pair;
+import com.cloud.utils.Pair;
import com.cloud.utils.component.ComponentLocator;
public class IPAddressUsageParser {
@@ -30,136 +44,136 @@ public class IPAddressUsageParser {
private static ComponentLocator _locator = ComponentLocator.getLocator(UsageServer.Name, "usage-components.xml", "log4j-cloud_usage");
private static UsageDao m_usageDao = _locator.getDao(UsageDao.class);
private static UsageIPAddressDao m_usageIPAddressDao = _locator.getDao(UsageIPAddressDao.class);
-
-
- public static boolean parse(AccountVO account, Date startDate, Date endDate) {
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Parsing IP Address usage for account: " + account.getId());
- }
- if ((endDate == null) || endDate.after(new Date())) {
- endDate = new Date();
- }
-
- // - query usage_ip_address table with the following criteria:
- // - look for an entry for accountId with start date in the given range
- // - look for an entry for accountId with end date in the given range
- // - look for an entry for accountId with end date null (currently running vm or owned IP)
- // - look for an entry for accountId with start date before given range *and* end date after given range
- List usageIPAddress = m_usageIPAddressDao.getUsageRecords(account.getId(), account.getDomainId(), startDate, endDate);
-
- if(usageIPAddress.isEmpty()){
- s_logger.debug("No IP Address usage for this period");
- return true;
- }
-
- // This map has both the running time *and* the usage amount.
- Map> usageMap = new HashMap>();
-
- Map IPMap = new HashMap();
-
- // loop through all the usage IPs, create a usage record for each
- for (UsageIPAddressVO usageIp : usageIPAddress) {
- long IpId = usageIp.getId();
-
- String key = ""+IpId;
-
- // store the info in the IP map
- IPMap.put(key, new IpInfo(usageIp.getZoneId(), IpId, usageIp.getAddress(), usageIp.isSourceNat()));
-
- Date IpAssignDate = usageIp.getAssigned();
- Date IpReleaseDeleteDate = usageIp.getReleased();
-
- if ((IpReleaseDeleteDate == null) || IpReleaseDeleteDate.after(endDate)) {
- IpReleaseDeleteDate = endDate;
- }
-
- // clip the start date to the beginning of our aggregation range if the vm has been running for a while
- if (IpAssignDate.before(startDate)) {
- IpAssignDate = startDate;
- }
-
- long currentDuration = (IpReleaseDeleteDate.getTime() - IpAssignDate.getTime()) + 1; // make sure this is an inclusive check for milliseconds (i.e. use n - m + 1 to find total number of millis to charge)
-
- updateIpUsageData(usageMap, key, usageIp.getId(), currentDuration);
- }
-
- for (String ipIdKey : usageMap.keySet()) {
- Pair ipTimeInfo = usageMap.get(ipIdKey);
- long useTime = ipTimeInfo.second().longValue();
-
- // Only create a usage record if we have a runningTime of bigger than zero.
- if (useTime > 0L) {
- IpInfo info = IPMap.get(ipIdKey);
- createUsageRecord(info.getZoneId(), useTime, startDate, endDate, account, info.getIpId(), info.getIPAddress(), info.isSourceNat());
- }
- }
-
- return true;
- }
-
- private static void updateIpUsageData(Map> usageDataMap, String key, long ipId, long duration) {
- Pair ipUsageInfo = usageDataMap.get(key);
- if (ipUsageInfo == null) {
- ipUsageInfo = new Pair(new Long(ipId), new Long(duration));
- } else {
- Long runningTime = ipUsageInfo.second();
- runningTime = new Long(runningTime.longValue() + duration);
- ipUsageInfo = new Pair(ipUsageInfo.first(), runningTime);
- }
- usageDataMap.put(key, ipUsageInfo);
- }
-
- private static void createUsageRecord(long zoneId, long runningTime, Date startDate, Date endDate, AccountVO account, long IpId, String IPAddress, boolean isSourceNat) {
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Total usage time " + runningTime + "ms");
- }
-
- float usage = runningTime / 1000f / 60f / 60f;
-
- DecimalFormat dFormat = new DecimalFormat("#.######");
- String usageDisplay = dFormat.format(usage);
-
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Creating IP usage record with id: " + IpId + ", usage: " + usageDisplay + ", startDate: " + startDate + ", endDate: " + endDate + ", for account: " + account.getId());
- }
-
- String usageDesc = "IPAddress: "+IPAddress;
-
- // Create the usage record
-
- UsageVO usageRecord = new UsageVO(zoneId, account.getAccountId(), account.getDomainId(), usageDesc, usageDisplay + " Hrs",
- UsageTypes.IP_ADDRESS, new Double(usage), null, null, null, null, IpId, startDate, endDate, (isSourceNat?"SourceNat":""));
- m_usageDao.persist(usageRecord);
- }
-
- private static class IpInfo {
- private long zoneId;
- private long IpId;
- private String IPAddress;
- private boolean isSourceNat;
-
- public IpInfo(long zoneId,long IpId, String IPAddress, boolean isSourceNat) {
- this.zoneId = zoneId;
- this.IpId = IpId;
- this.IPAddress = IPAddress;
- this.isSourceNat = isSourceNat;
- }
-
- public long getZoneId() {
- return zoneId;
- }
-
- public long getIpId() {
- return IpId;
- }
-
- public String getIPAddress() {
- return IPAddress;
- }
-
- public boolean isSourceNat() {
- return isSourceNat;
- }
- }
+
+
+ public static boolean parse(AccountVO account, Date startDate, Date endDate) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Parsing IP Address usage for account: " + account.getId());
+ }
+ if ((endDate == null) || endDate.after(new Date())) {
+ endDate = new Date();
+ }
+
+ // - query usage_ip_address table with the following criteria:
+ // - look for an entry for accountId with start date in the given range
+ // - look for an entry for accountId with end date in the given range
+ // - look for an entry for accountId with end date null (currently running vm or owned IP)
+ // - look for an entry for accountId with start date before given range *and* end date after given range
+ List usageIPAddress = m_usageIPAddressDao.getUsageRecords(account.getId(), account.getDomainId(), startDate, endDate);
+
+ if(usageIPAddress.isEmpty()){
+ s_logger.debug("No IP Address usage for this period");
+ return true;
+ }
+
+ // This map has both the running time *and* the usage amount.
+ Map> usageMap = new HashMap>();
+
+ Map IPMap = new HashMap();
+
+ // loop through all the usage IPs, create a usage record for each
+ for (UsageIPAddressVO usageIp : usageIPAddress) {
+ long IpId = usageIp.getId();
+
+ String key = ""+IpId;
+
+ // store the info in the IP map
+ IPMap.put(key, new IpInfo(usageIp.getZoneId(), IpId, usageIp.getAddress(), usageIp.isSourceNat()));
+
+ Date IpAssignDate = usageIp.getAssigned();
+ Date IpReleaseDeleteDate = usageIp.getReleased();
+
+ if ((IpReleaseDeleteDate == null) || IpReleaseDeleteDate.after(endDate)) {
+ IpReleaseDeleteDate = endDate;
+ }
+
+ // clip the start date to the beginning of our aggregation range if the vm has been running for a while
+ if (IpAssignDate.before(startDate)) {
+ IpAssignDate = startDate;
+ }
+
+ long currentDuration = (IpReleaseDeleteDate.getTime() - IpAssignDate.getTime()) + 1; // make sure this is an inclusive check for milliseconds (i.e. use n - m + 1 to find total number of millis to charge)
+
+ updateIpUsageData(usageMap, key, usageIp.getId(), currentDuration);
+ }
+
+ for (String ipIdKey : usageMap.keySet()) {
+ Pair ipTimeInfo = usageMap.get(ipIdKey);
+ long useTime = ipTimeInfo.second().longValue();
+
+ // Only create a usage record if we have a runningTime of bigger than zero.
+ if (useTime > 0L) {
+ IpInfo info = IPMap.get(ipIdKey);
+ createUsageRecord(info.getZoneId(), useTime, startDate, endDate, account, info.getIpId(), info.getIPAddress(), info.isSourceNat());
+ }
+ }
+
+ return true;
+ }
+
+ private static void updateIpUsageData(Map> usageDataMap, String key, long ipId, long duration) {
+ Pair ipUsageInfo = usageDataMap.get(key);
+ if (ipUsageInfo == null) {
+ ipUsageInfo = new Pair(new Long(ipId), new Long(duration));
+ } else {
+ Long runningTime = ipUsageInfo.second();
+ runningTime = new Long(runningTime.longValue() + duration);
+ ipUsageInfo = new Pair(ipUsageInfo.first(), runningTime);
+ }
+ usageDataMap.put(key, ipUsageInfo);
+ }
+
+ private static void createUsageRecord(long zoneId, long runningTime, Date startDate, Date endDate, AccountVO account, long IpId, String IPAddress, boolean isSourceNat) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Total usage time " + runningTime + "ms");
+ }
+
+ float usage = runningTime / 1000f / 60f / 60f;
+
+ DecimalFormat dFormat = new DecimalFormat("#.######");
+ String usageDisplay = dFormat.format(usage);
+
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Creating IP usage record with id: " + IpId + ", usage: " + usageDisplay + ", startDate: " + startDate + ", endDate: " + endDate + ", for account: " + account.getId());
+ }
+
+ String usageDesc = "IPAddress: "+IPAddress;
+
+ // Create the usage record
+
+ UsageVO usageRecord = new UsageVO(zoneId, account.getAccountId(), account.getDomainId(), usageDesc, usageDisplay + " Hrs",
+ UsageTypes.IP_ADDRESS, new Double(usage), null, null, null, null, IpId, startDate, endDate, (isSourceNat?"SourceNat":""));
+ m_usageDao.persist(usageRecord);
+ }
+
+ private static class IpInfo {
+ private long zoneId;
+ private long IpId;
+ private String IPAddress;
+ private boolean isSourceNat;
+
+ public IpInfo(long zoneId,long IpId, String IPAddress, boolean isSourceNat) {
+ this.zoneId = zoneId;
+ this.IpId = IpId;
+ this.IPAddress = IPAddress;
+ this.isSourceNat = isSourceNat;
+ }
+
+ public long getZoneId() {
+ return zoneId;
+ }
+
+ public long getIpId() {
+ return IpId;
+ }
+
+ public String getIPAddress() {
+ return IPAddress;
+ }
+
+ public boolean isSourceNat() {
+ return isSourceNat;
+ }
+ }
}
diff --git a/usage/src/com/cloud/usage/parser/LoadBalancerUsageParser.java b/usage/src/com/cloud/usage/parser/LoadBalancerUsageParser.java
index 504c999f046..7cdb8630e32 100644
--- a/usage/src/com/cloud/usage/parser/LoadBalancerUsageParser.java
+++ b/usage/src/com/cloud/usage/parser/LoadBalancerUsageParser.java
@@ -1,8 +1,23 @@
-/**
- * * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved
- *
- */
-
+
+/**
+ * * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved
+*
+ *
+ * This software is licensed under the GNU General Public License v3 or later.
+ *
+ * It is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
package com.cloud.usage.parser;
import java.text.DecimalFormat;
diff --git a/usage/src/com/cloud/usage/parser/NetworkOfferingUsageParser.java b/usage/src/com/cloud/usage/parser/NetworkOfferingUsageParser.java
index 0128c0b0501..b9321273799 100644
--- a/usage/src/com/cloud/usage/parser/NetworkOfferingUsageParser.java
+++ b/usage/src/com/cloud/usage/parser/NetworkOfferingUsageParser.java
@@ -1,8 +1,23 @@
-/**
- * * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved
- *
- */
-
+
+/**
+ * * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved
+*
+ *
+ * This software is licensed under the GNU General Public License v3 or later.
+ *
+ * It is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
package com.cloud.usage.parser;
import java.text.DecimalFormat;
diff --git a/usage/src/com/cloud/usage/parser/NetworkUsageParser.java b/usage/src/com/cloud/usage/parser/NetworkUsageParser.java
index 24b7e0145c2..212a265d425 100644
--- a/usage/src/com/cloud/usage/parser/NetworkUsageParser.java
+++ b/usage/src/com/cloud/usage/parser/NetworkUsageParser.java
@@ -1,8 +1,23 @@
-/**
- * * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved
- *
- */
-
+
+/**
+ * * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved
+*
+ *
+ * This software is licensed under the GNU General Public License v3 or later.
+ *
+ * It is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
package com.cloud.usage.parser;
import java.util.Date;
diff --git a/usage/src/com/cloud/usage/parser/PortForwardingUsageParser.java b/usage/src/com/cloud/usage/parser/PortForwardingUsageParser.java
index c098786e474..5a78fd901bc 100644
--- a/usage/src/com/cloud/usage/parser/PortForwardingUsageParser.java
+++ b/usage/src/com/cloud/usage/parser/PortForwardingUsageParser.java
@@ -1,8 +1,23 @@
-/**
- * * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved
- *
- */
-
+
+/**
+ * * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved
+*
+ *
+ * This software is licensed under the GNU General Public License v3 or later.
+ *
+ * It is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
package com.cloud.usage.parser;
import java.text.DecimalFormat;
diff --git a/usage/src/com/cloud/usage/parser/StorageUsageParser.java b/usage/src/com/cloud/usage/parser/StorageUsageParser.java
index 0d4c7f5e99f..1dbf0be8cb1 100644
--- a/usage/src/com/cloud/usage/parser/StorageUsageParser.java
+++ b/usage/src/com/cloud/usage/parser/StorageUsageParser.java
@@ -1,8 +1,23 @@
-/**
- * * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved
- *
- */
-
+
+/**
+ * * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved
+*
+ *
+ * This software is licensed under the GNU General Public License v3 or later.
+ *
+ * It is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
package com.cloud.usage.parser;
import java.text.DecimalFormat;
@@ -61,7 +76,7 @@ public class StorageUsageParser {
long storageId = usageStorage.getId();
int storage_type = usageStorage.getStorageType();
long size = usageStorage.getSize();
- long zoneId = usageStorage.getZoneId();
+ long zoneId = usageStorage.getZoneId();
Long sourceId = usageStorage.getSourceId();
String key = ""+storageId+"Z"+zoneId+"T"+storage_type;
@@ -127,14 +142,14 @@ public class StorageUsageParser {
s_logger.debug("Creating Storage usage record for type: "+ type + " with id: " + storageId + ", usage: " + usageDisplay + ", startDate: " + startDate + ", endDate: " + endDate + ", for account: " + account.getId());
}
- String usageDesc = "";
+ String usageDesc = "";
Long tmplSourceId = null;
int usage_type = 0;
switch(type){
case StorageTypes.TEMPLATE:
usage_type = UsageTypes.TEMPLATE;
- usageDesc += "Template ";
+ usageDesc += "Template ";
tmplSourceId = sourceId;
break;
case StorageTypes.ISO:
@@ -158,14 +173,14 @@ public class StorageUsageParser {
private static class StorageInfo {
private long zoneId;
private long storageId;
- private int storageType;
+ private int storageType;
private Long sourceId;
private long size;
public StorageInfo(long zoneId, long storageId, int storageType, Long sourceId, long size) {
this.zoneId = zoneId;
this.storageId = storageId;
- this.storageType = storageType;
+ this.storageType = storageType;
this.sourceId = sourceId;
this.size = size;
}
@@ -181,11 +196,11 @@ public class StorageUsageParser {
public int getStorageType() {
return storageType;
}
-
- public long getSourceId() {
- return sourceId;
- }
-
+
+ public long getSourceId() {
+ return sourceId;
+ }
+
public long getSize() {
return size;
diff --git a/usage/src/com/cloud/usage/parser/UsageParser.java b/usage/src/com/cloud/usage/parser/UsageParser.java
index 2802390f63f..ad6717a8ec6 100644
--- a/usage/src/com/cloud/usage/parser/UsageParser.java
+++ b/usage/src/com/cloud/usage/parser/UsageParser.java
@@ -1,8 +1,23 @@
-/**
- * * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved
- *
- */
-
+
+/**
+ * * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved
+*
+ *
+ * This software is licensed under the GNU General Public License v3 or later.
+ *
+ * It is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
package com.cloud.usage.parser;
import java.util.Date;
diff --git a/usage/src/com/cloud/usage/parser/VMInstanceUsageParser.java b/usage/src/com/cloud/usage/parser/VMInstanceUsageParser.java
index 2f79f287bad..848fa169248 100644
--- a/usage/src/com/cloud/usage/parser/VMInstanceUsageParser.java
+++ b/usage/src/com/cloud/usage/parser/VMInstanceUsageParser.java
@@ -1,8 +1,23 @@
-/**
- * * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved
- *
- */
-
+
+/**
+ * * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved
+*
+ *
+ * This software is licensed under the GNU General Public License v3 or later.
+ *
+ * It is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
package com.cloud.usage.parser;
import java.text.DecimalFormat;
diff --git a/usage/src/com/cloud/usage/parser/VolumeUsageParser.java b/usage/src/com/cloud/usage/parser/VolumeUsageParser.java
index f805eb74f89..d6ef11831f6 100644
--- a/usage/src/com/cloud/usage/parser/VolumeUsageParser.java
+++ b/usage/src/com/cloud/usage/parser/VolumeUsageParser.java
@@ -1,8 +1,23 @@
-/**
- * * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved
- *
- */
-
+
+/**
+ * * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved
+*
+ *
+ * This software is licensed under the GNU General Public License v3 or later.
+ *
+ * It is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
package com.cloud.usage.parser;
import java.text.DecimalFormat;