mirror of
https://github.com/apache/cloudstack.git
synced 2025-11-03 04:12:31 +01:00
VPC: moved vpc related code from NetworkManager to VpcManager
Conflicts: api/src/com/cloud/api/commands/AssociateIPAddrCmd.java server/src/com/cloud/network/NetworkManagerImpl.java server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java server/src/com/cloud/network/rules/RulesManagerImpl.java server/src/com/cloud/network/vpc/VpcManagerImpl.java server/test/com/cloud/network/MockNetworkManagerImpl.java
This commit is contained in:
parent
ebe53a91d7
commit
7cceaae912
@ -238,9 +238,13 @@ public class AssociateIPAddrCmd extends BaseAsyncCreateCmd {
|
||||
UserContext.current().setEventDetails("Ip Id: " + getEntityId());
|
||||
|
||||
IpAddress result = null;
|
||||
|
||||
result = _networkService.associateIP(getEntityId(), getNetworkId(), getVpcId());
|
||||
|
||||
if (getVpcId() != null) {
|
||||
result = _vpcService.associateIPToVpc(getEntityId(), getVpcId());
|
||||
} else if (getNetworkId() != null) {
|
||||
result = _networkService.associateIPToNetwork(getEntityId(), getNetworkId());
|
||||
}
|
||||
|
||||
if (result != null) {
|
||||
IPAddressResponse ipResponse = _responseGenerator.createIPAddressResponse(result);
|
||||
ipResponse.setResponseName(getCommandName());
|
||||
|
||||
@ -116,14 +116,26 @@ public class UpdateNetworkCmd extends BaseAsyncCmd {
|
||||
@Override
|
||||
public void execute() throws InsufficientCapacityException, ConcurrentOperationException{
|
||||
User callerUser = _accountService.getActiveUser(UserContext.current().getCallerUserId());
|
||||
Account callerAccount = _accountService.getActiveAccountById(callerUser.getAccountId());
|
||||
Network result = _networkService.updateGuestNetwork(getId(), getNetworkName(), getDisplayText(), callerAccount,
|
||||
callerUser, getNetworkDomain(), getNetworkOfferingId(), getChangeCidr());
|
||||
Account callerAccount = _accountService.getActiveAccountById(callerUser.getAccountId());
|
||||
Network network = _networkService.getNetwork(id);
|
||||
if (network == null) {
|
||||
throw new InvalidParameterValueException("Couldn't find network by id", null);
|
||||
}
|
||||
|
||||
Network result = null;
|
||||
if (network.getVpcId() != null) {
|
||||
result = _vpcService.updateVpcGuestNetwork(getId(), getNetworkName(), getDisplayText(), callerAccount,
|
||||
callerUser, getNetworkDomain(), getNetworkOfferingId(), getChangeCidr());
|
||||
} else {
|
||||
result = _networkService.updateGuestNetwork(getId(), getNetworkName(), getDisplayText(), callerAccount,
|
||||
callerUser, getNetworkDomain(), getNetworkOfferingId(), getChangeCidr());
|
||||
}
|
||||
|
||||
if (result != null) {
|
||||
NetworkResponse response = _responseGenerator.createNetworkResponse(result);
|
||||
response.setResponseName(getCommandName());
|
||||
this.setResponseObject(response);
|
||||
}else {
|
||||
} else {
|
||||
throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to update network");
|
||||
}
|
||||
}
|
||||
|
||||
@ -138,16 +138,15 @@ public interface NetworkService {
|
||||
boolean isVmPartOfNetwork(long vmId, long ntwkId);
|
||||
|
||||
/**
|
||||
* @param entityId
|
||||
* @param networkId
|
||||
* @param vpcId
|
||||
* @param entityId
|
||||
* @return
|
||||
* @throws ConcurrentOperationException
|
||||
* @throws ResourceUnavailableException
|
||||
* @throws ResourceAllocationException
|
||||
* @throws InsufficientAddressCapacityException
|
||||
*/
|
||||
IpAddress associateIP(long ipId, Long networkId, Long vpcId) throws InsufficientAddressCapacityException,
|
||||
IpAddress associateIPToNetwork(long ipId, long networkId) throws InsufficientAddressCapacityException,
|
||||
ResourceAllocationException, ResourceUnavailableException, ConcurrentOperationException;
|
||||
|
||||
/**
|
||||
|
||||
@ -23,13 +23,17 @@ import java.util.Set;
|
||||
import com.cloud.api.commands.ListPrivateGatewaysCmd;
|
||||
import com.cloud.api.commands.ListStaticRoutesCmd;
|
||||
import com.cloud.exception.ConcurrentOperationException;
|
||||
import com.cloud.exception.InsufficientAddressCapacityException;
|
||||
import com.cloud.exception.InsufficientCapacityException;
|
||||
import com.cloud.exception.NetworkRuleConflictException;
|
||||
import com.cloud.exception.ResourceAllocationException;
|
||||
import com.cloud.exception.ResourceUnavailableException;
|
||||
import com.cloud.network.IpAddress;
|
||||
import com.cloud.network.Network;
|
||||
import com.cloud.network.Network.Provider;
|
||||
import com.cloud.network.Network.Service;
|
||||
import com.cloud.user.Account;
|
||||
import com.cloud.user.User;
|
||||
|
||||
public interface VpcService {
|
||||
|
||||
@ -221,4 +225,19 @@ public interface VpcService {
|
||||
* @return
|
||||
*/
|
||||
VpcGateway getVpcGateway(long id);
|
||||
|
||||
/**
|
||||
* @param ipId
|
||||
* @param vpcId
|
||||
* @return
|
||||
* @throws ResourceAllocationException
|
||||
* @throws ResourceUnavailableException
|
||||
* @throws InsufficientAddressCapacityException
|
||||
* @throws ConcurrentOperationException
|
||||
*/
|
||||
IpAddress associateIPToVpc(long ipId, long vpcId) throws ResourceAllocationException, ResourceUnavailableException,
|
||||
InsufficientAddressCapacityException, ConcurrentOperationException;
|
||||
|
||||
public Network updateVpcGuestNetwork(long networkId, String name, String displayText, Account callerAccount,
|
||||
User callerUser, String domainSuffix, Long ntwkOffId, Boolean changeCidr);
|
||||
}
|
||||
|
||||
@ -47,7 +47,6 @@ import com.cloud.network.element.UserDataServiceProvider;
|
||||
import com.cloud.network.guru.NetworkGuru;
|
||||
import com.cloud.network.rules.FirewallRule;
|
||||
import com.cloud.network.rules.StaticNat;
|
||||
import com.cloud.network.vpc.Vpc;
|
||||
import com.cloud.offering.NetworkOffering;
|
||||
import com.cloud.offerings.NetworkOfferingVO;
|
||||
import com.cloud.user.Account;
|
||||
@ -274,8 +273,6 @@ public interface NetworkManager extends NetworkService {
|
||||
|
||||
public boolean checkIpForService(IPAddressVO ip, Service service, Long networkId);
|
||||
|
||||
void checkVirtualNetworkCidrOverlap(Long zoneId, String cidr);
|
||||
|
||||
void checkCapabilityForProvider(Set<Provider> providers, Service service,
|
||||
Capability cap, String capValue);
|
||||
|
||||
@ -319,16 +316,6 @@ public interface NetworkManager extends NetworkService {
|
||||
PublicIp assignSourceNatIpAddressToGuestNetwork(Account owner, Network guestNetwork) throws InsufficientAddressCapacityException, ConcurrentOperationException;
|
||||
|
||||
|
||||
/**
|
||||
* @param owner
|
||||
* @param vpc
|
||||
* @return
|
||||
* @throws ConcurrentOperationException
|
||||
* @throws InsufficientAddressCapacityException
|
||||
*/
|
||||
PublicIp assignSourceNatIpAddressToVpc(Account owner, Vpc vpc) throws InsufficientAddressCapacityException, ConcurrentOperationException;
|
||||
|
||||
|
||||
/**
|
||||
* @param accountId
|
||||
* @param zoneId
|
||||
@ -409,13 +396,6 @@ public interface NetworkManager extends NetworkService {
|
||||
InsufficientAddressCapacityException, ConcurrentOperationException;
|
||||
|
||||
|
||||
/**
|
||||
* @param ipId
|
||||
* @param networkId TODO
|
||||
*/
|
||||
void unassignIPFromVpcNetwork(long ipId, long networkId);
|
||||
|
||||
|
||||
/**
|
||||
* @param vm
|
||||
* @param networkId
|
||||
@ -479,9 +459,21 @@ public interface NetworkManager extends NetworkService {
|
||||
|
||||
|
||||
/**
|
||||
* @param ip
|
||||
* @return
|
||||
* @param addr
|
||||
*/
|
||||
boolean ipUsedInVpc(IpAddress ip);
|
||||
void markPublicIpAsAllocated(IPAddressVO addr);
|
||||
|
||||
|
||||
/**
|
||||
* @param owner
|
||||
* @param guestNtwkId
|
||||
* @param vpcId
|
||||
* @param dcId
|
||||
* @param isSourceNat
|
||||
* @return
|
||||
* @throws ConcurrentOperationException
|
||||
* @throws InsufficientAddressCapacityException
|
||||
*/
|
||||
PublicIp assignDedicateIpAddress(Account owner, Long guestNtwkId, Long vpcId, long dcId, boolean isSourceNat) throws ConcurrentOperationException, InsufficientAddressCapacityException;
|
||||
|
||||
}
|
||||
|
||||
@ -160,7 +160,6 @@ import com.cloud.network.rules.StaticNatRuleImpl;
|
||||
import com.cloud.network.rules.dao.PortForwardingRulesDao;
|
||||
import com.cloud.network.vpc.NetworkACLManager;
|
||||
import com.cloud.network.vpc.PrivateIpVO;
|
||||
import com.cloud.network.vpc.Vpc;
|
||||
import com.cloud.network.vpc.VpcManager;
|
||||
import com.cloud.network.vpc.Dao.PrivateIpDao;
|
||||
import com.cloud.network.vpn.RemoteAccessVpnService;
|
||||
@ -472,7 +471,8 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
|
||||
}
|
||||
|
||||
@DB
|
||||
protected void markPublicIpAsAllocated(IPAddressVO addr) {
|
||||
@Override
|
||||
public void markPublicIpAsAllocated(IPAddressVO addr) {
|
||||
|
||||
assert (addr.getState() == IpAddress.State.Allocating || addr.getState() == IpAddress.State.Free) :
|
||||
"Unable to transition from state " + addr.getState() + " to " + IpAddress.State.Allocated;
|
||||
@ -503,25 +503,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
|
||||
|
||||
txn.commit();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public PublicIp assignSourceNatIpAddressToVpc(Account owner, Vpc vpc) throws InsufficientAddressCapacityException, ConcurrentOperationException {
|
||||
long dcId = vpc.getZoneId();
|
||||
|
||||
IPAddressVO sourceNatIp = getExistingSourceNat(owner.getId(), null, vpc.getId());
|
||||
|
||||
PublicIp ipToReturn = null;
|
||||
|
||||
if (sourceNatIp != null) {
|
||||
ipToReturn = new PublicIp(sourceNatIp, _vlanDao.findById(sourceNatIp.getVlanId()),
|
||||
NetUtils.createSequenceBasedMacAddress(sourceNatIp.getMacAddress()));
|
||||
} else {
|
||||
ipToReturn = assignDedicateIpAddress(owner, null, vpc.getId(), dcId, true);
|
||||
}
|
||||
|
||||
return ipToReturn;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public PublicIp assignSourceNatIpAddressToGuestNetwork(Account owner, Network guestNetwork)
|
||||
@ -529,9 +511,9 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
|
||||
assert (guestNetwork.getTrafficType() != null) : "You're asking for a source nat but your network " +
|
||||
"can't participate in source nat. What do you have to say for yourself?";
|
||||
long dcId = guestNetwork.getDataCenterId();
|
||||
|
||||
IPAddressVO sourceNatIp = getExistingSourceNat(owner.getId(), guestNetwork.getId(), guestNetwork.getVpcId());
|
||||
|
||||
|
||||
IPAddressVO sourceNatIp = getExistingSourceNatInNetwork(owner.getId(), guestNetwork.getId());
|
||||
|
||||
PublicIp ipToReturn = null;
|
||||
if (sourceNatIp != null) {
|
||||
ipToReturn = new PublicIp(sourceNatIp, _vlanDao.findById(sourceNatIp.getVlanId()),
|
||||
@ -550,6 +532,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
|
||||
|
||||
|
||||
@DB
|
||||
@Override
|
||||
public PublicIp assignDedicateIpAddress(Account owner, Long guestNtwkId, Long vpcId, long dcId, boolean isSourceNat)
|
||||
throws ConcurrentOperationException, InsufficientAddressCapacityException {
|
||||
|
||||
@ -1118,15 +1101,11 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
|
||||
return ip;
|
||||
}
|
||||
|
||||
protected IPAddressVO getExistingSourceNat(long ownerId, Long networkId, Long vpcId) {
|
||||
|
||||
List<IPAddressVO> addrs = null;
|
||||
if (vpcId != null) {
|
||||
addrs = listPublicIpsAssignedToVpc(ownerId, true, vpcId);
|
||||
} else if (networkId != null) {
|
||||
addrs = listPublicIpsAssignedToGuestNtwk(ownerId, networkId, true);
|
||||
}
|
||||
|
||||
|
||||
protected IPAddressVO getExistingSourceNatInNetwork(long ownerId, Long networkId) {
|
||||
|
||||
List<IPAddressVO> addrs = listPublicIpsAssignedToGuestNtwk(ownerId, networkId, true);
|
||||
|
||||
IPAddressVO sourceNatIp = null;
|
||||
if (addrs.isEmpty()) {
|
||||
return null;
|
||||
@ -1140,7 +1119,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
|
||||
}
|
||||
|
||||
assert (sourceNatIp != null) : "How do we get a bunch of ip addresses but none of them are source nat? " +
|
||||
"account=" + ownerId + "; networkId=" + networkId + "; vpcId=" + vpcId;
|
||||
"account=" + ownerId + "; networkId=" + networkId;
|
||||
}
|
||||
|
||||
return sourceNatIp;
|
||||
@ -1203,7 +1182,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
|
||||
boolean sharedSourceNat = offering.getSharedSourceNat();
|
||||
boolean isSourceNat = false;
|
||||
if (!sharedSourceNat) {
|
||||
if (getExistingSourceNat(owner.getId(), networkId, null) == null) {
|
||||
if (getExistingSourceNatInNetwork(owner.getId(), networkId) == null) {
|
||||
if (network.getGuestType() == GuestType.Isolated && network.getVpcId() == null) {
|
||||
isSourceNat = true;
|
||||
}
|
||||
@ -1246,54 +1225,6 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@DB
|
||||
protected IpAddress associateIPToVpc(long ipId, long vpcId) throws ResourceAllocationException, ResourceUnavailableException,
|
||||
InsufficientAddressCapacityException, ConcurrentOperationException {
|
||||
Account caller = UserContext.current().getCaller();
|
||||
Account owner = null;
|
||||
|
||||
IpAddress ipToAssoc = getIp(ipId);
|
||||
if (ipToAssoc != null) {
|
||||
_accountMgr.checkAccess(caller, null, true, ipToAssoc);
|
||||
owner = _accountMgr.getAccount(ipToAssoc.getAllocatedToAccountId());
|
||||
} else {
|
||||
s_logger.debug("Unable to find ip address by id: " + ipId);
|
||||
return null;
|
||||
}
|
||||
|
||||
Vpc vpc = _vpcMgr.getVpc(vpcId);
|
||||
if (vpc == null) {
|
||||
throw new InvalidParameterValueException("Invalid VPC id " + vpcId);
|
||||
}
|
||||
|
||||
// check permissions
|
||||
_accountMgr.checkAccess(caller, null, true, owner, vpc);
|
||||
|
||||
boolean isSourceNat = false;
|
||||
if (getExistingSourceNat(owner.getId(), null, vpcId) == null) {
|
||||
isSourceNat = true;
|
||||
}
|
||||
|
||||
s_logger.debug("Associating ip " + ipToAssoc + " to vpc " + vpc);
|
||||
|
||||
Transaction txn = Transaction.currentTxn();
|
||||
txn.start();
|
||||
IPAddressVO ip = _ipAddressDao.findById(ipId);
|
||||
//update ip address with networkId
|
||||
ip.setVpcId(vpcId);
|
||||
ip.setSourceNat(isSourceNat);
|
||||
_ipAddressDao.update(ipId, ip);
|
||||
|
||||
//mark ip as allocated
|
||||
markPublicIpAsAllocated(ip);
|
||||
txn.commit();
|
||||
|
||||
s_logger.debug("Successfully assigned ip " + ipToAssoc + " to vpc " + vpc);
|
||||
|
||||
return _ipAddressDao.findById(ipId);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
@DB
|
||||
@ -1658,19 +1589,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
|
||||
|
||||
return _ipAddressDao.search(sc, null);
|
||||
}
|
||||
|
||||
protected List<IPAddressVO> listPublicIpsAssignedToVpc(long accountId, Boolean sourceNat, long vpcId) {
|
||||
SearchCriteria<IPAddressVO> sc = IpAddressSearch.create();
|
||||
sc.setParameters("accountId", accountId);
|
||||
sc.setParameters("vpcId", vpcId);
|
||||
|
||||
if (sourceNat != null) {
|
||||
sc.addAnd("sourceNat", SearchCriteria.Op.EQ, sourceNat);
|
||||
}
|
||||
sc.setJoinParameters("virtualNetworkVlanSB", "vlanType", VlanType.VirtualNetwork);
|
||||
|
||||
return _ipAddressDao.search(sc, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<NetworkVO> setupNetwork(Account owner, NetworkOfferingVO offering, DeploymentPlan plan, String name,
|
||||
@ -2082,24 +2001,19 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
|
||||
&& !sharedSourceNat) {
|
||||
|
||||
List<IPAddressVO> ips = null;
|
||||
Vpc vpc = null;
|
||||
if (network.getVpcId() != null) {
|
||||
vpc = _vpcMgr.getVpc(network.getVpcId());
|
||||
ips = _ipAddressDao.listByAssociatedVpc(vpc.getId(), true);
|
||||
ips = _ipAddressDao.listByAssociatedVpc(network.getVpcId(), true);
|
||||
if (ips.isEmpty()) {
|
||||
throw new CloudRuntimeException("Vpc is not implemented; there is no source nat ip");
|
||||
}
|
||||
} else {
|
||||
ips = _ipAddressDao.listByAssociatedNetwork(network.getId(), true);
|
||||
}
|
||||
|
||||
|
||||
if (ips.isEmpty()) {
|
||||
String target = vpc != null ? vpc.toString() : network.toString();
|
||||
s_logger.debug("Creating a source nat ip for " + target);
|
||||
s_logger.debug("Creating a source nat ip for network " + network);
|
||||
Account owner = _accountMgr.getAccount(network.getAccountId());
|
||||
if (vpc != null) {
|
||||
assignSourceNatIpAddressToVpc(owner, vpc);
|
||||
} else {
|
||||
assignSourceNatIpAddressToGuestNetwork(owner, network);
|
||||
}
|
||||
assignSourceNatIpAddressToGuestNetwork(owner, network);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2537,50 +2451,6 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
|
||||
_nicDao.expunge(nic.getId());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void checkVirtualNetworkCidrOverlap(Long zoneId, String cidr) {
|
||||
if (zoneId == null) {
|
||||
return;
|
||||
}
|
||||
if (cidr == null) {
|
||||
return;
|
||||
}
|
||||
List<NetworkVO> networks = _networksDao.listByZone((long) zoneId);
|
||||
Map<Long, String> networkToCidr = new HashMap<Long, String>();
|
||||
for (NetworkVO network : networks) {
|
||||
if (network.getGuestType() != GuestType.Isolated) {
|
||||
continue;
|
||||
}
|
||||
if (network.getCidr() != null) {
|
||||
networkToCidr.put(network.getId(), network.getCidr());
|
||||
}
|
||||
}
|
||||
if (networkToCidr == null || networkToCidr.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
String currCidrAddress = getCidrAddress(cidr);
|
||||
int currCidrSize = getCidrSize(cidr);
|
||||
|
||||
for (long networkId : networkToCidr.keySet()) {
|
||||
String ntwkCidr = networkToCidr.get(networkId);
|
||||
String ntwkCidrAddress = getCidrAddress(ntwkCidr);
|
||||
int ntwkCidrSize = getCidrSize(ntwkCidr);
|
||||
|
||||
long cidrSizeToUse = currCidrSize < ntwkCidrSize ? currCidrSize : ntwkCidrSize;
|
||||
|
||||
String ntwkCidrSubnet = NetUtils.getCidrSubNet(ntwkCidrAddress, cidrSizeToUse);
|
||||
String cidrSubnet = NetUtils.getCidrSubNet(currCidrAddress, cidrSizeToUse);
|
||||
|
||||
if (cidrSubnet.equals(ntwkCidrSubnet)) {
|
||||
InvalidParameterValueException ex = new InvalidParameterValueException("Warning: The specified existing network has conflict CIDR subnets with new network!");
|
||||
ex.addProxyObject("networks", networkId, "networkId");
|
||||
throw ex;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@DB
|
||||
@ -2646,17 +2516,6 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
|
||||
ex.addProxyObject(zone, zoneId, "zoneId");
|
||||
throw ex;
|
||||
}
|
||||
|
||||
//validate vpc
|
||||
if (vpcId != null) {
|
||||
Vpc vpc = _vpcMgr.getActiveVpc(vpcId);
|
||||
if (vpc == null) {
|
||||
InvalidParameterValueException ex = new InvalidParameterValueException("Unable to find Enabled VPC ");
|
||||
ex.addProxyObject("vpc", vpcId, "VPC");
|
||||
throw ex;
|
||||
}
|
||||
_accountMgr.checkAccess(caller, null, false, vpc);
|
||||
}
|
||||
|
||||
// Only domain and account ACL types are supported in Acton.
|
||||
ACLType aclType = null;
|
||||
@ -2835,8 +2694,8 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
|
||||
if (!_configMgr.isOfferingForVpc(ntwkOff)){
|
||||
throw new InvalidParameterValueException("Network offering can't be used for VPC networks");
|
||||
}
|
||||
network = createVpcGuestNetwork(networkOfferingId, name, displayText, gateway, cidr, vlanId,
|
||||
networkDomain, owner, sharedDomainId, pNtwk, zoneId, aclType, subdomainAccess, vpcId);
|
||||
network = _vpcMgr.createVpcGuestNetwork(networkOfferingId, name, displayText, gateway, cidr, vlanId,
|
||||
networkDomain, owner, sharedDomainId, pNtwk, zoneId, aclType, subdomainAccess, vpcId, caller);
|
||||
} else {
|
||||
if (_configMgr.isOfferingForVpc(ntwkOff)){
|
||||
throw new InvalidParameterValueException("Network offering can be used for VPC networks only");
|
||||
@ -2855,30 +2714,6 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
|
||||
|
||||
return network;
|
||||
}
|
||||
|
||||
@DB
|
||||
protected Network createVpcGuestNetwork(long ntwkOffId, String name, String displayText, String gateway,
|
||||
String cidr, String vlanId, String networkDomain, Account owner, Long domainId,
|
||||
PhysicalNetwork pNtwk, long zoneId, ACLType aclType, Boolean subdomainAccess, long vpcId)
|
||||
throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException {
|
||||
|
||||
Vpc vpc = _vpcMgr.getActiveVpc(vpcId);
|
||||
if (networkDomain == null) {
|
||||
networkDomain = vpc.getNetworkDomain();
|
||||
}
|
||||
|
||||
if (vpc.getZoneId() != zoneId) {
|
||||
throw new InvalidParameterValueException("New network doesn't belong to vpc zone", null);
|
||||
}
|
||||
|
||||
//1) Validate if network can be created for VPC
|
||||
_vpcMgr.validateGuestNtkwForVpc(_configMgr.getNetworkOffering(ntwkOffId), cidr, networkDomain, owner, vpc, null, gateway);
|
||||
//2) Create network
|
||||
Network guestNetwork = createGuestNetwork(ntwkOffId, name, displayText, gateway, cidr, vlanId,
|
||||
networkDomain, owner, domainId, pNtwk, zoneId, aclType, subdomainAccess, vpcId);
|
||||
|
||||
return guestNetwork;
|
||||
}
|
||||
|
||||
@Override
|
||||
@DB
|
||||
@ -4730,20 +4565,6 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
|
||||
String errMsg = forVpcNew ? "a vpc offering " : "not a vpc offering";
|
||||
throw new InvalidParameterValueException("Can't update as the new offering is " + errMsg);
|
||||
}
|
||||
|
||||
//can't update from vpc to non-vpc network offering
|
||||
boolean forVpcNew = _configMgr.isOfferingForVpc(networkOffering);
|
||||
boolean vorVpcOriginal = _configMgr.isOfferingForVpc(_configMgr.getNetworkOffering(oldNetworkOfferingId));
|
||||
if (forVpcNew != vorVpcOriginal) {
|
||||
String errMsg = forVpcNew ? "a vpc offering " : "not a vpc offering";
|
||||
throw new InvalidParameterValueException("Can't update as the new offering is " + errMsg);
|
||||
}
|
||||
|
||||
//perform below validation if the network is vpc network
|
||||
if (network.getVpcId() != null) {
|
||||
Vpc vpc = _vpcMgr.getVpc(network.getVpcId());
|
||||
_vpcMgr.validateGuestNtkwForVpc(networkOffering, null, null, null,vpc, networkId, null);
|
||||
}
|
||||
|
||||
if (networkOfferingId != oldNetworkOfferingId) {
|
||||
if (networkOfferingIsConfiguredForExternalNetworking(networkOfferingId) != networkOfferingIsConfiguredForExternalNetworking(oldNetworkOfferingId)
|
||||
@ -6117,7 +5938,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
|
||||
IPAddressVO ip = markIpAsUnavailable(ipToRelease.getId());
|
||||
assert (ip != null) : "Unable to mark the ip address id=" + ipToRelease.getId() + " as unavailable.";
|
||||
} else {
|
||||
unassignIPFromVpcNetwork(ipToRelease.getId(), network.getId());
|
||||
_vpcMgr.unassignIPFromVpcNetwork(ipToRelease.getId(), network.getId());
|
||||
}
|
||||
}
|
||||
|
||||
@ -7113,7 +6934,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
|
||||
// allocate ip
|
||||
ip = allocateIP(owner, true, guestNetwork.getDataCenterId());
|
||||
// apply ip associations
|
||||
ip = associateIP(ip.getId(), networkId, null);
|
||||
ip = associateIPToNetwork(ip.getId(), networkId);
|
||||
} catch (ResourceAllocationException ex) {
|
||||
throw new CloudRuntimeException("Failed to allocate system ip due to ", ex);
|
||||
} catch (ConcurrentOperationException ex) {
|
||||
@ -7288,69 +7109,22 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
|
||||
|
||||
@Override
|
||||
@ActionEvent(eventType = EventTypes.EVENT_NET_IP_ASSIGN, eventDescription = "associating Ip", async = true)
|
||||
public IpAddress associateIP(long ipId, Long networkId, Long vpcId) throws InsufficientAddressCapacityException,
|
||||
ResourceAllocationException, ResourceUnavailableException, ConcurrentOperationException {
|
||||
if (vpcId != null) {
|
||||
return associateIPToVpc(ipId, vpcId);
|
||||
}
|
||||
|
||||
if (networkId != null) {
|
||||
Network network = _networksDao.findById(networkId);
|
||||
if (network == null) {
|
||||
throw new InvalidParameterValueException("Invalid network id is given");
|
||||
}
|
||||
|
||||
if (network.getVpcId() != null) {
|
||||
throw new InvalidParameterValueException("Can't assign ip to the network directly when network belongs" +
|
||||
" to VPC.Specify vpcId to associate ip address to VPC");
|
||||
}
|
||||
return associateIPToGuestNetwork(ipId, networkId, true);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
public IpAddress associateIPToNetwork(long ipId, long networkId) throws InsufficientAddressCapacityException,
|
||||
ResourceAllocationException, ResourceUnavailableException, ConcurrentOperationException {
|
||||
|
||||
Network network = _networksDao.findById(networkId);
|
||||
if (network == null) {
|
||||
throw new InvalidParameterValueException("Invalid network id is given");
|
||||
}
|
||||
|
||||
if (network.getVpcId() != null) {
|
||||
throw new InvalidParameterValueException("Can't assign ip to the network directly when network belongs" +
|
||||
" to VPC.Specify vpcId to associate ip address to VPC");
|
||||
}
|
||||
return associateIPToGuestNetwork(ipId, networkId, true);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void unassignIPFromVpcNetwork(long ipId, long networkId) {
|
||||
IPAddressVO ip = _ipAddressDao.findById(ipId);
|
||||
|
||||
if (ipUsedInVpc(ip)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (ip == null || ip.getVpcId() == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
s_logger.debug("Releasing VPC ip address " + ip + " from vpc network id=" + networkId);
|
||||
|
||||
long vpcId = ip.getVpcId();
|
||||
boolean success = false;
|
||||
try {
|
||||
//unassign ip from the VPC router
|
||||
success = applyIpAssociations(getNetwork(networkId), true);
|
||||
} catch (ResourceUnavailableException ex) {
|
||||
throw new CloudRuntimeException("Failed to apply ip associations for network id=" + networkId +
|
||||
" as a part of unassigning ip " + ipId + " from vpc", ex);
|
||||
}
|
||||
|
||||
if (success) {
|
||||
ip.setAssociatedWithNetworkId(null);
|
||||
_ipAddressDao.update(ipId, ip);
|
||||
s_logger.debug("IP address " + ip + " is no longer associated with the network inside vpc id=" + vpcId);
|
||||
} else {
|
||||
throw new CloudRuntimeException("Failed to apply ip associations for network id=" + networkId +
|
||||
" as a part of unassigning ip " + ipId + " from vpc");
|
||||
}
|
||||
s_logger.debug("Successfully released VPC ip address " + ip + " back to VPC pool ");
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean ipUsedInVpc(IpAddress ip) {
|
||||
return (ip != null && ip.getVpcId() != null &&
|
||||
(ip.isOneToOneNat() || !_firewallDao.listByIp(ip.getId()).isEmpty()));
|
||||
}
|
||||
|
||||
@Override @DB
|
||||
public Network createPrivateNetwork(String networkName, String displayText, long physicalNetworkId,
|
||||
|
||||
@ -57,6 +57,7 @@ import com.cloud.network.rules.FirewallRule.State;
|
||||
import com.cloud.network.rules.FirewallRuleVO;
|
||||
import com.cloud.network.rules.PortForwardingRuleVO;
|
||||
import com.cloud.network.rules.dao.PortForwardingRulesDao;
|
||||
import com.cloud.network.vpc.VpcManager;
|
||||
import com.cloud.projects.Project.ListProjectResourcesCriteria;
|
||||
import com.cloud.server.ResourceTag.TaggedResourceType;
|
||||
import com.cloud.tags.ResourceTagVO;
|
||||
@ -111,6 +112,8 @@ public class FirewallManagerImpl implements FirewallService, FirewallManager, Ma
|
||||
UserVmDao _vmDao;
|
||||
@Inject
|
||||
ResourceTagDao _resourceTagDao;
|
||||
@Inject
|
||||
VpcManager _vpcMgr;
|
||||
|
||||
private boolean _elbEnabled = false;
|
||||
|
||||
@ -458,7 +461,7 @@ public class FirewallManagerImpl implements FirewallService, FirewallManager, Ma
|
||||
if (rule.getSourceIpAddressId() != null) {
|
||||
//if the rule is the last one for the ip address assigned to VPC, unassign it from the network
|
||||
IpAddress ip = _ipAddressDao.findById(rule.getSourceIpAddressId());
|
||||
_networkMgr.unassignIPFromVpcNetwork(ip.getId(), rule.getNetworkId());
|
||||
_vpcMgr.unassignIPFromVpcNetwork(ip.getId(), rule.getNetworkId());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -83,6 +83,7 @@ import com.cloud.network.rules.LbStickinessMethod.LbStickinessMethodParam;
|
||||
import com.cloud.network.rules.LoadBalancer;
|
||||
import com.cloud.network.rules.RulesManager;
|
||||
import com.cloud.network.rules.StickinessPolicy;
|
||||
import com.cloud.network.vpc.VpcManager;
|
||||
import com.cloud.offering.NetworkOffering;
|
||||
import com.cloud.projects.Project.ListProjectResourcesCriteria;
|
||||
import com.cloud.server.ResourceTag.TaggedResourceType;
|
||||
@ -165,6 +166,8 @@ public class LoadBalancingRulesManagerImpl<Type> implements LoadBalancingRulesMa
|
||||
NetworkServiceMapDao _ntwkSrvcDao;
|
||||
@Inject
|
||||
ResourceTagDao _resourceTagDao;
|
||||
@Inject
|
||||
VpcManager _vpcMgr;
|
||||
|
||||
private String getLBStickinessCapability(long networkid) {
|
||||
Map<Service, Map<Capability, String>> serviceCapabilitiesMap = _networkMgr.getNetworkCapabilities(networkid);
|
||||
@ -780,8 +783,7 @@ public class LoadBalancingRulesManagerImpl<Type> implements LoadBalancingRulesMa
|
||||
// release ip address if ipassoc was perfored
|
||||
if (performedIpAssoc) {
|
||||
ipVO = _ipAddressDao.findById(ipVO.getId());
|
||||
_networkMgr.unassignIPFromVpcNetwork(ipVO.getId(), lb.getNetworkId());
|
||||
|
||||
_vpcMgr.unassignIPFromVpcNetwork(ipVO.getId(), lb.getNetworkId());
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1351,6 +1353,6 @@ public class LoadBalancingRulesManagerImpl<Type> implements LoadBalancingRulesMa
|
||||
|
||||
//if the rule is the last one for the ip address assigned to VPC, unassign it from the network
|
||||
IpAddress ip = _ipAddressDao.findById(rule.getSourceIpAddressId());
|
||||
_networkMgr.unassignIPFromVpcNetwork(ip.getId(), rule.getNetworkId());
|
||||
_vpcMgr.unassignIPFromVpcNetwork(ip.getId(), rule.getNetworkId());
|
||||
}
|
||||
}
|
||||
|
||||
@ -206,7 +206,7 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian
|
||||
}
|
||||
}
|
||||
|
||||
PublicIp sourceNatIp = _networkMgr.assignSourceNatIpAddressToVpc(owner, vpc);
|
||||
PublicIp sourceNatIp = _vpcMgr.assignSourceNatIpAddressToVpc(owner, vpc);
|
||||
|
||||
DomainRouterVO router = deployVpcRouter(owner, dest, plan, params, false, vpcVrProvider, offeringId,
|
||||
vpc.getId(), sourceNatIp);
|
||||
@ -1198,7 +1198,7 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian
|
||||
PublicIp publicIp = new PublicIp(ip, _vlanDao.findById(ip.getVlanId()),
|
||||
NetUtils.createSequenceBasedMacAddress(ip.getMacAddress()));
|
||||
if ((ip.getState() == IpAddress.State.Allocated || ip.getState() == IpAddress.State.Allocating)
|
||||
&& _networkMgr.ipUsedInVpc(ip)&& !publicVlans.contains(publicIp.getVlanTag())) {
|
||||
&& _vpcMgr.ipUsedInVpc(ip)&& !publicVlans.contains(publicIp.getVlanTag())) {
|
||||
s_logger.debug("Allocating nic for router in vlan " + publicIp.getVlanTag());
|
||||
NicProfile publicNic = new NicProfile();
|
||||
publicNic.setDefaultNic(false);
|
||||
@ -1267,7 +1267,7 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian
|
||||
long publicNtwkId = ip.getNetworkId();
|
||||
|
||||
//if ip is not associated to any network, and there are no firewall rules, release it on the backend
|
||||
if (!_networkMgr.ipUsedInVpc(ip)) {
|
||||
if (!_vpcMgr.ipUsedInVpc(ip)) {
|
||||
ip.setState(IpAddress.State.Releasing);
|
||||
}
|
||||
|
||||
@ -1287,7 +1287,7 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian
|
||||
long publicNtwkId = ip.getNetworkId();
|
||||
|
||||
//if ip is not associated to any network, and there are no firewall rules, release it on the backend
|
||||
if (!_networkMgr.ipUsedInVpc(ip)) {
|
||||
if (!_vpcMgr.ipUsedInVpc(ip)) {
|
||||
ip.setState(IpAddress.State.Releasing);
|
||||
}
|
||||
|
||||
|
||||
@ -50,6 +50,7 @@ import com.cloud.network.dao.IPAddressDao;
|
||||
import com.cloud.network.rules.FirewallRule.FirewallRuleType;
|
||||
import com.cloud.network.rules.FirewallRule.Purpose;
|
||||
import com.cloud.network.rules.dao.PortForwardingRulesDao;
|
||||
import com.cloud.network.vpc.VpcManager;
|
||||
import com.cloud.offering.NetworkOffering;
|
||||
import com.cloud.projects.Project.ListProjectResourcesCriteria;
|
||||
import com.cloud.server.ResourceTag.TaggedResourceType;
|
||||
@ -114,6 +115,8 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager {
|
||||
NicDao _nicDao;
|
||||
@Inject
|
||||
ResourceTagDao _resourceTagDao;
|
||||
@Inject
|
||||
VpcManager _vpcMgr;
|
||||
|
||||
@Override
|
||||
public void checkIpAndUserVm(IpAddress ipAddress, UserVm userVm, Account caller) {
|
||||
@ -289,7 +292,7 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager {
|
||||
if (performedIpAssoc) {
|
||||
//if the rule is the last one for the ip address assigned to VPC, unassign it from the network
|
||||
IpAddress ip = _ipAddressDao.findById(ipAddress.getId());
|
||||
_networkMgr.unassignIPFromVpcNetwork(ip.getId(), networkId);
|
||||
_vpcMgr.unassignIPFromVpcNetwork(ip.getId(), networkId);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -468,7 +471,7 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager {
|
||||
if (performedIpAssoc) {
|
||||
//if the rule is the last one for the ip address assigned to VPC, unassign it from the network
|
||||
IpAddress ip = _ipAddressDao.findById(ipAddress.getId());
|
||||
_networkMgr.unassignIPFromVpcNetwork(ip.getId(), networkId);
|
||||
_vpcMgr.unassignIPFromVpcNetwork(ip.getId(), networkId);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1208,7 +1211,7 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager {
|
||||
ipAddress.setSystem(false);
|
||||
}
|
||||
_ipAddressDao.update(ipAddress.getId(), ipAddress);
|
||||
_networkMgr.unassignIPFromVpcNetwork(ipAddress.getId(), networkId);
|
||||
_vpcMgr.unassignIPFromVpcNetwork(ipAddress.getId(), networkId);
|
||||
|
||||
if (isIpSystem && releaseIpIfElastic && !_networkMgr.handleSystemIpRelease(ipAddress)) {
|
||||
s_logger.warn("Failed to release system ip address " + ipAddress);
|
||||
@ -1398,6 +1401,6 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager {
|
||||
|
||||
//if the rule is the last one for the ip address assigned to VPC, unassign it from the network
|
||||
IpAddress ip = _ipAddressDao.findById(rule.getSourceIpAddressId());
|
||||
_networkMgr.unassignIPFromVpcNetwork(ip.getId(), rule.getNetworkId());
|
||||
_vpcMgr.unassignIPFromVpcNetwork(ip.getId(), rule.getNetworkId());
|
||||
}
|
||||
}
|
||||
|
||||
@ -18,9 +18,16 @@ package com.cloud.network.vpc;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.cloud.acl.ControlledEntity.ACLType;
|
||||
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.offering.NetworkOffering;
|
||||
import com.cloud.network.IpAddress;
|
||||
import com.cloud.network.Network;
|
||||
import com.cloud.network.PhysicalNetwork;
|
||||
import com.cloud.network.addr.PublicIp;
|
||||
import com.cloud.user.Account;
|
||||
import com.cloud.vm.DomainRouterVO;
|
||||
|
||||
@ -28,7 +35,7 @@ import com.cloud.vm.DomainRouterVO;
|
||||
public interface VpcManager extends VpcService{
|
||||
|
||||
/**
|
||||
* @param guestNtwkOff
|
||||
* @param ntwkOffId
|
||||
* @param cidr
|
||||
* @param networkDomain
|
||||
* @param networkOwner
|
||||
@ -37,7 +44,7 @@ public interface VpcManager extends VpcService{
|
||||
* @param gateway TODO
|
||||
* @return
|
||||
*/
|
||||
void validateGuestNtkwForVpc(NetworkOffering guestNtwkOff, String cidr, String networkDomain, Account networkOwner,
|
||||
void validateNtkwOffForVpc(long ntwkOffId, String cidr, String networkDomain, Account networkOwner,
|
||||
Vpc vpc, Long networkId, String gateway);
|
||||
|
||||
|
||||
@ -69,4 +76,55 @@ public interface VpcManager extends VpcService{
|
||||
*/
|
||||
VpcGateway getPrivateGatewayForVpc(long vpcId);
|
||||
|
||||
|
||||
/**
|
||||
* @param ip
|
||||
* @return
|
||||
*/
|
||||
boolean ipUsedInVpc(IpAddress ip);
|
||||
|
||||
|
||||
/**
|
||||
* @param ipId
|
||||
* @param networkId
|
||||
*/
|
||||
void unassignIPFromVpcNetwork(long ipId, long networkId);
|
||||
|
||||
|
||||
/**
|
||||
* @param ntwkOffId
|
||||
* @param name
|
||||
* @param displayText
|
||||
* @param gateway
|
||||
* @param cidr
|
||||
* @param vlanId
|
||||
* @param networkDomain
|
||||
* @param owner
|
||||
* @param domainId
|
||||
* @param pNtwk
|
||||
* @param zoneId
|
||||
* @param aclType
|
||||
* @param subdomainAccess
|
||||
* @param vpcId
|
||||
* @param caller
|
||||
* @return
|
||||
* @throws ConcurrentOperationException
|
||||
* @throws InsufficientCapacityException
|
||||
* @throws ResourceAllocationException
|
||||
*/
|
||||
Network createVpcGuestNetwork(long ntwkOffId, String name, String displayText, String gateway, String cidr,
|
||||
String vlanId, String networkDomain, Account owner, Long domainId, PhysicalNetwork pNtwk, long zoneId,
|
||||
ACLType aclType, Boolean subdomainAccess, long vpcId, Account caller)
|
||||
throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException;
|
||||
|
||||
|
||||
/**
|
||||
* @param owner
|
||||
* @param vpc
|
||||
* @return
|
||||
* @throws InsufficientAddressCapacityException
|
||||
* @throws ConcurrentOperationException
|
||||
*/
|
||||
PublicIp assignSourceNatIpAddressToVpc(Account owner, Vpc vpc) throws InsufficientAddressCapacityException, ConcurrentOperationException;
|
||||
|
||||
}
|
||||
|
||||
@ -31,16 +31,21 @@ import javax.naming.ConfigurationException;
|
||||
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
import com.cloud.acl.ControlledEntity.ACLType;
|
||||
import com.cloud.api.commands.ListPrivateGatewaysCmd;
|
||||
import com.cloud.api.commands.ListStaticRoutesCmd;
|
||||
import com.cloud.configuration.Config;
|
||||
import com.cloud.configuration.ConfigurationManager;
|
||||
import com.cloud.configuration.dao.ConfigurationDao;
|
||||
import com.cloud.dc.DataCenter;
|
||||
import com.cloud.dc.Vlan.VlanType;
|
||||
import com.cloud.dc.VlanVO;
|
||||
import com.cloud.dc.dao.VlanDao;
|
||||
import com.cloud.deploy.DeployDestination;
|
||||
import com.cloud.event.ActionEvent;
|
||||
import com.cloud.event.EventTypes;
|
||||
import com.cloud.exception.ConcurrentOperationException;
|
||||
import com.cloud.exception.InsufficientAddressCapacityException;
|
||||
import com.cloud.exception.InsufficientCapacityException;
|
||||
import com.cloud.exception.InvalidParameterValueException;
|
||||
import com.cloud.exception.NetworkRuleConflictException;
|
||||
@ -49,6 +54,7 @@ import com.cloud.exception.ResourceAllocationException;
|
||||
import com.cloud.exception.ResourceUnavailableException;
|
||||
import com.cloud.exception.UnsupportedServiceException;
|
||||
import com.cloud.network.IPAddressVO;
|
||||
import com.cloud.network.IpAddress;
|
||||
import com.cloud.network.Network;
|
||||
import com.cloud.network.Network.GuestType;
|
||||
import com.cloud.network.Network.Provider;
|
||||
@ -58,6 +64,7 @@ import com.cloud.network.NetworkVO;
|
||||
import com.cloud.network.Networks.BroadcastDomainType;
|
||||
import com.cloud.network.Networks.TrafficType;
|
||||
import com.cloud.network.PhysicalNetwork;
|
||||
import com.cloud.network.addr.PublicIp;
|
||||
import com.cloud.network.dao.FirewallRulesDao;
|
||||
import com.cloud.network.dao.IPAddressDao;
|
||||
import com.cloud.network.dao.NetworkDao;
|
||||
@ -147,6 +154,8 @@ public class VpcManagerImpl implements VpcManager, Manager{
|
||||
Site2SiteVpnGatewayDao _vpnGatewayDao;
|
||||
@Inject
|
||||
Site2SiteVpnManager _s2sVpnMgr;
|
||||
@Inject
|
||||
VlanDao _vlanDao = null;
|
||||
|
||||
private final ScheduledExecutorService _executor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("VpcChecker"));
|
||||
private VpcProvider vpcElement = null;
|
||||
@ -154,6 +163,7 @@ public class VpcManagerImpl implements VpcManager, Manager{
|
||||
String _name;
|
||||
int _cleanupInterval;
|
||||
int _maxNetworks;
|
||||
SearchBuilder<IPAddressVO> IpAddressSearch;
|
||||
|
||||
@Override
|
||||
@DB
|
||||
@ -194,6 +204,18 @@ public class VpcManagerImpl implements VpcManager, Manager{
|
||||
|
||||
String maxNtwks = configs.get(Config.VpcMaxNetworks.key());
|
||||
_maxNetworks = NumbersUtil.parseInt(maxNtwks, 3); // max=3 is default
|
||||
|
||||
|
||||
IpAddressSearch = _ipAddressDao.createSearchBuilder();
|
||||
IpAddressSearch.and("accountId", IpAddressSearch.entity().getAllocatedToAccountId(), Op.EQ);
|
||||
IpAddressSearch.and("dataCenterId", IpAddressSearch.entity().getDataCenterId(), Op.EQ);
|
||||
IpAddressSearch.and("vpcId", IpAddressSearch.entity().getVpcId(), Op.EQ);
|
||||
IpAddressSearch.and("associatedWithNetworkId", IpAddressSearch.entity().getAssociatedWithNetworkId(), Op.EQ);
|
||||
SearchBuilder<VlanVO> virtualNetworkVlanSB = _vlanDao.createSearchBuilder();
|
||||
virtualNetworkVlanSB.and("vlanType", virtualNetworkVlanSB.entity().getVlanType(), Op.EQ);
|
||||
IpAddressSearch.join("virtualNetworkVlanSB", virtualNetworkVlanSB, IpAddressSearch.entity().getVlanId(), virtualNetworkVlanSB.entity().getId(), JoinBuilder.JoinType.INNER);
|
||||
IpAddressSearch.done();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -878,8 +900,10 @@ public class VpcManagerImpl implements VpcManager, Manager{
|
||||
|
||||
@Override
|
||||
@DB
|
||||
public void validateGuestNtkwForVpc(NetworkOffering guestNtwkOff, String cidr, String networkDomain,
|
||||
public void validateNtkwOffForVpc(long ntwkOffId, String cidr, String networkDomain,
|
||||
Account networkOwner, Vpc vpc, Long networkId, String gateway) {
|
||||
|
||||
NetworkOffering guestNtwkOff = _configMgr.getNetworkOffering(ntwkOffId);
|
||||
|
||||
if (networkId == null) {
|
||||
//1) Validate attributes that has to be passed in when create new guest network
|
||||
@ -1614,4 +1638,203 @@ public class VpcManagerImpl implements VpcManager, Manager{
|
||||
public VpcGateway getPrivateGatewayForVpc(long vpcId) {
|
||||
return _vpcGatewayDao.getPrivateGatewayForVpc(vpcId);
|
||||
}
|
||||
|
||||
|
||||
@DB
|
||||
@Override
|
||||
@ActionEvent(eventType = EventTypes.EVENT_NET_IP_ASSIGN, eventDescription = "associating Ip", async = true)
|
||||
public IpAddress associateIPToVpc(long ipId, long vpcId) throws ResourceAllocationException, ResourceUnavailableException,
|
||||
InsufficientAddressCapacityException, ConcurrentOperationException {
|
||||
Account caller = UserContext.current().getCaller();
|
||||
Account owner = null;
|
||||
|
||||
IpAddress ipToAssoc = _ntwkMgr.getIp(ipId);
|
||||
if (ipToAssoc != null) {
|
||||
_accountMgr.checkAccess(caller, null, true, ipToAssoc);
|
||||
owner = _accountMgr.getAccount(ipToAssoc.getAllocatedToAccountId());
|
||||
} else {
|
||||
s_logger.debug("Unable to find ip address by id: " + ipId);
|
||||
return null;
|
||||
}
|
||||
|
||||
Vpc vpc = getVpc(vpcId);
|
||||
if (vpc == null) {
|
||||
throw new InvalidParameterValueException("Invalid VPC id provided");
|
||||
}
|
||||
|
||||
// check permissions
|
||||
_accountMgr.checkAccess(caller, null, true, owner, vpc);
|
||||
|
||||
boolean isSourceNat = false;
|
||||
if (getExistingSourceNatInVpc(owner.getId(), vpcId) == null) {
|
||||
isSourceNat = true;
|
||||
}
|
||||
|
||||
s_logger.debug("Associating ip " + ipToAssoc + " to vpc " + vpc);
|
||||
|
||||
Transaction txn = Transaction.currentTxn();
|
||||
txn.start();
|
||||
IPAddressVO ip = _ipAddressDao.findById(ipId);
|
||||
//update ip address with networkId
|
||||
ip.setVpcId(vpcId);
|
||||
ip.setSourceNat(isSourceNat);
|
||||
_ipAddressDao.update(ipId, ip);
|
||||
|
||||
//mark ip as allocated
|
||||
_ntwkMgr.markPublicIpAsAllocated(ip);
|
||||
txn.commit();
|
||||
|
||||
s_logger.debug("Successfully assigned ip " + ipToAssoc + " to vpc " + vpc);
|
||||
|
||||
return _ipAddressDao.findById(ipId);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void unassignIPFromVpcNetwork(long ipId, long networkId) {
|
||||
IPAddressVO ip = _ipAddressDao.findById(ipId);
|
||||
if (ipUsedInVpc(ip)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (ip == null || ip.getVpcId() == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
s_logger.debug("Releasing VPC ip address " + ip + " from vpc network id=" + networkId);
|
||||
|
||||
long vpcId = ip.getVpcId();
|
||||
boolean success = false;
|
||||
try {
|
||||
//unassign ip from the VPC router
|
||||
success = _ntwkMgr.applyIpAssociations(_ntwkMgr.getNetwork(networkId), true);
|
||||
} catch (ResourceUnavailableException ex) {
|
||||
throw new CloudRuntimeException("Failed to apply ip associations for network id=" + networkId +
|
||||
" as a part of unassigning ip " + ipId + " from vpc", ex);
|
||||
}
|
||||
|
||||
if (success) {
|
||||
ip.setAssociatedWithNetworkId(null);
|
||||
_ipAddressDao.update(ipId, ip);
|
||||
s_logger.debug("IP address " + ip + " is no longer associated with the network inside vpc id=" + vpcId);
|
||||
} else {
|
||||
throw new CloudRuntimeException("Failed to apply ip associations for network id=" + networkId +
|
||||
" as a part of unassigning ip " + ipId + " from vpc");
|
||||
}
|
||||
s_logger.debug("Successfully released VPC ip address " + ip + " back to VPC pool ");
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean ipUsedInVpc(IpAddress ip) {
|
||||
return (ip != null && ip.getVpcId() != null &&
|
||||
(ip.isOneToOneNat() || !_firewallDao.listByIp(ip.getId()).isEmpty()));
|
||||
}
|
||||
|
||||
@DB
|
||||
@Override
|
||||
public Network createVpcGuestNetwork(long ntwkOffId, String name, String displayText, String gateway,
|
||||
String cidr, String vlanId, String networkDomain, Account owner, Long domainId,
|
||||
PhysicalNetwork pNtwk, long zoneId, ACLType aclType, Boolean subdomainAccess, long vpcId, Account caller)
|
||||
throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException {
|
||||
|
||||
Vpc vpc = getActiveVpc(vpcId);
|
||||
|
||||
if (vpc == null) {
|
||||
InvalidParameterValueException ex = new InvalidParameterValueException("Unable to find Enabled VPC ");
|
||||
ex.addProxyObject("vpc", vpcId, "VPC");
|
||||
throw ex;
|
||||
}
|
||||
_accountMgr.checkAccess(caller, null, false, vpc);
|
||||
|
||||
if (networkDomain == null) {
|
||||
networkDomain = vpc.getNetworkDomain();
|
||||
}
|
||||
|
||||
if (vpc.getZoneId() != zoneId) {
|
||||
throw new InvalidParameterValueException("New network doesn't belong to vpc zone");
|
||||
}
|
||||
|
||||
//1) Validate if network can be created for VPC
|
||||
validateNtkwOffForVpc(ntwkOffId, cidr, networkDomain, owner, vpc, null, gateway);
|
||||
|
||||
//2) Create network
|
||||
Network guestNetwork = _ntwkMgr.createGuestNetwork(ntwkOffId, name, displayText, gateway, cidr, vlanId,
|
||||
networkDomain, owner, domainId, pNtwk, zoneId, aclType, subdomainAccess, vpcId);
|
||||
|
||||
return guestNetwork;
|
||||
}
|
||||
|
||||
|
||||
protected IPAddressVO getExistingSourceNatInVpc(long ownerId, long vpcId) {
|
||||
|
||||
List<IPAddressVO> addrs = listPublicIpsAssignedToVpc(ownerId, true, vpcId);
|
||||
|
||||
IPAddressVO sourceNatIp = null;
|
||||
if (addrs.isEmpty()) {
|
||||
return null;
|
||||
} else {
|
||||
// Account already has ip addresses
|
||||
for (IPAddressVO addr : addrs) {
|
||||
if (addr.isSourceNat()) {
|
||||
sourceNatIp = addr;
|
||||
return sourceNatIp;
|
||||
}
|
||||
}
|
||||
|
||||
assert (sourceNatIp != null) : "How do we get a bunch of ip addresses but none of them are source nat? " +
|
||||
"account=" + ownerId + "; vpcId=" + vpcId;
|
||||
}
|
||||
|
||||
return sourceNatIp;
|
||||
}
|
||||
|
||||
protected List<IPAddressVO> listPublicIpsAssignedToVpc(long accountId, Boolean sourceNat, long vpcId) {
|
||||
SearchCriteria<IPAddressVO> sc = IpAddressSearch.create();
|
||||
sc.setParameters("accountId", accountId);
|
||||
sc.setParameters("vpcId", vpcId);
|
||||
|
||||
if (sourceNat != null) {
|
||||
sc.addAnd("sourceNat", SearchCriteria.Op.EQ, sourceNat);
|
||||
}
|
||||
sc.setJoinParameters("virtualNetworkVlanSB", "vlanType", VlanType.VirtualNetwork);
|
||||
|
||||
return _ipAddressDao.search(sc, null);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public PublicIp assignSourceNatIpAddressToVpc(Account owner, Vpc vpc) throws InsufficientAddressCapacityException, ConcurrentOperationException {
|
||||
long dcId = vpc.getZoneId();
|
||||
|
||||
IPAddressVO sourceNatIp = getExistingSourceNatInVpc(owner.getId(), vpc.getId());
|
||||
|
||||
PublicIp ipToReturn = null;
|
||||
|
||||
if (sourceNatIp != null) {
|
||||
ipToReturn = new PublicIp(sourceNatIp, _vlanDao.findById(sourceNatIp.getVlanId()),
|
||||
NetUtils.createSequenceBasedMacAddress(sourceNatIp.getMacAddress()));
|
||||
} else {
|
||||
ipToReturn = _ntwkMgr.assignDedicateIpAddress(owner, null, vpc.getId(), dcId, true);
|
||||
}
|
||||
|
||||
return ipToReturn;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Network updateVpcGuestNetwork(long networkId, String name, String displayText, Account callerAccount,
|
||||
User callerUser, String domainSuffix, Long ntwkOffId, Boolean changeCidr) {
|
||||
NetworkVO network = _ntwkDao.findById(networkId);
|
||||
if (network == null) {
|
||||
throw new InvalidParameterValueException("Couldn't find network by id");
|
||||
}
|
||||
//perform below validation if the network is vpc network
|
||||
if (network.getVpcId() != null && ntwkOffId != null) {
|
||||
Vpc vpc = getVpc(network.getVpcId());
|
||||
validateNtkwOffForVpc(ntwkOffId, null, null, null, vpc, networkId, null);
|
||||
}
|
||||
|
||||
return _ntwkMgr.updateGuestNetwork(networkId, name, displayText, callerAccount, callerUser, domainSuffix,
|
||||
ntwkOffId, changeCidr);
|
||||
}
|
||||
}
|
||||
|
||||
@ -55,7 +55,6 @@ import com.cloud.network.element.UserDataServiceProvider;
|
||||
import com.cloud.network.guru.NetworkGuru;
|
||||
import com.cloud.network.rules.FirewallRule;
|
||||
import com.cloud.network.rules.StaticNat;
|
||||
import com.cloud.network.vpc.Vpc;
|
||||
import com.cloud.offering.NetworkOffering;
|
||||
import com.cloud.offerings.NetworkOfferingVO;
|
||||
import com.cloud.user.Account;
|
||||
@ -774,15 +773,6 @@ public class MockNetworkManagerImpl implements NetworkManager, Manager, NetworkS
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see com.cloud.network.NetworkService#associateIP(long, java.lang.Long, java.lang.Long)
|
||||
*/
|
||||
@Override
|
||||
public IpAddress associateIP(long ipId, Long networkId, Long vpcId) throws InsufficientAddressCapacityException, ResourceAllocationException, ResourceUnavailableException, ConcurrentOperationException {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see com.cloud.network.NetworkManager#allocateNic(com.cloud.vm.NicProfile, com.cloud.network.Network, java.lang.Boolean, int, com.cloud.vm.VirtualMachineProfile)
|
||||
*/
|
||||
@ -835,7 +825,7 @@ public class MockNetworkManagerImpl implements NetworkManager, Manager, NetworkS
|
||||
* @see com.cloud.network.NetworkService#getIsolatedNetworksWithSourceNATOwnedByAccountInZone(long, com.cloud.user.Account)
|
||||
*/
|
||||
@Override
|
||||
public List<? extends Network> getIsolatedNetworksWithSourceNATOwnedByAccountInZone(long zoneId, Account owner) {
|
||||
public IpAddress associateIPToNetwork(long ipId, long networkId) throws InsufficientAddressCapacityException, ResourceAllocationException, ResourceUnavailableException, ConcurrentOperationException {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
@ -946,16 +936,6 @@ public class MockNetworkManagerImpl implements NetworkManager, Manager, NetworkS
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see com.cloud.network.NetworkManager#checkVirtualNetworkCidrOverlap(java.lang.Long, java.lang.String)
|
||||
*/
|
||||
@Override
|
||||
public void checkVirtualNetworkCidrOverlap(Long zoneId, String cidr) {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see com.cloud.network.NetworkManager#getDefaultStorageTrafficLabel(long, com.cloud.hypervisor.Hypervisor.HypervisorType)
|
||||
*/
|
||||
@ -983,15 +963,6 @@ public class MockNetworkManagerImpl implements NetworkManager, Manager, NetworkS
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see com.cloud.network.NetworkManager#assignSourceNatIpAddressToVpc(com.cloud.user.Account, com.cloud.network.vpc.Vpc)
|
||||
*/
|
||||
@Override
|
||||
public PublicIp assignSourceNatIpAddressToVpc(Account owner, Vpc vpc) throws InsufficientAddressCapacityException, ConcurrentOperationException {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see com.cloud.network.NetworkManager#setupDns(com.cloud.network.Network, com.cloud.network.Network.Provider)
|
||||
@ -1086,23 +1057,6 @@ public class MockNetworkManagerImpl implements NetworkManager, Manager, NetworkS
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see com.cloud.network.NetworkManager#unassignIPFromVpcNetwork(long, long)
|
||||
*/
|
||||
@Override
|
||||
public void unassignIPFromVpcNetwork(long ipId, long networkId) {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see com.cloud.network.NetworkManager#ipUsedInVpc(com.cloud.network.IpAddress)
|
||||
*/
|
||||
@Override
|
||||
public boolean ipUsedInVpc(IpAddress ip) {
|
||||
// TODO Auto-generated method stub
|
||||
return false;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see com.cloud.network.NetworkManager#handleSystemIpRelease(com.cloud.network.IpAddress)
|
||||
@ -1148,4 +1102,31 @@ public class MockNetworkManagerImpl implements NetworkManager, Manager, NetworkS
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see com.cloud.network.NetworkService#getIsolatedNetworksWithSourceNATOwnedByAccountInZone(long, com.cloud.user.Account)
|
||||
*/
|
||||
@Override
|
||||
public List<? extends Network> getIsolatedNetworksWithSourceNATOwnedByAccountInZone(long zoneId, Account owner) {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see com.cloud.network.NetworkManager#markPublicIpAsAllocated(com.cloud.network.IPAddressVO)
|
||||
*/
|
||||
@Override
|
||||
public void markPublicIpAsAllocated(IPAddressVO addr) {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see com.cloud.network.NetworkManager#assignDedicateIpAddress(com.cloud.user.Account, java.lang.Long, java.lang.Long, long, boolean)
|
||||
*/
|
||||
@Override
|
||||
public PublicIp assignDedicateIpAddress(Account owner, Long guestNtwkId, Long vpcId, long dcId, boolean isSourceNat) throws ConcurrentOperationException, InsufficientAddressCapacityException {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user