CLOUDSTACK-1289: Added missing usage command processing for External firewall device. ExternalLoadBalancerUsageManagerImpl should be renamed as ExternalDeviceUsageManagerImpl

This commit is contained in:
Kishan Kavala 2013-02-26 17:26:33 +05:30
parent 840650f9ff
commit 0b35f7184d

View File

@ -16,22 +16,6 @@
// under the License. // under the License.
package com.cloud.network; package com.cloud.network;
import java.net.URI;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import javax.ejb.Local;
import javax.inject.Inject;
import javax.naming.ConfigurationException;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
import com.cloud.agent.AgentManager; import com.cloud.agent.AgentManager;
import com.cloud.agent.api.ExternalNetworkResourceUsageAnswer; import com.cloud.agent.api.ExternalNetworkResourceUsageAnswer;
import com.cloud.agent.api.ExternalNetworkResourceUsageCommand; import com.cloud.agent.api.ExternalNetworkResourceUsageCommand;
@ -41,27 +25,30 @@ import com.cloud.dc.DataCenterVO;
import com.cloud.dc.dao.DataCenterDao; import com.cloud.dc.dao.DataCenterDao;
import com.cloud.dc.dao.HostPodDao; import com.cloud.dc.dao.HostPodDao;
import com.cloud.dc.dao.VlanDao; import com.cloud.dc.dao.VlanDao;
import com.cloud.host.DetailVO;
import com.cloud.host.Host; import com.cloud.host.Host;
import com.cloud.host.HostVO; import com.cloud.host.HostVO;
import com.cloud.host.dao.HostDao; import com.cloud.host.dao.HostDao;
import com.cloud.host.dao.HostDetailsDao; import com.cloud.host.dao.HostDetailsDao;
import com.cloud.network.dao.ExternalFirewallDeviceDao; import com.cloud.network.dao.ExternalFirewallDeviceDao;
import com.cloud.network.dao.ExternalFirewallDeviceVO;
import com.cloud.network.dao.ExternalLoadBalancerDeviceDao; import com.cloud.network.dao.ExternalLoadBalancerDeviceDao;
import com.cloud.network.dao.ExternalLoadBalancerDeviceVO; import com.cloud.network.dao.ExternalLoadBalancerDeviceVO;
import com.cloud.network.dao.IPAddressDao; import com.cloud.network.dao.IPAddressDao;
import com.cloud.network.dao.IPAddressVO;
import com.cloud.network.dao.InlineLoadBalancerNicMapDao; import com.cloud.network.dao.InlineLoadBalancerNicMapDao;
import com.cloud.network.dao.InlineLoadBalancerNicMapVO; import com.cloud.network.dao.InlineLoadBalancerNicMapVO;
import com.cloud.network.dao.LoadBalancerDao; import com.cloud.network.dao.LoadBalancerDao;
import com.cloud.network.dao.LoadBalancerVO; import com.cloud.network.dao.LoadBalancerVO;
import com.cloud.network.dao.NetworkDao; import com.cloud.network.dao.NetworkDao;
import com.cloud.network.dao.NetworkExternalFirewallDao; import com.cloud.network.dao.NetworkExternalFirewallDao;
import com.cloud.network.dao.NetworkExternalFirewallVO;
import com.cloud.network.dao.NetworkExternalLoadBalancerDao; import com.cloud.network.dao.NetworkExternalLoadBalancerDao;
import com.cloud.network.dao.NetworkExternalLoadBalancerVO; import com.cloud.network.dao.NetworkExternalLoadBalancerVO;
import com.cloud.network.dao.NetworkServiceMapDao; import com.cloud.network.dao.NetworkServiceMapDao;
import com.cloud.network.dao.NetworkVO; import com.cloud.network.dao.NetworkVO;
import com.cloud.network.dao.PhysicalNetworkDao; import com.cloud.network.dao.PhysicalNetworkDao;
import com.cloud.network.dao.PhysicalNetworkServiceProviderDao; import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
import com.cloud.network.rules.PortForwardingRuleVO;
import com.cloud.network.rules.dao.PortForwardingRulesDao; import com.cloud.network.rules.dao.PortForwardingRulesDao;
import com.cloud.offerings.dao.NetworkOfferingDao; import com.cloud.offerings.dao.NetworkOfferingDao;
import com.cloud.resource.ResourceManager; import com.cloud.resource.ResourceManager;
@ -81,6 +68,20 @@ import com.cloud.vm.DomainRouterVO;
import com.cloud.vm.NicVO; import com.cloud.vm.NicVO;
import com.cloud.vm.dao.DomainRouterDao; import com.cloud.vm.dao.DomainRouterDao;
import com.cloud.vm.dao.NicDao; import com.cloud.vm.dao.NicDao;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
import javax.ejb.Local;
import javax.inject.Inject;
import javax.naming.ConfigurationException;
import java.net.URI;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
@Component @Component
@Local(value = { ExternalLoadBalancerUsageManager.class }) @Local(value = { ExternalLoadBalancerUsageManager.class })
@ -160,7 +161,7 @@ public class ExternalLoadBalancerUsageManagerImpl extends ManagerBase implements
@Override @Override
public boolean start() { public boolean start() {
if (_externalNetworkStatsInterval > 0) { if (_externalNetworkStatsInterval > 0) {
_executor.scheduleAtFixedRate(new ExternalLoadBalancerDeviceNetworkUsageTask(), _externalNetworkStatsInterval, _externalNetworkStatsInterval, TimeUnit.SECONDS); _executor.scheduleAtFixedRate(new ExternalDeviceNetworkUsageTask(), _externalNetworkStatsInterval, _externalNetworkStatsInterval, TimeUnit.SECONDS);
} }
return true; return true;
} }
@ -170,6 +171,11 @@ public class ExternalLoadBalancerUsageManagerImpl extends ManagerBase implements
return true; return true;
} }
@Override
public String getName() {
return _name;
}
private ExternalLoadBalancerDeviceVO getExternalLoadBalancerForNetwork(Network network) { private ExternalLoadBalancerDeviceVO getExternalLoadBalancerForNetwork(Network network) {
NetworkExternalLoadBalancerVO lbDeviceForNetwork = _networkExternalLBDao.findByNetworkId(network.getId()); NetworkExternalLoadBalancerVO lbDeviceForNetwork = _networkExternalLBDao.findByNetworkId(network.getId());
if (lbDeviceForNetwork != null) { if (lbDeviceForNetwork != null) {
@ -181,9 +187,15 @@ public class ExternalLoadBalancerUsageManagerImpl extends ManagerBase implements
return null; return null;
} }
private boolean externalLoadBalancerIsInline(HostVO externalLoadBalancer) { private ExternalFirewallDeviceVO getExternalFirewallForNetwork(Network network) {
DetailVO detail = _hostDetailDao.findDetail(externalLoadBalancer.getId(), "inline"); NetworkExternalFirewallVO fwDeviceForNetwork = _networkExternalFirewallDao.findByNetworkId(network.getId());
return (detail != null && detail.getValue().equals("true")); if (fwDeviceForNetwork != null) {
long fwDeviceId = fwDeviceForNetwork.getExternalFirewallDeviceId();
ExternalFirewallDeviceVO fwDevice = _externalFirewallDeviceDao.findById(fwDeviceId);
assert(fwDevice != null);
return fwDevice;
}
return null;
} }
@Override @Override
@ -204,6 +216,7 @@ public class ExternalLoadBalancerUsageManagerImpl extends ManagerBase implements
} }
return; return;
} }
ExternalLoadBalancerDeviceVO lbDeviceVO = getExternalLoadBalancerForNetwork(network); ExternalLoadBalancerDeviceVO lbDeviceVO = getExternalLoadBalancerForNetwork(network);
if (lbDeviceVO == null) { if (lbDeviceVO == null) {
if(s_logger.isDebugEnabled()){ if(s_logger.isDebugEnabled()){
@ -243,8 +256,8 @@ public class ExternalLoadBalancerUsageManagerImpl extends ManagerBase implements
if (publicIp != null) { if (publicIp != null) {
long[] bytesSentAndReceived = null; long[] bytesSentAndReceived = null;
statsEntryIdentifier += ", public IP: " + publicIp; statsEntryIdentifier += ", public IP: " + publicIp;
boolean inline = _networkMgr.isNetworkInlineMode(network);
if (externalLoadBalancer.getType().equals(Host.Type.ExternalLoadBalancer) && externalLoadBalancerIsInline(externalLoadBalancer)) { if (externalLoadBalancer.getType().equals(Host.Type.ExternalLoadBalancer) && inline) {
// Look up stats for the guest IP address that's mapped to the public IP address // Look up stats for the guest IP address that's mapped to the public IP address
InlineLoadBalancerNicMapVO mapping = _inlineLoadBalancerNicMapDao.findByPublicIpAddress(publicIp); InlineLoadBalancerNicMapVO mapping = _inlineLoadBalancerNicMapDao.findByPublicIpAddress(publicIp);
@ -310,32 +323,32 @@ public class ExternalLoadBalancerUsageManagerImpl extends ManagerBase implements
} }
} }
protected class ExternalLoadBalancerDeviceNetworkUsageTask implements Runnable { protected class ExternalDeviceNetworkUsageTask implements Runnable {
public ExternalLoadBalancerDeviceNetworkUsageTask() { public ExternalDeviceNetworkUsageTask() {
} }
@Override @Override
public void run() { public void run() {
GlobalLock scanLock = GlobalLock.getInternLock("ExternalLoadBalancerUsageManagerImpl"); GlobalLock scanLock = GlobalLock.getInternLock("ExternalDeviceNetworkUsageManagerImpl");
try { try {
if (scanLock.lock(20)) { if (scanLock.lock(20)) {
try { try {
runExternalLoadBalancerNetworkUsageTask(); runExternalDeviceNetworkUsageTask();
} finally { } finally {
scanLock.unlock(); scanLock.unlock();
} }
} }
} catch (Exception e) { } catch (Exception e) {
s_logger.warn("Problems while getting external load balancer device usage", e); s_logger.warn("Problems while getting external device usage", e);
} finally { } finally {
scanLock.releaseRef(); scanLock.releaseRef();
} }
} }
private void runExternalLoadBalancerNetworkUsageTask() { private void runExternalDeviceNetworkUsageTask() {
s_logger.debug("External load balancer devices stats collector is running..."); s_logger.debug("External devices stats collector is running...");
for (DataCenterVO zone : _dcDao.listAll()) { for (DataCenterVO zone : _dcDao.listAll()) {
List<DomainRouterVO> domainRoutersInZone = _routerDao.listByDataCenter(zone.getId()); List<DomainRouterVO> domainRoutersInZone = _routerDao.listByDataCenter(zone.getId());
@ -343,6 +356,7 @@ public class ExternalLoadBalancerUsageManagerImpl extends ManagerBase implements
continue; continue;
} }
Map<Long, ExternalNetworkResourceUsageAnswer> lbDeviceUsageAnswerMap = new HashMap<Long, ExternalNetworkResourceUsageAnswer>(); Map<Long, ExternalNetworkResourceUsageAnswer> lbDeviceUsageAnswerMap = new HashMap<Long, ExternalNetworkResourceUsageAnswer>();
Map<Long, ExternalNetworkResourceUsageAnswer> fwDeviceUsageAnswerMap = new HashMap<Long, ExternalNetworkResourceUsageAnswer>();
List<Long> accountsProcessed = new ArrayList<Long>(); List<Long> accountsProcessed = new ArrayList<Long>();
for (DomainRouterVO domainRouter : domainRoutersInZone) { for (DomainRouterVO domainRouter : domainRoutersInZone) {
@ -368,45 +382,88 @@ public class ExternalLoadBalancerUsageManagerImpl extends ManagerBase implements
continue; continue;
} }
ExternalFirewallDeviceVO fwDeviceVO = getExternalFirewallForNetwork(network);
ExternalLoadBalancerDeviceVO lbDeviceVO = getExternalLoadBalancerForNetwork(network); ExternalLoadBalancerDeviceVO lbDeviceVO = getExternalLoadBalancerForNetwork(network);
if (lbDeviceVO == null) { if (lbDeviceVO == null && fwDeviceVO == null) {
continue; continue;
} }
// Get network stats from the external firewall
ExternalNetworkResourceUsageAnswer firewallAnswer = null;
HostVO externalFirewall = null;
if(fwDeviceVO != null){
externalFirewall = _hostDao.findById(fwDeviceVO.getHostId());
if (externalFirewall != null) {
Long fwDeviceId = new Long(externalFirewall.getId());
if(!fwDeviceUsageAnswerMap.containsKey(fwDeviceId)){
try{
ExternalNetworkResourceUsageCommand cmd = new ExternalNetworkResourceUsageCommand();
firewallAnswer = (ExternalNetworkResourceUsageAnswer) _agentMgr.easySend(externalFirewall.getId(), cmd);
if (firewallAnswer == null || !firewallAnswer.getResult()) {
String details = (firewallAnswer != null) ? firewallAnswer.getDetails() : "details unavailable";
String msg = "Unable to get external firewall stats for network" + zone.getName() + " due to: " + details + ".";
s_logger.error(msg);
} else {
fwDeviceUsageAnswerMap.put(fwDeviceId, firewallAnswer);
}
} catch (Exception e){
String msg = "Unable to get external firewall stats for network" + zone.getName();
s_logger.error(msg, e);
}
} else {
if (s_logger.isTraceEnabled()) {
s_logger.trace("Reusing usage Answer for device id " + fwDeviceId + "for Network " + network.getId());
}
firewallAnswer = fwDeviceUsageAnswerMap.get(fwDeviceId);
}
}}
// Get network stats from the external load balancer // Get network stats from the external load balancer
ExternalNetworkResourceUsageAnswer lbAnswer = null; ExternalNetworkResourceUsageAnswer lbAnswer = null;
HostVO externalLoadBalancer = _hostDao.findById(lbDeviceVO.getHostId()); HostVO externalLoadBalancer = null;
if (externalLoadBalancer != null) { if(lbDeviceVO !=null){
Long lbDeviceId = new Long(externalLoadBalancer.getId()); externalLoadBalancer = _hostDao.findById(lbDeviceVO.getHostId());
if (!lbDeviceUsageAnswerMap.containsKey(lbDeviceId)) { if (externalLoadBalancer != null) {
ExternalNetworkResourceUsageCommand cmd = new ExternalNetworkResourceUsageCommand(); Long lbDeviceId = new Long(externalLoadBalancer.getId());
lbAnswer = (ExternalNetworkResourceUsageAnswer) _agentMgr.easySend(externalLoadBalancer.getId(), cmd); if (!lbDeviceUsageAnswerMap.containsKey(lbDeviceId)) {
if (lbAnswer == null || !lbAnswer.getResult()) { try {
String details = (lbAnswer != null) ? lbAnswer.getDetails() : "details unavailable"; ExternalNetworkResourceUsageCommand cmd = new ExternalNetworkResourceUsageCommand();
String msg = "Unable to get external load balancer stats for " + zone.getName() + " due to: " + details + "."; lbAnswer = (ExternalNetworkResourceUsageAnswer) _agentMgr.easySend(externalLoadBalancer.getId(), cmd);
s_logger.error(msg); if (lbAnswer == null || !lbAnswer.getResult()) {
continue; String details = (lbAnswer != null) ? lbAnswer.getDetails() : "details unavailable";
String msg = "Unable to get external load balancer stats for " + zone.getName() + " due to: " + details + ".";
s_logger.error(msg);
} else {
lbDeviceUsageAnswerMap.put(lbDeviceId, lbAnswer);
}
} catch (Exception e){
String msg = "Unable to get external load balancer stats for " + zone.getName();
s_logger.error(msg, e);
}
} else {
if (s_logger.isTraceEnabled()) {
s_logger.trace("Reusing usage Answer for device id " + lbDeviceId + "for Network " + network.getId());
}
lbAnswer = lbDeviceUsageAnswerMap.get(lbDeviceId);
} }
lbDeviceUsageAnswerMap.put(lbDeviceId, lbAnswer);
} else {
if (s_logger.isTraceEnabled()) {
s_logger.trace("Reusing usage Answer for device id " + lbDeviceId + "for Network " + network.getId());
}
lbAnswer = lbDeviceUsageAnswerMap.get(lbDeviceId);
} }
} }
if(firewallAnswer == null && lbAnswer == null){
continue;
}
AccountVO account = _accountDao.findById(accountId); AccountVO account = _accountDao.findById(accountId);
if (account == null) { if (account == null) {
s_logger.debug("Skipping stats update for account with ID " + accountId); s_logger.debug("Skipping stats update for account with ID " + accountId);
continue; continue;
} }
if (!manageStatsEntries(true, accountId, zoneId, network, externalLoadBalancer, lbAnswer)) { if (!manageStatsEntries(true, accountId, zoneId, network, externalFirewall, firewallAnswer, externalLoadBalancer, lbAnswer)) {
continue; continue;
} }
manageStatsEntries(false, accountId, zoneId, network, externalLoadBalancer, lbAnswer); manageStatsEntries(false, accountId, zoneId, network, externalFirewall, firewallAnswer, externalLoadBalancer, lbAnswer);
} }
accountsProcessed.add(new Long(accountId)); accountsProcessed.add(new Long(accountId));
@ -448,7 +505,7 @@ public class ExternalLoadBalancerUsageManagerImpl extends ManagerBase implements
} }
// Updates an existing stats entry with new data from the specified usage answer. // Updates an existing stats entry with new data from the specified usage answer.
private boolean updateStatsEntry(long accountId, long zoneId, long networkId, String publicIp, long hostId, ExternalNetworkResourceUsageAnswer answer) { private boolean updateStatsEntry(long accountId, long zoneId, long networkId, String publicIp, long hostId, ExternalNetworkResourceUsageAnswer answer, boolean inline) {
AccountVO account = _accountDao.findById(accountId); AccountVO account = _accountDao.findById(accountId);
DataCenterVO zone = _dcDao.findById(zoneId); DataCenterVO zone = _dcDao.findById(zoneId);
NetworkVO network = _networkDao.findById(networkId); NetworkVO network = _networkDao.findById(networkId);
@ -462,7 +519,7 @@ public class ExternalLoadBalancerUsageManagerImpl extends ManagerBase implements
long[] bytesSentAndReceived = null; long[] bytesSentAndReceived = null;
statsEntryIdentifier += ", public IP: " + publicIp; statsEntryIdentifier += ", public IP: " + publicIp;
if (host.getType().equals(Host.Type.ExternalLoadBalancer) && externalLoadBalancerIsInline(host)) { if (host.getType().equals(Host.Type.ExternalLoadBalancer) && inline) {
// Look up stats for the guest IP address that's mapped to the public IP address // Look up stats for the guest IP address that's mapped to the public IP address
InlineLoadBalancerNicMapVO mapping = _inlineLoadBalancerNicMapDao.findByPublicIpAddress(publicIp); InlineLoadBalancerNicMapVO mapping = _inlineLoadBalancerNicMapDao.findByPublicIpAddress(publicIp);
@ -520,11 +577,11 @@ public class ExternalLoadBalancerUsageManagerImpl extends ManagerBase implements
} }
} }
private boolean createOrUpdateStatsEntry(boolean create, long accountId, long zoneId, long networkId, String publicIp, long hostId, ExternalNetworkResourceUsageAnswer answer) { private boolean createOrUpdateStatsEntry(boolean create, long accountId, long zoneId, long networkId, String publicIp, long hostId, ExternalNetworkResourceUsageAnswer answer, boolean inline) {
if (create) { if (create) {
return createStatsEntry(accountId, zoneId, networkId, publicIp, hostId); return createStatsEntry(accountId, zoneId, networkId, publicIp, hostId);
} else { } else {
return updateStatsEntry(accountId, zoneId, networkId, publicIp, hostId, answer); return updateStatsEntry(accountId, zoneId, networkId, publicIp, hostId, answer, inline);
} }
} }
@ -534,19 +591,66 @@ public class ExternalLoadBalancerUsageManagerImpl extends ManagerBase implements
* balancing rules * balancing rules
*/ */
private boolean manageStatsEntries(boolean create, long accountId, long zoneId, Network network, private boolean manageStatsEntries(boolean create, long accountId, long zoneId, Network network,
HostVO externalLoadBalancer, ExternalNetworkResourceUsageAnswer lbAnswer) { HostVO externalFirewall, ExternalNetworkResourceUsageAnswer firewallAnswer,
HostVO externalLoadBalancer, ExternalNetworkResourceUsageAnswer lbAnswer) {
String accountErrorMsg = "Failed to update external network stats entry. Details: account ID = " + accountId; String accountErrorMsg = "Failed to update external network stats entry. Details: account ID = " + accountId;
Transaction txn = Transaction.open(Transaction.CLOUD_DB); Transaction txn = Transaction.open(Transaction.CLOUD_DB);
try { try {
txn.start(); txn.start();
String networkErrorMsg = accountErrorMsg + ", network ID = " + network.getId(); String networkErrorMsg = accountErrorMsg + ", network ID = " + network.getId();
boolean sharedSourceNat = false;
Map<Network.Capability, String> sourceNatCapabilities = _networkMgr.getNetworkServiceCapabilities(network.getId(), Network.Service.SourceNat);
if (sourceNatCapabilities != null) {
String supportedSourceNatTypes = sourceNatCapabilities.get(Network.Capability.SupportedSourceNatTypes).toLowerCase();
if (supportedSourceNatTypes.contains("zone")) {
sharedSourceNat = true;
}
}
if(externalFirewall != null && firewallAnswer != null){
if (!sharedSourceNat) {
// Manage the entry for this network's source NAT IP address
List<IPAddressVO> sourceNatIps = _ipAddressDao.listByAssociatedNetwork(network.getId(), true);
if (sourceNatIps.size() == 1) {
String publicIp = sourceNatIps.get(0).getAddress().addr();
if (!createOrUpdateStatsEntry(create, accountId, zoneId, network.getId(), publicIp, externalFirewall.getId(), firewallAnswer, false)) {
throw new ExecutionException(networkErrorMsg + ", source NAT IP = " + publicIp);
}
}
// Manage one entry for each static NAT rule in this network
List<IPAddressVO> staticNatIps = _ipAddressDao.listStaticNatPublicIps(network.getId());
for (IPAddressVO staticNatIp : staticNatIps) {
String publicIp = staticNatIp.getAddress().addr();
if (!createOrUpdateStatsEntry(create, accountId, zoneId, network.getId(), publicIp, externalFirewall.getId(), firewallAnswer, false)) {
throw new ExecutionException(networkErrorMsg + ", static NAT rule public IP = " + publicIp);
}
}
// Manage one entry for each port forwarding rule in this network
List<PortForwardingRuleVO> portForwardingRules = _portForwardingRulesDao.listByNetwork(network.getId());
for (PortForwardingRuleVO portForwardingRule : portForwardingRules) {
String publicIp = _networkMgr.getIp(portForwardingRule.getSourceIpAddressId()).getAddress().addr();
if (!createOrUpdateStatsEntry(create, accountId, zoneId, network.getId(), publicIp, externalFirewall.getId(), firewallAnswer, false)) {
throw new ExecutionException(networkErrorMsg + ", port forwarding rule public IP = " + publicIp);
}
}
} else {
// Manage the account-wide entry for the external firewall
if (!createOrUpdateStatsEntry(create, accountId, zoneId, network.getId(), null, externalFirewall.getId(), firewallAnswer, false)) {
throw new ExecutionException(networkErrorMsg);
}
}
}
// If an external load balancer is added, manage one entry for each load balancing rule in this network // If an external load balancer is added, manage one entry for each load balancing rule in this network
if (externalLoadBalancer != null && lbAnswer != null) { if (externalLoadBalancer != null && lbAnswer != null) {
boolean inline = _networkMgr.isNetworkInlineMode(network);
List<LoadBalancerVO> loadBalancers = _loadBalancerDao.listByNetworkId(network.getId()); List<LoadBalancerVO> loadBalancers = _loadBalancerDao.listByNetworkId(network.getId());
for (LoadBalancerVO loadBalancer : loadBalancers) { for (LoadBalancerVO loadBalancer : loadBalancers) {
String publicIp = _networkMgr.getIp(loadBalancer.getSourceIpAddressId()).getAddress().addr(); String publicIp = _networkMgr.getIp(loadBalancer.getSourceIpAddressId()).getAddress().addr();
if (!createOrUpdateStatsEntry(create, accountId, zoneId, network.getId(), publicIp, externalLoadBalancer.getId(), lbAnswer)) { if (!createOrUpdateStatsEntry(create, accountId, zoneId, network.getId(), publicIp, externalLoadBalancer.getId(), lbAnswer, inline)) {
throw new ExecutionException(networkErrorMsg + ", load balancing rule public IP = " + publicIp); throw new ExecutionException(networkErrorMsg + ", load balancing rule public IP = " + publicIp);
} }
} }
@ -561,4 +665,5 @@ public class ExternalLoadBalancerUsageManagerImpl extends ManagerBase implements
} }
} }
} }
} }