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 <[email protected]> Reported-by: Wei Zhou <[email protected]> Signed-off-by: Prasanna Santhanam <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/0d604c63 Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/0d604c63 Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/0d604c63 Branch: refs/heads/ui-multiple-pod-ranges Commit: 0d604c636daed253f8d3034d8093e56f1ab85aff Parents: 00742e5 Author: Wei Zhou <[email protected]> Authored: Fri Mar 22 10:26:59 2013 +0530 Committer: Prasanna Santhanam <[email protected]> Committed: Fri Mar 22 10:51:27 2013 +0530 ---------------------------------------------------------------------- .../kvm/resource/LibvirtComputingResource.java | 73 +++++++++++++-- 1 files changed, 65 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0d604c63/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java ---------------------------------------------------------------------- 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 8ee3ea4..8492362 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) {
