diff --git a/server/src/com/cloud/offerings/dao/NetworkOfferingDao.java b/server/src/com/cloud/offerings/dao/NetworkOfferingDao.java index 245f6e41bac..9195c621c59 100644 --- a/server/src/com/cloud/offerings/dao/NetworkOfferingDao.java +++ b/server/src/com/cloud/offerings/dao/NetworkOfferingDao.java @@ -5,6 +5,7 @@ package com.cloud.offerings.dao; import java.util.List; +import com.cloud.offering.NetworkOffering.Availability; import com.cloud.offerings.NetworkOfferingVO; import com.cloud.utils.db.GenericDao; @@ -35,4 +36,6 @@ public interface NetworkOfferingDao extends GenericDao List listSystemNetworkOfferings(); + List listByAvailability(Availability availability, boolean isSystem); + } diff --git a/server/src/com/cloud/offerings/dao/NetworkOfferingDaoImpl.java b/server/src/com/cloud/offerings/dao/NetworkOfferingDaoImpl.java index 63bbaaa630c..fe62f233ea1 100644 --- a/server/src/com/cloud/offerings/dao/NetworkOfferingDaoImpl.java +++ b/server/src/com/cloud/offerings/dao/NetworkOfferingDaoImpl.java @@ -11,6 +11,7 @@ import javax.persistence.EntityExistsException; import org.apache.log4j.Logger; +import com.cloud.offering.NetworkOffering.Availability; import com.cloud.offerings.NetworkOfferingVO; import com.cloud.utils.db.DB; import com.cloud.utils.db.GenericDaoBase; @@ -24,6 +25,7 @@ public class NetworkOfferingDaoImpl extends GenericDaoBase NameSearch; final SearchBuilder SystemOfferingSearch; + final SearchBuilder AvailabilitySearch; protected NetworkOfferingDaoImpl() { super(); @@ -35,6 +37,11 @@ public class NetworkOfferingDaoImpl extends GenericDaoBase listByAvailability(Availability availability, boolean isSystem) { + SearchCriteria sc = AvailabilitySearch.create(); + sc.setParameters("availability", availability); + sc.setParameters("isSystem", isSystem); + return listBy(sc, null); + } } diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 8618b01d511..e95bc68a78f 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -37,14 +37,13 @@ import com.cloud.agent.api.Answer; import com.cloud.agent.api.AttachIsoCommand; import com.cloud.agent.api.AttachVolumeAnswer; import com.cloud.agent.api.AttachVolumeCommand; -import com.cloud.agent.api.BackupSnapshotCommand; import com.cloud.agent.api.CreatePrivateTemplateFromSnapshotCommand; import com.cloud.agent.api.CreatePrivateTemplateFromVolumeCommand; -import com.cloud.agent.api.UpgradeSnapshotCommand; import com.cloud.agent.api.GetVmStatsAnswer; import com.cloud.agent.api.GetVmStatsCommand; import com.cloud.agent.api.SnapshotCommand; import com.cloud.agent.api.StopAnswer; +import com.cloud.agent.api.UpgradeSnapshotCommand; import com.cloud.agent.api.VmStatsEntry; import com.cloud.agent.api.storage.CreatePrivateTemplateAnswer; import com.cloud.agent.api.to.VolumeTO; @@ -122,7 +121,9 @@ import com.cloud.network.router.VirtualNetworkApplianceManager; import com.cloud.network.rules.RulesManager; import com.cloud.network.security.SecurityGroupManager; import com.cloud.network.vpn.PasswordResetElement; +import com.cloud.offering.NetworkOffering.Availability; import com.cloud.offering.ServiceOffering; +import com.cloud.offerings.NetworkOfferingVO; import com.cloud.offerings.dao.NetworkOfferingDao; import com.cloud.server.Criteria; import com.cloud.service.ServiceOfferingVO; @@ -131,7 +132,6 @@ import com.cloud.storage.DiskOfferingVO; import com.cloud.storage.GuestOSVO; import com.cloud.storage.SnapshotVO; import com.cloud.storage.Storage; -import com.cloud.storage.VMTemplateZoneVO; import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.Storage.StoragePoolType; import com.cloud.storage.Storage.StorageResourceType; @@ -142,6 +142,7 @@ import com.cloud.storage.StoragePoolVO; import com.cloud.storage.VMTemplateHostVO; import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; import com.cloud.storage.VMTemplateVO; +import com.cloud.storage.VMTemplateZoneVO; import com.cloud.storage.Volume; import com.cloud.storage.Volume.VolumeType; import com.cloud.storage.VolumeVO; @@ -2005,6 +2006,16 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager networkList.add(guestVirtualNetwork); } else { + + boolean requiredNetworkOfferingIsPresent = false; + List requiredOfferings = _networkOfferingDao.listByAvailability(Availability.Required, false); + Long requiredOfferingId = null; + + if (!requiredOfferings.isEmpty()) { + //in 2.2.x there can be only one required offering - default Virtual + requiredOfferingId = requiredOfferings.get(0).getId(); + } + for (Long networkId : networkIdList) { NetworkVO network = _networkDao.findById(networkId); if (network == null) { @@ -2019,8 +2030,19 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager } } + if (requiredOfferingId != null && network.getNetworkOfferingId() == requiredOfferingId.longValue()) { + requiredNetworkOfferingIsPresent = true; + } + networkList.add(network); } + + //If default Virtual network offering is Required, it has to be specified in the network list + if (requiredOfferingId != null && !requiredNetworkOfferingIsPresent) { + throw new InvalidParameterValueException("Network created from the network offering id=" + requiredOfferingId + " is required; change network offering availability to be Optional to relax this requirement"); + } + + } return createVirtualMachine(zone, serviceOffering, template, hostName, displayName, caller, diskOfferingId,