diff --git a/server/src/com/cloud/network/NetworkManager.java b/server/src/com/cloud/network/NetworkManager.java index 1467227b9fc..e91337f0a97 100644 --- a/server/src/com/cloud/network/NetworkManager.java +++ b/server/src/com/cloud/network/NetworkManager.java @@ -243,4 +243,6 @@ public interface NetworkManager extends NetworkService { boolean isNetworkSystem(Network network); Map getNetworkOfferingServiceCapabilities(NetworkOffering offering, Service service); + + Long getPhysicalNetworkId(Network network); } diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index ad8631a9d09..7621404f120 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -4859,4 +4859,13 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag return svcProviders; } + @Override + public Long getPhysicalNetworkId(Network network) { + Long physicalNetworkId = network.getPhysicalNetworkId(); + if (physicalNetworkId == null) { + physicalNetworkId = findPhysicalNetworkId(network.getDataCenterId(), null); + } + return physicalNetworkId; + } + } diff --git a/server/src/com/cloud/network/element/RedundantVirtualRouterElement.java b/server/src/com/cloud/network/element/RedundantVirtualRouterElement.java index e09667351f9..f3d8afa8a9d 100644 --- a/server/src/com/cloud/network/element/RedundantVirtualRouterElement.java +++ b/server/src/com/cloud/network/element/RedundantVirtualRouterElement.java @@ -23,6 +23,7 @@ import com.cloud.network.VirtualRouterProvider.VirtualRouterProviderType; import com.cloud.network.dao.VirtualRouterProviderDao; import com.cloud.network.router.VirtualRouter; import com.cloud.offering.NetworkOffering; +import com.cloud.offerings.NetworkOfferingVO; import com.cloud.uservm.UserVm; import com.cloud.utils.component.Inject; import com.cloud.vm.DomainRouterVO; @@ -44,15 +45,18 @@ public class RedundantVirtualRouterElement extends VirtualRouterElement implemen } @Override - public boolean implement(Network guestConfig, NetworkOffering offering, DeployDestination dest, ReservationContext context) throws ResourceUnavailableException, ConcurrentOperationException, InsufficientCapacityException { - if (!canHandle(guestConfig, Service.Gateway)) { + public boolean implement(Network network, NetworkOffering offering, DeployDestination dest, ReservationContext context) throws ResourceUnavailableException, ConcurrentOperationException, InsufficientCapacityException { + if (offering.isSystemOnly()) { + return false; + } + if (!_networkMgr.isProviderAvailable(_networkMgr.getPhysicalNetworkId(network), "RedundantVirtualRouter")) { return false; } Map params = new HashMap(1); params.put(VirtualMachineProfile.Param.ReProgramNetwork, true); - _routerMgr.deployVirtualRouter(guestConfig, dest, _accountMgr.getAccount(guestConfig.getAccountId()), params, getProvider()); + _routerMgr.deployVirtualRouter(network, dest, _accountMgr.getAccount(network.getAccountId()), params, getProvider()); return true; } @@ -60,22 +64,26 @@ public class RedundantVirtualRouterElement extends VirtualRouterElement implemen @Override public boolean prepare(Network network, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException { - if (canHandle(network, Service.Gateway)) { - if (vm.getType() != VirtualMachine.Type.User) { - return false; - } - - @SuppressWarnings("unchecked") - VirtualMachineProfile uservm = (VirtualMachineProfile)vm; - List routers = _routerMgr.deployVirtualRouter(network, dest, _accountMgr.getAccount(network.getAccountId()), uservm.getParameters(), getProvider()); - if ((routers == null) || (routers.size() == 0)) { - throw new ResourceUnavailableException("Can't find at least one running router!", this.getClass(), 0); - } - List rets = _routerMgr.addVirtualMachineIntoNetwork(network, nic, uservm, dest, context, routers); - return (rets != null) && (!rets.isEmpty()); - } else { + NetworkOfferingVO offering = _networkOfferingDao.findById(network.getNetworkOfferingId()); + if (offering.isSystemOnly()) { return false; } + if (!_networkMgr.isProviderAvailable(_networkMgr.getPhysicalNetworkId(network), "RedundantVirtualRouter")) { + return false; + } + + if (vm.getType() != VirtualMachine.Type.User) { + return false; + } + + @SuppressWarnings("unchecked") + VirtualMachineProfile uservm = (VirtualMachineProfile)vm; + List routers = _routerMgr.deployVirtualRouter(network, dest, _accountMgr.getAccount(network.getAccountId()), uservm.getParameters(), getProvider()); + if ((routers == null) || (routers.size() == 0)) { + throw new ResourceUnavailableException("Can't find at least one running router!", this.getClass(), 0); + } + List rets = _routerMgr.addVirtualMachineIntoNetwork(network, nic, uservm, dest, context, routers); + return (rets != null) && (!rets.isEmpty()); } @Override diff --git a/server/src/com/cloud/network/element/VirtualRouterElement.java b/server/src/com/cloud/network/element/VirtualRouterElement.java index 58f6e2d5f79..229076119cc 100644 --- a/server/src/com/cloud/network/element/VirtualRouterElement.java +++ b/server/src/com/cloud/network/element/VirtualRouterElement.java @@ -60,6 +60,7 @@ import com.cloud.network.rules.PortForwardingRule; import com.cloud.network.rules.RulesManager; import com.cloud.network.rules.StaticNat; import com.cloud.offering.NetworkOffering; +import com.cloud.offerings.NetworkOfferingVO; import com.cloud.offerings.dao.NetworkOfferingDao; import com.cloud.user.AccountManager; import com.cloud.uservm.UserVm; @@ -113,15 +114,18 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl } @Override - public boolean implement(Network guestConfig, NetworkOffering offering, DeployDestination dest, ReservationContext context) throws ResourceUnavailableException, ConcurrentOperationException, InsufficientCapacityException { - if (!canHandle(guestConfig, Service.Gateway)) { + public boolean implement(Network network, NetworkOffering offering, DeployDestination dest, ReservationContext context) throws ResourceUnavailableException, ConcurrentOperationException, InsufficientCapacityException { + if (offering.isSystemOnly()) { return false; } - + if (!_networkMgr.isProviderAvailable(_networkMgr.getPhysicalNetworkId(network), "VirtualRouter")) { + return false; + } + Map params = new HashMap(1); params.put(VirtualMachineProfile.Param.ReProgramNetwork, true); - _routerMgr.deployVirtualRouter(guestConfig, dest, _accountMgr.getAccount(guestConfig.getAccountId()), params, getProvider()); + _routerMgr.deployVirtualRouter(network, dest, _accountMgr.getAccount(network.getAccountId()), params, getProvider()); return true; } @@ -129,32 +133,36 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl @Override public boolean prepare(Network network, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException { - if (canHandle(network, Service.Dhcp)) { - if (vm.getType() != VirtualMachine.Type.User) { - return false; - } - - @SuppressWarnings("unchecked") - VirtualMachineProfile uservm = (VirtualMachineProfile)vm; - List routers = _routerMgr.deployVirtualRouter(network, dest, _accountMgr.getAccount(network.getAccountId()), uservm.getParameters(), getProvider()); - if ((routers == null) || (routers.size() == 0)) { - throw new ResourceUnavailableException("Can't find at least one running router!", this.getClass(), 0); - } - - //for Basic zone, add all Running routers - we have to send Dhcp/vmData/password info to them when network.dns.basiczone.updates is set to "all" - Long podId = dest.getPod().getId(); - DataCenter dc = dest.getDataCenter(); - boolean isPodBased = (dc.getNetworkType() == NetworkType.Basic || _networkMgr.isSecurityGroupSupportedInNetwork(network)) && network.getTrafficType() == TrafficType.Guest; - if (isPodBased && _routerMgr.getDnsBasicZoneUpdate().equalsIgnoreCase("all")) { - List allRunningRoutersOutsideThePod = _routerDao.findByNetworkOutsideThePod(network.getId(), podId, State.Running, Role.DHCP_USERDATA); - routers.addAll(allRunningRoutersOutsideThePod); - } - - List rets = _routerMgr.addVirtualMachineIntoNetwork(network, nic, uservm, dest, context, routers); - return (rets != null) && (!rets.isEmpty()); - } else { + NetworkOfferingVO offering = _networkOfferingDao.findById(network.getNetworkOfferingId()); + if (offering.isSystemOnly()) { return false; } + if (!_networkMgr.isProviderAvailable(_networkMgr.getPhysicalNetworkId(network), "VirtualRouter")) { + return false; + } + + if (vm.getType() != VirtualMachine.Type.User) { + return false; + } + + @SuppressWarnings("unchecked") + VirtualMachineProfile uservm = (VirtualMachineProfile)vm; + List routers = _routerMgr.deployVirtualRouter(network, dest, _accountMgr.getAccount(network.getAccountId()), uservm.getParameters(), getProvider()); + if ((routers == null) || (routers.size() == 0)) { + throw new ResourceUnavailableException("Can't find at least one running router!", this.getClass(), 0); + } + + //for Basic zone, add all Running routers - we have to send Dhcp/vmData/password info to them when network.dns.basiczone.updates is set to "all" + Long podId = dest.getPod().getId(); + DataCenter dc = dest.getDataCenter(); + boolean isPodBased = (dc.getNetworkType() == NetworkType.Basic || _networkMgr.isSecurityGroupSupportedInNetwork(network)) && network.getTrafficType() == TrafficType.Guest; + if (isPodBased && _routerMgr.getDnsBasicZoneUpdate().equalsIgnoreCase("all")) { + List allRunningRoutersOutsideThePod = _routerDao.findByNetworkOutsideThePod(network.getId(), podId, State.Running, Role.DHCP_USERDATA); + routers.addAll(allRunningRoutersOutsideThePod); + } + + List rets = _routerMgr.addVirtualMachineIntoNetwork(network, nic, uservm, dest, context, routers); + return (rets != null) && (!rets.isEmpty()); } @Override