diff --git a/api/src/com/cloud/agent/api/NetworkUsageCommand.java b/api/src/com/cloud/agent/api/NetworkUsageCommand.java index 6c4152af62d..14621ffd1dc 100644 --- a/api/src/com/cloud/agent/api/NetworkUsageCommand.java +++ b/api/src/com/cloud/agent/api/NetworkUsageCommand.java @@ -13,26 +13,26 @@ package com.cloud.agent.api; import com.cloud.agent.api.LogLevel.Log4jLevel; -import com.cloud.agent.api.to.NicTO; -@LogLevel(Log4jLevel.Trace) +@LogLevel(Log4jLevel.Debug) public class NetworkUsageCommand extends Command { private String privateIP; private String domRName; private String option; boolean forVpc = false; - NicTO guestNic; + private String gatewayIP; + private String vpcCIDR; protected NetworkUsageCommand() { } - public NetworkUsageCommand(String privateIP, String domRName, boolean forVpc, NicTO guestNic) + public NetworkUsageCommand(String privateIP, String domRName, boolean forVpc, String gatewayIP) { this.privateIP = privateIP; this.domRName = domRName; this.forVpc = forVpc; - this.guestNic = guestNic; + this.gatewayIP = gatewayIP; this.option = "get"; } @@ -44,6 +44,16 @@ public class NetworkUsageCommand extends Command { this.forVpc = forVpc; } + public NetworkUsageCommand(String privateIP, String domRName, boolean forVpc, String gatewayIP, String vpcCIDR) + { + this.privateIP = privateIP; + this.domRName = domRName; + this.forVpc = forVpc; + this.gatewayIP = gatewayIP; + this.option = "create"; + this.vpcCIDR = vpcCIDR; + } + public String getPrivateIP() { return privateIP; } @@ -60,12 +70,16 @@ public class NetworkUsageCommand extends Command { return forVpc; } - public NicTO getGuestNic() { - return guestNic; - } + public String getVpcCIDR() { + return vpcCIDR; + } + + public String getGatewayIP() { + return gatewayIP; + } @Override public boolean executeInSequence() { return false; } -} \ No newline at end of file +} diff --git a/core/src/com/cloud/hypervisor/xen/resource/XenServer56Resource.java b/core/src/com/cloud/hypervisor/xen/resource/XenServer56Resource.java index cc644141e6b..0bc18500b3c 100644 --- a/core/src/com/cloud/hypervisor/xen/resource/XenServer56Resource.java +++ b/core/src/com/cloud/hypervisor/xen/resource/XenServer56Resource.java @@ -168,17 +168,18 @@ public class XenServer56Resource extends CitrixResourceBase { try { Connection conn = getConnection(); String option = cmd.getOption(); - String guestIp = cmd.getGuestNic().getIp(); + String publicIp = cmd.getGatewayIP(); - String args = "vpc_netusage.sh " + cmd.getPrivateIP() + " "; + String args = "vpc_netusage.sh " + cmd.getPrivateIP(); + args += " -l " + publicIp+ " "; if (option.equals("get")) { args += "-g"; - args += " -l " + guestIp; } else if (option.equals("create")) { args += "-c"; + String vpcCIDR = cmd.getVpcCIDR(); + args += " -v " + vpcCIDR; } else if (option.equals("reset")) { args += "-r"; - args += " -l " + guestIp; } else { return new NetworkUsageAnswer(cmd, "success", 0L, 0L); } diff --git a/patches/systemvm/debian/config/opt/cloud/bin/vpc_guestnw.sh b/patches/systemvm/debian/config/opt/cloud/bin/vpc_guestnw.sh index 61c5a7ecb02..0ca371c1d7b 100755 --- a/patches/systemvm/debian/config/opt/cloud/bin/vpc_guestnw.sh +++ b/patches/systemvm/debian/config/opt/cloud/bin/vpc_guestnw.sh @@ -97,21 +97,6 @@ desetup_dnsmasq() { sleep 1 } -setup_usage() { - sudo iptables -t mangle -N NETWORK_STATS_$dev - sudo iptables -t mangle -A NETWORK_STATS_$dev -s $subnet/$mask ! -d $vpccidr - sudo iptables -t mangle -A NETWORK_STATS_$dev -o $dev ! -s $vpccidr - sudo iptables -t mangle -A POSTROUTING -s $subnet/$mask -j NETWORK_STATS_$dev - sudo iptables -t mangle -A POSTROUTING -o $dev -j NETWORK_STATS_$dev -} - -desetup_usage() { - sudo iptables -t mangle -F NETWORK_STATS_$dev - sudo iptables -t mangle -D POSTROUTING -s $subnet/$mask -j NETWORK_STATS_$dev - sudo iptables -t mangle -D POSTROUTING -o $dev -j NETWORK_STATS_$dev - sudo iptables -t mangle -X NETWORK_STATS_$dev -} - create_guest_network() { logger -t cloud " $(basename $0): Create network on interface $dev, gateway $gw, network $ip/$mask " # setup ip configuration @@ -130,7 +115,6 @@ create_guest_network() { # set up hairpin sudo iptables -t nat -A POSTROUTING -s $subnet/$mask -o $dev -j SNAT --to-source $ip create_acl_chain - setup_usage setup_dnsmasq setup_apache2 } @@ -144,7 +128,6 @@ destroy_guest_network() { sudo iptables -t mangle -D PREROUTING -i $dev -m state --state ESTABLISHED,RELATED -j CONNMARK --restore-mark sudo iptables -t nat -A POSTROUTING -s $subnet/$mask -o $dev -j SNAT --to-source $ip destroy_acl_chain - desetup_usage desetup_dnsmasq desetup_apache2 } diff --git a/patches/systemvm/debian/config/opt/cloud/bin/vpc_netusage.sh b/patches/systemvm/debian/config/opt/cloud/bin/vpc_netusage.sh index 54c6b55f5dc..8ec44a1b90e 100755 --- a/patches/systemvm/debian/config/opt/cloud/bin/vpc_netusage.sh +++ b/patches/systemvm/debian/config/opt/cloud/bin/vpc_netusage.sh @@ -27,21 +27,23 @@ usage() { } create_usage_rules () { - iptables-save|grep "NETWORK_STATS_$guestIp -i $ethDev" > /dev/null + iptables -N NETWORK_STATS_$ethDev > /dev/null + iptables -I FORWARD -j NETWORK_STATS_$ethDev > /dev/null + iptables-save|grep "NETWORK_STATS_$ethDev -i $ethDev" > /dev/null if [ $? -gt 0 ] then - iptables -A NETWORK_STATS_$guestIp -i $ethDev -s ! zcidr > /dev/null + iptables -A NETWORK_STATS_$ethDev -i $ethDev -d $vcidr > /dev/null fi - iptables-save|grep "NETWORK_STATS_$guestIp -o $ethDev" > /dev/null + iptables-save|grep "NETWORK_STATS_$ethDev -o $ethDev" > /dev/null if [ $? -gt 0 ] then - iptables -A NETWORK_STATS_$guestIp -o $ethDev -d ! zcidr > /dev/null + iptables -A NETWORK_STATS_$ethDev -o $ethDev -s $vcidr > /dev/null fi return $? } get_usage () { - iptables -t mangle -L NETWORK_STATS_$ethDev -n -v -x | awk '$1 ~ /^[0-9]+$/ { printf "%s:", $2}'; > /dev/null + iptables -L NETWORK_STATS_$ethDev -n -v -x | awk '$1 ~ /^[0-9]+$/ { printf "%s:", $2}'; > /dev/null if [ $? -gt 0 ] then printf $? @@ -50,7 +52,7 @@ get_usage () { } reset_usage () { - iptables -t mangle -Z NETWORK_STATS_$ethDev > /dev/null + iptables -Z NETWORK_STATS_$ethDev > /dev/null if [ $? -gt 0 -a $? -ne 2 ] then return 1 @@ -65,7 +67,7 @@ rflag= lflag= -while getopts 'cgrl:' OPTION +while getopts 'cgrl:v:' OPTION do case $OPTION in c) cflag=1 @@ -75,7 +77,10 @@ do r) rflag=1 ;; l) lflag=1 - guestIp="$OPTARG" + publicIp="$OPTARG" + ;; + v) vflag=1 + vcidr="$OPTARG" ;; i) #Do nothing, since it's parameter for host script ;; @@ -85,12 +90,13 @@ do esac done +ethDev=$(getEthByIp $publicIp) if [ "$cflag" == "1" ] then + create_usage_rules unlock_exit 0 $lock $locked fi -ethDev=$(getEthByIp $guestIp) if [ "$gflag" == "1" ] then get_usage diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java index 5f600ef69f7..15ce1e98f4f 100755 --- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java +++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java @@ -755,100 +755,96 @@ VirtualMachineGuru, Listener { @Override public void run() { - try{ - final List routers = _routerDao.listByStateAndNetworkType(State.Running, GuestType.Isolated, mgmtSrvrId); - s_logger.debug("Found " + routers.size() + " running routers. "); + try{ + final List routers = _routerDao.listByStateAndNetworkType(State.Running, GuestType.Isolated, mgmtSrvrId); + s_logger.debug("Found " + routers.size() + " running routers. "); - for (DomainRouterVO router : routers) { - String privateIP = router.getPrivateIpAddress(); + for (DomainRouterVO router : routers) { + String privateIP = router.getPrivateIpAddress(); - if (privateIP != null) { - List routerGuestNtwkIds = _routerDao.getRouterNetworks(router.getId()); + if (privateIP != null) { + List routerNics = _nicDao.listByVmId(router.getId()); + for (Nic routerNic : routerNics) { + Network network = _networkMgr.getNetwork(routerNic.getNetworkId()); + if (network.getTrafficType() == TrafficType.Public) { + boolean forVpc = router.getVpcId() != null; + final NetworkUsageCommand usageCmd = new NetworkUsageCommand(privateIP, router.getHostName(), + forVpc, routerNic.getIp4Address()); + UserStatisticsVO previousStats = _statsDao.findBy(router.getAccountId(), + router.getDataCenterIdToDeployIn(), network.getId(), null, router.getId(), router.getType().toString()); + NetworkUsageAnswer answer = null; + try { + answer = (NetworkUsageAnswer) _agentMgr.easySend(router.getHostId(), usageCmd); + } catch (Exception e) { + s_logger.warn("Error while collecting network stats from router: "+router.getInstanceName()+" from host: "+router.getHostId(), e); + continue; + } - for (Long guestNtwkId : routerGuestNtwkIds) { - boolean forVpc = router.getVpcId() != null; - Network guestNtwk = _networkMgr.getNetwork(guestNtwkId); - Nic guestNic = _nicDao.findByInstanceIdAndNetworkId(guestNtwk.getId(), router.getId()); - NicProfile guestNicProfile = new NicProfile(guestNic, guestNtwk, guestNic.getBroadcastUri(), - guestNic.getIsolationUri(), _networkMgr.getNetworkRate(guestNtwk.getId(), router.getId()), - _networkMgr.isSecurityGroupSupportedInNetwork(guestNtwk), - _networkMgr.getNetworkTag(router.getHypervisorType(), guestNtwk)); - final NetworkUsageCommand usageCmd = new NetworkUsageCommand(privateIP, router.getHostName(), - forVpc, _itMgr.toNicTO(guestNicProfile, router.getHypervisorType())); - UserStatisticsVO previousStats = _statsDao.findBy(router.getAccountId(), - router.getDataCenterIdToDeployIn(), guestNtwkId, null, router.getId(), router.getType().toString()); - NetworkUsageAnswer answer = null; - try { - answer = (NetworkUsageAnswer) _agentMgr.easySend(router.getHostId(), usageCmd); - } catch (Exception e) { - s_logger.warn("Error while collecting network stats from router: "+router.getInstanceName()+" from host: "+router.getHostId(), e); - continue; - } + if (answer != null) { + if (!answer.getResult()) { + s_logger.warn("Error while collecting network stats from router: "+router.getInstanceName()+" from host: "+router.getHostId() + "; details: " + answer.getDetails()); + continue; + } + Transaction txn = Transaction.open(Transaction.CLOUD_DB); + try { + if ((answer.getBytesReceived() == 0) && (answer.getBytesSent() == 0)) { + s_logger.debug("Recieved and Sent bytes are both 0. Not updating user_statistics"); + continue; + } + txn.start(); + UserStatisticsVO stats = _statsDao.lock(router.getAccountId(), + router.getDataCenterIdToDeployIn(), network.getId(), routerNic.getIp4Address(), router.getId(), router.getType().toString()); + if (stats == null) { + s_logger.warn("unable to find stats for account: " + router.getAccountId()); + continue; + } - if (answer != null) { - if (!answer.getResult()) { - s_logger.warn("Error while collecting network stats from router: "+router.getInstanceName()+" from host: "+router.getHostId() + "; details: " + answer.getDetails()); - continue; - } - Transaction txn = Transaction.open(Transaction.CLOUD_DB); - try { - if ((answer.getBytesReceived() == 0) && (answer.getBytesSent() == 0)) { - s_logger.debug("Recieved and Sent bytes are both 0. Not updating user_statistics"); - continue; - } - txn.start(); - UserStatisticsVO stats = _statsDao.lock(router.getAccountId(), - router.getDataCenterIdToDeployIn(), guestNtwkId, null, router.getId(), router.getType().toString()); - if (stats == null) { - s_logger.warn("unable to find stats for account: " + router.getAccountId()); - continue; - } + if(previousStats != null + && ((previousStats.getCurrentBytesReceived() != stats.getCurrentBytesReceived()) + || (previousStats.getCurrentBytesSent() != stats.getCurrentBytesSent()))){ + s_logger.debug("Router stats changed from the time NetworkUsageCommand was sent. " + + "Ignoring current answer. Router: "+answer.getRouterName()+" Rcvd: " + + answer.getBytesReceived()+ "Sent: " +answer.getBytesSent()); + continue; + } - if(previousStats != null - && ((previousStats.getCurrentBytesReceived() != stats.getCurrentBytesReceived()) - || (previousStats.getCurrentBytesSent() != stats.getCurrentBytesSent()))){ - s_logger.debug("Router stats changed from the time NetworkUsageCommand was sent. " + - "Ignoring current answer. Router: "+answer.getRouterName()+" Rcvd: " + - answer.getBytesReceived()+ "Sent: " +answer.getBytesSent()); - continue; - } - - if (stats.getCurrentBytesReceived() > answer.getBytesReceived()) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Received # of bytes that's less than the last one. " + - "Assuming something went wrong and persisting it. Router: " + - answer.getRouterName()+" Reported: " + answer.getBytesReceived() - + " Stored: " + stats.getCurrentBytesReceived()); - } - stats.setNetBytesReceived(stats.getNetBytesReceived() + stats.getCurrentBytesReceived()); - } - stats.setCurrentBytesReceived(answer.getBytesReceived()); - if (stats.getCurrentBytesSent() > answer.getBytesSent()) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Received # of bytes that's less than the last one. " + - "Assuming something went wrong and persisting it. Router: " + - answer.getRouterName()+" Reported: " + answer.getBytesSent() - + " Stored: " + stats.getCurrentBytesSent()); - } - stats.setNetBytesSent(stats.getNetBytesSent() + stats.getCurrentBytesSent()); - } - stats.setCurrentBytesSent(answer.getBytesSent()); - _statsDao.update(stats.getId(), stats); - txn.commit(); - } catch (Exception e) { - txn.rollback(); - s_logger.warn("Unable to update user statistics for account: " + router.getAccountId() - + " Rx: " + answer.getBytesReceived() + "; Tx: " + answer.getBytesSent()); - } finally { - txn.close(); - } - } - } - } - } - } catch (Exception e) { - s_logger.warn("Error while collecting network stats", e); - } + if (stats.getCurrentBytesReceived() > answer.getBytesReceived()) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Received # of bytes that's less than the last one. " + + "Assuming something went wrong and persisting it. Router: " + + answer.getRouterName()+" Reported: " + answer.getBytesReceived() + + " Stored: " + stats.getCurrentBytesReceived()); + } + stats.setNetBytesReceived(stats.getNetBytesReceived() + stats.getCurrentBytesReceived()); + } + stats.setCurrentBytesReceived(answer.getBytesReceived()); + if (stats.getCurrentBytesSent() > answer.getBytesSent()) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Received # of bytes that's less than the last one. " + + "Assuming something went wrong and persisting it. Router: " + + answer.getRouterName()+" Reported: " + answer.getBytesSent() + + " Stored: " + stats.getCurrentBytesSent()); + } + stats.setNetBytesSent(stats.getNetBytesSent() + stats.getCurrentBytesSent()); + } + stats.setCurrentBytesSent(answer.getBytesSent()); + _statsDao.update(stats.getId(), stats); + txn.commit(); + } catch (Exception e) { + txn.rollback(); + s_logger.warn("Unable to update user statistics for account: " + router.getAccountId() + + " Rx: " + answer.getBytesReceived() + "; Tx: " + answer.getBytesSent()); + } finally { + txn.close(); + } + } + } + } + } + } + } catch (Exception e) { + s_logger.warn("Error while collecting network stats", e); + } } } @@ -3271,97 +3267,94 @@ VirtualMachineGuru, Listener { @Override public void prepareStop(VirtualMachineProfile profile){ - //Collect network usage before stopping Vm - VMInstanceVO vm = profile.getVirtualMachine(); - DomainRouterVO router = _routerDao.findById(vm.getId()); - if(router == null){ - return; - } - String privateIP = router.getPrivateIpAddress(); + //Collect network usage before stopping Vm + VMInstanceVO vm = profile.getVirtualMachine(); + DomainRouterVO router = _routerDao.findById(vm.getId()); + if(router == null){ + return; + } - if (privateIP != null) { - List routerGuestNtwkIds = _routerDao.getRouterNetworks(router.getId()); + String privateIP = router.getPrivateIpAddress(); - for (Long guestNtwkId : routerGuestNtwkIds) { - boolean forVpc = router.getVpcId() != null; - Network guestNtwk = _networkMgr.getNetwork(guestNtwkId); - Nic guestNic = _nicDao.findByInstanceIdAndNetworkId(guestNtwk.getId(), router.getId()); - NicProfile guestNicProfile = new NicProfile(guestNic, guestNtwk, guestNic.getBroadcastUri(), - guestNic.getIsolationUri(), _networkMgr.getNetworkRate(guestNtwk.getId(), router.getId()), - _networkMgr.isSecurityGroupSupportedInNetwork(guestNtwk), - _networkMgr.getNetworkTag(router.getHypervisorType(), guestNtwk)); - final NetworkUsageCommand usageCmd = new NetworkUsageCommand(privateIP, router.getHostName(), - forVpc, _itMgr.toNicTO(guestNicProfile, router.getHypervisorType())); - UserStatisticsVO previousStats = _statsDao.findBy(router.getAccountId(), - router.getDataCenterIdToDeployIn(), guestNtwkId, null, router.getId(), router.getType().toString()); - NetworkUsageAnswer answer = null; - try { - answer = (NetworkUsageAnswer) _agentMgr.easySend(router.getHostId(), usageCmd); - } catch (Exception e) { - s_logger.warn("Error while collecting network stats from router: "+router.getInstanceName()+" from host: "+router.getHostId(), e); - continue; - } + if (privateIP != null) { + List routerNics = _nicDao.listByVmId(router.getId()); + for (Nic routerNic : routerNics) { + Network network = _networkMgr.getNetwork(routerNic.getNetworkId()); + if (network.getTrafficType() == TrafficType.Public) { + boolean forVpc = router.getVpcId() != null; + final NetworkUsageCommand usageCmd = new NetworkUsageCommand(privateIP, router.getHostName(), + forVpc, routerNic.getIp4Address()); + UserStatisticsVO previousStats = _statsDao.findBy(router.getAccountId(), + router.getDataCenterIdToDeployIn(), network.getId(), null, router.getId(), router.getType().toString()); + NetworkUsageAnswer answer = null; + try { + answer = (NetworkUsageAnswer) _agentMgr.easySend(router.getHostId(), usageCmd); + } catch (Exception e) { + s_logger.warn("Error while collecting network stats from router: "+router.getInstanceName()+" from host: "+router.getHostId(), e); + continue; + } - if (answer != null) { - if (!answer.getResult()) { - s_logger.warn("Error while collecting network stats from router: "+router.getInstanceName()+" from host: "+router.getHostId() + "; details: " + answer.getDetails()); - continue; - } - Transaction txn = Transaction.open(Transaction.CLOUD_DB); - try { - if ((answer.getBytesReceived() == 0) && (answer.getBytesSent() == 0)) { - s_logger.debug("Recieved and Sent bytes are both 0. Not updating user_statistics"); - continue; - } - txn.start(); - UserStatisticsVO stats = _statsDao.lock(router.getAccountId(), - router.getDataCenterIdToDeployIn(), guestNtwkId, null, router.getId(), router.getType().toString()); - if (stats == null) { - s_logger.warn("unable to find stats for account: " + router.getAccountId()); - continue; - } + if (answer != null) { + if (!answer.getResult()) { + s_logger.warn("Error while collecting network stats from router: "+router.getInstanceName()+" from host: "+router.getHostId() + "; details: " + answer.getDetails()); + continue; + } + Transaction txn = Transaction.open(Transaction.CLOUD_DB); + try { + if ((answer.getBytesReceived() == 0) && (answer.getBytesSent() == 0)) { + s_logger.debug("Recieved and Sent bytes are both 0. Not updating user_statistics"); + continue; + } + txn.start(); + UserStatisticsVO stats = _statsDao.lock(router.getAccountId(), + router.getDataCenterIdToDeployIn(), network.getId(), null, router.getId(), router.getType().toString()); + if (stats == null) { + s_logger.warn("unable to find stats for account: " + router.getAccountId()); + continue; + } - if(previousStats != null - && ((previousStats.getCurrentBytesReceived() != stats.getCurrentBytesReceived()) - || (previousStats.getCurrentBytesSent() != stats.getCurrentBytesSent()))){ - s_logger.debug("Router stats changed from the time NetworkUsageCommand was sent. " + - "Ignoring current answer. Router: "+answer.getRouterName()+" Rcvd: " + - answer.getBytesReceived()+ "Sent: " +answer.getBytesSent()); - continue; - } + if(previousStats != null + && ((previousStats.getCurrentBytesReceived() != stats.getCurrentBytesReceived()) + || (previousStats.getCurrentBytesSent() != stats.getCurrentBytesSent()))){ + s_logger.debug("Router stats changed from the time NetworkUsageCommand was sent. " + + "Ignoring current answer. Router: "+answer.getRouterName()+" Rcvd: " + + answer.getBytesReceived()+ "Sent: " +answer.getBytesSent()); + continue; + } - if (stats.getCurrentBytesReceived() > answer.getBytesReceived()) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Received # of bytes that's less than the last one. " + - "Assuming something went wrong and persisting it. Router: " + - answer.getRouterName()+" Reported: " + answer.getBytesReceived() - + " Stored: " + stats.getCurrentBytesReceived()); - } - stats.setNetBytesReceived(stats.getNetBytesReceived() + stats.getCurrentBytesReceived()); - } - stats.setCurrentBytesReceived(answer.getBytesReceived()); - if (stats.getCurrentBytesSent() > answer.getBytesSent()) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Received # of bytes that's less than the last one. " + - "Assuming something went wrong and persisting it. Router: " + - answer.getRouterName()+" Reported: " + answer.getBytesSent() - + " Stored: " + stats.getCurrentBytesSent()); - } - stats.setNetBytesSent(stats.getNetBytesSent() + stats.getCurrentBytesSent()); - } - stats.setCurrentBytesSent(answer.getBytesSent()); - _statsDao.update(stats.getId(), stats); - txn.commit(); - } catch (Exception e) { - txn.rollback(); - s_logger.warn("Unable to update user statistics for account: " + router.getAccountId() - + " Rx: " + answer.getBytesReceived() + "; Tx: " + answer.getBytesSent()); - } finally { - txn.close(); - } - } - } - } + if (stats.getCurrentBytesReceived() > answer.getBytesReceived()) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Received # of bytes that's less than the last one. " + + "Assuming something went wrong and persisting it. Router: " + + answer.getRouterName()+" Reported: " + answer.getBytesReceived() + + " Stored: " + stats.getCurrentBytesReceived()); + } + stats.setNetBytesReceived(stats.getNetBytesReceived() + stats.getCurrentBytesReceived()); + } + stats.setCurrentBytesReceived(answer.getBytesReceived()); + if (stats.getCurrentBytesSent() > answer.getBytesSent()) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Received # of bytes that's less than the last one. " + + "Assuming something went wrong and persisting it. Router: " + + answer.getRouterName()+" Reported: " + answer.getBytesSent() + + " Stored: " + stats.getCurrentBytesSent()); + } + stats.setNetBytesSent(stats.getNetBytesSent() + stats.getCurrentBytesSent()); + } + stats.setCurrentBytesSent(answer.getBytesSent()); + _statsDao.update(stats.getId(), stats); + txn.commit(); + } catch (Exception e) { + txn.rollback(); + s_logger.warn("Unable to update user statistics for account: " + router.getAccountId() + + " Rx: " + answer.getBytesReceived() + "; Tx: " + answer.getBytesSent()); + } finally { + txn.close(); + } + } + } + } + } } @Override diff --git a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java index 720498fdd2a..68bde2c91aa 100644 --- a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java +++ b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java @@ -25,7 +25,9 @@ import javax.ejb.Local; import org.apache.log4j.Logger; import com.cloud.agent.AgentManager.OnError; +import com.cloud.agent.api.Command; import com.cloud.agent.api.GetDomRVersionCmd; +import com.cloud.agent.api.NetworkUsageCommand; import com.cloud.agent.api.PlugNicAnswer; import com.cloud.agent.api.PlugNicCommand; import com.cloud.agent.api.SetupGuestNetworkAnswer; @@ -94,6 +96,7 @@ import com.cloud.network.vpc.StaticRouteProfile; import com.cloud.network.vpc.Vpc; import com.cloud.network.vpc.VpcGateway; import com.cloud.network.vpc.VpcManager; +import com.cloud.network.vpc.VpcVO; import com.cloud.network.vpc.Dao.PrivateIpDao; import com.cloud.network.vpc.Dao.StaticRouteDao; import com.cloud.network.vpc.Dao.VpcDao; @@ -101,6 +104,7 @@ import com.cloud.network.vpc.Dao.VpcOfferingDao; import com.cloud.network.vpn.Site2SiteVpnManager; import com.cloud.offerings.NetworkOfferingVO; import com.cloud.user.Account; +import com.cloud.user.UserStatisticsVO; import com.cloud.utils.Pair; import com.cloud.utils.component.Inject; import com.cloud.utils.db.DB; @@ -772,6 +776,8 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian } } + List usageCmds = new ArrayList(); + //3) PREPARE PLUG NIC COMMANDS try { //add VPC router to public networks @@ -795,10 +801,18 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian _routerDao.update(routerVO.getId(), routerVO); } } - - PlugNicCommand plugNicCmd = new PlugNicCommand(getNicTO(router, publicNic.getNetworkId(), - publicNic.getBroadcastUri().toString()), router.getInstanceName()); + PlugNicCommand plugNicCmd = new PlugNicCommand(getNicTO(router, publicNic.getNetworkId(), publicNic.getBroadcastUri().toString()), router.getInstanceName()); cmds.addCommand(plugNicCmd); + VpcVO vpc = _vpcDao.findById(router.getVpcId()); + NetworkUsageCommand netUsageCmd = new NetworkUsageCommand(router.getPrivateIpAddress(), router.getInstanceName(), true, publicNic.getIp4Address(), vpc.getCidr()); + usageCmds.add(netUsageCmd); + UserStatisticsVO stats = _userStatsDao.findBy(router.getAccountId(), router.getDataCenterIdToDeployIn(), + publicNtwk.getId(), publicNic.getIp4Address(), router.getId(), router.getType().toString()); + if (stats == null) { + stats = new UserStatisticsVO(router.getAccountId(), router.getDataCenterIdToDeployIn(), publicNic.getIp4Address(), router.getId(), + router.getType().toString(), publicNtwk.getId()); + _userStatsDao.persist(stats); + } } // create ip assoc for source nat @@ -806,6 +820,9 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian createVpcAssociatePublicIPCommands(router, sourceNat, cmds, vlanMacAddress); } + //Add network usage commands + cmds.addCommands(usageCmds); + //add VPC router to guest networks for (Pair nicNtwk : guestNics) { Nic guestNic = nicNtwk.first();