diff --git a/api/src/com/cloud/api/ApiConstants.java b/api/src/com/cloud/api/ApiConstants.java index 03d233115cd..4b2b2e5362f 100755 --- a/api/src/com/cloud/api/ApiConstants.java +++ b/api/src/com/cloud/api/ApiConstants.java @@ -353,6 +353,8 @@ public class ApiConstants { public static final String VSM_CONFIG_MODE = "vsmconfigmode"; public static final String VSM_CONFIG_STATE = "vsmconfigstate"; public static final String VSM_DEVICE_STATE = "vsmdevicestate"; + public static final String INCL_ZONES = "includezones"; + public static final String EXCL_ZONES = "excludezones"; public enum HostDetails { all, capacity, events, stats, min; diff --git a/core/src/com/cloud/agent/api/DirectNetworkUsageCommand.java b/core/src/com/cloud/agent/api/DirectNetworkUsageCommand.java index 446057b504a..9153d03a1e6 100644 --- a/core/src/com/cloud/agent/api/DirectNetworkUsageCommand.java +++ b/core/src/com/cloud/agent/api/DirectNetworkUsageCommand.java @@ -20,11 +20,15 @@ public class DirectNetworkUsageCommand extends Command { private List publicIps; private Date start; private Date end; + private String includeZones; + private String excludeZones; - public DirectNetworkUsageCommand(List publicIps, Date start, Date end) { + public DirectNetworkUsageCommand(List publicIps, Date start, Date end, String includeZones, String excludeZones) { this.setPublicIps(publicIps); this.setStart(start); this.setEnd(end); + this.setIncludeZones(includeZones); + this.setExcludeZones(excludeZones); } @Override @@ -55,4 +59,21 @@ public class DirectNetworkUsageCommand extends Command { public Date getEnd() { return end; } + + public String getIncludeZones() { + return includeZones; + } + + public void setIncludeZones(String includeZones) { + this.includeZones = includeZones; + } + + public String getExcludeZones() { + return excludeZones; + } + + public void setExcludeZones(String excludeZones) { + this.excludeZones = excludeZones; + } + } diff --git a/core/src/com/cloud/network/resource/TrafficSentinelResource.java b/core/src/com/cloud/network/resource/TrafficSentinelResource.java index e7da109912d..a50d2e3977f 100644 --- a/core/src/com/cloud/network/resource/TrafficSentinelResource.java +++ b/core/src/com/cloud/network/resource/TrafficSentinelResource.java @@ -45,7 +45,6 @@ import com.cloud.agent.api.StartupCommand; import com.cloud.agent.api.StartupTrafficMonitorCommand; import com.cloud.host.Host; import com.cloud.resource.ServerResource; -import com.cloud.utils.NumbersUtil; import com.cloud.utils.exception.ExecutionException; public class TrafficSentinelResource implements ServerResource { @@ -55,8 +54,8 @@ public class TrafficSentinelResource implements ServerResource { private String _ip; private String _guid; private String _url; - private static Integer _numRetries; - private static Integer _timeoutInSeconds; + private String _inclZones; + private String _exclZones; private static final Logger s_logger = Logger.getLogger(TrafficSentinelResource.class); @@ -87,9 +86,8 @@ public class TrafficSentinelResource implements ServerResource { throw new ConfigurationException("Unable to find url"); } - _numRetries = NumbersUtil.parseInt((String) params.get("numRetries"), 1); - - _timeoutInSeconds = NumbersUtil.parseInt((String) params.get("timeoutInSeconds"), 300); + _inclZones = (String)params.get("inclZones"); + _exclZones = (String)params.get("exclZones"); return true; } catch (Exception e) { @@ -193,6 +191,15 @@ public class TrafficSentinelResource implements ServerResource { try { //Direct Network Usage URL trafficSentinel; + //Use Global include/exclude zones if there are no per TS zones + if(_inclZones == null){ + _inclZones = cmd.getIncludeZones(); + } + + if(_exclZones == null){ + _exclZones = cmd.getExcludeZones(); + } + try { //Query traffic Sentinel trafficSentinel = new URL(_url+"/inmsf/Query?script="+URLEncoder.encode(getScript(cmd.getPublicIps(), cmd.getStart(), cmd.getEnd()),"UTF-8") @@ -243,12 +250,28 @@ public class TrafficSentinelResource implements ServerResource { IpAddresses += ","; } } + String destZoneCondition = ""; + if(_inclZones !=null && !_inclZones.isEmpty()){ + destZoneCondition = " & destinationzone = "+_inclZones; + } + if(_exclZones !=null && !_exclZones.isEmpty()){ + destZoneCondition += " & destinationzone != "+_exclZones; + } + + String srcZoneCondition = ""; + if(_inclZones !=null && !_inclZones.isEmpty()){ + srcZoneCondition = " & sourcezone = "+_inclZones; + } + if(_exclZones !=null && !_exclZones.isEmpty()){ + srcZoneCondition += " & sourcezone != "+_exclZones; + } + String startDate = getDateString(start); String endtDate = getDateString(end); StringBuffer sb = new StringBuffer(); sb.append("var q = Query.topN(\"historytrmx\","); sb.append(" \"ipsource,bytes\","); - sb.append(" \"ipsource = "+IpAddresses+" & destinationzone = EXTERNAL\","); + sb.append(" \"ipsource = "+IpAddresses+destZoneCondition+"\","); sb.append(" \""+startDate+", "+endtDate+"\","); sb.append(" \"bytes\","); sb.append(" 100000);"); @@ -261,7 +284,7 @@ public class TrafficSentinelResource implements ServerResource { sb.append(" });"); sb.append("var q = Query.topN(\"historytrmx\","); sb.append(" \"ipdestination,bytes\","); - sb.append(" \"ipdestination = "+IpAddresses+" & sourcezone = EXTERNAL\","); + sb.append(" \"ipdestination = "+IpAddresses+srcZoneCondition+"\","); sb.append(" \""+startDate+", "+endtDate+"\","); sb.append(" \"bytes\","); sb.append(" 100000);"); diff --git a/server/src/com/cloud/api/commands/AddTrafficMonitorCmd.java b/server/src/com/cloud/api/commands/AddTrafficMonitorCmd.java index 5453ab01375..0d393c7be7e 100644 --- a/server/src/com/cloud/api/commands/AddTrafficMonitorCmd.java +++ b/server/src/com/cloud/api/commands/AddTrafficMonitorCmd.java @@ -46,11 +46,25 @@ public class AddTrafficMonitorCmd extends BaseCmd { @Parameter(name=ApiConstants.URL, type=CommandType.STRING, required = true, description="URL of the traffic monitor Host") private String url; + + @Parameter(name=ApiConstants.INCL_ZONES, type=CommandType.STRING, description="Traffic going into the listed zones will be metered") + private String inclZones; + + @Parameter(name=ApiConstants.EXCL_ZONES, type=CommandType.STRING, description="Traffic going into the listed zones will not be metered") + private String exclZones; /////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// + public String getInclZones() { + return inclZones; + } + + public String getExclZones() { + return exclZones; + } + public Long getZoneId() { return zoneId; } diff --git a/server/src/com/cloud/configuration/Config.java b/server/src/com/cloud/configuration/Config.java index 984f2193cea..868f60771f2 100755 --- a/server/src/com/cloud/configuration/Config.java +++ b/server/src/com/cloud/configuration/Config.java @@ -270,6 +270,8 @@ public enum Config { DirectNetworkStatsInterval("Usage", ManagementServer.class, Integer.class, "direct.network.stats.interval", "86400", "Interval (in seconds) to collect stats from Traffic Monitor", null), UsageSanityCheckInterval("Usage", ManagementServer.class, Integer.class, "usage.sanity.check.interval", null, "Interval (in days) to check sanity of usage data", null), UsageAggregationTimezone("Usage", ManagementServer.class, String.class, "usage.aggregation.timezone", "GMT", "The timezone to use for usage stats aggregation", null), + TrafficSentinelIncludeZones("Usage", ManagementServer.class, Integer.class, "traffic.sentinel.include.zones", "EXTERNAL", "Traffic going into specified list of zones is metered. For metering all traffic leave this parameter empty", null), + TrafficSentinelExcludeZones("Usage", ManagementServer.class, Integer.class, "traffic.sentinel.exclude.zones", "", "Traffic going into specified list of zones is not metered.", null), // Hidden UseSecondaryStorageVm("Hidden", ManagementServer.class, Boolean.class, "secondary.storage.vm", "false", "Deploys a VM per zone to manage secondary storage if true, otherwise secondary storage is mounted on management server", null), diff --git a/server/src/com/cloud/network/NetworkUsageManagerImpl.java b/server/src/com/cloud/network/NetworkUsageManagerImpl.java index a27c0db0f49..6ba0bdbef2a 100755 --- a/server/src/com/cloud/network/NetworkUsageManagerImpl.java +++ b/server/src/com/cloud/network/NetworkUsageManagerImpl.java @@ -104,6 +104,8 @@ public class NetworkUsageManagerImpl implements NetworkUsageManager, ResourceSta @Inject ResourceManager _resourceMgr; ScheduledExecutorService _executor; int _networkStatsInterval; + String _TSinclZones; + String _TSexclZones; protected SearchBuilder AllocatedIpSearch; @Override @@ -144,8 +146,8 @@ public class NetworkUsageManagerImpl implements NetworkUsageManager, ResourceSta hostParams.put("zone", String.valueOf(zoneId)); hostParams.put("ipaddress", ipAddress); hostParams.put("url", cmd.getUrl()); - //hostParams("numRetries", numRetries); - //hostParams("timeout", timeout); + hostParams.put("inclZones", (cmd.getInclZones() != null) ? cmd.getInclZones() : _TSinclZones); + hostParams.put("exclZones", (cmd.getExclZones() != null) ? cmd.getExclZones() : _TSexclZones); hostParams.put("guid", guid); hostParams.put("name", guid); @@ -158,7 +160,14 @@ public class NetworkUsageManagerImpl implements NetworkUsageManager, ResourceSta Map hostDetails = new HashMap(); hostDetails.put("url", cmd.getUrl()); hostDetails.put("last_collection", ""+System.currentTimeMillis()); - + if(cmd.getInclZones() != null){ + hostDetails.put("inclZones", cmd.getInclZones()); + } + if(cmd.getExclZones() != null){ + hostDetails.put("exclZones", cmd.getExclZones()); + } + + Host trafficMonitor = _resourceMgr.addHost(zoneId, resource, Host.Type.TrafficMonitor, hostDetails); return trafficMonitor; } @@ -218,6 +227,8 @@ public class NetworkUsageManagerImpl implements NetworkUsageManager, ResourceSta AllocatedIpSearch.done(); _networkStatsInterval = NumbersUtil.parseInt(_configDao.getValue(Config.DirectNetworkStatsInterval.key()), 86400); + _TSinclZones = _configDao.getValue(Config.TrafficSentinelIncludeZones.key()); + _TSexclZones = _configDao.getValue(Config.TrafficSentinelExcludeZones.key()); _agentMgr.registerForHostEvents(new DirectNetworkStatsListener( _networkStatsInterval), true, false, false); _resourceMgr.registerResourceStateAdapter(this.getClass().getSimpleName(), this); return true; @@ -368,7 +379,7 @@ public class NetworkUsageManagerImpl implements NetworkUsageManager, ResourceSta //Get usage for Ips which were assigned for the entire duration if(fullDurationIpUsage.size() > 0){ - DirectNetworkUsageCommand cmd = new DirectNetworkUsageCommand(IpList, lastCollection, now); + DirectNetworkUsageCommand cmd = new DirectNetworkUsageCommand(IpList, lastCollection, now, _TSinclZones, _TSexclZones); DirectNetworkUsageAnswer answer = (DirectNetworkUsageAnswer) _agentMgr.easySend(host.getId(), cmd); if (answer == null || !answer.getResult()) { String details = (answer != null) ? answer.getDetails() : "details unavailable"; @@ -401,7 +412,7 @@ public class NetworkUsageManagerImpl implements NetworkUsageManager, ResourceSta for(UsageIPAddressVO usageIp : IpPartialUsage){ IpList = new ArrayList() ; IpList.add(usageIp.getAddress()); - DirectNetworkUsageCommand cmd = new DirectNetworkUsageCommand(IpList, usageIp.getAssigned(), usageIp.getReleased()); + DirectNetworkUsageCommand cmd = new DirectNetworkUsageCommand(IpList, usageIp.getAssigned(), usageIp.getReleased(), _TSinclZones, _TSexclZones); DirectNetworkUsageAnswer answer = (DirectNetworkUsageAnswer) _agentMgr.easySend(host.getId(), cmd); if (answer == null || !answer.getResult()) { String details = (answer != null) ? answer.getDetails() : "details unavailable"; @@ -528,8 +539,11 @@ public class NetworkUsageManagerImpl implements NetworkUsageManager, ResourceSta @Override public DeleteHostAnswer deleteHost(HostVO host, boolean isForced, boolean isForceDeleteStorage) throws UnableDeleteHostException { - // TODO Auto-generated method stub - return null; + if(host.getType() != Host.Type.TrafficMonitor){ + return null; + } + + return new DeleteHostAnswer(true); } }