Changed to use resource manager

This commit is contained in:
Alex Huang 2011-11-10 15:50:08 -08:00
parent d6c22c42fe
commit 3ecceedf34
1 changed files with 134 additions and 128 deletions

View File

@ -1,6 +1,6 @@
/**
* * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved
*
*
*
* This software is licensed under the GNU General Public License v3 or later.
*
@ -111,7 +111,7 @@ import com.cloud.network.rules.StaticNatRule;
import com.cloud.network.rules.StaticNatRuleImpl;
import com.cloud.network.rules.dao.PortForwardingRulesDao;
import com.cloud.offerings.dao.NetworkOfferingDao;
import com.cloud.offerings.dao.NetworkOfferingServiceMapDao;
import com.cloud.resource.ResourceManager;
import com.cloud.resource.ServerResource;
import com.cloud.server.api.response.ExternalFirewallResponse;
import com.cloud.server.api.response.ExternalLoadBalancerResponse;
@ -177,13 +177,14 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
@Inject ExternalFirewallDeviceDao _externalFirewallDeviceDao;
@Inject NetworkExternalLoadBalancerDao _networkExternalLBDao;
@Inject NetworkExternalFirewallDao _networkExternalFirewallDao;
@Inject ResourceManager _resourceMgr;
ScheduledExecutorService _executor;
int _externalNetworkStatsInterval;
private static final org.apache.log4j.Logger s_logger = Logger.getLogger(ExternalNetworkDeviceManagerImpl.class);
protected String _name;
@Override
public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
_name = name;
@ -193,7 +194,7 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
}
return true;
}
@Override
public boolean start() {
if (_externalNetworkStatsInterval > 0){
@ -211,14 +212,14 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
public String getName() {
return _name;
}
@Override
public Host addNetworkDevice(AddNetworkDeviceCmd cmd) {
Map paramList = cmd.getParamList();
if (paramList == null) {
throw new CloudRuntimeException("Parameter list is null");
}
Collection paramsCollection = paramList.values();
HashMap params = (HashMap) (paramsCollection.toArray())[0];
if (cmd.getType().equalsIgnoreCase(NetworkDevice.ExternalDhcp.getName())) {
@ -292,35 +293,36 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
} else {
throw new CloudRuntimeException("Unsupported network device type:" + host.getType());
}
response.setId(device.getId());
return response;
}
private List<Host> listNetworkDevice(Long zoneId, Long physicalNetworkId, Long podId, Host.Type type) {
List<Host> res = new ArrayList<Host>();
if (podId != null) {
List<HostVO> devs = _hostDao.listBy(type, null, podId, zoneId);
if (devs.size() == 1) {
res.add(devs.get(0));
} else {
s_logger.debug("List " + type + ": " + devs.size() + " found");
}
} else {
List<HostVO> devs = _hostDao.listBy(type, zoneId);
res.addAll(devs);
}
return res;
// List<Host> res = new ArrayList<Host>();
// if (podId != null) {
// List<HostVO> devs = _hostDao.listBy(type, null, podId, zoneId);
// if (devs.size() == 1) {
// res.add(devs.get(0));
// } else {
// s_logger.debug("List " + type + ": " + devs.size() + " found");
// }
// } else {
// List<HostVO> devs = _hostDao.listBy(type, zoneId);
// res.addAll(devs);
// }
//
// return res;
return null;
}
@Override
public List<Host> listNetworkDevice(ListNetworkDeviceCmd cmd) {
Map paramList = cmd.getParamList();
if (paramList == null) {
throw new CloudRuntimeException("Parameter list is null");
}
List<Host> res;
Collection paramsCollection = paramList.values();
HashMap params = (HashMap) (paramsCollection.toArray())[0];
@ -361,21 +363,21 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
} else {
throw new CloudRuntimeException("Unknown network device type:" + cmd.getType());
}
return res;
}
@Override
public boolean deleteNetworkDevice(DeleteNetworkDeviceCmd cmd) {
HostVO device = _hostDao.findById(cmd.getId());
if (device.getType() == Type.ExternalLoadBalancer) {
return deleteExternalLoadBalancer(cmd.getId());
} else if (device.getType() == Type.ExternalLoadBalancer) {
return deleteExternalFirewall(cmd.getId());
}
return true;
HostVO device = _hostDao.findById(cmd.getId());
if (device.getType() == Type.ExternalLoadBalancer) {
return deleteExternalLoadBalancer(cmd.getId());
} else if (device.getType() == Type.ExternalLoadBalancer) {
return deleteExternalFirewall(cmd.getId());
}
return true;
}
public String getExternalNetworkResourceGuid(long zoneId, ExternalNetworkResourceName name, String ip) {
return zoneId + "-" + name + "-" + ip;
}
@ -392,7 +394,7 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
}
protected HostVO getExternalFirewallForNetwork(Network network) {
NetworkExternalFirewallVO fwDeviceForNetwork = _networkExternalFirewallDao.findByNetworkId(network.getId());
NetworkExternalFirewallVO fwDeviceForNetwork = _networkExternalFirewallDao.findByNetworkId(network.getId());
if (fwDeviceForNetwork != null) {
long fwDeviceId = fwDeviceForNetwork.getExternalFirewallDeviceId();
ExternalFirewallDeviceVO fwDeviceVO = _externalFirewallDeviceDao.findById(fwDeviceId);
@ -477,7 +479,7 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
String url=null;
String username=null;
String password=null;
if (deviceParamList != null) {
url = (String) deviceParamList.get(ApiConstants.URL);
username = (String) deviceParamList.get(ApiConstants.USERNAME);
@ -527,7 +529,7 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
}
String ipAddress = uri.getHost();
Map<String, String> params = new HashMap<String, String>();
UrlUtil.parseQueryParameters(uri.getQuery(), true, params);
String publicInterface = params.get("publicinterface");
@ -576,7 +578,7 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
throw new CloudRuntimeException(e.getMessage());
}
Host host = _agentMgr.addHost(zoneId, resource, Host.Type.ExternalLoadBalancer, hostDetails);
Host host = _resourceMgr.addHost(zoneId, resource, Host.Type.ExternalLoadBalancer, hostDetails);
if (host != null) {
Transaction txn = Transaction.currentTxn();
txn.start();
@ -602,7 +604,7 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
}
try {
if (_agentMgr.maintain(hostId) && _agentMgr.deleteHost(hostId, false, false, caller)) {
if (_resourceMgr.maintain(hostId) && _resourceMgr.deleteHost(hostId, false, false)) {
// FIXME: device maintenance , rules reprogramming
DataCenterVO zone = _dcDao.findById(externalLoadBalancer.getDataCenterId());
return _dcDao.update(zone.getId(), zone);
@ -622,7 +624,7 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
lbHosts.addAll(listExternalLoadBalancers(cmd.getZoneId(), null, NetworkDevice.F5BigIpLoadBalancer.getName()));
return lbHosts;
}
public List<Host> listExternalLoadBalancers(Long zoneId, Long physicalNetworkId, String deviceName) {
List<Host> lbHosts = new ArrayList<Host>();
List<Host> lbHostsInZone = new ArrayList<Host>();
@ -644,7 +646,7 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
if (_dcDao.findById(zoneId) == null) {
throw new InvalidParameterValueException("Could not find zone with ID: " + zoneId);
}
lbHostsInZone.addAll(_hostDao.listByTypeDataCenter(Host.Type.ExternalLoadBalancer, zoneId));
lbHostsInZone.addAll(_resourceMgr.listAllHostsInOneZoneByType(Host.Type.ExternalLoadBalancer, zoneId));
}
if (physicalNetworkId == null) {
return lbHostsInZone;
@ -696,7 +698,7 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
long externalLoadBalancerId = findSuitableLBDeviceForNetwork(guestConfig);
NetworkExternalLoadBalancerVO networkLB = new NetworkExternalLoadBalancerVO(guestConfig.getId(), externalLoadBalancerId);
_networkExternalLBDao.persist(networkLB);
ExternalLoadBalancerDeviceVO device = _externalLoadBalancerDeviceDao.findById(externalLoadBalancerId);
externalLoadBalancer = _hostDao.findById(device.getHostId());
} finally {
@ -796,13 +798,13 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
if (mapping == null) {
// Acquire a new guest IP address and save it as the load balancing IP address
String loadBalancingIpAddress = _networkMgr.acquireGuestIpAddress(network, null);
if (loadBalancingIpAddress == null) {
String msg = "Ran out of guest IP addresses.";
s_logger.error(msg);
throw new ResourceUnavailableException(msg, DataCenter.class, network.getDataCenterId());
}
// If a NIC doesn't exist for the load balancing IP address, create one
loadBalancingIpNic = _nicDao.findByIp4Address(loadBalancingIpAddress);
if (loadBalancingIpNic == null) {
@ -812,7 +814,7 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
// Save a mapping between the source IP address and the load balancing IP address NIC
mapping = new InlineLoadBalancerNicMapVO(rule.getId(), srcIp, loadBalancingIpNic.getId());
_inlineLoadBalancerNicMapDao.persist(mapping);
// On the external firewall, create a static NAT rule between the source IP address and the load balancing IP address
applyStaticNatRuleForInlineLBRule(zone, network, externalFirewall, revoked, srcIp, loadBalancingIpNic.getIp4Address());
} else {
@ -822,13 +824,13 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
if (mapping != null) {
// Find the NIC that the mapping refers to
loadBalancingIpNic = _nicDao.findById(mapping.getNicId());
// On the external firewall, delete the static NAT rule between the source IP address and the load balancing IP address
applyStaticNatRuleForInlineLBRule(zone, network, externalFirewall, revoked, srcIp, loadBalancingIpNic.getIp4Address());
// Delete the mapping between the source IP address and the load balancing IP address
_inlineLoadBalancerNicMapDao.expunge(mapping.getId());
// Delete the NIC
_nicDao.expunge(loadBalancingIpNic.getId());
} else {
@ -836,11 +838,11 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
continue;
}
}
// Change the source IP address for the load balancing rule to be the load balancing IP address
srcIp = loadBalancingIpNic.getIp4Address();
}
if (destinations != null && !destinations.isEmpty()) {
LoadBalancerTO loadBalancer = new LoadBalancerTO(srcIp, srcPort, protocol, algorithm, revoked, false, destinations);
loadBalancersToApply.add(loadBalancer);
@ -864,7 +866,7 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
return true;
}
@Override
@Deprecated // should use more generic addNetworkDevice command to add firewall
public Host addExternalFirewall(AddExternalFirewallCmd cmd) {
@ -877,7 +879,7 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
deviceParams.put(ApiConstants.PASSWORD, cmd.getPassword());
return addExternalFirewall(zoneId, null, deviceType, deviceParams);
}
public Host addExternalFirewall(Long zoneId, Long physicalNetworkId, String deviceName, Map deviceParamList) {
PhysicalNetworkVO pNetwork=null;
@ -886,7 +888,7 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
String url=null;
String username=null;
String password=null;
if (deviceParamList != null) {
url = (String) deviceParamList.get(ApiConstants.URL);
username = (String) deviceParamList.get(ApiConstants.USERNAME);
@ -983,7 +985,7 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
}
if (deviceName ==null) {
deviceName = NetworkDevice.JuniperSRXFirewall.getName(); //default it to Juniper for now
deviceName = NetworkDevice.JuniperSRXFirewall.getName(); //default it to Juniper for now
}
if (deviceName.equalsIgnoreCase(NetworkDevice.JuniperSRXFirewall.getName())) {
resource = new JuniperSrxResource();
@ -991,7 +993,7 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
} else {
throw new CloudRuntimeException("An unsupported networt device type is added as external firewall.");
}
Map hostDetails = new HashMap<String, String>();
hostDetails.put("zoneId", String.valueOf(zoneId));
hostDetails.put("ip", ipAddress);
@ -1016,7 +1018,7 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
throw new CloudRuntimeException(e.getMessage());
}
Host externalFirewall = _agentMgr.addHost(zoneId, resource, Host.Type.ExternalFirewall, hostDetails);
Host externalFirewall = _resourceMgr.addHost(zoneId, resource, Host.Type.ExternalFirewall, hostDetails);
if (externalFirewall != null) {
Transaction txn = Transaction.currentTxn();
txn.start();
@ -1034,7 +1036,7 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
public boolean deleteExternalFirewall(DeleteExternalFirewallCmd cmd) {
return deleteExternalFirewall(cmd.getId());
}
public boolean deleteExternalFirewall(Long hostId) {
User caller = _accountMgr.getActiveUser(UserContext.current().getCallerUserId());
HostVO externalFirewall = _hostDao.findById(hostId);
@ -1044,7 +1046,7 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
try {
// FIXME: device maintenance , rules reprogramming
if (_agentMgr.maintain(hostId) && _agentMgr.deleteHost(hostId, false, false, caller)) {
if (_resourceMgr.maintain(hostId) && _resourceMgr.deleteHost(hostId, false, false)) {
return true;
} else {
return false;
@ -1084,7 +1086,7 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
if (_dcDao.findById(zoneId) == null) {
throw new InvalidParameterValueException("Could not find zone with ID: " + zoneId);
}
firewallhostsInZone.addAll(_hostDao.listByTypeDataCenter(Host.Type.ExternalFirewall, zoneId));
firewallhostsInZone.addAll(_resourceMgr.listAllHostsInOneZoneByType(Host.Type.ExternalFirewall, zoneId));
}
if (physicalNetworkId == null) {
return firewallhostsInZone;
@ -1099,7 +1101,7 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
}
return firewallHosts;
}
@Override
public ExternalFirewallResponse createExternalFirewallResponse(Host externalFirewall) {
Map<String, String> fwDetails = _detailsDao.findDetails(externalFirewall.getId());
@ -1147,11 +1149,11 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
deviceMapLock.releaseRef();
}
} else {
externalFirewall = getExternalFirewallForNetwork(network);
externalFirewall = getExternalFirewallForNetwork(network);
}
Account account = _accountDao.findByIdIncludingRemoved(network.getAccountId());
boolean sharedSourceNat = false;
Map<Network.Capability, String> sourceNatCapabilities = _networkMgr.getNetworkServiceCapabilities(network.getId(), Service.SourceNat);
if (sourceNatCapabilities != null) {
@ -1160,7 +1162,7 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
sharedSourceNat = true;
}
}
IPAddressVO sourceNatIp = null;
if (!sharedSourceNat) {
// Get the source NAT IP address for this network
@ -1180,7 +1182,7 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
String guestVlanGateway = network.getGateway();
String guestVlanCidr = network.getCidr();
String sourceNatIpAddress = sourceNatIp.getAddress().addr();
VlanVO publicVlan = _vlanDao.findById(sourceNatIp.getVlanId());
String publicVlanTag = publicVlan.getVlanTag();
@ -1209,19 +1211,19 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
// Insert a new NIC for this guest network to reserve the gateway address
savePlaceholderNic(network, network.getGateway());
}
// Delete any mappings used for inline external load balancers in this network
List<NicVO> nicsInNetwork = _nicDao.listByNetworkId(network.getId());
for (NicVO nic : nicsInNetwork) {
InlineLoadBalancerNicMapVO mapping = _inlineLoadBalancerNicMapDao.findByNicId(nic.getId());
if (mapping != null) {
_nicDao.expunge(mapping.getNicId());
_inlineLoadBalancerNicMapDao.expunge(mapping.getId());
}
}
String action = add ? "implemented" : "shut down";
s_logger.debug("External firewall has " + action + " the guest network for account " + account.getAccountName() + "(id = " + account.getAccountId() + ") with VLAN tag " + guestVlanTag);
@ -1299,81 +1301,83 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
public boolean applyIps(Network network, List<? extends PublicIpAddress> ipAddresses) throws ResourceUnavailableException {
return true;
}
@Override
public boolean manageRemoteAccessVpn(boolean create, Network network, RemoteAccessVpn vpn) throws ResourceUnavailableException {
HostVO externalFirewall = getExternalFirewallForNetwork(network);
if (externalFirewall == null) {
return false;
}
// Create/delete VPN
IpAddress ip = _networkMgr.getIp(vpn.getServerAddressId());
// Mask the IP range with the network's VLAN tag
String[] ipRange = vpn.getIpRange().split("-");
DataCenterVO zone = _dcDao.findById(network.getDataCenterId());
int vlanTag = Integer.parseInt(network.getBroadcastUri().getHost());
int offset = getVlanOffset(network.getPhysicalNetworkId(), vlanTag);
int cidrSize = getGloballyConfiguredCidrSize();
for (int i = 0; i < 2; i++) {
ipRange[i] = NetUtils.long2Ip((NetUtils.ip2Long(ipRange[i]) & 0xff000000) | (offset << (32 - cidrSize)));
}
String maskedIpRange = ipRange[0] + "-" + ipRange[1];
RemoteAccessVpnCfgCommand createVpnCmd = new RemoteAccessVpnCfgCommand(create, ip.getAddress().addr(), vpn.getLocalIp(), maskedIpRange, vpn.getIpsecPresharedKey());
createVpnCmd.setAccessDetail(NetworkElementCommand.ACCOUNT_ID, String.valueOf(network.getAccountId()));
createVpnCmd.setAccessDetail(NetworkElementCommand.GUEST_NETWORK_CIDR, network.getCidr());
Answer answer = _agentMgr.easySend(externalFirewall.getId(), createVpnCmd);
if (answer == null || !answer.getResult()) {
String details = (answer != null) ? answer.getDetails() : "details unavailable";
String msg = "External firewall was unable to create a remote access VPN in zone " + zone.getName() + " due to: " + details + ".";
s_logger.error(msg);
throw new ResourceUnavailableException(msg, DataCenter.class, zone.getId());
String details = (answer != null) ? answer.getDetails() : "details unavailable";
String msg = "External firewall was unable to create a remote access VPN in zone " + zone.getName() + " due to: " + details + ".";
s_logger.error(msg);
throw new ResourceUnavailableException(msg, DataCenter.class, zone.getId());
}
// Add/delete users
List<VpnUserVO> vpnUsers = _vpnUsersDao.listByAccount(vpn.getAccountId());
return manageRemoteAccessVpnUsers(network, vpn, vpnUsers);
}
@Override
public boolean manageRemoteAccessVpnUsers(Network network, RemoteAccessVpn vpn, List<? extends VpnUser> vpnUsers) throws ResourceUnavailableException {
HostVO externalFirewall = getExternalFirewallForNetwork(network);
if (externalFirewall == null) {
return false;
}
List<VpnUser> addUsers = new ArrayList<VpnUser>();
List<VpnUser> removeUsers = new ArrayList<VpnUser>();
for (VpnUser user : vpnUsers) {
if (user.getState() == VpnUser.State.Add ||
user.getState() == VpnUser.State.Active) {
user.getState() == VpnUser.State.Active) {
addUsers.add(user);
} else if (user.getState() == VpnUser.State.Revoke) {
removeUsers.add(user);
}
}
VpnUsersCfgCommand addUsersCmd = new VpnUsersCfgCommand(addUsers, removeUsers);
addUsersCmd.setAccessDetail(NetworkElementCommand.ACCOUNT_ID, String.valueOf(network.getAccountId()));
addUsersCmd.setAccessDetail(NetworkElementCommand.GUEST_NETWORK_CIDR, network.getCidr());
Answer answer = _agentMgr.easySend(externalFirewall.getId(), addUsersCmd);
if (answer == null || !answer.getResult()) {
String details = (answer != null) ? answer.getDetails() : "details unavailable";
DataCenterVO zone = _dcDao.findById(network.getDataCenterId());
String msg = "External firewall was unable to add remote access users in zone " + zone.getName() + " due to: " + details + ".";
s_logger.error(msg);
throw new ResourceUnavailableException(msg, DataCenter.class, zone.getId());
String details = (answer != null) ? answer.getDetails() : "details unavailable";
DataCenterVO zone = _dcDao.findById(network.getDataCenterId());
String msg = "External firewall was unable to add remote access users in zone " + zone.getName() + " due to: " + details + ".";
s_logger.error(msg);
throw new ResourceUnavailableException(msg, DataCenter.class, zone.getId());
}
return true;
}
private void applyStaticNatRuleForInlineLBRule(DataCenterVO zone, Network network, HostVO externalFirewall, boolean revoked, String publicIp, String privateIp) throws ResourceUnavailableException {
List<StaticNatRuleTO> staticNatRules = new ArrayList<StaticNatRuleTO>();
IPAddressVO ipVO = _ipAddressDao.listByDcIdIpAddress(zone.getId(), publicIp).get(0);
@ -1384,15 +1388,16 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
StaticNatRule rule = new StaticNatRuleImpl(fwRule, privateIp);
StaticNatRuleTO ruleTO = new StaticNatRuleTO(rule, vlan.getVlanTag(), publicIp, privateIp);
staticNatRules.add(ruleTO);
applyStaticNatRules(staticNatRules, zone, externalFirewall.getId());
}
private boolean externalLoadBalancerIsInline(HostVO externalLoadBalancer) {
DetailVO detail = _detailsDao.findDetail(externalLoadBalancer.getId(), "inline");
return (detail != null && detail.getValue().equals("true"));
}
@Override
public int getVlanOffset(long physicalNetworkId, int vlanTag) {
PhysicalNetworkVO pNetwork = _physicalNetworkDao.findById(physicalNetworkId);
if (pNetwork == null) {
@ -1406,7 +1411,7 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
int lowestVlanTag = Integer.valueOf(vlanRange[0]);
return vlanTag - lowestVlanTag;
}
private NicVO savePlaceholderNic(Network network, String ipAddress) {
NicVO nic = new NicVO(null, null, network.getId(), null);
nic.setIp4Address(ipAddress);
@ -1414,7 +1419,8 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
nic.setState(State.Reserved);
return _nicDao.persist(nic);
}
@Override
public int getGloballyConfiguredCidrSize() {
try {
String globalVlanBits = _configDao.getValue(Config.GuestVlanBits.key());
@ -1423,34 +1429,34 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
throw new CloudRuntimeException("Failed to read the globally configured VLAN bits size.");
}
}
protected class ExternalNetworkUsageTask implements Runnable {
public ExternalNetworkUsageTask() {
}
private boolean updateBytes(UserStatisticsVO userStats, long newCurrentBytesSent, long newCurrentBytesReceived) {
long oldNetBytesSent = userStats.getNetBytesSent();
long oldNetBytesReceived = userStats.getNetBytesReceived();
long oldCurrentBytesSent = userStats.getCurrentBytesSent();
long oldCurrentBytesReceived = userStats.getCurrentBytesReceived();
String warning = "Received an external network stats byte count that was less than the stored value. Zone ID: " + userStats.getDataCenterId() + ", account ID: " + userStats.getAccountId() + ".";
userStats.setCurrentBytesSent(newCurrentBytesSent);
if (oldCurrentBytesSent > newCurrentBytesSent) {
s_logger.warn(warning + "Stored bytes sent: " + oldCurrentBytesSent + ", new bytes sent: " + newCurrentBytesSent + ".");
userStats.setNetBytesSent(oldNetBytesSent + oldCurrentBytesSent);
}
userStats.setCurrentBytesReceived(newCurrentBytesReceived);
if (oldCurrentBytesReceived > newCurrentBytesReceived) {
s_logger.warn(warning + "Stored bytes received: " + oldCurrentBytesReceived + ", new bytes received: " + newCurrentBytesReceived + ".");
userStats.setNetBytesReceived(oldNetBytesReceived + oldCurrentBytesReceived);
}
return _userStatsDao.update(userStats.getId(), userStats);
}
/*
* Creates a new stats entry for the specified parameters, if one doesn't already exist.
*/
@ -1463,7 +1469,7 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
return true;
}
}
/*
* Updates an existing stats entry with new data from the specified usage answer.
*/
@ -1473,23 +1479,23 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
NetworkVO network = _networkDao.findById(networkId);
HostVO host = _hostDao.findById(hostId);
String statsEntryIdentifier = "account " + account.getAccountName() + ", zone " + zone.getName() + ", network ID " + networkId + ", host ID " + host.getName();
long newCurrentBytesSent = 0;
long newCurrentBytesReceived = 0;
if (publicIp != null) {
long[] bytesSentAndReceived = null;
statsEntryIdentifier += ", public IP: " + publicIp;
if (host.getType().equals(Host.Type.ExternalLoadBalancer) && externalLoadBalancerIsInline(host)) {
// Look up stats for the guest IP address that's mapped to the public IP address
InlineLoadBalancerNicMapVO mapping = _inlineLoadBalancerNicMapDao.findByPublicIpAddress(publicIp);
if (mapping != null) {
NicVO nic = _nicDao.findById(mapping.getNicId());
String loadBalancingIpAddress = nic.getIp4Address();
bytesSentAndReceived = answer.ipBytes.get(loadBalancingIpAddress);
if (bytesSentAndReceived != null) {
bytesSentAndReceived[0] = 0;
}
@ -1497,7 +1503,7 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
} else {
bytesSentAndReceived = answer.ipBytes.get(publicIp);
}
if (bytesSentAndReceived == null) {
s_logger.debug("Didn't get an external network usage answer for public IP " + publicIp);
} else {
@ -1512,7 +1518,7 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
} else {
long vlanTag = Integer.parseInt(broadcastURI.getHost());
long[] bytesSentAndReceived = answer.guestVlanBytes.get(String.valueOf(vlanTag));
if (bytesSentAndReceived == null) {
s_logger.warn("Didn't get an external network usage answer for guest VLAN " + vlanTag);
} else {
@ -1521,7 +1527,7 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
}
}
}
UserStatisticsVO userStats;
try {
userStats = _userStatsDao.lock(accountId, zoneId, networkId, publicIp, hostId, host.getType().toString());
@ -1529,7 +1535,7 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
s_logger.warn("Unable to find user stats entry for " + statsEntryIdentifier);
return false;
}
if (updateBytes(userStats, newCurrentBytesSent, newCurrentBytesReceived)) {
s_logger.debug("Successfully updated stats for " + statsEntryIdentifier);
return true;
@ -1538,7 +1544,7 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
return false;
}
}
private boolean createOrUpdateStatsEntry(boolean create, long accountId, long zoneId, long networkId, String publicIp, long hostId, ExternalNetworkResourceUsageAnswer answer) {
if (create) {
return createStatsEntry(accountId, zoneId, networkId, publicIp, hostId);
@ -1546,20 +1552,20 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
return updateStatsEntry(accountId, zoneId, networkId, publicIp, hostId, answer);
}
}
/*
* Creates/updates all necessary stats entries for an account and zone.
* Stats entries are created for source NAT IP addresses, static NAT rules, port forwarding rules, and load balancing rules
*/
private boolean manageStatsEntries(boolean create, long accountId, long zoneId, Network network,
HostVO externalFirewall, ExternalNetworkResourceUsageAnswer firewallAnswer,
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;
Transaction txn = Transaction.open(Transaction.CLOUD_DB);
try {
txn.start();
String networkErrorMsg = accountErrorMsg + ", network ID = " + network.getId();
boolean sharedSourceNat = false;
Map<Network.Capability, String> sourceNatCapabilities = _networkMgr.getNetworkServiceCapabilities(network.getId(), Service.SourceNat);
if (sourceNatCapabilities != null) {
@ -1568,7 +1574,7 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
sharedSourceNat = true;
}
}
if (!sharedSourceNat) {
// Manage the entry for this network's source NAT IP address
List<IPAddressVO> sourceNatIps = _ipAddressDao.listByAssociatedNetwork(network.getId(), true);
@ -1578,7 +1584,7 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
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) {
@ -1587,7 +1593,7 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
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) {
@ -1602,7 +1608,7 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
throw new ExecutionException(networkErrorMsg);
}
}
// If an external load balancer is added, manage one entry for each load balancing rule in this network
if (externalLoadBalancer != null && lbAnswer != null) {
List<LoadBalancerVO> loadBalancers = _loadBalancerDao.listByNetworkId(network.getId());
@ -1622,7 +1628,7 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
txn.close();
}
}
private void runExternalNetworkUsageTask() {
s_logger.debug("External network stats collector is running...");
@ -1632,7 +1638,7 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
long accountId = domainRouter.getAccountId();
long zoneId = zone.getId();
List<NetworkVO> networksForAccount = _networkDao.listBy(accountId, zoneId, Network.GuestType.Isolated);
for (NetworkVO network : networksForAccount) {
if (!_networkMgr.networkIsConfiguredForExternalNetworking(zoneId, network.getId())) {
s_logger.debug("Network " + network.getId() + " is not configured for external networking, so skipping usage check.");
@ -1658,7 +1664,7 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
}
}
// Get network stats from the external load balancer
// Get network stats from the external load balancer
ExternalNetworkResourceUsageAnswer lbAnswer = null;
if (externalLoadBalancer != null) {
lbAnswer = (ExternalNetworkResourceUsageAnswer) _agentMgr.easySend(externalLoadBalancer.getId(), cmd);
@ -1674,17 +1680,17 @@ public class ExternalNetworkDeviceManagerImpl implements ExternalNetworkDeviceMa
s_logger.debug("Skipping stats update for account with ID " + accountId);
continue;
}
if (!manageStatsEntries(true, accountId, zoneId, network, externalFirewall, firewallAnswer, externalLoadBalancer, lbAnswer)) {
continue;
}
manageStatsEntries(false, accountId, zoneId, network, externalFirewall, firewallAnswer, externalLoadBalancer, lbAnswer);
}
}
}
}
@Override
public void run() {
GlobalLock scanLock = GlobalLock.getInternLock("ExternalNetworkManagerImpl");