From 0d604c636daed253f8d3034d8093e56f1ab85aff Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Fri, 22 Mar 2013 10:26:59 +0530 Subject: [PATCH] CLOUDSTACK-1666: Fix NetworkUsage for VPC on KVM The collection of network usage from VPC virtual router on KVM does not work, because there is no corresponding procedure to deal with VPC virtual router (cmd.isForVpc() = true). Reviewed-by: Kishan Kavala Reported-by: Wei Zhou Signed-off-by: Prasanna Santhanam --- .../resource/LibvirtComputingResource.java | 73 +++++++++++++++++-- 1 file changed, 65 insertions(+), 8 deletions(-) diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java index 8ee3ea4e200..84923626bad 100755 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java @@ -2751,17 +2751,74 @@ ServerResource { return stats; } + protected String VPCNetworkUsage(final String privateIpAddress, final String publicIp, + final String option, final String vpcCIDR) { + Script getUsage = new Script(_routerProxyPath, s_logger); + getUsage.add("vpc_netusage.sh"); + getUsage.add(privateIpAddress); + getUsage.add("-l", publicIp); + + if (option.equals("get")) { + getUsage.add("-g"); + } else if (option.equals("create")) { + getUsage.add("-c"); + getUsage.add("-v", vpcCIDR); + } else if (option.equals("reset")) { + getUsage.add("-r"); + } else if (option.equals("vpn")) { + getUsage.add("-n"); + } else if (option.equals("remove")) { + getUsage.add("-d"); + } + + final OutputInterpreter.OneLineParser usageParser = new OutputInterpreter.OneLineParser(); + String result = getUsage.execute(usageParser); + if (result != null) { + s_logger.debug("Failed to execute VPCNetworkUsage:" + result); + return null; + } + return usageParser.getLine(); + } + + protected long[] getVPCNetworkStats(String privateIP, String publicIp, String option) { + String result = VPCNetworkUsage(privateIP, publicIp, option, null); + long[] stats = new long[2]; + if (result != null) { + String[] splitResult = result.split(":"); + int i = 0; + while (i < splitResult.length - 1) { + stats[0] += (new Long(splitResult[i++])).longValue(); + stats[1] += (new Long(splitResult[i++])).longValue(); + } + } + return stats; + } + private Answer execute(NetworkUsageCommand cmd) { - if (cmd.getOption() != null && cmd.getOption().equals("create")) { - String result = networkUsage(cmd.getPrivateIP(), "create", null); - NetworkUsageAnswer answer = new NetworkUsageAnswer(cmd, result, 0L, - 0L); + if (cmd.isForVpc()) { + if (cmd.getOption() != null && cmd.getOption().equals("create")) { + String result = VPCNetworkUsage(cmd.getPrivateIP(),cmd.getGatewayIP(), "create", cmd.getVpcCIDR()); + NetworkUsageAnswer answer = new NetworkUsageAnswer(cmd, result, 0L, 0L); + return answer; + } else if (cmd.getOption() != null && (cmd.getOption().equals("get") || cmd.getOption().equals("vpn"))) { + long[] stats = getVPCNetworkStats(cmd.getPrivateIP(), cmd.getGatewayIP(), cmd.getOption()); + NetworkUsageAnswer answer = new NetworkUsageAnswer(cmd, "", stats[0], stats[1]); + return answer; + } else { + String result = VPCNetworkUsage(cmd.getPrivateIP(),cmd.getGatewayIP(), cmd.getOption(), cmd.getVpcCIDR()); + NetworkUsageAnswer answer = new NetworkUsageAnswer(cmd, result, 0L, 0L); + return answer; + } + } else { + if (cmd.getOption() != null && cmd.getOption().equals("create")) { + String result = networkUsage(cmd.getPrivateIP(), "create", null); + NetworkUsageAnswer answer = new NetworkUsageAnswer(cmd, result, 0L, 0L); + return answer; + } + long[] stats = getNetworkStats(cmd.getPrivateIP()); + NetworkUsageAnswer answer = new NetworkUsageAnswer(cmd, "", stats[0], stats[1]); return answer; } - long[] stats = getNetworkStats(cmd.getPrivateIP()); - NetworkUsageAnswer answer = new NetworkUsageAnswer(cmd, "", stats[0], - stats[1]); - return answer; } private Answer execute(RebootCommand cmd) {