From 7c2077ff9177f4651ef135cb5ccf454ff6a06ae7 Mon Sep 17 00:00:00 2001 From: Hugo Trippaers Date: Tue, 29 Oct 2013 17:35:42 +0100 Subject: [PATCH] Make the changes to the core networks to support the capabilities. --- .../network/guru/ControlNetworkGuru.java | 35 +++ .../cloud/network/guru/DirectNetworkGuru.java | 76 +++-- .../guru/DirectPodBasedNetworkGuru.java | 49 +++- .../guru/ExternalGuestNetworkGuru.java | 39 ++- .../network/guru/PodBasedNetworkGuru.java | 104 ++++--- .../network/guru/PrivateNetworkGuru.java | 37 ++- .../cloud/network/guru/PublicNetworkGuru.java | 41 ++- .../network/guru/StorageNetworkGuru.java | 275 ++++++++++-------- 8 files changed, 468 insertions(+), 188 deletions(-) diff --git a/server/src/com/cloud/network/guru/ControlNetworkGuru.java b/server/src/com/cloud/network/guru/ControlNetworkGuru.java index 1943e16a4f3..0c856d3d96e 100755 --- a/server/src/com/cloud/network/guru/ControlNetworkGuru.java +++ b/server/src/com/cloud/network/guru/ControlNetworkGuru.java @@ -16,6 +16,9 @@ // under the License. package com.cloud.network.guru; +import java.util.ArrayList; +import java.util.EnumSet; +import java.util.List; import java.util.Map; import javax.ejb.Local; @@ -37,12 +40,14 @@ import com.cloud.exception.InsufficientAddressCapacityException; import com.cloud.exception.InsufficientVirtualNetworkCapcityException; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.network.Network; +import com.cloud.network.Network.GuestType; import com.cloud.network.NetworkModel; import com.cloud.network.NetworkProfile; import com.cloud.network.Networks.AddressFormat; import com.cloud.network.Networks.BroadcastDomainType; import com.cloud.network.Networks.Mode; import com.cloud.network.Networks.TrafficType; +import com.cloud.network.PhysicalNetwork.IsolationMethod; import com.cloud.network.dao.NetworkVO; import com.cloud.offering.NetworkOffering; import com.cloud.user.Account; @@ -57,6 +62,16 @@ import com.cloud.vm.VirtualMachineProfile; @Local(value={NetworkGuru.class}) public class ControlNetworkGuru extends PodBasedNetworkGuru implements NetworkGuru { private static final Logger s_logger = Logger.getLogger(ControlNetworkGuru.class); + + /** + * The supported networking configs + */ + private static final EnumSet _supportedNetworkTypes = EnumSet.of(NetworkType.Basic, NetworkType.Advanced); + private static final EnumSet _supportedGuestTypes = EnumSet.of(GuestType.Isolated, GuestType.Shared); + private static final EnumSet _supportedIsolationMethods = EnumSet.of(IsolationMethod.VLAN, + IsolationMethod.NONE); + private static final EnumSet _supportedTrafficTypes = EnumSet.of(TrafficType.Control); + @Inject DataCenterDao _dcDao; @Inject ConfigurationDao _configDao; @Inject NetworkModel _networkMgr; @@ -236,4 +251,24 @@ public class ControlNetworkGuru extends PodBasedNetworkGuru implements NetworkGu return true; } + @Override + public List getSupportedNetworkTypes() { + return new ArrayList(_supportedNetworkTypes); + } + + @Override + public List getSupportedTrafficTypes() { + return new ArrayList(_supportedTrafficTypes); + } + + @Override + public List getSupportedGuestTypes() { + return new ArrayList(_supportedGuestTypes); + } + + @Override + public List getSupportedIsolationMethods() { + return new ArrayList(_supportedIsolationMethods); + } + } diff --git a/server/src/com/cloud/network/guru/DirectNetworkGuru.java b/server/src/com/cloud/network/guru/DirectNetworkGuru.java index 801d252ef81..460e2888787 100755 --- a/server/src/com/cloud/network/guru/DirectNetworkGuru.java +++ b/server/src/com/cloud/network/guru/DirectNetworkGuru.java @@ -16,12 +16,15 @@ // under the License. package com.cloud.network.guru; +import java.util.ArrayList; +import java.util.EnumSet; import java.util.List; import javax.ejb.Local; import javax.inject.Inject; import org.apache.log4j.Logger; + import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; import com.cloud.dc.DataCenter; @@ -46,6 +49,7 @@ import com.cloud.network.NetworkProfile; import com.cloud.network.Networks.BroadcastDomainType; import com.cloud.network.Networks.Mode; import com.cloud.network.Networks.TrafficType; +import com.cloud.network.PhysicalNetwork.IsolationMethod; import com.cloud.network.dao.IPAddressDao; import com.cloud.network.dao.IPAddressVO; import com.cloud.network.dao.NetworkVO; @@ -57,7 +61,6 @@ import com.cloud.utils.component.AdapterBase; import com.cloud.utils.db.DB; import com.cloud.utils.db.Transaction; import com.cloud.utils.db.TransactionCallbackNoReturn; -import com.cloud.utils.db.TransactionCallbackWithException; import com.cloud.utils.db.TransactionCallbackWithExceptionNoReturn; import com.cloud.utils.db.TransactionStatus; import com.cloud.utils.exception.ExceptionUtil; @@ -75,6 +78,14 @@ import com.cloud.vm.dao.NicSecondaryIpDao; public class DirectNetworkGuru extends AdapterBase implements NetworkGuru { private static final Logger s_logger = Logger.getLogger(DirectNetworkGuru.class); + /** + * The supported networking configs + */ + private static final EnumSet _supportedNetworkTypes = EnumSet.of(NetworkType.Advanced); + private static final EnumSet _supportedGuestTypes = EnumSet.of(GuestType.Shared); + private static final EnumSet _supportedIsolationMethods = EnumSet.of(IsolationMethod.VLAN); + private static final EnumSet _supportedTrafficTypes = EnumSet.of(TrafficType.Guest); + @Inject DataCenterDao _dcDao; @Inject @@ -99,22 +110,22 @@ public class DirectNetworkGuru extends AdapterBase implements NetworkGuru { IpAddressManager _ipAddrMgr; private static final TrafficType[] _trafficTypes = {TrafficType.Guest}; - + @Override public boolean isMyTrafficType(TrafficType type) { - for (TrafficType t : _trafficTypes) { - if (t == type) { - return true; - } - } - return false; + for (TrafficType t : _trafficTypes) { + if (t == type) { + return true; + } + } + return false; } @Override public TrafficType[] getSupportedTrafficType() { - return _trafficTypes; + return _trafficTypes; } - + protected boolean canHandle(NetworkOffering offering, DataCenter dc) { // this guru handles only Guest networks in Advance zone with source nat service disabled if (dc.getNetworkType() == NetworkType.Advanced && isMyTrafficType(offering.getTrafficType()) && offering.getGuestType() == GuestType.Shared) { @@ -171,9 +182,9 @@ public class DirectNetworkGuru extends AdapterBase implements NetworkGuru { boolean isSecurityGroupEnabled = _networkModel.areServicesSupportedByNetworkOffering(offering.getId(), Service.SecurityGroup); if (isSecurityGroupEnabled) { - if (userSpecified.getIp6Cidr() != null) { + if (userSpecified.getIp6Cidr() != null) { throw new InvalidParameterValueException("Didn't support security group with IPv6"); - } + } config.setName("SecurityGroupEnabledNetwork"); config.setDisplayText("SecurityGroupEnabledNetwork"); } @@ -198,7 +209,7 @@ public class DirectNetworkGuru extends AdapterBase implements NetworkGuru { @Override public NicProfile allocate(Network network, NicProfile nic, VirtualMachineProfile vm) throws InsufficientVirtualNetworkCapcityException, - InsufficientAddressCapacityException, ConcurrentOperationException { + InsufficientAddressCapacityException, ConcurrentOperationException { DataCenter dc = _dcDao.findById(network.getDataCenterId()); @@ -271,11 +282,11 @@ public class DirectNetworkGuru extends AdapterBase implements NetworkGuru { @Override @DB public void deallocate(final Network network, final NicProfile nic, VirtualMachineProfile vm) { - if (s_logger.isDebugEnabled()) { + if (s_logger.isDebugEnabled()) { s_logger.debug("Deallocate network: networkId: " + nic.getNetworkId() + ", ip: " + nic.getIp4Address()); } - - if (nic.getIp4Address() != null) { + + if (nic.getIp4Address() != null) { final IPAddressVO ip = _ipAddressDao.findByIpAndSourceNetworkId(nic.getNetworkId(), nic.getIp4Address()); if (ip != null) { Transaction.execute(new TransactionCallbackNoReturn() { @@ -289,7 +300,7 @@ public class DirectNetworkGuru extends AdapterBase implements NetworkGuru { _ipAddrMgr.markIpAsUnavailable(ip.getId()); _ipAddressDao.unassignIpAddress(ip.getId()); } - + //unassign nic secondary ip address s_logger.debug("remove nic " + nic.getId() + " secondary ip "); List nicSecIps = null; @@ -302,11 +313,11 @@ public class DirectNetworkGuru extends AdapterBase implements NetworkGuru { } }); } - } - - if (nic.getIp6Address() != null) { - _ipv6Mgr.revokeDirectIpv6Address(nic.getNetworkId(), nic.getIp6Address()); - } + } + + if (nic.getIp6Address() != null) { + _ipv6Mgr.revokeDirectIpv6Address(nic.getNetworkId(), nic.getIp6Address()); + } nic.deallocate(); } @@ -344,4 +355,25 @@ public class DirectNetworkGuru extends AdapterBase implements NetworkGuru { networkProfile.setDns1(dc.getDns1()); networkProfile.setDns2(dc.getDns2()); } + + @Override + public List getSupportedNetworkTypes() { + return new ArrayList(_supportedNetworkTypes); + } + + @Override + public List getSupportedTrafficTypes() { + return new ArrayList(_supportedTrafficTypes); + } + + @Override + public List getSupportedGuestTypes() { + return new ArrayList(_supportedGuestTypes); + } + + @Override + public List getSupportedIsolationMethods() { + return new ArrayList(_supportedIsolationMethods); + } + } diff --git a/server/src/com/cloud/network/guru/DirectPodBasedNetworkGuru.java b/server/src/com/cloud/network/guru/DirectPodBasedNetworkGuru.java index 053a786e67b..dcfae4a1cc8 100755 --- a/server/src/com/cloud/network/guru/DirectPodBasedNetworkGuru.java +++ b/server/src/com/cloud/network/guru/DirectPodBasedNetworkGuru.java @@ -17,12 +17,15 @@ // under the License. package com.cloud.network.guru; +import java.util.ArrayList; +import java.util.EnumSet; import java.util.List; import javax.ejb.Local; import javax.inject.Inject; import org.apache.log4j.Logger; + import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; import com.cloud.configuration.ZoneConfig; @@ -42,9 +45,12 @@ import com.cloud.exception.InsufficientAddressCapacityException; import com.cloud.exception.InsufficientVirtualNetworkCapcityException; import com.cloud.network.IpAddressManager; import com.cloud.network.Network; +import com.cloud.network.Network.GuestType; import com.cloud.network.Networks.AddressFormat; import com.cloud.network.Networks.BroadcastDomainType; import com.cloud.network.Networks.IsolationType; +import com.cloud.network.Networks.TrafficType; +import com.cloud.network.PhysicalNetwork.IsolationMethod; import com.cloud.network.addr.PublicIp; import com.cloud.network.dao.IPAddressDao; import com.cloud.network.dao.IPAddressVO; @@ -67,6 +73,15 @@ import com.cloud.vm.VirtualMachineProfile; public class DirectPodBasedNetworkGuru extends DirectNetworkGuru { private static final Logger s_logger = Logger.getLogger(DirectPodBasedNetworkGuru.class); + /** + * The supported networking configs + */ + private static final EnumSet _supportedNetworkTypes = EnumSet.of(NetworkType.Basic); + private static final EnumSet _supportedGuestTypes = EnumSet.of(GuestType.Isolated, GuestType.Shared); + private static final EnumSet _supportedIsolationMethods = EnumSet.of(IsolationMethod.VLAN, + IsolationMethod.NONE); + private static final EnumSet _supportedTrafficTypes = EnumSet.of(TrafficType.Guest); + @Inject DataCenterDao _dcDao; @Inject @@ -95,7 +110,7 @@ public class DirectPodBasedNetworkGuru extends DirectNetworkGuru { @Override public NicProfile allocate(Network network, NicProfile nic, VirtualMachineProfile vm) throws InsufficientVirtualNetworkCapcityException, - InsufficientAddressCapacityException, ConcurrentOperationException { + InsufficientAddressCapacityException, ConcurrentOperationException { DataCenterVO dc = _dcDao.findById(network.getDataCenterId()); ReservationStrategy rsStrategy = ReservationStrategy.Start; @@ -127,10 +142,10 @@ public class DirectPodBasedNetworkGuru extends DirectNetworkGuru { @Override @DB public void reserve(NicProfile nic, Network network, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException, ConcurrentOperationException { - + String oldIp = nic.getIp4Address(); boolean getNewIp = false; - + if (oldIp == null) { getNewIp = true; } else { @@ -166,7 +181,7 @@ public class DirectPodBasedNetworkGuru extends DirectNetworkGuru { @DB protected void getIp(final NicProfile nic, final Pod pod, final VirtualMachineProfile vm, final Network network) throws InsufficientVirtualNetworkCapcityException, - InsufficientAddressCapacityException, ConcurrentOperationException { + InsufficientAddressCapacityException, ConcurrentOperationException { final DataCenter dc = _dcDao.findById(pod.getDataCenterId()); if (nic.getIp4Address() == null) { Transaction.execute(new TransactionCallbackWithExceptionNoReturn() { @@ -187,11 +202,11 @@ public class DirectPodBasedNetworkGuru extends DirectNetworkGuru { s_logger.debug("Nic got an ip address " + placeholderNic.getIp4Address() + " stored in placeholder nic for the network " + network + " and gateway " + podRangeGateway); } } - + if (ip == null) { ip = _ipAddrMgr.assignPublicIpAddress(dc.getId(), pod.getId(), vm.getOwner(), VlanType.DirectAttached, network.getId(), null, false); } - + nic.setIp4Address(ip.getAddress().toString()); nic.setFormat(AddressFormat.Ip4); nic.setGateway(ip.getGateway()); @@ -203,7 +218,7 @@ public class DirectPodBasedNetworkGuru extends DirectNetworkGuru { } nic.setReservationId(String.valueOf(ip.getVlanTag())); nic.setMacAddress(ip.getMacAddress()); - + //save the placeholder nic if the vm is the Virtual router if (vm.getType() == VirtualMachine.Type.DomainRouter) { Nic placeholderNic = _networkModel.getPlaceholderNicForRouter(network, pod.getId()); @@ -219,4 +234,24 @@ public class DirectPodBasedNetworkGuru extends DirectNetworkGuru { nic.setDns2(dc.getDns2()); } + @Override + public List getSupportedNetworkTypes() { + return new ArrayList(_supportedNetworkTypes); + } + + @Override + public List getSupportedTrafficTypes() { + return new ArrayList(_supportedTrafficTypes); + } + + @Override + public List getSupportedGuestTypes() { + return new ArrayList(_supportedGuestTypes); + } + + @Override + public List getSupportedIsolationMethods() { + return new ArrayList(_supportedIsolationMethods); + } + } diff --git a/server/src/com/cloud/network/guru/ExternalGuestNetworkGuru.java b/server/src/com/cloud/network/guru/ExternalGuestNetworkGuru.java index 7a7da68e58d..322fa01df9a 100644 --- a/server/src/com/cloud/network/guru/ExternalGuestNetworkGuru.java +++ b/server/src/com/cloud/network/guru/ExternalGuestNetworkGuru.java @@ -16,6 +16,8 @@ // under the License. package com.cloud.network.guru; +import java.util.ArrayList; +import java.util.EnumSet; import java.util.List; import javax.ejb.Local; @@ -42,6 +44,7 @@ import com.cloud.network.Network; import com.cloud.network.Network.GuestType; import com.cloud.network.Network.State; import com.cloud.network.Networks.BroadcastDomainType; +import com.cloud.network.Networks.TrafficType; import com.cloud.network.PhysicalNetwork; import com.cloud.network.PhysicalNetwork.IsolationMethod; import com.cloud.network.dao.IPAddressDao; @@ -65,6 +68,16 @@ import com.cloud.vm.VirtualMachineProfile; @Local(value = NetworkGuru.class) public class ExternalGuestNetworkGuru extends GuestNetworkGuru { private static final Logger s_logger = Logger.getLogger(ExternalGuestNetworkGuru.class); + + /** + * The supported networking configs + */ + private static final EnumSet _supportedNetworkTypes = EnumSet.of(NetworkType.Advanced); + private static final EnumSet _supportedGuestTypes = EnumSet.of(GuestType.Isolated); + private static final EnumSet _supportedIsolationMethods = EnumSet.of(IsolationMethod.GRE, IsolationMethod.L3, + IsolationMethod.VLAN); + private static final EnumSet _supportedTrafficTypes = EnumSet.of(TrafficType.Guest); + @Inject NetworkOrchestrationService _networkMgr; @Inject @@ -139,11 +152,11 @@ public class ExternalGuestNetworkGuru extends GuestNetworkGuru { int vlanTag; if (config.getBroadcastUri() == null) { String vnet = _dcDao.allocateVnet(zone.getId(), config.getPhysicalNetworkId(), config.getAccountId(), context.getReservationId(), - UseSystemGuestVlans.valueIn(config.getAccountId())); + UseSystemGuestVlans.valueIn(config.getAccountId())); try { // when supporting more types of networks this need to become -// int vlantag = Integer.parseInt(BroadcastDomainType.getValue(vnet)); + // int vlantag = Integer.parseInt(BroadcastDomainType.getValue(vnet)); vlanTag = Integer.parseInt(vnet); } catch (NumberFormatException e) { throw new CloudRuntimeException("Obtained an invalid guest vlan tag. Exception: " + e.getMessage()); @@ -219,7 +232,7 @@ public class ExternalGuestNetworkGuru extends GuestNetworkGuru { @Override public NicProfile allocate(Network config, NicProfile nic, VirtualMachineProfile vm) throws InsufficientVirtualNetworkCapcityException, - InsufficientAddressCapacityException { + InsufficientAddressCapacityException { if (_networkModel.networkIsConfiguredForExternalNetworking(config.getDataCenterId(), config.getId()) && nic != null && nic.getRequestedIpv4() != null) { throw new CloudRuntimeException("Does not support custom ip allocation at this time: " + nic); @@ -318,4 +331,24 @@ public class ExternalGuestNetworkGuru extends GuestNetworkGuru { return NetUtils.ip2Long(ipAddress) & ~(0xffffffffffffffffl << (32 - cidrSize)); } + @Override + public List getSupportedNetworkTypes() { + return new ArrayList(_supportedNetworkTypes); + } + + @Override + public List getSupportedTrafficTypes() { + return new ArrayList(_supportedTrafficTypes); + } + + @Override + public List getSupportedGuestTypes() { + return new ArrayList(_supportedGuestTypes); + } + + @Override + public List getSupportedIsolationMethods() { + return new ArrayList(_supportedIsolationMethods); + } + } diff --git a/server/src/com/cloud/network/guru/PodBasedNetworkGuru.java b/server/src/com/cloud/network/guru/PodBasedNetworkGuru.java index ab64f8ee78f..c1a670b5b10 100755 --- a/server/src/com/cloud/network/guru/PodBasedNetworkGuru.java +++ b/server/src/com/cloud/network/guru/PodBasedNetworkGuru.java @@ -16,6 +16,9 @@ // under the License. package com.cloud.network.guru; +import java.util.ArrayList; +import java.util.EnumSet; +import java.util.List; import java.util.Random; import javax.ejb.Local; @@ -23,6 +26,7 @@ import javax.inject.Inject; import org.apache.log4j.Logger; +import com.cloud.dc.DataCenter.NetworkType; import com.cloud.dc.Pod; import com.cloud.dc.dao.DataCenterDao; import com.cloud.deploy.DeployDestination; @@ -30,13 +34,15 @@ import com.cloud.deploy.DeploymentPlan; import com.cloud.exception.InsufficientAddressCapacityException; import com.cloud.exception.InsufficientVirtualNetworkCapcityException; import com.cloud.network.Network; +import com.cloud.network.Network.GuestType; import com.cloud.network.NetworkProfile; import com.cloud.network.Networks.AddressFormat; import com.cloud.network.Networks.BroadcastDomainType; import com.cloud.network.Networks.Mode; import com.cloud.network.Networks.TrafficType; -import com.cloud.network.dao.NetworkVO; +import com.cloud.network.PhysicalNetwork.IsolationMethod; import com.cloud.network.StorageNetworkManager; +import com.cloud.network.dao.NetworkVO; import com.cloud.offering.NetworkOffering; import com.cloud.user.Account; import com.cloud.utils.Pair; @@ -46,45 +52,54 @@ import com.cloud.utils.net.NetUtils; import com.cloud.vm.Nic.ReservationStrategy; import com.cloud.vm.NicProfile; import com.cloud.vm.ReservationContext; -import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachineProfile; @Local(value={NetworkGuru.class}) public class PodBasedNetworkGuru extends AdapterBase implements NetworkGuru { private static final Logger s_logger = Logger.getLogger(PodBasedNetworkGuru.class); + + /** + * The supported networking configs + */ + private static final EnumSet _supportedNetworkTypes = EnumSet.of(NetworkType.Basic, NetworkType.Advanced); + private static final EnumSet _supportedGuestTypes = EnumSet.of(GuestType.Isolated, GuestType.Shared); + private static final EnumSet _supportedIsolationMethods = EnumSet.of(IsolationMethod.VLAN, + IsolationMethod.NONE); + private static final EnumSet _supportedTrafficTypes = EnumSet.of(TrafficType.Management); + @Inject DataCenterDao _dcDao; @Inject StorageNetworkManager _sNwMgr; Random _rand = new Random(System.currentTimeMillis()); - + private static final TrafficType[] _trafficTypes = {TrafficType.Management}; - + @Override public boolean isMyTrafficType(TrafficType type) { - for (TrafficType t : _trafficTypes) { - if (t == type) { - return true; - } - } - return false; + for (TrafficType t : _trafficTypes) { + if (t == type) { + return true; + } + } + return false; } @Override public TrafficType[] getSupportedTrafficType() { - return _trafficTypes; + return _trafficTypes; } - + @Override public Network design(NetworkOffering offering, DeploymentPlan plan, Network userSpecified, Account owner) { TrafficType type = offering.getTrafficType(); - + if (!isMyTrafficType(type)) { return null; } - + NetworkVO config = new NetworkVO(type, Mode.Static, BroadcastDomainType.Native, offering.getId(), Network.State.Setup, plan.getDataCenterId(), plan.getPhysicalNetworkId()); return config; } - + protected PodBasedNetworkGuru() { super(); } @@ -92,13 +107,13 @@ public class PodBasedNetworkGuru extends AdapterBase implements NetworkGuru { @Override public void deallocate(Network config, NicProfile nic, VirtualMachineProfile vm) { } - + @Override public NicProfile allocate(Network config, NicProfile nic, VirtualMachineProfile vm) throws InsufficientVirtualNetworkCapcityException, - InsufficientAddressCapacityException { + InsufficientAddressCapacityException { TrafficType trafficType = config.getTrafficType(); - assert trafficType == TrafficType.Management || trafficType == TrafficType.Storage: "Well, I can't take care of this config now can I? " + config; - + assert trafficType == TrafficType.Management || trafficType == TrafficType.Storage: "Well, I can't take care of this config now can I? " + config; + if (nic != null) { if (nic.getRequestedIpv4() != null) { throw new CloudRuntimeException("Does not support custom ip allocation at this time: " + nic); @@ -106,21 +121,21 @@ public class PodBasedNetworkGuru extends AdapterBase implements NetworkGuru { nic.setStrategy(nic.getIp4Address() != null ? ReservationStrategy.Create : ReservationStrategy.Start); } else { nic = new NicProfile(ReservationStrategy.Start, null, null, null, null); - } - + } + return nic; } @Override public void reserve(NicProfile nic, Network config, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) throws InsufficientVirtualNetworkCapcityException, - InsufficientAddressCapacityException { + InsufficientAddressCapacityException { Pod pod = dest.getPod(); - + Pair ip = _dcDao.allocatePrivateIpAddress(dest.getDataCenter().getId(), dest.getPod().getId(), nic.getId(), context.getReservationId()); if (ip == null) { throw new InsufficientAddressCapacityException("Unable to get a management ip address", Pod.class, pod.getId()); } - + nic.setIp4Address(ip.first()); nic.setMacAddress(NetUtils.long2Mac(NetUtils.createSequenceBasedMacAddress(ip.second()))); nic.setGateway(pod.getGateway()); @@ -130,29 +145,29 @@ public class PodBasedNetworkGuru extends AdapterBase implements NetworkGuru { nic.setBroadcastType(BroadcastDomainType.Native); nic.setBroadcastUri(null); nic.setIsolationUri(null); - + s_logger.debug("Allocated a nic " + nic + " for " + vm); } - - + + @Override public void updateNicProfile(NicProfile profile, Network network) { } - + @Override public void updateNetworkProfile(NetworkProfile networkProfile) { } - + @Override public boolean release(NicProfile nic, VirtualMachineProfile vm, String reservationId) { _dcDao.releasePrivateIpAddress(nic.getId(), nic.getReservationId()); - + nic.deallocate(); - + if (s_logger.isDebugEnabled()) { s_logger.debug("Released nic: " + nic); } - + return true; } @@ -160,13 +175,34 @@ public class PodBasedNetworkGuru extends AdapterBase implements NetworkGuru { public Network implement(Network config, NetworkOffering offering, DeployDestination destination, ReservationContext context) throws InsufficientVirtualNetworkCapcityException { return config; } - + @Override public void shutdown(NetworkProfile config, NetworkOffering offering) { } - + @Override public boolean trash(Network config, NetworkOffering offering) { return true; } + + @Override + public List getSupportedNetworkTypes() { + return new ArrayList(_supportedNetworkTypes); + } + + @Override + public List getSupportedTrafficTypes() { + return new ArrayList(_supportedTrafficTypes); + } + + @Override + public List getSupportedGuestTypes() { + return new ArrayList(_supportedGuestTypes); + } + + @Override + public List getSupportedIsolationMethods() { + return new ArrayList(_supportedIsolationMethods); + } + } diff --git a/server/src/com/cloud/network/guru/PrivateNetworkGuru.java b/server/src/com/cloud/network/guru/PrivateNetworkGuru.java index 11e2c051b85..092b1e3f8a8 100644 --- a/server/src/com/cloud/network/guru/PrivateNetworkGuru.java +++ b/server/src/com/cloud/network/guru/PrivateNetworkGuru.java @@ -16,6 +16,10 @@ // under the License. package com.cloud.network.guru; +import java.util.ArrayList; +import java.util.EnumSet; +import java.util.List; + import javax.ejb.Local; import javax.inject.Inject; @@ -39,6 +43,7 @@ import com.cloud.network.Networks.BroadcastDomainType; import com.cloud.network.Networks.IsolationType; import com.cloud.network.Networks.Mode; import com.cloud.network.Networks.TrafficType; +import com.cloud.network.PhysicalNetwork.IsolationMethod; import com.cloud.network.dao.NetworkVO; import com.cloud.network.vpc.PrivateIpAddress; import com.cloud.network.vpc.PrivateIpVO; @@ -57,6 +62,15 @@ import com.cloud.vm.VirtualMachineProfile; @Local(value = NetworkGuru.class) public class PrivateNetworkGuru extends AdapterBase implements NetworkGuru { private static final Logger s_logger = Logger.getLogger(PrivateNetworkGuru.class); + + /** + * The supported networking configs + */ + private static final EnumSet _supportedNetworkTypes = EnumSet.of(NetworkType.Advanced); + private static final EnumSet _supportedGuestTypes = EnumSet.of(GuestType.Isolated); + private static final EnumSet _supportedIsolationMethods = EnumSet.of(IsolationMethod.VLAN); + private static final EnumSet _supportedTrafficTypes = EnumSet.of(TrafficType.Guest); + @Inject protected ConfigurationManager _configMgr; @Inject @@ -222,7 +236,7 @@ public class PrivateNetworkGuru extends AdapterBase implements NetworkGuru { @Override public void reserve(NicProfile nic, Network network, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) - throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException { + throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException { if (nic.getIp4Address() == null) { getIp(nic, _entityMgr.findById(DataCenter.class, network.getDataCenterId()), network); nic.setStrategy(ReservationStrategy.Create); @@ -250,4 +264,25 @@ public class PrivateNetworkGuru extends AdapterBase implements NetworkGuru { networkProfile.setDns1(dc.getDns1()); networkProfile.setDns2(dc.getDns2()); } + + @Override + public List getSupportedNetworkTypes() { + return new ArrayList(_supportedNetworkTypes); + } + + @Override + public List getSupportedTrafficTypes() { + return new ArrayList(_supportedTrafficTypes); + } + + @Override + public List getSupportedGuestTypes() { + return new ArrayList(_supportedGuestTypes); + } + + @Override + public List getSupportedIsolationMethods() { + return new ArrayList(_supportedIsolationMethods); + } + } diff --git a/server/src/com/cloud/network/guru/PublicNetworkGuru.java b/server/src/com/cloud/network/guru/PublicNetworkGuru.java index 6fed1a6ff7e..5476896864e 100755 --- a/server/src/com/cloud/network/guru/PublicNetworkGuru.java +++ b/server/src/com/cloud/network/guru/PublicNetworkGuru.java @@ -16,13 +16,19 @@ // under the License. package com.cloud.network.guru; +import java.util.ArrayList; +import java.util.EnumSet; +import java.util.List; + import javax.ejb.Local; import javax.inject.Inject; import org.apache.log4j.Logger; + import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; import com.cloud.dc.DataCenter; +import com.cloud.dc.DataCenter.NetworkType; import com.cloud.dc.Vlan.VlanType; import com.cloud.dc.dao.DataCenterDao; import com.cloud.dc.dao.VlanDao; @@ -33,6 +39,7 @@ import com.cloud.exception.InsufficientAddressCapacityException; import com.cloud.exception.InsufficientVirtualNetworkCapcityException; import com.cloud.network.IpAddressManager; import com.cloud.network.Network; +import com.cloud.network.Network.GuestType; import com.cloud.network.Network.State; import com.cloud.network.NetworkProfile; import com.cloud.network.Networks.AddressFormat; @@ -40,6 +47,7 @@ import com.cloud.network.Networks.BroadcastDomainType; import com.cloud.network.Networks.IsolationType; import com.cloud.network.Networks.Mode; import com.cloud.network.Networks.TrafficType; +import com.cloud.network.PhysicalNetwork.IsolationMethod; import com.cloud.network.addr.PublicIp; import com.cloud.network.dao.IPAddressDao; import com.cloud.network.dao.IPAddressVO; @@ -62,6 +70,15 @@ import com.cloud.vm.VirtualMachineProfile; public class PublicNetworkGuru extends AdapterBase implements NetworkGuru { private static final Logger s_logger = Logger.getLogger(PublicNetworkGuru.class); + /** + * The supported networking configs + */ + private static final EnumSet _supportedNetworkTypes = EnumSet.of(NetworkType.Basic, NetworkType.Advanced); + private static final EnumSet _supportedGuestTypes = EnumSet.of(GuestType.Isolated, GuestType.Shared); + private static final EnumSet _supportedIsolationMethods = EnumSet.of(IsolationMethod.VLAN, + IsolationMethod.NONE); + private static final EnumSet _supportedTrafficTypes = EnumSet.of(TrafficType.Public); + @Inject DataCenterDao _dcDao; @Inject @@ -143,7 +160,7 @@ public class PublicNetworkGuru extends AdapterBase implements NetworkGuru { @Override public NicProfile allocate(Network network, NicProfile nic, VirtualMachineProfile vm) throws InsufficientVirtualNetworkCapcityException, - InsufficientAddressCapacityException, ConcurrentOperationException { + InsufficientAddressCapacityException, ConcurrentOperationException { DataCenter dc = _dcDao.findById(network.getDataCenterId()); @@ -204,7 +221,7 @@ public class PublicNetworkGuru extends AdapterBase implements NetworkGuru { }); } nic.deallocate(); - + if (s_logger.isDebugEnabled()) { s_logger.debug("Deallocated nic: " + nic); } @@ -226,4 +243,24 @@ public class PublicNetworkGuru extends AdapterBase implements NetworkGuru { networkProfile.setDns2(dc.getDns2()); } + @Override + public List getSupportedNetworkTypes() { + return new ArrayList(_supportedNetworkTypes); + } + + @Override + public List getSupportedTrafficTypes() { + return new ArrayList(_supportedTrafficTypes); + } + + @Override + public List getSupportedGuestTypes() { + return new ArrayList(_supportedGuestTypes); + } + + @Override + public List getSupportedIsolationMethods() { + return new ArrayList(_supportedIsolationMethods); + } + } diff --git a/server/src/com/cloud/network/guru/StorageNetworkGuru.java b/server/src/com/cloud/network/guru/StorageNetworkGuru.java index 6d82dc5d737..e7a70a74696 100755 --- a/server/src/com/cloud/network/guru/StorageNetworkGuru.java +++ b/server/src/com/cloud/network/guru/StorageNetworkGuru.java @@ -16,11 +16,16 @@ // under the License. package com.cloud.network.guru; +import java.util.ArrayList; +import java.util.EnumSet; +import java.util.List; + import javax.ejb.Local; import javax.inject.Inject; import org.apache.log4j.Logger; +import com.cloud.dc.DataCenter.NetworkType; import com.cloud.dc.Pod; import com.cloud.dc.StorageNetworkIpAddressVO; import com.cloud.deploy.DeployDestination; @@ -28,164 +33,196 @@ import com.cloud.deploy.DeploymentPlan; import com.cloud.exception.InsufficientAddressCapacityException; import com.cloud.exception.InsufficientVirtualNetworkCapcityException; import com.cloud.network.Network; +import com.cloud.network.Network.GuestType; import com.cloud.network.NetworkProfile; import com.cloud.network.Networks.AddressFormat; import com.cloud.network.Networks.BroadcastDomainType; import com.cloud.network.Networks.Mode; import com.cloud.network.Networks.TrafficType; +import com.cloud.network.PhysicalNetwork.IsolationMethod; import com.cloud.network.StorageNetworkManager; import com.cloud.network.dao.NetworkDao; import com.cloud.network.dao.NetworkVO; import com.cloud.offering.NetworkOffering; import com.cloud.user.Account; import com.cloud.utils.net.NetUtils; +import com.cloud.vm.Nic.ReservationStrategy; import com.cloud.vm.NicProfile; import com.cloud.vm.ReservationContext; -import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachineProfile; -import com.cloud.vm.Nic.ReservationStrategy; @Local(value = NetworkGuru.class) public class StorageNetworkGuru extends PodBasedNetworkGuru implements NetworkGuru { - private static final Logger s_logger = Logger.getLogger(StorageNetworkGuru.class); - @Inject StorageNetworkManager _sNwMgr; - @Inject NetworkDao _nwDao; - - protected StorageNetworkGuru() { - super(); - } - + private static final Logger s_logger = Logger.getLogger(StorageNetworkGuru.class); + + /** + * The supported networking configs + */ + private static final EnumSet _supportedNetworkTypes = EnumSet.of(NetworkType.Basic, NetworkType.Advanced); + private static final EnumSet _supportedGuestTypes = EnumSet.of(GuestType.Isolated, GuestType.Shared); + private static final EnumSet _supportedIsolationMethods = EnumSet.of(IsolationMethod.VLAN, + IsolationMethod.NONE); + private static final EnumSet _supportedTrafficTypes = EnumSet.of(TrafficType.Storage); + + @Inject + StorageNetworkManager _sNwMgr; + @Inject NetworkDao _nwDao; + + protected StorageNetworkGuru() { + super(); + } + private static final TrafficType[] _trafficTypes = {TrafficType.Storage}; - + @Override public boolean isMyTrafficType(TrafficType type) { - for (TrafficType t : _trafficTypes) { - if (t == type) { - return true; - } - } - return false; + for (TrafficType t : _trafficTypes) { + if (t == type) { + return true; + } + } + return false; } @Override public TrafficType[] getSupportedTrafficType() { - return _trafficTypes; + return _trafficTypes; } - - protected boolean canHandle(NetworkOffering offering) { - if (isMyTrafficType(offering.getTrafficType()) && offering.isSystemOnly()) { - return true; - } else { - s_logger.trace("It's not storage network offering, skip it."); - return false; - } - } - - @Override - public Network design(NetworkOffering offering, DeploymentPlan plan, Network userSpecified, Account owner) { - if (!canHandle(offering)) { - return null; - } - - NetworkVO config = new NetworkVO(offering.getTrafficType(), Mode.Static, BroadcastDomainType.Native, offering.getId(), Network.State.Setup, - plan.getDataCenterId(), plan.getPhysicalNetworkId()); - return config; - } - @Override - public Network implement(Network network, NetworkOffering offering, DeployDestination destination, ReservationContext context) - throws InsufficientVirtualNetworkCapcityException { - assert network.getTrafficType() == TrafficType.Storage : "Why are you sending this configuration to me " + network; - if (!_sNwMgr.isStorageIpRangeAvailable(destination.getDataCenter().getId())) { - return super.implement(network, offering, destination, context); - } - return network; - } + protected boolean canHandle(NetworkOffering offering) { + if (isMyTrafficType(offering.getTrafficType()) && offering.isSystemOnly()) { + return true; + } else { + s_logger.trace("It's not storage network offering, skip it."); + return false; + } + } - @Override - public NicProfile allocate(Network network, NicProfile nic, VirtualMachineProfile vm) - throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException { - assert network.getTrafficType() == TrafficType.Storage : "Well, I can't take care of this config now can I? " + network; - if (!_sNwMgr.isStorageIpRangeAvailable(network.getDataCenterId())) { - return super.allocate(network, nic, vm); - } - - return new NicProfile(ReservationStrategy.Start, null, null, null, null); - } + @Override + public Network design(NetworkOffering offering, DeploymentPlan plan, Network userSpecified, Account owner) { + if (!canHandle(offering)) { + return null; + } - @Override - public void reserve(NicProfile nic, Network network, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) - throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException { - if (!_sNwMgr.isStorageIpRangeAvailable(dest.getDataCenter().getId())) { - super.reserve(nic, network, vm, dest, context); - return; - } - - Pod pod = dest.getPod(); - Integer vlan = null; - - StorageNetworkIpAddressVO ip = _sNwMgr.acquireIpAddress(pod.getId()); - if (ip == null) { - throw new InsufficientAddressCapacityException("Unable to get a storage network ip address", Pod.class, pod.getId()); - } - - vlan = ip.getVlan(); - nic.setIp4Address(ip.getIpAddress()); - nic.setMacAddress(NetUtils.long2Mac(NetUtils.createSequenceBasedMacAddress(ip.getMac()))); - nic.setFormat(AddressFormat.Ip4); - nic.setNetmask(ip.getNetmask()); - nic.setBroadcastType(BroadcastDomainType.Storage); - nic.setGateway(ip.getGateway()); - if (vlan != null) { - nic.setBroadcastUri(BroadcastDomainType.Storage.toUri(vlan)); - } else { - nic.setBroadcastUri(null); - } + NetworkVO config = new NetworkVO(offering.getTrafficType(), Mode.Static, BroadcastDomainType.Native, offering.getId(), Network.State.Setup, + plan.getDataCenterId(), plan.getPhysicalNetworkId()); + return config; + } + + @Override + public Network implement(Network network, NetworkOffering offering, DeployDestination destination, ReservationContext context) + throws InsufficientVirtualNetworkCapcityException { + assert network.getTrafficType() == TrafficType.Storage : "Why are you sending this configuration to me " + network; + if (!_sNwMgr.isStorageIpRangeAvailable(destination.getDataCenter().getId())) { + return super.implement(network, offering, destination, context); + } + return network; + } + + @Override + public NicProfile allocate(Network network, NicProfile nic, VirtualMachineProfile vm) + throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException { + assert network.getTrafficType() == TrafficType.Storage : "Well, I can't take care of this config now can I? " + network; + if (!_sNwMgr.isStorageIpRangeAvailable(network.getDataCenterId())) { + return super.allocate(network, nic, vm); + } + + return new NicProfile(ReservationStrategy.Start, null, null, null, null); + } + + @Override + public void reserve(NicProfile nic, Network network, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) + throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException { + if (!_sNwMgr.isStorageIpRangeAvailable(dest.getDataCenter().getId())) { + super.reserve(nic, network, vm, dest, context); + return; + } + + Pod pod = dest.getPod(); + Integer vlan = null; + + StorageNetworkIpAddressVO ip = _sNwMgr.acquireIpAddress(pod.getId()); + if (ip == null) { + throw new InsufficientAddressCapacityException("Unable to get a storage network ip address", Pod.class, pod.getId()); + } + + vlan = ip.getVlan(); + nic.setIp4Address(ip.getIpAddress()); + nic.setMacAddress(NetUtils.long2Mac(NetUtils.createSequenceBasedMacAddress(ip.getMac()))); + nic.setFormat(AddressFormat.Ip4); + nic.setNetmask(ip.getNetmask()); + nic.setBroadcastType(BroadcastDomainType.Storage); + nic.setGateway(ip.getGateway()); + if (vlan != null) { + nic.setBroadcastUri(BroadcastDomainType.Storage.toUri(vlan)); + } else { + nic.setBroadcastUri(null); + } nic.setIsolationUri(null); s_logger.debug("Allocated a storage nic " + nic + " for " + vm); - } + } - @Override - public boolean release(NicProfile nic, VirtualMachineProfile vm, String reservationId) { - Network nw = _nwDao.findById(nic.getNetworkId()); - if (!_sNwMgr.isStorageIpRangeAvailable(nw.getDataCenterId())) { - return super.release(nic, vm, reservationId); - } - - _sNwMgr.releaseIpAddress(nic.getIp4Address()); - s_logger.debug("Release an storage ip " + nic.getIp4Address()); - nic.deallocate(); - return true; - } + @Override + public boolean release(NicProfile nic, VirtualMachineProfile vm, String reservationId) { + Network nw = _nwDao.findById(nic.getNetworkId()); + if (!_sNwMgr.isStorageIpRangeAvailable(nw.getDataCenterId())) { + return super.release(nic, vm, reservationId); + } - @Override - public void deallocate(Network network, NicProfile nic, VirtualMachineProfile vm) { - // TODO Auto-generated method stub + _sNwMgr.releaseIpAddress(nic.getIp4Address()); + s_logger.debug("Release an storage ip " + nic.getIp4Address()); + nic.deallocate(); + return true; + } - } + @Override + public void deallocate(Network network, NicProfile nic, VirtualMachineProfile vm) { + // TODO Auto-generated method stub - @Override - public void updateNicProfile(NicProfile profile, Network network) { - // TODO Auto-generated method stub + } - } + @Override + public void updateNicProfile(NicProfile profile, Network network) { + // TODO Auto-generated method stub - @Override - public void shutdown(NetworkProfile network, NetworkOffering offering) { - // TODO Auto-generated method stub + } - } + @Override + public void shutdown(NetworkProfile network, NetworkOffering offering) { + // TODO Auto-generated method stub - @Override - public boolean trash(Network network, NetworkOffering offering) { - // TODO Auto-generated method stub - return false; - } + } - @Override - public void updateNetworkProfile(NetworkProfile networkProfile) { - // TODO Auto-generated method stub + @Override + public boolean trash(Network network, NetworkOffering offering) { + // TODO Auto-generated method stub + return false; + } - } + @Override + public void updateNetworkProfile(NetworkProfile networkProfile) { + // TODO Auto-generated method stub + + } + + @Override + public List getSupportedNetworkTypes() { + return new ArrayList(_supportedNetworkTypes); + } + + @Override + public List getSupportedTrafficTypes() { + return new ArrayList(_supportedTrafficTypes); + } + + @Override + public List getSupportedGuestTypes() { + return new ArrayList(_supportedGuestTypes); + } + + @Override + public List getSupportedIsolationMethods() { + return new ArrayList(_supportedIsolationMethods); + } }