mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
ip assoc working
This commit is contained in:
parent
49c77cf0cf
commit
2c42ebbf71
@ -32,6 +32,7 @@ import com.cloud.consoleproxy.ConsoleProxyService;
|
||||
import com.cloud.dao.EntityManager;
|
||||
import com.cloud.exception.ConcurrentOperationException;
|
||||
import com.cloud.exception.InsufficientCapacityException;
|
||||
import com.cloud.exception.ResourceAllocationException;
|
||||
import com.cloud.exception.ResourceUnavailableException;
|
||||
import com.cloud.network.DomainRouterService;
|
||||
import com.cloud.network.NetworkService;
|
||||
@ -125,7 +126,7 @@ public abstract class BaseCmd {
|
||||
_responseGenerator = generator;
|
||||
}
|
||||
|
||||
public abstract void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException;
|
||||
public abstract void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException;
|
||||
|
||||
public String getResponseType() {
|
||||
if (responseType == null) {
|
||||
|
||||
@ -29,7 +29,9 @@ import com.cloud.api.ServerApiException;
|
||||
import com.cloud.api.response.IPAddressResponse;
|
||||
import com.cloud.exception.ConcurrentOperationException;
|
||||
import com.cloud.exception.InsufficientAddressCapacityException;
|
||||
import com.cloud.exception.InsufficientCapacityException;
|
||||
import com.cloud.exception.ResourceAllocationException;
|
||||
import com.cloud.exception.ResourceUnavailableException;
|
||||
import com.cloud.network.IpAddress;
|
||||
import com.cloud.network.Network;
|
||||
import com.cloud.user.UserContext;
|
||||
@ -107,7 +109,7 @@ public class AssociateIPAddrCmd extends BaseCmd {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(){
|
||||
public void execute() throws ResourceUnavailableException, ResourceAllocationException, ConcurrentOperationException, InsufficientCapacityException {
|
||||
try {
|
||||
IpAddress result = _networkService.associateIP(this);
|
||||
if (result != null) {
|
||||
|
||||
@ -18,8 +18,9 @@
|
||||
package com.cloud.exception;
|
||||
|
||||
import com.cloud.utils.SerialVersionUID;
|
||||
import com.cloud.utils.exception.CloudRuntimeException;
|
||||
|
||||
public class ResourceUnavailableException extends Exception {
|
||||
public class ResourceUnavailableException extends CloudRuntimeException {
|
||||
private static final long serialVersionUID = SerialVersionUID.ResourceUnavailableException;
|
||||
|
||||
public ResourceUnavailableException(String msg) {
|
||||
|
||||
@ -49,7 +49,7 @@ public interface NetworkService {
|
||||
* @return ip address object
|
||||
* @throws ResourceAllocationException, InsufficientCapacityException
|
||||
*/
|
||||
IpAddress associateIP(AssociateIPAddrCmd cmd) throws ResourceAllocationException, InsufficientAddressCapacityException, ConcurrentOperationException;
|
||||
IpAddress associateIP(AssociateIPAddrCmd cmd) throws ResourceAllocationException, InsufficientAddressCapacityException, ConcurrentOperationException, ResourceUnavailableException;
|
||||
boolean disassociateIpAddress(DisassociateIPAddrCmd cmd);
|
||||
|
||||
/**
|
||||
|
||||
@ -75,7 +75,7 @@ public interface NetworkElement extends Adapter {
|
||||
* @return
|
||||
* @throws ResourceUnavailableException
|
||||
*/
|
||||
boolean associate(Network network, IpAddress ipAddress) throws ResourceUnavailableException;
|
||||
boolean associate(Network network, List<? extends IpAddress> ipAddress) throws ResourceUnavailableException;
|
||||
|
||||
/**
|
||||
* Disassociate the ip address from this network
|
||||
@ -84,7 +84,7 @@ public interface NetworkElement extends Adapter {
|
||||
* @return
|
||||
* @throws ResourceUnavailableException
|
||||
*/
|
||||
boolean disassociate(Network network, IpAddress ipAddress) throws ResourceUnavailableException;
|
||||
boolean disassociate(Network network, List<? extends IpAddress> ipAddress) throws ResourceUnavailableException;
|
||||
|
||||
/**
|
||||
* Apply rules
|
||||
|
||||
@ -21,7 +21,6 @@ import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.net.URLEncoder;
|
||||
import java.nio.channels.ClosedChannelException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Enumeration;
|
||||
@ -408,8 +407,9 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, ResourceS
|
||||
for (Pair<Integer, Listener> listener : _cmdMonitors) {
|
||||
answer = listener.second().processControlCommand(attache.getId(), cmd);
|
||||
|
||||
if(answer != null)
|
||||
return answer;
|
||||
if(answer != null) {
|
||||
return answer;
|
||||
}
|
||||
}
|
||||
|
||||
s_logger.warn("No handling of agent control command: " + cmd.toString() + " sent from " + attache.getId());
|
||||
@ -437,8 +437,9 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, ResourceS
|
||||
|
||||
synchronized (_agents) {
|
||||
final Set<Long> s = _agents.keySet();
|
||||
for (final Long id : s)
|
||||
for (final Long id : s) {
|
||||
result.add(id);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
@ -620,9 +621,9 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, ResourceS
|
||||
|
||||
try {
|
||||
uri = new URI(UriUtils.encodeURIComponent(url));
|
||||
if (uri.getScheme() == null)
|
||||
throw new InvalidParameterValueException("uri.scheme is null " + url + ", add nfs:// as a prefix");
|
||||
else if (uri.getScheme().equalsIgnoreCase("nfs")) {
|
||||
if (uri.getScheme() == null) {
|
||||
throw new InvalidParameterValueException("uri.scheme is null " + url + ", add nfs:// as a prefix");
|
||||
} else if (uri.getScheme().equalsIgnoreCase("nfs")) {
|
||||
if (uri.getHost() == null || uri.getHost().equalsIgnoreCase("") || uri.getPath() == null || uri.getPath().equalsIgnoreCase("")) {
|
||||
throw new InvalidParameterValueException("Your host and/or path is wrong. Make sure it's of the format nfs://hostname/path");
|
||||
}
|
||||
@ -700,7 +701,9 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, ResourceS
|
||||
boolean success = true;
|
||||
for( HostVO thost: hosts ) {
|
||||
long thostId = thost.getId();
|
||||
if( thostId == hostId ) continue;
|
||||
if( thostId == hostId ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
PoolEjectCommand eject = new PoolEjectCommand(host.getGuid());
|
||||
Answer answer = easySend(thostId, eject);
|
||||
@ -1007,8 +1010,9 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, ResourceS
|
||||
}
|
||||
|
||||
protected boolean handleDisconnect(AgentAttache attache, Status.Event event, boolean investigate) {
|
||||
if( attache == null )
|
||||
if( attache == null ) {
|
||||
return true;
|
||||
}
|
||||
|
||||
long hostId = attache.getId();
|
||||
|
||||
@ -1254,8 +1258,9 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, ResourceS
|
||||
|
||||
protected AgentAttache simulateStart(ServerResource resource, Map<String, String> details, boolean old) throws IllegalArgumentException{
|
||||
StartupCommand[] cmds = resource.initialize();
|
||||
if (cmds == null )
|
||||
if (cmds == null ) {
|
||||
return null;
|
||||
}
|
||||
|
||||
AgentAttache attache = null;
|
||||
if (s_logger.isDebugEnabled()) {
|
||||
@ -1643,10 +1648,11 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, ResourceS
|
||||
}
|
||||
|
||||
try{
|
||||
if (maintain(hostId))
|
||||
return _hostDao.findById(hostId);
|
||||
else
|
||||
throw new CloudRuntimeException("Unable to prepare for maintenance host " + hostId);
|
||||
if (maintain(hostId)) {
|
||||
return _hostDao.findById(hostId);
|
||||
} else {
|
||||
throw new CloudRuntimeException("Unable to prepare for maintenance host " + hostId);
|
||||
}
|
||||
}catch (AgentUnavailableException e) {
|
||||
throw new CloudRuntimeException("Unable to prepare for maintenance host " + hostId);
|
||||
}
|
||||
@ -1680,8 +1686,9 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, ResourceS
|
||||
}
|
||||
protected void checkCIDR(Host.Type type, HostPodVO pod, DataCenterVO dc, String serverPrivateIP, String serverPrivateNetmask) throws IllegalArgumentException {
|
||||
// Skip this check for Storage Agents and Console Proxies
|
||||
if (type == Host.Type.Storage || type == Host.Type.ConsoleProxy)
|
||||
if (type == Host.Type.Storage || type == Host.Type.ConsoleProxy) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (serverPrivateIP == null) {
|
||||
return;
|
||||
@ -2066,18 +2073,21 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, ResourceS
|
||||
|
||||
// If this command is from the agent simulator, don't do the CIDR
|
||||
// check
|
||||
if (scc.getAgentTag() != null && startup.getAgentTag().equalsIgnoreCase("vmops-simulator"))
|
||||
if (scc.getAgentTag() != null && startup.getAgentTag().equalsIgnoreCase("vmops-simulator")) {
|
||||
doCidrCheck = false;
|
||||
}
|
||||
|
||||
// If this command is from a KVM agent, or from an agent that has a
|
||||
// null hypervisor type, don't do the CIDR check
|
||||
if (hypervisorType == null || hypervisorType == HypervisorType.KVM || hypervisorType == HypervisorType.VmWare)
|
||||
if (hypervisorType == null || hypervisorType == HypervisorType.KVM || hypervisorType == HypervisorType.VmWare) {
|
||||
doCidrCheck = false;
|
||||
}
|
||||
|
||||
if (doCidrCheck)
|
||||
if (doCidrCheck) {
|
||||
s_logger.info("Host: " + host.getName() + " connected with hypervisor type: " + hypervisorType + ". Checking CIDR...");
|
||||
else
|
||||
} else {
|
||||
s_logger.info("Host: " + host.getName() + " connected with hypervisor type: " + hypervisorType + ". Skipping CIDR check...");
|
||||
}
|
||||
|
||||
if (doCidrCheck) {
|
||||
checkCIDR(type, p, dc, scc.getPrivateIpAddress(), scc.getPrivateNetmask());
|
||||
@ -2276,8 +2286,9 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, ResourceS
|
||||
} catch (Exception e) {
|
||||
s_logger.warn("Unable to simulate start on resource " + id + " name " + resource.getName(), e);
|
||||
} finally {
|
||||
if(actionDelegate != null)
|
||||
actionDelegate.action(new Long(id));
|
||||
if(actionDelegate != null) {
|
||||
actionDelegate.action(new Long(id));
|
||||
}
|
||||
|
||||
StackMaid.current().exitCleanup();
|
||||
}
|
||||
@ -2316,8 +2327,9 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, ResourceS
|
||||
// }
|
||||
try {
|
||||
StartupCommand[] startups = new StartupCommand[cmds.length];
|
||||
for (int i = 0; i < cmds.length; i++)
|
||||
for (int i = 0; i < cmds.length; i++) {
|
||||
startups[i] = (StartupCommand) cmds[i];
|
||||
}
|
||||
attache = handleConnect(link, startups);
|
||||
} catch (final IllegalArgumentException e) {
|
||||
_alertMgr.sendAlert(AlertManager.ALERT_TYPE_HOST, 0, new Long(0), "Agent from " + startup.getPrivateIpAddress()
|
||||
|
||||
@ -88,6 +88,7 @@ import com.cloud.event.EventUtils;
|
||||
import com.cloud.event.EventVO;
|
||||
import com.cloud.event.dao.EventDao;
|
||||
import com.cloud.exception.AgentUnavailableException;
|
||||
import com.cloud.exception.ConcurrentOperationException;
|
||||
import com.cloud.exception.InsufficientCapacityException;
|
||||
import com.cloud.exception.OperationTimedoutException;
|
||||
import com.cloud.exception.ResourceUnavailableException;
|
||||
@ -478,7 +479,12 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx
|
||||
s_logger.info("No stopped console proxy is available, need to allocate a new console proxy for data center : " + dataCenterId);
|
||||
}
|
||||
|
||||
proxy = startNew(dataCenterId);
|
||||
try {
|
||||
proxy = startNew(dataCenterId);
|
||||
} catch (ConcurrentOperationException e) {
|
||||
s_logger.info("Concurrent operation caught " + e);
|
||||
return null;
|
||||
}
|
||||
} else {
|
||||
if (s_logger.isInfoEnabled()) {
|
||||
s_logger.info("Found a stopped console proxy, bring it up to running pool. proxy vm id : " + proxy.getId() + ", data center : "
|
||||
@ -905,7 +911,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx
|
||||
return null;
|
||||
}
|
||||
|
||||
public ConsoleProxyVO startNewConsoleProxy(long dataCenterId) {
|
||||
public ConsoleProxyVO startNewConsoleProxy(long dataCenterId) throws ConcurrentOperationException {
|
||||
if (s_logger.isDebugEnabled()) {
|
||||
s_logger.debug("Assign console proxy from a newly started instance for request from data center : " + dataCenterId);
|
||||
}
|
||||
@ -948,7 +954,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx
|
||||
return null;
|
||||
}
|
||||
|
||||
public ConsoleProxyVO startNew(long dataCenterId) {
|
||||
public ConsoleProxyVO startNew(long dataCenterId) throws ConcurrentOperationException {
|
||||
|
||||
if (s_logger.isDebugEnabled()) {
|
||||
s_logger.debug("Assign console proxy from a newly started instance for request from data center : " + dataCenterId);
|
||||
@ -1087,7 +1093,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx
|
||||
}
|
||||
}
|
||||
|
||||
protected Map<String, Object> createProxyInstance2(long dataCenterId) {
|
||||
protected Map<String, Object> createProxyInstance2(long dataCenterId) throws ConcurrentOperationException {
|
||||
|
||||
long id = _consoleProxyDao.getNextInSequence(Long.class, "id");
|
||||
String name = VirtualMachineName.getConsoleProxyName(id, _instance);
|
||||
@ -1102,9 +1108,9 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx
|
||||
NicProfile defaultNic = new NicProfile();
|
||||
defaultNic.setDefaultNic(true);
|
||||
defaultNic.setDeviceId(2);
|
||||
networks.add(new Pair<NetworkVO, NicProfile>(_networkMgr.setupNetworkConfiguration(systemAcct, defaultOffering.get(0), plan, null, null, false).get(0), defaultNic));
|
||||
networks.add(new Pair<NetworkVO, NicProfile>(_networkMgr.setupNetwork(systemAcct, defaultOffering.get(0), plan, null, null, false).get(0), defaultNic));
|
||||
for (NetworkOfferingVO offering : offerings) {
|
||||
networks.add(new Pair<NetworkVO, NicProfile>(_networkMgr.setupNetworkConfiguration(systemAcct, offering, plan, null, null, false).get(0), null));
|
||||
networks.add(new Pair<NetworkVO, NicProfile>(_networkMgr.setupNetwork(systemAcct, offering, plan, null, null, false).get(0), null));
|
||||
}
|
||||
ConsoleProxyVO proxy = new ConsoleProxyVO(id, _serviceOffering.getId(), name, _template.getId(), _template.getGuestOSId(), dataCenterId, systemAcct.getDomainId(), systemAcct.getId(), 0);
|
||||
try {
|
||||
@ -1698,6 +1704,9 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx
|
||||
if (_allocProxyLock.lock(ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_SYNC)) {
|
||||
try {
|
||||
proxy = startNew(dataCenterId);
|
||||
} catch (ConcurrentOperationException e) {
|
||||
s_logger.info("Concurrent Operation caught " + e)
|
||||
;
|
||||
} finally {
|
||||
_allocProxyLock.unlock();
|
||||
}
|
||||
|
||||
@ -65,6 +65,9 @@ public class IPAddressVO implements IpAddress {
|
||||
|
||||
@Column(name="mac_address")
|
||||
private long macAddress;
|
||||
|
||||
@Column(name="network_id")
|
||||
private Long associatedNetworkId;
|
||||
|
||||
protected IPAddressVO() {
|
||||
}
|
||||
@ -104,6 +107,14 @@ public class IPAddressVO implements IpAddress {
|
||||
public Long getAllocatedToAccountId() {
|
||||
return allocatedToAccountId;
|
||||
}
|
||||
|
||||
public Long getAssociatedNetworkId() {
|
||||
return associatedNetworkId;
|
||||
}
|
||||
|
||||
public void setAssociatedNetworkId(Long networkId) {
|
||||
this.associatedNetworkId = networkId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long getAllocatedInDomainId() {
|
||||
|
||||
@ -89,8 +89,8 @@ public interface NetworkManager extends NetworkService {
|
||||
*/
|
||||
List<IPAddressVO> listPublicIpAddressesInVirtualNetwork(long accountId, long dcId, Boolean sourceNat);
|
||||
|
||||
List<NetworkVO> setupNetworkConfiguration(Account owner, NetworkOfferingVO offering, DeploymentPlan plan, String name, String displayText, boolean isShared);
|
||||
List<NetworkVO> setupNetwork(Account owner, NetworkOfferingVO offering, Network predefined, DeploymentPlan plan, String name, String displayText, boolean isShared);
|
||||
List<NetworkVO> setupNetwork(Account owner, NetworkOfferingVO offering, DeploymentPlan plan, String name, String displayText, boolean isShared) throws ConcurrentOperationException;
|
||||
List<NetworkVO> setupNetwork(Account owner, NetworkOfferingVO offering, Network predefined, DeploymentPlan plan, String name, String displayText, boolean isShared) throws ConcurrentOperationException;
|
||||
|
||||
List<NetworkOfferingVO> getSystemAccountNetworkOfferings(String... offeringNames);
|
||||
|
||||
@ -106,7 +106,7 @@ public interface NetworkManager extends NetworkService {
|
||||
|
||||
List<NetworkVO> getNetworksforOffering(long offeringId, long dataCenterId, long accountId);
|
||||
|
||||
List<NetworkVO> setupNetwork(Account owner, ServiceOfferingVO offering, DeploymentPlan plan);
|
||||
List<NetworkVO> setupNetwork(Account owner, ServiceOfferingVO offering, DeploymentPlan plan) throws ConcurrentOperationException;
|
||||
|
||||
Network getNetwork(long id);
|
||||
String getNextAvailableMacAddressInNetwork(long networkConfigurationId) throws InsufficientAddressCapacityException;
|
||||
|
||||
@ -193,7 +193,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
|
||||
private Map<String, String> _configs;
|
||||
|
||||
@DB
|
||||
protected PublicIp fetchNewPublicIp(long dcId, VlanType vlanUse, Account owner, boolean sourceNat) throws InsufficientAddressCapacityException {
|
||||
protected PublicIp fetchNewPublicIp(long dcId, VlanType vlanUse, Account owner, Long networkId, boolean sourceNat) throws InsufficientAddressCapacityException {
|
||||
Transaction txn = Transaction.currentTxn();
|
||||
txn.start();
|
||||
SearchCriteria<IPAddressVO> sc = AssignIpAddressSearch.create();
|
||||
@ -214,6 +214,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
|
||||
addr.setAllocatedTime(new Date());
|
||||
addr.setAllocatedInDomainId(owner.getDomainId());
|
||||
addr.setAllocatedToAccountId(owner.getId());
|
||||
addr.setAssociatedNetworkId(networkId);
|
||||
|
||||
if (!_ipAddressDao.update(addr.getAddress(), addr)) {
|
||||
throw new CloudRuntimeException("Found address to allocate but unable to update: " + addr);
|
||||
@ -261,7 +262,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
|
||||
s_logger.debug("assigning a new ip address in " + dcId + " to " + owner);
|
||||
}
|
||||
|
||||
ip = fetchNewPublicIp(dcId, VlanType.VirtualNetwork, owner, true);
|
||||
ip = fetchNewPublicIp(dcId, VlanType.VirtualNetwork, owner, network.getId(), true);
|
||||
sourceNat = ip.ip();
|
||||
sourceNat.setState(IpAddress.State.Allocated);
|
||||
_ipAddressDao.update(sourceNat.getAddress(), sourceNat);
|
||||
@ -423,6 +424,37 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
|
||||
return account;
|
||||
}
|
||||
|
||||
public boolean applyIpAssociations(Network network, boolean continueOnError) throws ResourceUnavailableException {
|
||||
List<IPAddressVO> userIps = _ipAddressDao.listByNetwork(network.getId());
|
||||
|
||||
boolean success = true;
|
||||
for (NetworkElement element : _networkElements) {
|
||||
try {
|
||||
element.associate(network, userIps);
|
||||
} catch (ResourceUnavailableException e) {
|
||||
success = false;
|
||||
if (!continueOnError) {
|
||||
throw e;
|
||||
} else {
|
||||
s_logger.debug("Resource is not available: " + element.getName(), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (success) {
|
||||
for (IPAddressVO addr : userIps) {
|
||||
if (addr.getState() == IpAddress.State.Allocating) {
|
||||
addr.setState(IpAddress.State.Allocated);
|
||||
_ipAddressDao.update(addr.getAddress(), addr);
|
||||
} else if (addr.getState() == IpAddress.State.Releasing) {
|
||||
_ipAddressDao.unassignIpAddress(addr.getAddress());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<? extends Network> getVirtualNetworksOwnedByAccountInZone(String accountName, long domainId, long zoneId) {
|
||||
Account owner = _accountDao.findActiveAccount(accountName, domainId);
|
||||
@ -434,13 +466,12 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
|
||||
}
|
||||
|
||||
@Override @DB
|
||||
public IpAddress associateIP(AssociateIPAddrCmd cmd) throws ResourceAllocationException, InsufficientAddressCapacityException, ConcurrentOperationException {
|
||||
public IpAddress associateIP(AssociateIPAddrCmd cmd) throws ResourceAllocationException, ResourceUnavailableException, InsufficientAddressCapacityException, ConcurrentOperationException {
|
||||
String accountName = cmd.getAccountName();
|
||||
long domainId = cmd.getDomainId();
|
||||
Long zoneId = cmd.getZoneId();
|
||||
Account caller = UserContext.current().getAccount();
|
||||
long userId = UserContext.current().getUserId();
|
||||
Long accountId = null;
|
||||
|
||||
Account owner = _accountDao.findActiveAccount(accountName, domainId);
|
||||
if (owner == null) {
|
||||
@ -449,6 +480,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
|
||||
|
||||
_accountMgr.checkAccess(caller, owner);
|
||||
|
||||
long ownerId = owner.getId();
|
||||
Long networkId = cmd.getNetworkId();
|
||||
Network network = null;
|
||||
if (networkId != null) {
|
||||
@ -460,7 +492,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
|
||||
|
||||
EventVO event = new EventVO();
|
||||
event.setUserId(userId);
|
||||
event.setAccountId(accountId);
|
||||
event.setAccountId(ownerId);
|
||||
event.setType(EventTypes.EVENT_NET_IP_ASSIGN);
|
||||
|
||||
PublicIp ip = null;
|
||||
@ -470,11 +502,11 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
|
||||
Account accountToLock = null;
|
||||
try {
|
||||
if (s_logger.isDebugEnabled()) {
|
||||
s_logger.debug("Associate IP address called for user " + userId + " account " + accountId);
|
||||
s_logger.debug("Associate IP address called for user " + userId + " account " + ownerId);
|
||||
}
|
||||
accountToLock = _accountDao.acquireInLockTable(accountId);
|
||||
accountToLock = _accountDao.acquireInLockTable(ownerId);
|
||||
if (accountToLock == null) {
|
||||
s_logger.warn("Unable to lock account: " + accountId);
|
||||
s_logger.warn("Unable to lock account: " + ownerId);
|
||||
throw new ConcurrentOperationException("Unable to acquire account lock");
|
||||
}
|
||||
|
||||
@ -492,11 +524,11 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
|
||||
|
||||
txn.start();
|
||||
|
||||
ip = fetchNewPublicIp(zoneId, VlanType.VirtualNetwork, owner, false);
|
||||
ip = fetchNewPublicIp(zoneId, VlanType.VirtualNetwork, owner, network.getId(), false);
|
||||
if (ip == null) {
|
||||
throw new InsufficientAddressCapacityException("Unable to find available public IP addresses", DataCenter.class, zoneId);
|
||||
}
|
||||
_accountMgr.incrementResourceCount(accountId, ResourceType.public_ip);
|
||||
_accountMgr.incrementResourceCount(ownerId, ResourceType.public_ip);
|
||||
|
||||
String ipAddress = ip.getAddress();
|
||||
|
||||
@ -505,13 +537,8 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
|
||||
_eventDao.persist(event);
|
||||
|
||||
txn.commit();
|
||||
if (network != null) {
|
||||
for (NetworkElement element : _networkElements) {
|
||||
element.associate(network, ip);
|
||||
}
|
||||
}
|
||||
|
||||
success = true;
|
||||
|
||||
success = applyIpAssociations(network, false);
|
||||
|
||||
return ip;
|
||||
} catch (ResourceUnavailableException e) {
|
||||
@ -519,16 +546,21 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
|
||||
return null;
|
||||
} finally {
|
||||
if (caller != null) {
|
||||
_accountDao.releaseFromLockTable(accountId);
|
||||
_accountDao.releaseFromLockTable(ownerId);
|
||||
s_logger.debug("Associate IP address lock released");
|
||||
}
|
||||
|
||||
if (!success) {
|
||||
if (ip != null) {
|
||||
Transaction.currentTxn();
|
||||
try {
|
||||
_ipAddressDao.markAsUnavailable(ip.getAddress(), ip.getAccountId());
|
||||
applyIpAssociations(network, true);
|
||||
} catch (Exception e) {
|
||||
s_logger.warn("Unable to disassociate ip address for recovery", e);
|
||||
}
|
||||
txn.start();
|
||||
_ipAddressDao.unassignIpAddress(ip.getAddress());
|
||||
_accountMgr.decrementResourceCount(accountId, ResourceType.public_ip);
|
||||
_accountMgr.decrementResourceCount(ownerId, ResourceType.public_ip);
|
||||
|
||||
event.setLevel(EventVO.LEVEL_ERROR);
|
||||
event.setDescription("");
|
||||
@ -569,12 +601,15 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
|
||||
success = false;
|
||||
}
|
||||
|
||||
for (NetworkElement ne : _networkElements) {
|
||||
if (ip.getAssociatedNetworkId() != null) {
|
||||
Network network = _networksDao.findById(ip.getAssociatedNetworkId());
|
||||
try {
|
||||
ne.disassociate(null, ip);
|
||||
if (!applyIpAssociations(network, true)) {
|
||||
s_logger.warn("Unable to apply ip address associations for " + network);
|
||||
success = false;
|
||||
}
|
||||
} catch (ResourceUnavailableException e) {
|
||||
s_logger.warn("Unable to release the ip address " + ip, e);
|
||||
success = false;
|
||||
throw new CloudRuntimeException("We should nver get to here because we used true when applyIpAssociations", e);
|
||||
}
|
||||
}
|
||||
|
||||
@ -726,56 +761,65 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<NetworkVO> setupNetworkConfiguration(Account owner, NetworkOfferingVO offering, DeploymentPlan plan, String name, String displayText, boolean isShared) {
|
||||
public List<NetworkVO> setupNetwork(Account owner, NetworkOfferingVO offering, DeploymentPlan plan, String name, String displayText, boolean isShared) throws ConcurrentOperationException {
|
||||
return setupNetwork(owner, offering, null, plan, name, displayText, isShared);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<NetworkVO> setupNetwork(Account owner, NetworkOfferingVO offering, Network predefined, DeploymentPlan plan, String name, String displayText, boolean isShared) {
|
||||
|
||||
List<NetworkVO> configs = _networksDao.listBy(owner.getId(), offering.getId(), plan.getDataCenterId());
|
||||
if (predefined == null || (predefined.getBroadcastUri() == null && predefined.getBroadcastDomainType() != BroadcastDomainType.Vlan)) {
|
||||
if (configs.size() > 0) {
|
||||
if (s_logger.isDebugEnabled()) {
|
||||
s_logger.debug("Found existing network configuration for offering " + offering + ": " + configs.get(0));
|
||||
@Override @DB
|
||||
public List<NetworkVO> setupNetwork(Account owner, NetworkOfferingVO offering, Network predefined, DeploymentPlan plan, String name, String displayText, boolean isShared) throws ConcurrentOperationException {
|
||||
Transaction.currentTxn();
|
||||
Account locked = _accountDao.acquireInLockTable(owner.getId());
|
||||
if (locked == null) {
|
||||
throw new ConcurrentOperationException("Unable to acquire lock on " + owner);
|
||||
}
|
||||
try {
|
||||
List<NetworkVO> configs = _networksDao.listBy(owner.getId(), offering.getId(), plan.getDataCenterId());
|
||||
if (predefined == null || (predefined.getBroadcastUri() == null && predefined.getBroadcastDomainType() != BroadcastDomainType.Vlan)) {
|
||||
if (configs.size() > 0) {
|
||||
if (s_logger.isDebugEnabled()) {
|
||||
s_logger.debug("Found existing network configuration for offering " + offering + ": " + configs.get(0));
|
||||
}
|
||||
return configs;
|
||||
}
|
||||
return configs;
|
||||
}
|
||||
}
|
||||
|
||||
configs = new ArrayList<NetworkVO>();
|
||||
|
||||
long related = -1;
|
||||
|
||||
for (NetworkGuru guru : _networkGurus) {
|
||||
Network config = guru.design(offering, plan, predefined, owner);
|
||||
if (config == null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (config.getId() != -1) {
|
||||
if (config instanceof NetworkVO) {
|
||||
configs.add((NetworkVO)config);
|
||||
} else {
|
||||
configs.add(_networksDao.findById(config.getId()));
|
||||
|
||||
configs = new ArrayList<NetworkVO>();
|
||||
|
||||
long related = -1;
|
||||
|
||||
for (NetworkGuru guru : _networkGurus) {
|
||||
Network config = guru.design(offering, plan, predefined, owner);
|
||||
if (config == null) {
|
||||
continue;
|
||||
}
|
||||
continue;
|
||||
|
||||
if (config.getId() != -1) {
|
||||
if (config instanceof NetworkVO) {
|
||||
configs.add((NetworkVO)config);
|
||||
} else {
|
||||
configs.add(_networksDao.findById(config.getId()));
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
long id = _networksDao.getNextInSequence(Long.class, "id");
|
||||
if (related == -1) {
|
||||
related = id;
|
||||
}
|
||||
|
||||
NetworkVO vo = new NetworkVO(id, config, offering.getId(), plan.getDataCenterId(), guru.getName(), owner.getDomainId(), owner.getId(), related, name, displayText, isShared);
|
||||
configs.add(_networksDao.persist(vo));
|
||||
}
|
||||
|
||||
long id = _networksDao.getNextInSequence(Long.class, "id");
|
||||
if (related == -1) {
|
||||
related = id;
|
||||
}
|
||||
|
||||
NetworkVO vo = new NetworkVO(id, config, offering.getId(), plan.getDataCenterId(), guru.getName(), owner.getDomainId(), owner.getId(), related, name, displayText, isShared);
|
||||
configs.add(_networksDao.persist(vo));
|
||||
|
||||
if (configs.size() < 1) {
|
||||
throw new CloudRuntimeException("Unable to convert network offering to network profile: " + offering.getId());
|
||||
}
|
||||
|
||||
return configs;
|
||||
} finally {
|
||||
s_logger.debug("Releasing lock for " + locked);
|
||||
_accountDao.releaseFromLockTable(locked.getId());
|
||||
}
|
||||
|
||||
if (configs.size() < 1) {
|
||||
throw new CloudRuntimeException("Unable to convert network offering to network profile: " + offering.getId());
|
||||
}
|
||||
|
||||
return configs;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -1179,9 +1223,9 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<NetworkVO> setupNetwork(Account owner, ServiceOfferingVO offering, DeploymentPlan plan) {
|
||||
public List<NetworkVO> setupNetwork(Account owner, ServiceOfferingVO offering, DeploymentPlan plan) throws ConcurrentOperationException {
|
||||
NetworkOfferingVO networkOffering = _networkOfferingDao.findByServiceOffering(offering);
|
||||
return setupNetworkConfiguration(owner, networkOffering, plan, null, null, false);
|
||||
return setupNetwork(owner, networkOffering, plan, null, null, false);
|
||||
}
|
||||
|
||||
private String [] getGuestIpRange() {
|
||||
|
||||
@ -32,6 +32,8 @@ public interface IPAddressDao extends GenericDao<IPAddressVO, String> {
|
||||
List<IPAddressVO> listByAccount(long accountId);
|
||||
|
||||
List<IPAddressVO> listByDcIdIpAddress(long dcId, String ipAddress);
|
||||
|
||||
List<IPAddressVO> listByNetwork(long networkId);
|
||||
|
||||
int countIPs(long dcId, long vlanDbId, boolean onlyCountAllocated);
|
||||
|
||||
@ -40,10 +42,4 @@ public interface IPAddressDao extends GenericDao<IPAddressVO, String> {
|
||||
boolean mark(long dcId, String ip);
|
||||
|
||||
List<String> assignAcccountSpecificIps(long accountId, long longValue, Long vlanDbId, boolean sourceNat);
|
||||
|
||||
void setIpAsSourceNat(String ipAddr);
|
||||
|
||||
void unassignIpAsSourceNat(String ipAddress);
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -59,6 +59,7 @@ public class IPAddressDaoImpl extends GenericDaoBase<IPAddressVO, String> implem
|
||||
AllFieldsSearch.and("vlan", AllFieldsSearch.entity().getVlanId(), Op.EQ);
|
||||
AllFieldsSearch.and("accountId", AllFieldsSearch.entity().getAllocatedToAccountId(), Op.EQ);
|
||||
AllFieldsSearch.and("sourceNat", AllFieldsSearch.entity().isSourceNat(), Op.EQ);
|
||||
AllFieldsSearch.and("network", AllFieldsSearch.entity().getAssociatedNetworkId(), Op.EQ);
|
||||
AllFieldsSearch.done();
|
||||
|
||||
VlanDbIdSearchUnallocated = createSearchBuilder();
|
||||
@ -122,15 +123,11 @@ public class IPAddressDaoImpl extends GenericDaoBase<IPAddressVO, String> implem
|
||||
return ipStringList;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setIpAsSourceNat(String ipAddr) {
|
||||
|
||||
IPAddressVO ip = createForUpdate(ipAddr);
|
||||
ip.setSourceNat(true);
|
||||
s_logger.debug("Setting " + ipAddr + " as source Nat ");
|
||||
update(ipAddr, ip);
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated This method is now deprecated because vlan has been
|
||||
* added. The actual method is now within NetworkManager.
|
||||
*/
|
||||
@Deprecated
|
||||
public IPAddressVO assignIpAddress(long accountId, long domainId, long vlanDbId, boolean sourceNat) {
|
||||
Transaction txn = Transaction.currentTxn();
|
||||
txn.start();
|
||||
@ -171,13 +168,7 @@ public class IPAddressDaoImpl extends GenericDaoBase<IPAddressVO, String> implem
|
||||
address.setSourceNat(false);
|
||||
address.setOneToOneNat(false);
|
||||
address.setState(State.Free);
|
||||
update(ipAddress, address);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void unassignIpAsSourceNat(String ipAddress) {
|
||||
IPAddressVO address = createForUpdate();
|
||||
address.setSourceNat(false);
|
||||
address.setAssociatedNetworkId(null);
|
||||
update(ipAddress, address);
|
||||
}
|
||||
|
||||
@ -185,7 +176,7 @@ public class IPAddressDaoImpl extends GenericDaoBase<IPAddressVO, String> implem
|
||||
public List<IPAddressVO> listByAccount(long accountId) {
|
||||
SearchCriteria<IPAddressVO> sc = AllFieldsSearch.create();
|
||||
sc.setParameters("accountId", accountId);
|
||||
return listIncludingRemovedBy(sc);
|
||||
return listBy(sc);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -193,7 +184,15 @@ public class IPAddressDaoImpl extends GenericDaoBase<IPAddressVO, String> implem
|
||||
SearchCriteria<IPAddressVO> sc = AllFieldsSearch.create();
|
||||
sc.setParameters("dataCenterId", dcId);
|
||||
sc.setParameters("ipAddress", ipAddress);
|
||||
return listIncludingRemovedBy(sc);
|
||||
return listBy(sc);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<IPAddressVO> listByNetwork(long networkId) {
|
||||
SearchCriteria<IPAddressVO> sc = AllFieldsSearch.create();
|
||||
sc.setParameters("network", networkId);
|
||||
|
||||
return listBy(sc);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@ -142,13 +142,13 @@ public class DomainRouterElement extends AdapterBase implements NetworkElement {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean associate(Network network, IpAddress ipAddress) throws ResourceUnavailableException {
|
||||
public boolean associate(Network network, List<? extends IpAddress> ipAddress) throws ResourceUnavailableException {
|
||||
// TODO Auto-generated method stub
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean disassociate(Network network, IpAddress ipAddress) throws ResourceUnavailableException {
|
||||
public boolean disassociate(Network network, List<? extends IpAddress> ipAddress) throws ResourceUnavailableException {
|
||||
// TODO Auto-generated method stub
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -2096,11 +2096,11 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute
|
||||
|
||||
List<NetworkOfferingVO> offerings = _networkMgr.getSystemAccountNetworkOfferings(NetworkOfferingVO.SystemVmControlNetwork);
|
||||
NetworkOfferingVO controlOffering = offerings.get(0);
|
||||
NetworkVO controlConfig = _networkMgr.setupNetworkConfiguration(_systemAcct, controlOffering, plan, null, null, false).get(0);
|
||||
NetworkVO controlConfig = _networkMgr.setupNetwork(_systemAcct, controlOffering, plan, null, null, false).get(0);
|
||||
|
||||
List<Pair<NetworkVO, NicProfile>> networks = new ArrayList<Pair<NetworkVO, NicProfile>>(3);
|
||||
NetworkOfferingVO publicOffering = _networkMgr.getSystemAccountNetworkOfferings(NetworkOfferingVO.SystemVmPublicNetwork).get(0);
|
||||
List<NetworkVO> publicConfigs = _networkMgr.setupNetworkConfiguration(_systemAcct, publicOffering, plan, null, null, false);
|
||||
List<NetworkVO> publicConfigs = _networkMgr.setupNetwork(_systemAcct, publicOffering, plan, null, null, false);
|
||||
NicProfile defaultNic = new NicProfile();
|
||||
defaultNic.setDefaultNic(true);
|
||||
//defaultNic.setIp4Address(sourceNatIp);
|
||||
|
||||
@ -761,9 +761,14 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V
|
||||
NicProfile defaultNic = new NicProfile();
|
||||
defaultNic.setDefaultNic(true);
|
||||
defaultNic.setDeviceId(2);
|
||||
networks.add(new Pair<NetworkVO, NicProfile>(_networkMgr.setupNetworkConfiguration(systemAcct, defaultOffering.get(0), plan, null, null, false).get(0), defaultNic));
|
||||
for (NetworkOfferingVO offering : offerings) {
|
||||
networks.add(new Pair<NetworkVO, NicProfile>(_networkMgr.setupNetworkConfiguration(systemAcct, offering, plan, null, null, false).get(0), null));
|
||||
try {
|
||||
networks.add(new Pair<NetworkVO, NicProfile>(_networkMgr.setupNetwork(systemAcct, defaultOffering.get(0), plan, null, null, false).get(0), defaultNic));
|
||||
for (NetworkOfferingVO offering : offerings) {
|
||||
networks.add(new Pair<NetworkVO, NicProfile>(_networkMgr.setupNetwork(systemAcct, offering, plan, null, null, false).get(0), null));
|
||||
}
|
||||
} catch (ConcurrentOperationException e) {
|
||||
s_logger.info("Unable to setup due to concurrent operation. " + e);
|
||||
return new HashMap<String, Object>();
|
||||
}
|
||||
SecondaryStorageVmVO secStorageVm = new SecondaryStorageVmVO(id, _serviceOffering.getId(), name, _template.getId(),
|
||||
_template.getGuestOSId(), dataCenterId, systemAcct.getDomainId(), systemAcct.getId());
|
||||
|
||||
@ -89,15 +89,6 @@ ALTER TABLE `cloud`.`cluster` ADD CONSTRAINT `fk_cluster__data_center_id` FOREIG
|
||||
ALTER TABLE `cloud`.`cluster` ADD CONSTRAINT `fk_cluster__pod_id` FOREIGN KEY `fd_cluster__pod_id`(`pod_id`) REFERENCES `cloud`.`host_pod_ref`(`id`);
|
||||
ALTER TABLE `cloud`.`cluster` ADD UNIQUE `i_cluster__pod_id__name`(`pod_id`, `name`);
|
||||
|
||||
ALTER TABLE `cloud`.`user_ip_address` ADD CONSTRAINT `fk_user_ip_address__account_id` FOREIGN KEY `fk_user_ip_address__account_id` (`account_id`) REFERENCES `account` (`id`);
|
||||
ALTER TABLE `cloud`.`user_ip_address` ADD INDEX `i_user_ip_address__account_id`(`account_id`);
|
||||
ALTER TABLE `cloud`.`user_ip_address` ADD CONSTRAINT `fk_user_ip_address__vlan_db_id` FOREIGN KEY `fk_user_ip_address__vlan_db_id` (`vlan_db_id`) REFERENCES `vlan` (`id`) ON DELETE CASCADE;
|
||||
ALTER TABLE `cloud`.`user_ip_address` ADD INDEX `i_user_ip_address__vlan_db_id`(`vlan_db_id`);
|
||||
|
||||
ALTER TABLE `cloud`.`user_ip_address` ADD INDEX `i_user_ip_address__data_center_id`(`data_center_id`);
|
||||
ALTER TABLE `cloud`.`user_ip_address` ADD INDEX `i_user_ip_address__source_nat`(`source_nat`);
|
||||
ALTER TABLE `cloud`.`user_ip_address` ADD INDEX `i_user_ip_address__allocated`(`allocated`);
|
||||
ALTER TABLE `cloud`.`user_ip_address` ADD INDEX `i_user_ip_address__public_ip_address`(`public_ip_address`);
|
||||
|
||||
ALTER TABLE `cloud`.`vm_template` ADD INDEX `i_vm_template__removed`(`removed`);
|
||||
ALTER TABLE `cloud`.`vm_template` ADD INDEX `i_vm_template__public`(`public`);
|
||||
|
||||
@ -628,7 +628,12 @@ CREATE TABLE `cloud`.`user_ip_address` (
|
||||
`mac_address` bigint unsigned NOT NULL COMMENT 'mac address of this ip',
|
||||
`network_id` bigint unsigned COMMENT 'network this public ip address is associated with',
|
||||
PRIMARY KEY (`public_ip_address`),
|
||||
CONSTRAINT `fk_user_ip_address__network_id` FOREIGN KEY (`network_id`) REFERENCES `networks`(`id`)
|
||||
CONSTRAINT `fk_user_ip_address__network_id` FOREIGN KEY (`network_id`) REFERENCES `networks`(`id`),
|
||||
CONSTRAINT `fk_user_ip_address__account_id` FOREIGN KEY (`account_id`) REFERENCES `account`(`id`),
|
||||
CONSTRAINT `fk_user_ip_address__vlan_db_id` FOREIGN KEY (`vlan_db_id`) REFERENCES `vlan`(`id`) ON DELETE CASCADE,
|
||||
CONSTRAINT `fk_user_ip_address__data_center_id` FOREIGN KEY (`data_center_id`) REFERENCES `data_center`(`id`) ON DELETE CASCADE,
|
||||
INDEX `i_user_ip_address__allocated`(`allocated`),
|
||||
INDEX `i_user_ip_address__source_nat`(`source_nat`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE `cloud`.`user_statistics` (
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user