mirror of https://github.com/apache/cloudstack.git
bug 8146: Elastic IP support in Basic zone.
Following was done as a part of checkin: 1) NetworkOffering/Network: * add PF service support for default Guest network offering. * Add one more additional network - Public. * Allow to enable external firewall in Basic zone. 2) Don't allow to deployVm in Public Network. 3) Allow to add vlan ip ranges to Public networks in Basic zone. 4) Associate IP - allow to associate with Direct vms. 5) Allow to create PF/Static nat rules. Rules are being sent to External Firewall Rule only. 6) Add PF support to External Firewall element.
This commit is contained in:
parent
7f595871f8
commit
96e83fe97f
|
|
@ -30,6 +30,8 @@ import com.cloud.api.Parameter;
|
|||
import com.cloud.api.ServerApiException;
|
||||
import com.cloud.api.response.IPAddressResponse;
|
||||
import com.cloud.async.AsyncJob;
|
||||
import com.cloud.dc.DataCenter;
|
||||
import com.cloud.dc.DataCenter.NetworkType;
|
||||
import com.cloud.event.EventTypes;
|
||||
import com.cloud.exception.ConcurrentOperationException;
|
||||
import com.cloud.exception.InsufficientAddressCapacityException;
|
||||
|
|
@ -39,6 +41,7 @@ import com.cloud.exception.ResourceAllocationException;
|
|||
import com.cloud.exception.ResourceUnavailableException;
|
||||
import com.cloud.network.IpAddress;
|
||||
import com.cloud.network.Network;
|
||||
import com.cloud.network.Networks.TrafficType;
|
||||
import com.cloud.user.Account;
|
||||
import com.cloud.user.UserContext;
|
||||
|
||||
|
|
@ -91,12 +94,23 @@ public class AssociateIPAddrCmd extends BaseAsyncCreateCmd {
|
|||
return networkId;
|
||||
}
|
||||
|
||||
List<? extends Network> networks = _networkService.getVirtualNetworksOwnedByAccountInZone(getAccountName(), getDomainId(), getZoneId());
|
||||
if (networks.size() == 0) {
|
||||
throw new InvalidParameterValueException("Account name=" + getAccountName() + " domainId=" + getDomainId() + " doesn't have virtual networks in zone " + getZoneId());
|
||||
DataCenter zone = _configService.getZone(getZoneId());
|
||||
if (zone.getNetworkType() == NetworkType.Advanced) {
|
||||
List<? extends Network> networks = _networkService.getVirtualNetworksOwnedByAccountInZone(getAccountName(), getDomainId(), getZoneId());
|
||||
if (networks.size() == 0) {
|
||||
throw new InvalidParameterValueException("Account name=" + getAccountName() + " domainId=" + getDomainId() + " doesn't have virtual networks in zone " + getZoneId());
|
||||
}
|
||||
assert (networks.size() <= 1) : "Too many virtual networks. This logic should be obsolete";
|
||||
return networks.get(0).getId();
|
||||
} else {
|
||||
Network defaultGuestNetwork = _networkService.getSystemNetworkByZoneAndTrafficType(zone.getId(), TrafficType.Guest);
|
||||
|
||||
if (defaultGuestNetwork == null) {
|
||||
throw new InvalidParameterValueException("Unable to find a default Guest network for account " + getAccountName() + " in domain id=" + getDomainId());
|
||||
} else {
|
||||
return defaultGuestNetwork.getId();
|
||||
}
|
||||
}
|
||||
assert (networks.size() <= 1) : "Too many virtual networks. This logic should be obsolete";
|
||||
return networks.get(0).getId();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -38,7 +38,6 @@ import com.cloud.exception.InsufficientCapacityException;
|
|||
import com.cloud.exception.InvalidParameterValueException;
|
||||
import com.cloud.exception.ResourceAllocationException;
|
||||
import com.cloud.exception.ResourceUnavailableException;
|
||||
import com.cloud.hypervisor.Hypervisor;
|
||||
import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
||||
import com.cloud.offering.ServiceOffering;
|
||||
import com.cloud.template.VirtualMachineTemplate;
|
||||
|
|
|
|||
|
|
@ -0,0 +1,28 @@
|
|||
/**
|
||||
* Copyright (C) 2010 Cloud.com, Inc. All rights reserved.
|
||||
*
|
||||
* This software is licensed under the GNU General Public License v3 or later.
|
||||
*
|
||||
* It is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or any later version.
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
package com.cloud.exception;
|
||||
|
||||
import com.cloud.utils.exception.CloudRuntimeException;
|
||||
|
||||
public class UnsupportedServiceException extends CloudRuntimeException{
|
||||
|
||||
public UnsupportedServiceException(String message) {
|
||||
super(message);
|
||||
}
|
||||
}
|
||||
|
|
@ -34,6 +34,7 @@ import com.cloud.exception.ResourceAllocationException;
|
|||
import com.cloud.exception.ResourceUnavailableException;
|
||||
import com.cloud.network.Network.Capability;
|
||||
import com.cloud.network.Network.Service;
|
||||
import com.cloud.network.Networks.TrafficType;
|
||||
import com.cloud.offering.NetworkOffering;
|
||||
|
||||
|
||||
|
|
@ -71,4 +72,6 @@ public interface NetworkService {
|
|||
|
||||
Map<Service, Map<Capability, String>> getNetworkCapabilities(long networkId);
|
||||
|
||||
Network getSystemNetworkByZoneAndTrafficType(long zoneId, TrafficType trafficType);
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1168,7 +1168,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura
|
|||
} else if (offering.getTrafficType() == TrafficType.Control) {
|
||||
broadcastDomainType = BroadcastDomainType.LinkLocal;
|
||||
} else if (offering.getTrafficType() == TrafficType.Public) {
|
||||
if (zone.getNetworkType() == NetworkType.Advanced && !zone.isSecurityGroupEnabled()) {
|
||||
if ((zone.getNetworkType() == NetworkType.Advanced && !zone.isSecurityGroupEnabled()) || zone.getNetworkType() == NetworkType.Basic) {
|
||||
broadcastDomainType = BroadcastDomainType.Vlan;
|
||||
} else {
|
||||
continue;
|
||||
|
|
@ -1741,12 +1741,12 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura
|
|||
//Allow adding untagged direct vlan only for Basic zone
|
||||
if (zone.getNetworkType() == NetworkType.Advanced && vlanId.equals(Vlan.UNTAGGED) && (!forVirtualNetwork || zone.isSecurityGroupEnabled())) {
|
||||
throw new InvalidParameterValueException("Direct untagged network is not supported for the zone " + zone.getId() + " of type " + zone.getNetworkType());
|
||||
} else if (zone.getNetworkType() == NetworkType.Basic && !(vlanId.equals(Vlan.UNTAGGED) && !forVirtualNetwork)) {
|
||||
throw new InvalidParameterValueException("Only direct untagged network is supported in the zone " + zone.getId() + " of type " + zone.getNetworkType());
|
||||
} else if (zone.getNetworkType() == NetworkType.Basic && !((vlanId.equals(Vlan.UNTAGGED) && !forVirtualNetwork) || (!vlanId.equals(Vlan.UNTAGGED) && forVirtualNetwork))) {
|
||||
throw new InvalidParameterValueException("Only Direct Untagged and Virtual networks are supported in the zone " + zone.getId() + " of type " + zone.getNetworkType());
|
||||
}
|
||||
|
||||
//don't allow to create a virtual vlan when zone's vnet is NULL
|
||||
if (zone.getVnet() == null && forVirtualNetwork) {
|
||||
//don't allow to create a virtual vlan when zone's vnet is NULL in Advanced zone
|
||||
if ((zone.getNetworkType() == NetworkType.Advanced && zone.getVnet() == null) && forVirtualNetwork) {
|
||||
throw new InvalidParameterValueException("Can't add virtual network to the zone id=" + zone.getId() + " as zone doesn't have guest vlan configured");
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -126,8 +126,6 @@ public interface NetworkManager extends NetworkService {
|
|||
|
||||
boolean applyRules(List<? extends FirewallRule> rules, boolean continueOnError) throws ResourceUnavailableException;
|
||||
|
||||
NetworkVO getSystemNetworkByZoneAndTrafficType(long zoneId, TrafficType trafficType);
|
||||
|
||||
List<? extends RemoteAccessVpnElement> getRemoteAccessVpnElements();
|
||||
|
||||
PublicIpAddress getPublicIpAddress(long ipAddressId);
|
||||
|
|
@ -174,7 +172,7 @@ public interface NetworkManager extends NetworkService {
|
|||
|
||||
void unassignPublicIpAddress(IPAddressVO addr);
|
||||
|
||||
Map<Capability, String> getServiceCapability(long zoneId, Service service);
|
||||
Map<Capability, String> getServiceCapabilities(long zoneId, Service service);
|
||||
|
||||
boolean applyIpAssociations(Network network, boolean continueOnError) throws ResourceUnavailableException;
|
||||
|
||||
|
|
|
|||
|
|
@ -80,6 +80,7 @@ import com.cloud.exception.InvalidParameterValueException;
|
|||
import com.cloud.exception.PermissionDeniedException;
|
||||
import com.cloud.exception.ResourceAllocationException;
|
||||
import com.cloud.exception.ResourceUnavailableException;
|
||||
import com.cloud.exception.UnsupportedServiceException;
|
||||
import com.cloud.network.IpAddress.State;
|
||||
import com.cloud.network.Network.Capability;
|
||||
import com.cloud.network.Network.GuestIpType;
|
||||
|
|
@ -450,6 +451,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
|
|||
boolean success = true;
|
||||
for (NetworkElement element : _networkElements) {
|
||||
try {
|
||||
s_logger.trace("Asking " + element + " to apply ip associations");
|
||||
element.applyIps(network, publicIps);
|
||||
} catch (ResourceUnavailableException e) {
|
||||
success = false;
|
||||
|
|
@ -693,8 +695,8 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
|
|||
null,
|
||||
true,
|
||||
Availability.Required,
|
||||
//services - all true except for firewall/lb/vpn and gateway services
|
||||
true, true, true, false, false,false, false, GuestIpType.Direct);
|
||||
//services - all true except for lb/vpn and gateway services
|
||||
true, true, true, false, true,false, false, GuestIpType.Direct);
|
||||
guestNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(guestNetworkOffering);
|
||||
_systemNetworks.put(NetworkOfferingVO.SystemGuestNetwork, guestNetworkOffering);
|
||||
|
||||
|
|
@ -1770,17 +1772,9 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
|
|||
sb.and("removed", sb.entity().getRemoved(), Op.NULL);
|
||||
|
||||
SearchCriteria<NetworkVO> sc = sb.create();
|
||||
|
||||
if (!isSystem) {
|
||||
if (zoneId != null) {
|
||||
DataCenterVO dc = _dcDao.findById(zoneId);
|
||||
if (dc != null && !dc.isSecurityGroupEnabled()) {
|
||||
sc.setJoinParameters("networkOfferingSearch", "systemOnly", false);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
sc.setJoinParameters("networkOfferingSearch", "systemOnly", true);
|
||||
sc.setJoinParameters("zoneSearch", "networkType", NetworkType.Advanced.toString());
|
||||
|
||||
if (isSystem != null) {
|
||||
sc.setJoinParameters("networkOfferingSearch", "systemOnly", isSystem);
|
||||
}
|
||||
|
||||
if (keyword != null) {
|
||||
|
|
@ -2339,8 +2333,12 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
|
|||
}
|
||||
|
||||
@Override
|
||||
public Map<Capability, String> getServiceCapability(long zoneId, Service service) {
|
||||
public Map<Capability, String> getServiceCapabilities(long zoneId, Service service) {
|
||||
Map<Service, Map<Capability, String>> networkCapabilities = getZoneCapabilities(zoneId);
|
||||
if (networkCapabilities.get(service) == null) {
|
||||
throw new UnsupportedServiceException("Service " + service.getName() + " is not supported in zone id=" + zoneId);
|
||||
}
|
||||
|
||||
return networkCapabilities.get(service);
|
||||
}
|
||||
|
||||
|
|
@ -2549,9 +2547,15 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
|
|||
@Override
|
||||
public boolean zoneIsConfiguredForExternalNetworking(long zoneId) {
|
||||
DataCenterVO zone = _dcDao.findById(zoneId);
|
||||
|
||||
return (zone.getGatewayProvider() != null && zone.getGatewayProvider().equals(Network.Provider.JuniperSRX.getName()) && zone.getFirewallProvider().equals(Network.Provider.JuniperSRX.getName()) && zone.getLoadBalancerProvider().equals(
|
||||
Network.Provider.F5BigIp.getName()));
|
||||
|
||||
if (zone.getNetworkType() == NetworkType.Advanced) {
|
||||
return (zone.getGatewayProvider() != null && zone.getGatewayProvider().equals(Network.Provider.JuniperSRX.getName())
|
||||
&& zone.getFirewallProvider() != null && zone.getFirewallProvider().equals(Network.Provider.JuniperSRX.getName())
|
||||
&& zone.getLoadBalancerProvider() != null && zone.getLoadBalancerProvider().equals(
|
||||
Network.Provider.F5BigIp.getName()));
|
||||
} else {
|
||||
return (zone.getFirewallProvider() != null && zone.getFirewallProvider().equals(Network.Provider.JuniperSRX.getName()));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -28,7 +28,6 @@ import org.apache.log4j.Logger;
|
|||
import com.cloud.configuration.ConfigurationManager;
|
||||
import com.cloud.dc.DataCenter;
|
||||
import com.cloud.dc.DataCenter.NetworkType;
|
||||
import com.cloud.dc.HostPodVO;
|
||||
import com.cloud.dc.dao.HostPodDao;
|
||||
import com.cloud.deploy.DeployDestination;
|
||||
import com.cloud.exception.ConcurrentOperationException;
|
||||
|
|
@ -51,7 +50,6 @@ import com.cloud.offering.NetworkOffering;
|
|||
import com.cloud.uservm.UserVm;
|
||||
import com.cloud.utils.component.AdapterBase;
|
||||
import com.cloud.utils.component.Inject;
|
||||
import com.cloud.utils.exception.CloudRuntimeException;
|
||||
import com.cloud.vm.DomainRouterVO;
|
||||
import com.cloud.vm.NicProfile;
|
||||
import com.cloud.vm.ReservationContext;
|
||||
|
|
@ -84,7 +82,7 @@ public class DhcpElement extends AdapterBase implements NetworkElement, Password
|
|||
|
||||
if (provider != null && provider.equalsIgnoreCase(Provider.JuniperSRX.getName()) && ipType == GuestIpType.Virtual) {
|
||||
return true;
|
||||
} else if (dest.getPod().getExternalDhcp()){
|
||||
} else if (dest.getPod() != null && dest.getPod().getExternalDhcp()){
|
||||
//This pod is using external DHCP server
|
||||
return false;
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -19,7 +19,6 @@ import com.cloud.exception.InsufficientAddressCapacityException;
|
|||
import com.cloud.exception.InsufficientVirtualNetworkCapcityException;
|
||||
import com.cloud.network.IPAddressVO;
|
||||
import com.cloud.network.Network;
|
||||
import com.cloud.network.Network.GuestIpType;
|
||||
import com.cloud.network.Network.State;
|
||||
import com.cloud.network.NetworkManager;
|
||||
import com.cloud.network.NetworkProfile;
|
||||
|
|
@ -54,7 +53,7 @@ public class PublicNetworkGuru extends AdapterBase implements NetworkGuru {
|
|||
|
||||
|
||||
protected boolean canHandle(NetworkOffering offering, DataCenter dc) {
|
||||
if (dc.getNetworkType() == NetworkType.Advanced && offering.getTrafficType() == TrafficType.Public && offering.isSystemOnly() && !dc.isSecurityGroupEnabled()) {
|
||||
if (((dc.getNetworkType() == NetworkType.Advanced && !dc.isSecurityGroupEnabled()) || dc.getNetworkType() == NetworkType.Basic) && offering.getTrafficType() == TrafficType.Public && offering.isSystemOnly()) {
|
||||
return true;
|
||||
} else {
|
||||
s_logger.trace("We only take care of System only Public Virtual Network");
|
||||
|
|
|
|||
|
|
@ -220,8 +220,8 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager {
|
|||
}
|
||||
|
||||
//Verify that the network guru supports the protocol specified
|
||||
Map<Network.Capability, String> firewallCapability = _networkMgr.getServiceCapability(network.getDataCenterId(), Service.Firewall);
|
||||
String supportedProtocols = firewallCapability.get(Capability.SupportedProtocols).toLowerCase();
|
||||
Map<Network.Capability, String> firewallCapabilities = _networkMgr.getServiceCapabilities(network.getDataCenterId(), Service.Firewall);
|
||||
String supportedProtocols = firewallCapabilities.get(Capability.SupportedProtocols).toLowerCase();
|
||||
if (!supportedProtocols.contains(rule.getProtocol().toLowerCase())) {
|
||||
throw new InvalidParameterValueException("Protocol " + rule.getProtocol() + " is not supported in zone " + network.getDataCenterId());
|
||||
}
|
||||
|
|
@ -330,7 +330,7 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager {
|
|||
}
|
||||
|
||||
//Verify that the network guru supports the protocol specified
|
||||
Map<Network.Capability, String> firewallCapability = _networkMgr.getServiceCapability(network.getDataCenterId(), Service.Firewall);
|
||||
Map<Network.Capability, String> firewallCapability = _networkMgr.getServiceCapabilities(network.getDataCenterId(), Service.Firewall);
|
||||
String supportedProtocols = firewallCapability.get(Capability.SupportedProtocols).toLowerCase();
|
||||
if (!supportedProtocols.contains(rule.getProtocol().toLowerCase())) {
|
||||
throw new InvalidParameterValueException("Protocol " + rule.getProtocol() + " is not supported in zone " + network.getDataCenterId());
|
||||
|
|
|
|||
|
|
@ -63,7 +63,6 @@ import com.cloud.network.NetworkVO;
|
|||
import com.cloud.network.Networks.BroadcastDomainType;
|
||||
import com.cloud.network.Networks.Mode;
|
||||
import com.cloud.network.Networks.TrafficType;
|
||||
import com.cloud.network.dao.IPAddressDao;
|
||||
import com.cloud.network.dao.NetworkDao;
|
||||
import com.cloud.network.guru.ControlNetworkGuru;
|
||||
import com.cloud.network.guru.DirectPodBasedNetworkGuru;
|
||||
|
|
@ -77,7 +76,6 @@ import com.cloud.service.ServiceOfferingVO;
|
|||
import com.cloud.service.dao.ServiceOfferingDao;
|
||||
import com.cloud.storage.DiskOfferingVO;
|
||||
import com.cloud.storage.dao.DiskOfferingDao;
|
||||
import com.cloud.storage.dao.SnapshotPolicyDao;
|
||||
import com.cloud.test.IPRangeConfig;
|
||||
import com.cloud.user.Account;
|
||||
import com.cloud.user.User;
|
||||
|
|
@ -94,7 +92,6 @@ public class ConfigurationServerImpl implements ConfigurationServer {
|
|||
public static final Logger s_logger = Logger.getLogger(ConfigurationServerImpl.class.getName());
|
||||
|
||||
private final ConfigurationDao _configDao;
|
||||
private final SnapshotPolicyDao _snapPolicyDao;
|
||||
private final DataCenterDao _zoneDao;
|
||||
private final HostPodDao _podDao;
|
||||
private final DiskOfferingDao _diskOfferingDao;
|
||||
|
|
@ -104,13 +101,11 @@ public class ConfigurationServerImpl implements ConfigurationServer {
|
|||
private final DataCenterDao _dataCenterDao;
|
||||
private final NetworkDao _networkDao;
|
||||
private final VlanDao _vlanDao;
|
||||
private final IPAddressDao _ipAddressDao;
|
||||
|
||||
|
||||
public ConfigurationServerImpl() {
|
||||
ComponentLocator locator = ComponentLocator.getLocator(Name);
|
||||
_configDao = locator.getDao(ConfigurationDao.class);
|
||||
_snapPolicyDao = locator.getDao(SnapshotPolicyDao.class);
|
||||
_zoneDao = locator.getDao(DataCenterDao.class);
|
||||
_podDao = locator.getDao(HostPodDao.class);
|
||||
_diskOfferingDao = locator.getDao(DiskOfferingDao.class);
|
||||
|
|
@ -120,7 +115,6 @@ public class ConfigurationServerImpl implements ConfigurationServer {
|
|||
_dataCenterDao = locator.getDao(DataCenterDao.class);
|
||||
_networkDao = locator.getDao(NetworkDao.class);
|
||||
_vlanDao = locator.getDao(VlanDao.class);
|
||||
_ipAddressDao = locator.getDao(IPAddressDao.class);
|
||||
}
|
||||
|
||||
@Override @DB
|
||||
|
|
@ -730,8 +724,8 @@ public class ConfigurationServerImpl implements ConfigurationServer {
|
|||
TrafficType.Guest,
|
||||
true, false, null, null, null, true,
|
||||
Availability.Required,
|
||||
true, true, true, //services - all true except for firewall/lb/vpn and gateway
|
||||
false, false, false, false, GuestIpType.Direct);
|
||||
true, true, true, //services - all true except for lb/vpn and gateway
|
||||
false, true, false, false, GuestIpType.Direct);
|
||||
|
||||
guestNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(guestNetworkOffering);
|
||||
|
||||
|
|
@ -800,7 +794,7 @@ public class ConfigurationServerImpl implements ConfigurationServer {
|
|||
} else if (trafficType == TrafficType.Control) {
|
||||
broadcastDomainType = BroadcastDomainType.LinkLocal;
|
||||
} else if (offering.getTrafficType() == TrafficType.Public) {
|
||||
if (zone.getNetworkType() == NetworkType.Advanced) {
|
||||
if ((zone.getNetworkType() == NetworkType.Advanced && !zone.isSecurityGroupEnabled()) || zone.getNetworkType() == NetworkType.Basic) {
|
||||
broadcastDomainType = BroadcastDomainType.Vlan;
|
||||
} else {
|
||||
continue;
|
||||
|
|
|
|||
|
|
@ -127,6 +127,7 @@ 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.org.Cluster;
|
||||
import com.cloud.server.Criteria;
|
||||
import com.cloud.service.ServiceOfferingVO;
|
||||
import com.cloud.service.dao.ServiceOfferingDao;
|
||||
|
|
@ -199,7 +200,6 @@ import com.cloud.vm.dao.InstanceGroupVMMapDao;
|
|||
import com.cloud.vm.dao.NicDao;
|
||||
import com.cloud.vm.dao.UserVmDao;
|
||||
import com.cloud.vm.dao.UserVmDetailsDao;
|
||||
import com.cloud.org.Cluster;
|
||||
|
||||
@Local(value={UserVmManager.class, UserVmService.class})
|
||||
public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager {
|
||||
|
|
@ -1894,12 +1894,12 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager
|
|||
_accountMgr.checkAccess(caller, owner);
|
||||
|
||||
//Get default guest network in Basic zone
|
||||
NetworkVO defaultNetwork = _networkMgr.getSystemNetworkByZoneAndTrafficType(zone.getId(), TrafficType.Guest);
|
||||
Network defaultNetwork = _networkMgr.getSystemNetworkByZoneAndTrafficType(zone.getId(), TrafficType.Guest);
|
||||
|
||||
if (defaultNetwork == null) {
|
||||
throw new InvalidParameterValueException("Unable to find a default network to start a vm");
|
||||
} else {
|
||||
networkList.add(defaultNetwork);
|
||||
networkList.add(_networkDao.findById(defaultNetwork.getId()));
|
||||
}
|
||||
|
||||
return createVirtualMachine(zone, serviceOffering, template, hostName, displayName, caller, diskOfferingId,
|
||||
|
|
|
|||
Loading…
Reference in New Issue