You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ah...@apache.org on 2013/09/07 00:38:35 UTC
[05/36] Moved NetworkManagerImpl to NetworkOrchestrator
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2e5bb63f/server/src/com/cloud/network/NetworkManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java
deleted file mode 100755
index dab0e5f..0000000
--- a/server/src/com/cloud/network/NetworkManagerImpl.java
+++ /dev/null
@@ -1,3172 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License. You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied. See the License for the
-// specific language governing permissions and limitations
-// under the License.
-package com.cloud.network;
-
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.UUID;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-
-import javax.ejb.Local;
-import javax.inject.Inject;
-import javax.naming.ConfigurationException;
-
-import org.apache.log4j.Logger;
-
-import org.apache.cloudstack.acl.ControlledEntity.ACLType;
-import org.apache.cloudstack.context.CallContext;
-import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
-import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
-import org.apache.cloudstack.region.PortableIpDao;
-
-import com.cloud.agent.AgentManager;
-import com.cloud.agent.Listener;
-import com.cloud.agent.api.AgentControlAnswer;
-import com.cloud.agent.api.AgentControlCommand;
-import com.cloud.agent.api.Answer;
-import com.cloud.agent.api.CheckNetworkAnswer;
-import com.cloud.agent.api.CheckNetworkCommand;
-import com.cloud.agent.api.Command;
-import com.cloud.agent.api.StartupCommand;
-import com.cloud.agent.api.StartupRoutingCommand;
-import com.cloud.agent.api.to.NicTO;
-import com.cloud.alert.AlertManager;
-import com.cloud.api.ApiDBUtils;
-import com.cloud.configuration.Config;
-import com.cloud.configuration.ConfigurationManager;
-import com.cloud.configuration.Resource.ResourceType;
-import com.cloud.dc.DataCenter;
-import com.cloud.dc.DataCenter.NetworkType;
-import com.cloud.dc.DataCenterVO;
-import com.cloud.dc.DataCenterVnetVO;
-import com.cloud.dc.PodVlanMapVO;
-import com.cloud.dc.Vlan;
-import com.cloud.dc.VlanVO;
-import com.cloud.dc.dao.AccountVlanMapDao;
-import com.cloud.dc.dao.DataCenterDao;
-import com.cloud.dc.dao.DataCenterVnetDao;
-import com.cloud.dc.dao.PodVlanMapDao;
-import com.cloud.dc.dao.VlanDao;
-import com.cloud.deploy.DataCenterDeployment;
-import com.cloud.deploy.DeployDestination;
-import com.cloud.deploy.DeploymentPlan;
-import com.cloud.domain.Domain;
-import com.cloud.domain.dao.DomainDao;
-import com.cloud.event.dao.UsageEventDao;
-import com.cloud.exception.ConcurrentOperationException;
-import com.cloud.exception.ConnectionException;
-import com.cloud.exception.InsufficientAddressCapacityException;
-import com.cloud.exception.InsufficientCapacityException;
-import com.cloud.exception.InsufficientVirtualNetworkCapcityException;
-import com.cloud.exception.InvalidParameterValueException;
-import com.cloud.exception.ResourceAllocationException;
-import com.cloud.exception.ResourceUnavailableException;
-import com.cloud.exception.UnsupportedServiceException;
-import com.cloud.host.Host;
-import com.cloud.host.Status;
-import com.cloud.host.dao.HostDao;
-import com.cloud.hypervisor.Hypervisor.HypervisorType;
-import com.cloud.network.IpAddress.State;
-import com.cloud.network.Network.Capability;
-import com.cloud.network.Network.Event;
-import com.cloud.network.Network.GuestType;
-import com.cloud.network.Network.Provider;
-import com.cloud.network.Network.Service;
-import com.cloud.network.Networks.BroadcastDomainType;
-import com.cloud.network.Networks.TrafficType;
-import com.cloud.network.addr.PublicIp;
-import com.cloud.network.dao.AccountGuestVlanMapDao;
-import com.cloud.network.dao.AccountGuestVlanMapVO;
-import com.cloud.network.dao.FirewallRulesDao;
-import com.cloud.network.dao.IPAddressDao;
-import com.cloud.network.dao.IPAddressVO;
-import com.cloud.network.dao.LoadBalancerDao;
-import com.cloud.network.dao.NetworkAccountDao;
-import com.cloud.network.dao.NetworkAccountVO;
-import com.cloud.network.dao.NetworkDao;
-import com.cloud.network.dao.NetworkDomainDao;
-import com.cloud.network.dao.NetworkDomainVO;
-import com.cloud.network.dao.NetworkServiceMapDao;
-import com.cloud.network.dao.NetworkServiceMapVO;
-import com.cloud.network.dao.NetworkVO;
-import com.cloud.network.dao.PhysicalNetworkDao;
-import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
-import com.cloud.network.dao.PhysicalNetworkTrafficTypeDao;
-import com.cloud.network.dao.PhysicalNetworkTrafficTypeVO;
-import com.cloud.network.dao.PhysicalNetworkVO;
-import com.cloud.network.dao.UserIpv6AddressDao;
-import com.cloud.network.element.DhcpServiceProvider;
-import com.cloud.network.element.IpDeployer;
-import com.cloud.network.element.LoadBalancingServiceProvider;
-import com.cloud.network.element.NetworkElement;
-import com.cloud.network.element.StaticNatServiceProvider;
-import com.cloud.network.element.UserDataServiceProvider;
-import com.cloud.network.guru.NetworkGuru;
-import com.cloud.network.lb.LoadBalancingRulesManager;
-import com.cloud.network.rules.FirewallManager;
-import com.cloud.network.rules.FirewallRule;
-import com.cloud.network.rules.FirewallRule.Purpose;
-import com.cloud.network.rules.FirewallRuleVO;
-import com.cloud.network.rules.LoadBalancerContainer.Scheme;
-import com.cloud.network.rules.PortForwardingRuleVO;
-import com.cloud.network.rules.RulesManager;
-import com.cloud.network.rules.StaticNatRule;
-import com.cloud.network.rules.StaticNatRuleImpl;
-import com.cloud.network.rules.dao.PortForwardingRulesDao;
-import com.cloud.network.vpc.NetworkACLManager;
-import com.cloud.network.vpc.VpcManager;
-import com.cloud.network.vpc.dao.PrivateIpDao;
-import com.cloud.network.vpn.RemoteAccessVpnService;
-import com.cloud.offering.NetworkOffering;
-import com.cloud.offering.NetworkOffering.Availability;
-import com.cloud.offerings.NetworkOfferingServiceMapVO;
-import com.cloud.offerings.NetworkOfferingVO;
-import com.cloud.offerings.dao.NetworkOfferingDao;
-import com.cloud.offerings.dao.NetworkOfferingDetailsDao;
-import com.cloud.offerings.dao.NetworkOfferingServiceMapDao;
-import com.cloud.server.ConfigurationServer;
-import com.cloud.user.Account;
-import com.cloud.user.AccountManager;
-import com.cloud.user.ResourceLimitService;
-import com.cloud.user.User;
-import com.cloud.user.dao.AccountDao;
-import com.cloud.user.dao.UserDao;
-import com.cloud.utils.NumbersUtil;
-import com.cloud.utils.Pair;
-import com.cloud.utils.component.AdapterBase;
-import com.cloud.utils.component.ManagerBase;
-import com.cloud.utils.concurrency.NamedThreadFactory;
-import com.cloud.utils.db.DB;
-import com.cloud.utils.db.EntityManager;
-import com.cloud.utils.db.GlobalLock;
-import com.cloud.utils.db.JoinBuilder.JoinType;
-import com.cloud.utils.db.SearchBuilder;
-import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
-import com.cloud.utils.exception.CloudRuntimeException;
-import com.cloud.utils.fsm.NoTransitionException;
-import com.cloud.utils.fsm.StateMachine2;
-import com.cloud.utils.net.NetUtils;
-import com.cloud.vm.Nic;
-import com.cloud.vm.Nic.ReservationStrategy;
-import com.cloud.vm.NicIpAlias;
-import com.cloud.vm.NicProfile;
-import com.cloud.vm.NicVO;
-import com.cloud.vm.ReservationContext;
-import com.cloud.vm.ReservationContextImpl;
-import com.cloud.vm.UserVmVO;
-import com.cloud.vm.VMInstanceVO;
-import com.cloud.vm.VirtualMachine;
-import com.cloud.vm.VirtualMachine.Type;
-import com.cloud.vm.VirtualMachineProfile;
-import com.cloud.vm.dao.NicDao;
-import com.cloud.vm.dao.NicIpAliasDao;
-import com.cloud.vm.dao.NicIpAliasVO;
-import com.cloud.vm.dao.NicSecondaryIpDao;
-import com.cloud.vm.dao.NicSecondaryIpVO;
-import com.cloud.vm.dao.UserVmDao;
-import com.cloud.vm.dao.VMInstanceDao;
-
-/**
- * NetworkManagerImpl implements NetworkManager.
- */
-@Local(value = { NetworkOrchestrationService.class})
-public class NetworkManagerImpl extends ManagerBase implements NetworkOrchestrationService, Listener {
- static final Logger s_logger = Logger.getLogger(NetworkManagerImpl.class);
- @Inject
- EntityManager _entityMgr;
-
- @Inject
- DataCenterDao _dcDao = null;
- @Inject
- VlanDao _vlanDao = null;
- @Inject
- IPAddressDao _ipAddressDao = null;
- @Inject
- AccountDao _accountDao = null;
- @Inject
- DomainDao _domainDao = null;
- @Inject
- UserDao _userDao = null;
- @Inject
- ConfigurationDao _configDao;
- @Inject
- UserVmDao _userVmDao = null;
- @Inject
- AlertManager _alertMgr;
- @Inject
- AccountManager _accountMgr;
- @Inject
- ConfigurationManager _configMgr;
- @Inject
- AccountVlanMapDao _accountVlanMapDao;
- @Inject
- NetworkOfferingDao _networkOfferingDao = null;
- @Inject
- NetworkDao _networksDao = null;
- @Inject
- NicDao _nicDao = null;
- @Inject
- RulesManager _rulesMgr;
- @Inject
- LoadBalancingRulesManager _lbMgr;
- @Inject
- RemoteAccessVpnService _vpnMgr;
- @Inject
- PodVlanMapDao _podVlanMapDao;
- @Inject
- NetworkOfferingDetailsDao _ntwkOffDetailsDao;
- @Inject
- ConfigurationServer _configServer;
- @Inject
- AccountGuestVlanMapDao _accountGuestVlanMapDao;
- @Inject
- DataCenterVnetDao _datacenterVnetDao;
- @Inject
- NetworkAccountDao _networkAccountDao;
- @Inject
- protected NicIpAliasDao _nicIpAliasDao;
- @Inject
- protected IPAddressDao _publicIpAddressDao;
- @Inject
- protected IpAddressManager _ipAddrMgr;
-
- List<NetworkGuru> _networkGurus;
- public List<NetworkGuru> getNetworkGurus() {
- return _networkGurus;
- }
- public void setNetworkGurus(List<NetworkGuru> _networkGurus) {
- this._networkGurus = _networkGurus;
- }
-
- List<NetworkElement> _networkElements;
- public List<NetworkElement> getNetworkElements() {
- return _networkElements;
- }
- public void setNetworkElements(List<NetworkElement> _networkElements) {
- this._networkElements = _networkElements;
- }
-
- @Inject NetworkDomainDao _networkDomainDao;
-
- List<IpDeployer> _ipDeployers;
- public List<IpDeployer> getIpDeployers() {
- return _ipDeployers;
- }
- public void setIpDeployers(List<IpDeployer> _ipDeployers) {
- this._ipDeployers = _ipDeployers;
- }
-
- List<DhcpServiceProvider> _dhcpProviders;
- public List<DhcpServiceProvider> getDhcpProviders() {
- return _dhcpProviders;
- }
- public void setDhcpProviders(List<DhcpServiceProvider> _dhcpProviders) {
- this._dhcpProviders = _dhcpProviders;
- }
-
- @Inject
- VMInstanceDao _vmDao;
- @Inject
- FirewallManager _firewallMgr;
- @Inject
- FirewallRulesDao _firewallDao;
- @Inject
- ResourceLimitService _resourceLimitMgr;
-
- @Inject
- NetworkOfferingServiceMapDao _ntwkOfferingSrvcDao;
- @Inject
- PhysicalNetworkDao _physicalNetworkDao;
- @Inject
- PhysicalNetworkServiceProviderDao _pNSPDao;
- @Inject
- PortForwardingRulesDao _portForwardingRulesDao;
- @Inject
- LoadBalancerDao _lbDao;
- @Inject
- PhysicalNetworkTrafficTypeDao _pNTrafficTypeDao;
- @Inject
- AgentManager _agentMgr;
- @Inject
- HostDao _hostDao;
- @Inject
- NetworkServiceMapDao _ntwkSrvcDao;
- @Inject
- StorageNetworkManager _stnwMgr;
- @Inject
- VpcManager _vpcMgr;
- @Inject
- PrivateIpDao _privateIpDao;
- @Inject
- NetworkACLManager _networkACLMgr;
- @Inject
- UsageEventDao _usageEventDao;
- @Inject
- NetworkModel _networkModel;
- @Inject
- NicSecondaryIpDao _nicSecondaryIpDao;
- @Inject
- UserIpv6AddressDao _ipv6Dao;
- @Inject
- Ipv6AddressManager _ipv6Mgr;
- @Inject
- PortableIpDao _portableIpDao;
-
- protected StateMachine2<Network.State, Network.Event, Network> _stateMachine;
- ScheduledExecutorService _executor;
-
- SearchBuilder<IPAddressVO> AssignIpAddressSearch;
- SearchBuilder<IPAddressVO> AssignIpAddressFromPodVlanSearch;
-
- int _networkGcWait;
- int _networkGcInterval;
- int _networkLockTimeout;
-
- private Map<String, String> _configs;
-
- HashMap<Long, Long> _lastNetworkIdsToFree = new HashMap<Long, Long>();
-
-
-
-
- @Override
- @DB
- public boolean configure(final String name, final Map<String, Object> params) throws ConfigurationException {
- _configs = _configDao.getConfiguration("AgentManager", params);
- _networkGcWait = NumbersUtil.parseInt(_configs.get(Config.NetworkGcWait.key()), 600);
- _networkGcInterval = NumbersUtil.parseInt(_configs.get(Config.NetworkGcInterval.key()), 600);
-
- _configs = _configDao.getConfiguration("Network", params);
-
- _networkLockTimeout = NumbersUtil.parseInt(_configs.get(Config.NetworkLockTimeout.key()), 600);
-
- // populate providers
- Map<Network.Service, Set<Network.Provider>> defaultSharedNetworkOfferingProviders = new HashMap<Network.Service, Set<Network.Provider>>();
- Set<Network.Provider> defaultProviders = new HashSet<Network.Provider>();
-
- defaultProviders.add(Network.Provider.VirtualRouter);
- defaultSharedNetworkOfferingProviders.put(Service.Dhcp, defaultProviders);
- defaultSharedNetworkOfferingProviders.put(Service.Dns, defaultProviders);
- defaultSharedNetworkOfferingProviders.put(Service.UserData, defaultProviders);
-
- Map<Network.Service, Set<Network.Provider>> defaultIsolatedNetworkOfferingProviders = defaultSharedNetworkOfferingProviders;
- defaultIsolatedNetworkOfferingProviders.put(Service.Dhcp, defaultProviders);
- defaultIsolatedNetworkOfferingProviders.put(Service.Dns, defaultProviders);
- defaultIsolatedNetworkOfferingProviders.put(Service.UserData, defaultProviders);
- defaultIsolatedNetworkOfferingProviders.put(Service.Firewall, defaultProviders);
- defaultIsolatedNetworkOfferingProviders.put(Service.Gateway, defaultProviders);
- defaultIsolatedNetworkOfferingProviders.put(Service.Lb, defaultProviders);
- defaultIsolatedNetworkOfferingProviders.put(Service.StaticNat, defaultProviders);
- defaultIsolatedNetworkOfferingProviders.put(Service.PortForwarding, defaultProviders);
- defaultIsolatedNetworkOfferingProviders.put(Service.Vpn, defaultProviders);
-
- Map<Network.Service, Set<Network.Provider>> defaultSharedSGEnabledNetworkOfferingProviders = new HashMap<Network.Service, Set<Network.Provider>>();
- defaultSharedSGEnabledNetworkOfferingProviders.put(Service.Dhcp, defaultProviders);
- defaultSharedSGEnabledNetworkOfferingProviders.put(Service.Dns, defaultProviders);
- defaultSharedSGEnabledNetworkOfferingProviders.put(Service.UserData, defaultProviders);
- Set<Provider> sgProviders = new HashSet<Provider>();
- sgProviders.add(Provider.SecurityGroupProvider);
- defaultSharedSGEnabledNetworkOfferingProviders.put(Service.SecurityGroup, sgProviders);
-
- Map<Network.Service, Set<Network.Provider>> defaultIsolatedSourceNatEnabledNetworkOfferingProviders =
- new HashMap<Network.Service, Set<Network.Provider>>();
- defaultProviders.clear();
- defaultProviders.add(Network.Provider.VirtualRouter);
- defaultIsolatedSourceNatEnabledNetworkOfferingProviders.put(Service.Dhcp, defaultProviders);
- defaultIsolatedSourceNatEnabledNetworkOfferingProviders.put(Service.Dns, defaultProviders);
- defaultIsolatedSourceNatEnabledNetworkOfferingProviders.put(Service.UserData, defaultProviders);
- defaultIsolatedSourceNatEnabledNetworkOfferingProviders.put(Service.Firewall, defaultProviders);
- defaultIsolatedSourceNatEnabledNetworkOfferingProviders.put(Service.Gateway, defaultProviders);
- defaultIsolatedSourceNatEnabledNetworkOfferingProviders.put(Service.Lb, defaultProviders);
- defaultIsolatedSourceNatEnabledNetworkOfferingProviders.put(Service.SourceNat, defaultProviders);
- defaultIsolatedSourceNatEnabledNetworkOfferingProviders.put(Service.StaticNat, defaultProviders);
- defaultIsolatedSourceNatEnabledNetworkOfferingProviders.put(Service.PortForwarding, defaultProviders);
- defaultIsolatedSourceNatEnabledNetworkOfferingProviders.put(Service.Vpn, defaultProviders);
-
-
- Map<Network.Service, Set<Network.Provider>> defaultVPCOffProviders =
- new HashMap<Network.Service, Set<Network.Provider>>();
- defaultProviders.clear();
- defaultProviders.add(Network.Provider.VirtualRouter);
- defaultVPCOffProviders.put(Service.Dhcp, defaultProviders);
- defaultVPCOffProviders.put(Service.Dns, defaultProviders);
- defaultVPCOffProviders.put(Service.UserData, defaultProviders);
- defaultVPCOffProviders.put(Service.NetworkACL, defaultProviders);
- defaultVPCOffProviders.put(Service.Gateway, defaultProviders);
- defaultVPCOffProviders.put(Service.Lb, defaultProviders);
- defaultVPCOffProviders.put(Service.SourceNat, defaultProviders);
- defaultVPCOffProviders.put(Service.StaticNat, defaultProviders);
- defaultVPCOffProviders.put(Service.PortForwarding, defaultProviders);
- defaultVPCOffProviders.put(Service.Vpn, defaultProviders);
-
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- NetworkOfferingVO offering = null;
- //#1 - quick cloud network offering
- if (_networkOfferingDao.findByUniqueName(NetworkOffering.QuickCloudNoServices) == null) {
- offering =
- _configMgr.createNetworkOffering(NetworkOffering.QuickCloudNoServices,
- "Offering for QuickCloud with no services", TrafficType.Guest, null, true,
- Availability.Optional, null, new HashMap<Network.Service, Set<Network.Provider>>(), true,
- Network.GuestType.Shared, false, null, true, null, true, false, null, false, null);
- offering.setState(NetworkOffering.State.Enabled);
- _networkOfferingDao.update(offering.getId(), offering);
- }
-
- //#2 - SG enabled network offering
- if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultSharedNetworkOfferingWithSGService) == null) {
- offering =
- _configMgr.createNetworkOffering(NetworkOffering.DefaultSharedNetworkOfferingWithSGService,
- "Offering for Shared Security group enabled networks", TrafficType.Guest, null, true,
- Availability.Optional, null, defaultSharedNetworkOfferingProviders, true,
- Network.GuestType.Shared, false, null, true, null, true, false, null, false, null);
- offering.setState(NetworkOffering.State.Enabled);
- _networkOfferingDao.update(offering.getId(), offering);
- }
-
- //#3 - shared network offering with no SG service
- if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultSharedNetworkOffering) == null) {
- offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultSharedNetworkOffering, "Offering for Shared networks", TrafficType.Guest, null, true, Availability.Optional, null,
- defaultSharedNetworkOfferingProviders, true, Network.GuestType.Shared, false, null, true, null, true, false, null, false, null);
- offering.setState(NetworkOffering.State.Enabled);
- _networkOfferingDao.update(offering.getId(), offering);
- }
-
-
- //#4 - default isolated offering with Source nat service
- if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultIsolatedNetworkOfferingWithSourceNatService) == null) {
- offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOfferingWithSourceNatService,
- "Offering for Isolated networks with Source Nat service enabled", TrafficType.Guest,
- null, false, Availability.Required, null, defaultIsolatedSourceNatEnabledNetworkOfferingProviders,
- true, Network.GuestType.Isolated, false, null, true, null, false, false, null, false, null);
-
- offering.setState(NetworkOffering.State.Enabled);
- _networkOfferingDao.update(offering.getId(), offering);
- }
-
- //#5 - default vpc offering with LB service
- if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworks) == null) {
- offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworks,
- "Offering for Isolated VPC networks with Source Nat service enabled", TrafficType.Guest,
- null, false, Availability.Optional, null, defaultVPCOffProviders,
- true, Network.GuestType.Isolated, false, null, false, null, false, false, null,false, null);
- offering.setState(NetworkOffering.State.Enabled);
- _networkOfferingDao.update(offering.getId(), offering);
- }
-
- //#6 - default vpc offering with no LB service
- if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksNoLB) == null) {
- //remove LB service
- defaultVPCOffProviders.remove(Service.Lb);
- offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksNoLB,
- "Offering for Isolated VPC networks with Source Nat service enabled and LB service disabled", TrafficType.Guest,
- null, false, Availability.Optional, null, defaultVPCOffProviders,
- true, Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null);
- offering.setState(NetworkOffering.State.Enabled);
- _networkOfferingDao.update(offering.getId(), offering);
- }
-
- //#7 - isolated offering with source nat disabled
- if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultIsolatedNetworkOffering) == null) {
- offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOffering,
- "Offering for Isolated networks with no Source Nat service", TrafficType.Guest, null, true,
- Availability.Optional, null, defaultIsolatedNetworkOfferingProviders, true, Network.GuestType.Isolated,
- false, null, true, null, true, false, null, false, null);
- offering.setState(NetworkOffering.State.Enabled);
- _networkOfferingDao.update(offering.getId(), offering);
- }
-
- //#8 - network offering with internal lb service
- Map<Network.Service, Set<Network.Provider>> internalLbOffProviders =
- new HashMap<Network.Service, Set<Network.Provider>>();
- Set<Network.Provider> defaultVpcProvider = new HashSet<Network.Provider>();
- defaultVpcProvider.add(Network.Provider.VPCVirtualRouter);
-
- Set<Network.Provider> defaultInternalLbProvider = new HashSet<Network.Provider>();
- defaultInternalLbProvider.add(Network.Provider.InternalLbVm);
-
- internalLbOffProviders.put(Service.Dhcp, defaultVpcProvider);
- internalLbOffProviders.put(Service.Dns, defaultVpcProvider);
- internalLbOffProviders.put(Service.UserData, defaultVpcProvider);
- internalLbOffProviders.put(Service.NetworkACL, defaultVpcProvider);
- internalLbOffProviders.put(Service.Gateway, defaultVpcProvider);
- internalLbOffProviders.put(Service.Lb, defaultInternalLbProvider);
- internalLbOffProviders.put(Service.SourceNat, defaultVpcProvider);
-
- if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksWithInternalLB) == null) {
- offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksWithInternalLB,
- "Offering for Isolated VPC networks with Internal Lb support", TrafficType.Guest,
- null, false, Availability.Optional, null, internalLbOffProviders,
- true, Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null);
- offering.setState(NetworkOffering.State.Enabled);
- offering.setInternalLb(true);
- offering.setPublicLb(false);
- _networkOfferingDao.update(offering.getId(), offering);
- }
-
- Map<Network.Service, Set<Network.Provider>> netscalerServiceProviders = new HashMap<Network.Service, Set<Network.Provider>>();
- Set<Network.Provider> vrProvider = new HashSet<Network.Provider>();
- vrProvider.add(Provider.VirtualRouter);
- Set<Network.Provider> sgProvider = new HashSet<Network.Provider>();
- sgProvider.add(Provider.SecurityGroupProvider);
- Set<Network.Provider> nsProvider = new HashSet<Network.Provider>();
- nsProvider.add(Provider.Netscaler);
- netscalerServiceProviders.put(Service.Dhcp, vrProvider);
- netscalerServiceProviders.put(Service.Dns, vrProvider);
- netscalerServiceProviders.put(Service.UserData, vrProvider);
- netscalerServiceProviders.put(Service.SecurityGroup, sgProvider);
- netscalerServiceProviders.put(Service.StaticNat, nsProvider);
- netscalerServiceProviders.put(Service.Lb, nsProvider);
-
- Map<Service, Map<Capability, String>> serviceCapabilityMap = new HashMap<Service, Map<Capability, String>>();
- Map<Capability, String> elb = new HashMap<Capability, String>();
- elb.put(Capability.ElasticLb, "true");
- Map<Capability, String> eip = new HashMap<Capability, String>();
- eip.put(Capability.ElasticIp, "true");
- serviceCapabilityMap.put(Service.Lb, elb);
- serviceCapabilityMap.put(Service.StaticNat, eip);
-
- if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultSharedEIPandELBNetworkOffering) == null) {
- offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultSharedEIPandELBNetworkOffering, "Offering for Shared networks with Elastic IP and Elastic LB capabilities", TrafficType.Guest, null, true,
- Availability.Optional, null, netscalerServiceProviders, true, Network.GuestType.Shared, false, null, true, serviceCapabilityMap, true, false, null, false, null);
- offering.setState(NetworkOffering.State.Enabled);
- offering.setDedicatedLB(false);
- _networkOfferingDao.update(offering.getId(), offering);
- }
-
- txn.commit();
-
-
- AssignIpAddressSearch = _ipAddressDao.createSearchBuilder();
- AssignIpAddressSearch.and("dc", AssignIpAddressSearch.entity().getDataCenterId(), Op.EQ);
- AssignIpAddressSearch.and("allocated", AssignIpAddressSearch.entity().getAllocatedTime(), Op.NULL);
- AssignIpAddressSearch.and("vlanId", AssignIpAddressSearch.entity().getVlanId(), Op.IN);
- SearchBuilder<VlanVO> vlanSearch = _vlanDao.createSearchBuilder();
- vlanSearch.and("type", vlanSearch.entity().getVlanType(), Op.EQ);
- vlanSearch.and("networkId", vlanSearch.entity().getNetworkId(), Op.EQ);
- AssignIpAddressSearch.join("vlan", vlanSearch, vlanSearch.entity().getId(), AssignIpAddressSearch.entity().getVlanId(), JoinType.INNER);
- AssignIpAddressSearch.done();
-
- AssignIpAddressFromPodVlanSearch = _ipAddressDao.createSearchBuilder();
- AssignIpAddressFromPodVlanSearch.and("dc", AssignIpAddressFromPodVlanSearch.entity().getDataCenterId(), Op.EQ);
- AssignIpAddressFromPodVlanSearch.and("allocated", AssignIpAddressFromPodVlanSearch.entity().getAllocatedTime(), Op.NULL);
- AssignIpAddressFromPodVlanSearch.and("vlanId", AssignIpAddressFromPodVlanSearch.entity().getVlanId(), Op.IN);
-
- SearchBuilder<VlanVO> podVlanSearch = _vlanDao.createSearchBuilder();
- podVlanSearch.and("type", podVlanSearch.entity().getVlanType(), Op.EQ);
- podVlanSearch.and("networkId", podVlanSearch.entity().getNetworkId(), Op.EQ);
- SearchBuilder<PodVlanMapVO> podVlanMapSB = _podVlanMapDao.createSearchBuilder();
- podVlanMapSB.and("podId", podVlanMapSB.entity().getPodId(), Op.EQ);
- AssignIpAddressFromPodVlanSearch.join("podVlanMapSB", podVlanMapSB, podVlanMapSB.entity().getVlanDbId(), AssignIpAddressFromPodVlanSearch.entity().getVlanId(), JoinType.INNER);
- AssignIpAddressFromPodVlanSearch.join("vlan", podVlanSearch, podVlanSearch.entity().getId(), AssignIpAddressFromPodVlanSearch.entity().getVlanId(), JoinType.INNER);
-
-
- AssignIpAddressFromPodVlanSearch.done();
-
- _executor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("Network-Scavenger"));
-
- _agentMgr.registerForHostEvents(this, true, false, true);
-
- Network.State.getStateMachine().registerListener(new NetworkStateListener(_usageEventDao, _networksDao));
-
- s_logger.info("Network Manager is configured.");
-
- return true;
- }
-
- @Override
- public boolean start() {
- _executor.scheduleWithFixedDelay(new NetworkGarbageCollector(), _networkGcInterval, _networkGcInterval, TimeUnit.SECONDS);
- return true;
- }
-
- @Override
- public boolean stop() {
- return true;
- }
-
- protected NetworkManagerImpl() {
- setStateMachine();
- }
-
- @Override
- public List<? extends Network> setupNetwork(Account owner, NetworkOffering offering, DeploymentPlan plan, String name,
- String displayText, boolean isDefault)
- throws ConcurrentOperationException {
- return setupNetwork(owner, offering, null, plan, name, displayText, false, null, null, null, null, true);
- }
-
- @Override
- @DB
- public List<? extends Network> setupNetwork(Account owner, NetworkOffering offering, Network predefined, DeploymentPlan
- plan, String name, String displayText, boolean errorIfAlreadySetup, Long domainId,
- ACLType aclType, Boolean subdomainAccess, Long vpcId, Boolean isDisplayNetworkEnabled) throws ConcurrentOperationException {
-
- Account locked = _accountDao.acquireInLockTable(owner.getId());
- if (locked == null) {
- throw new ConcurrentOperationException("Unable to acquire lock on " + owner);
- }
-
- try {
- if (predefined == null
- || (offering.getTrafficType() != TrafficType.Guest && predefined.getCidr() == null && predefined.getBroadcastUri() == null &&
- !(predefined.getBroadcastDomainType() == BroadcastDomainType.Vlan || predefined.getBroadcastDomainType() == BroadcastDomainType.Lswitch))) {
- List<NetworkVO> configs = _networksDao.listBy(owner.getId(), offering.getId(), plan.getDataCenterId());
- if (configs.size() > 0) {
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Found existing network configuration for offering " + offering + ": " + configs.get(0));
- }
-
- if (errorIfAlreadySetup) {
- InvalidParameterValueException ex = new InvalidParameterValueException("Found existing network configuration (with specified id) for offering (with specified id)");
- ex.addProxyObject(offering.getUuid(), "offeringId");
- ex.addProxyObject(configs.get(0).getUuid(), "networkConfigId");
- throw ex;
- } else {
- return configs;
- }
- }
- }
-
- List<NetworkVO> networks = new ArrayList<NetworkVO>();
-
- long related = -1;
-
- for (NetworkGuru guru : _networkGurus) {
- Network network = guru.design(offering, plan, predefined, owner);
- if (network == null) {
- continue;
- }
-
- if (network.getId() != -1) {
- if (network instanceof NetworkVO) {
- networks.add((NetworkVO) network);
- } else {
- networks.add(_networksDao.findById(network.getId()));
- }
- continue;
- }
-
- long id = _networksDao.getNextInSequence(Long.class, "id");
- if (related == -1) {
- related = id;
- }
-
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- NetworkVO vo = new NetworkVO(id, network, offering.getId(), guru.getName(), owner.getDomainId(), owner.getId(),
- related, name, displayText, predefined.getNetworkDomain(), offering.getGuestType(),
- plan.getDataCenterId(), plan.getPhysicalNetworkId(), aclType, offering.getSpecifyIpRanges(), vpcId);
- vo.setDisplayNetwork(isDisplayNetworkEnabled == null ? true : isDisplayNetworkEnabled);
- networks.add(_networksDao.persist(vo, vo.getGuestType() == Network.GuestType.Isolated,
- finalizeServicesAndProvidersForNetwork(offering, plan.getPhysicalNetworkId())));
-
- if (domainId != null && aclType == ACLType.Domain) {
- if (subdomainAccess == null ) {
- subdomainAccess = true;
- }
- _networksDao.addDomainToNetwork(id, domainId, subdomainAccess);
- }
-
- txn.commit();
- }
-
- if (networks.size() < 1) {
- // see networkOfferingVO.java
- CloudRuntimeException ex = new CloudRuntimeException("Unable to convert network offering with specified id to network profile");
- ex.addProxyObject(offering.getUuid(), "offeringId");
- throw ex;
- }
-
- return networks;
- } finally {
- s_logger.debug("Releasing lock for " + locked);
- _accountDao.releaseFromLockTable(locked.getId());
- }
- }
-
-
-
- @Override
- @DB
- public void allocate(VirtualMachineProfile vm, LinkedHashMap<? extends Network, ? extends NicProfile> networks)
- throws InsufficientCapacityException, ConcurrentOperationException {
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- int deviceId = 0;
-
- boolean[] deviceIds = new boolean[networks.size()];
- Arrays.fill(deviceIds, false);
-
- List<NicProfile> nics = new ArrayList<NicProfile>(networks.size());
- NicProfile defaultNic = null;
-
- for (Map.Entry<? extends Network, ? extends NicProfile> network : networks.entrySet()) {
- Network config = network.getKey();
- NicProfile requested = network.getValue();
-
- Boolean isDefaultNic = false;
- if (vm != null && (requested != null && requested.isDefaultNic())) {
- isDefaultNic = true;
- }
-
- while (deviceIds[deviceId] && deviceId < deviceIds.length) {
- deviceId++;
- }
-
- Pair<NicProfile,Integer> vmNicPair = allocateNic(requested, config, isDefaultNic,
- deviceId, vm);
-
- NicProfile vmNic = vmNicPair.first();
- if (vmNic == null) {
- continue;
- }
-
- deviceId = vmNicPair.second();
-
- int devId = vmNic.getDeviceId();
- if (devId > deviceIds.length) {
- throw new IllegalArgumentException("Device id for nic is too large: " + vmNic);
- }
- if (deviceIds[devId]) {
- throw new IllegalArgumentException("Conflicting device id for two different nics: " + vmNic);
- }
-
- deviceIds[devId] = true;
-
- if (vmNic.isDefaultNic()) {
- if (defaultNic != null) {
- throw new IllegalArgumentException("You cannot specify two nics as default nics: nic 1 = " +
- defaultNic + "; nic 2 = " + vmNic);
- }
- defaultNic = vmNic;
- }
-
- nics.add(vmNic);
- vm.addNic(vmNic);
-
- }
-
- if (nics.size() != networks.size()) {
- s_logger.warn("Number of nics " + nics.size() + " doesn't match number of requested networks " + networks.size());
- throw new CloudRuntimeException("Number of nics " + nics.size() + " doesn't match number of requested networks " + networks.size());
- }
-
- if (nics.size() == 1) {
- nics.get(0).setDefaultNic(true);
- }
-
- txn.commit();
- }
-
-
- @DB
- @Override
- public Pair<NicProfile,Integer> allocateNic(NicProfile requested, Network network, Boolean isDefaultNic,
- int deviceId, VirtualMachineProfile vm) throws InsufficientVirtualNetworkCapcityException,
- InsufficientAddressCapacityException, ConcurrentOperationException{
-
- NetworkVO ntwkVO = _networksDao.findById(network.getId());
- s_logger.debug("Allocating nic for vm " + vm.getVirtualMachine() + " in network " + network + " with requested profile " + requested);
- NetworkGuru guru = AdapterBase.getAdapterByName(_networkGurus, ntwkVO.getGuruName());
-
- if (requested != null && requested.getMode() == null) {
- requested.setMode(network.getMode());
- }
- NicProfile profile = guru.allocate(network, requested, vm);
- if (isDefaultNic != null) {
- profile.setDefaultNic(isDefaultNic);
- }
-
- if (profile == null) {
- return null;
- }
-
- if (requested != null && requested.getMode() == null) {
- profile.setMode(requested.getMode());
- } else {
- profile.setMode(network.getMode());
- }
-
- NicVO vo = new NicVO(guru.getName(), vm.getId(), network.getId(), vm.getType());
-
- deviceId = applyProfileToNic(vo, profile, deviceId);
-
- vo = _nicDao.persist(vo);
-
- Integer networkRate = _networkModel.getNetworkRate(network.getId(), vm.getId());
- NicProfile vmNic = new NicProfile(vo, network, vo.getBroadcastUri(), vo.getIsolationUri(), networkRate,
- _networkModel.isSecurityGroupSupportedInNetwork(network), _networkModel.getNetworkTag(vm.getHypervisorType(),
- network));
-
- return new Pair<NicProfile,Integer>(vmNic, Integer.valueOf(deviceId));
- }
-
- protected Integer applyProfileToNic(NicVO vo, NicProfile profile, Integer deviceId) {
- if (profile.getDeviceId() != null) {
- vo.setDeviceId(profile.getDeviceId());
- } else if (deviceId != null) {
- vo.setDeviceId(deviceId++);
- }
-
- if (profile.getReservationStrategy() != null) {
- vo.setReservationStrategy(profile.getReservationStrategy());
- }
-
- vo.setDefaultNic(profile.isDefaultNic());
-
- vo.setIp4Address(profile.getIp4Address());
- vo.setAddressFormat(profile.getFormat());
-
- if (profile.getMacAddress() != null) {
- vo.setMacAddress(profile.getMacAddress());
- }
-
- vo.setMode(profile.getMode());
- vo.setNetmask(profile.getNetmask());
- vo.setGateway(profile.getGateway());
-
- if (profile.getBroadCastUri() != null) {
- vo.setBroadcastUri(profile.getBroadCastUri());
- }
-
- if (profile.getIsolationUri() != null) {
- vo.setIsolationUri(profile.getIsolationUri());
- }
-
- vo.setState(Nic.State.Allocated);
-
- vo.setIp6Address(profile.getIp6Address());
- vo.setIp6Gateway(profile.getIp6Gateway());
- vo.setIp6Cidr(profile.getIp6Cidr());
-
- return deviceId;
- }
-
- protected void applyProfileToNicForRelease(NicVO vo, NicProfile profile) {
- vo.setGateway(profile.getGateway());
- vo.setAddressFormat(profile.getFormat());
- vo.setIp4Address(profile.getIp4Address());
- vo.setIp6Address(profile.getIp6Address());
- vo.setMacAddress(profile.getMacAddress());
- if (profile.getReservationStrategy() != null) {
- vo.setReservationStrategy(profile.getReservationStrategy());
- }
- vo.setBroadcastUri(profile.getBroadCastUri());
- vo.setIsolationUri(profile.getIsolationUri());
- vo.setNetmask(profile.getNetmask());
- }
-
- protected void applyProfileToNetwork(NetworkVO network, NetworkProfile profile) {
- network.setBroadcastUri(profile.getBroadcastUri());
- network.setDns1(profile.getDns1());
- network.setDns2(profile.getDns2());
- network.setPhysicalNetworkId(profile.getPhysicalNetworkId());
- }
-
- protected NicTO toNicTO(NicVO nic, NicProfile profile, NetworkVO config) {
- NicTO to = new NicTO();
- to.setDeviceId(nic.getDeviceId());
- to.setBroadcastType(config.getBroadcastDomainType());
- to.setType(config.getTrafficType());
- to.setIp(nic.getIp4Address());
- to.setNetmask(nic.getNetmask());
- to.setMac(nic.getMacAddress());
- to.setDns1(profile.getDns1());
- to.setDns2(profile.getDns2());
- if (nic.getGateway() != null) {
- to.setGateway(nic.getGateway());
- } else {
- to.setGateway(config.getGateway());
- }
- to.setDefaultNic(nic.isDefaultNic());
- to.setBroadcastUri(nic.getBroadcastUri());
- to.setIsolationuri(nic.getIsolationUri());
- if (profile != null) {
- to.setDns1(profile.getDns1());
- to.setDns2(profile.getDns2());
- }
-
- Integer networkRate = _networkModel.getNetworkRate(config.getId(), null);
- to.setNetworkRateMbps(networkRate);
-
- to.setUuid(config.getUuid());
-
- return to;
- }
-
- boolean isNetworkImplemented(NetworkVO network) {
- Network.State state = network.getState();
- if (state == Network.State.Implemented || state == Network.State.Implementing) {
- return true;
- } else if (state == Network.State.Setup) {
- DataCenterVO zone = _dcDao.findById(network.getDataCenterId());
- if (!isSharedNetworkOfferingWithServices(network.getNetworkOfferingId()) || (zone.getNetworkType() == NetworkType.Basic)) {
- return true;
- }
- }
- return false;
- }
-
- @Override
- @DB
- public Pair<NetworkGuru, NetworkVO> implementNetwork(long networkId, DeployDestination dest, ReservationContext context)
- throws ConcurrentOperationException, ResourceUnavailableException,
- InsufficientCapacityException {
- Transaction.currentTxn();
- Pair<NetworkGuru, NetworkVO> implemented = new Pair<NetworkGuru, NetworkVO>(null, null);
-
- NetworkVO network = _networksDao.findById(networkId);
- NetworkGuru guru = AdapterBase.getAdapterByName(_networkGurus, network.getGuruName());
- if (isNetworkImplemented(network)) {
- s_logger.debug("Network id=" + networkId + " is already implemented");
- implemented.set(guru, network);
- return implemented;
- }
-
- // Acquire lock only when network needs to be implemented
- network = _networksDao.acquireInLockTable(networkId, _networkLockTimeout);
- if (network == null) {
- // see NetworkVO.java
- ConcurrentOperationException ex = new ConcurrentOperationException("Unable to acquire network configuration");
- ex.addProxyObject(ApiDBUtils.findNetworkById(networkId).getUuid());
- throw ex;
- }
-
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Lock is acquired for network id " + networkId + " as a part of network implement");
- }
-
- try {
- if (isNetworkImplemented(network)) {
- s_logger.debug("Network id=" + networkId + " is already implemented");
- implemented.set(guru, network);
- return implemented;
- }
-
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Asking " + guru.getName() + " to implement " + network);
- }
-
- NetworkOfferingVO offering = _networkOfferingDao.findById(network.getNetworkOfferingId());
-
- network.setReservationId(context.getReservationId());
- if (isSharedNetworkWithServices(network)) {
- network.setState(Network.State.Implementing);
- } else {
- stateTransitTo(network, Event.ImplementNetwork);
- }
-
- Network result = guru.implement(network, offering, dest, context);
- network.setCidr(result.getCidr());
- network.setBroadcastUri(result.getBroadcastUri());
- network.setGateway(result.getGateway());
- network.setMode(result.getMode());
- network.setPhysicalNetworkId(result.getPhysicalNetworkId());
- _networksDao.update(networkId, network);
-
- // implement network elements and re-apply all the network rules
- implementNetworkElementsAndResources(dest, context, network, offering);
-
- if (isSharedNetworkWithServices(network)) {
- network.setState(Network.State.Implemented);
- } else {
- stateTransitTo(network,Event.OperationSucceeded);
- }
-
- network.setRestartRequired(false);
- _networksDao.update(network.getId(), network);
- implemented.set(guru, network);
- return implemented;
- } catch (NoTransitionException e) {
- s_logger.error(e.getMessage());
- return null;
- } finally {
- if (implemented.first() == null) {
- s_logger.debug("Cleaning up because we're unable to implement the network " + network);
- try {
- if (isSharedNetworkWithServices(network)) {
- network.setState(Network.State.Shutdown);
- _networksDao.update(networkId, network);
- } else {
- stateTransitTo(network,Event.OperationFailed);
- }
- } catch (NoTransitionException e) {
- s_logger.error(e.getMessage());
- }
-
- shutdownNetwork(networkId, context, false);
- }
-
- _networksDao.releaseFromLockTable(networkId);
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Lock is released for network id " + networkId + " as a part of network implement");
- }
- }
- }
-
- @Override
- public boolean equals(Object o) {
- return super.equals(o); //To change body of overridden methods use File | Settings | File Templates.
- }
-
- @Override
- public void implementNetworkElementsAndResources(DeployDestination dest, ReservationContext context,
- Network network, NetworkOffering offering)
- throws ConcurrentOperationException, InsufficientAddressCapacityException, ResourceUnavailableException, InsufficientCapacityException {
-
- // Associate a source NAT IP (if one isn't already associated with the network) if this is a
- // 1) 'Isolated' or 'Shared' guest virtual network in the advance zone
- // 2) network has sourceNat service
- // 3) network offering does not support a shared source NAT rule
-
- boolean sharedSourceNat = offering.getSharedSourceNat();
- DataCenter zone = _dcDao.findById(network.getDataCenterId());
-
- if (!sharedSourceNat && _networkModel.areServicesSupportedInNetwork(network.getId(), Service.SourceNat)
- && (network.getGuestType() == Network.GuestType.Isolated ||
- (network.getGuestType() == Network.GuestType.Shared && zone.getNetworkType() == NetworkType.Advanced))) {
-
- List<IPAddressVO> ips = null;
- if (network.getVpcId() != null) {
- 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()) {
- s_logger.debug("Creating a source nat ip for network " + network);
- Account owner = _accountMgr.getAccount(network.getAccountId());
- _ipAddrMgr.assignSourceNatIpAddressToGuestNetwork(owner, network);
- }
- }
-
- // get providers to implement
- List<Provider> providersToImplement = getNetworkProviders(network.getId());
- for (NetworkElement element : _networkElements) {
- if (providersToImplement.contains(element.getProvider())) {
- if (!_networkModel.isProviderEnabledInPhysicalNetwork(_networkModel.getPhysicalNetworkId(network), element.getProvider().getName())) {
- // The physicalNetworkId will not get translated into a uuid by the reponse serializer,
- // because the serializer would look up the NetworkVO class's table and retrieve the
- // network id instead of the physical network id.
- // So just throw this exception as is. We may need to TBD by changing the serializer.
- throw new CloudRuntimeException("Service provider " + element.getProvider().getName() +
- " either doesn't exist or is not enabled in physical network id: " + network.getPhysicalNetworkId());
- }
-
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Asking " + element.getName() + " to implemenet " + network);
- }
-
- if (!element.implement(network, offering, dest, context)) {
- CloudRuntimeException ex = new CloudRuntimeException("Failed to implement provider " + element.getProvider().getName() + " for network with specified id");
- ex.addProxyObject(network.getUuid(), "networkId");
- throw ex;
- }
- }
- }
-
- // reapply all the firewall/staticNat/lb rules
- s_logger.debug("Reprogramming network " + network + " as a part of network implement");
- if (!reprogramNetworkRules(network.getId(), CallContext.current().getCallingAccount(), network)) {
- s_logger.warn("Failed to re-program the network as a part of network " + network + " implement");
- // see DataCenterVO.java
- ResourceUnavailableException ex = new ResourceUnavailableException("Unable to apply network rules as a part of network " + network + " implement", DataCenter.class, network.getDataCenterId());
- ex.addProxyObject(ApiDBUtils.findZoneById(network.getDataCenterId()).getUuid());
- throw ex;
- }
- }
-
- // This method re-programs the rules/ips for existing network
- protected boolean reprogramNetworkRules(long networkId, Account caller, Network network) throws ResourceUnavailableException {
- boolean success = true;
- // associate all ip addresses
- if (!_ipAddrMgr.applyIpAssociations(network, false)) {
- s_logger.warn("Failed to apply ip addresses as a part of network id" + networkId + " restart");
- success = false;
- }
-
- // apply static nat
- if (!_rulesMgr.applyStaticNatsForNetwork(networkId, false, caller)) {
- s_logger.warn("Failed to apply static nats a part of network id" + networkId + " restart");
- success = false;
- }
-
- // apply firewall rules
- List<FirewallRuleVO> firewallIngressRulesToApply = _firewallDao.listByNetworkPurposeTrafficType(networkId, Purpose.Firewall, FirewallRule.TrafficType.Ingress);
- if (!_firewallMgr.applyFirewallRules(firewallIngressRulesToApply, false, caller)) {
- s_logger.warn("Failed to reapply Ingress firewall rule(s) as a part of network id=" + networkId + " restart");
- success = false;
- }
-
- List<FirewallRuleVO> firewallEgressRulesToApply = _firewallDao.listByNetworkPurposeTrafficType(networkId, Purpose.Firewall, FirewallRule.TrafficType.Egress);
- if (firewallEgressRulesToApply.size() == 0) {
- NetworkOfferingVO offering = _networkOfferingDao.findById(network.getNetworkOfferingId());
- //there are no egress rules then apply the default egress rule
- DataCenter zone = _dcDao.findById(network.getDataCenterId());
- if (offering.getEgressDefaultPolicy() && _networkModel.areServicesSupportedInNetwork(network.getId(), Service.Firewall) &&
- (network.getGuestType() == Network.GuestType.Isolated || (network.getGuestType() == Network.GuestType.Shared && zone.getNetworkType() == NetworkType.Advanced))) {
- // add default egress rule to accept the traffic
- _firewallMgr.applyDefaultEgressFirewallRule(network.getId(), true);
- }
- } else {
- if (!_firewallMgr.applyFirewallRules(firewallEgressRulesToApply, false, caller)) {
- s_logger.warn("Failed to reapply firewall Egress rule(s) as a part of network id=" + networkId + " restart");
- success = false;
- }
- }
-
- // apply port forwarding rules
- if (!_rulesMgr.applyPortForwardingRulesForNetwork(networkId, false, caller)) {
- s_logger.warn("Failed to reapply port forwarding rule(s) as a part of network id=" + networkId + " restart");
- success = false;
- }
-
- // apply static nat rules
- if (!_rulesMgr.applyStaticNatRulesForNetwork(networkId, false, caller)) {
- s_logger.warn("Failed to reapply static nat rule(s) as a part of network id=" + networkId + " restart");
- success = false;
- }
-
- // apply public load balancer rules
- if (!_lbMgr.applyLoadBalancersForNetwork(networkId, Scheme.Public)) {
- s_logger.warn("Failed to reapply Public load balancer rules as a part of network id=" + networkId + " restart");
- success = false;
- }
-
- // apply internal load balancer rules
- if (!_lbMgr.applyLoadBalancersForNetwork(networkId, Scheme.Internal)) {
- s_logger.warn("Failed to reapply internal load balancer rules as a part of network id=" + networkId + " restart");
- success = false;
- }
-
- // apply vpn rules
- List<? extends RemoteAccessVpn> vpnsToReapply = _vpnMgr.listRemoteAccessVpns(networkId);
- if (vpnsToReapply != null) {
- for (RemoteAccessVpn vpn : vpnsToReapply) {
- // Start remote access vpn per ip
- if (_vpnMgr.startRemoteAccessVpn(vpn.getServerAddressId(), false) == null) {
- s_logger.warn("Failed to reapply vpn rules as a part of network id=" + networkId + " restart");
- success = false;
- }
- }
- }
-
- //apply network ACLs
- if (!_networkACLMgr.applyACLToNetwork(networkId)) {
- s_logger.warn("Failed to reapply network ACLs as a part of of network id=" + networkId + " restart");
- success = false;
- }
-
- return success;
- }
-
- protected boolean prepareElement(NetworkElement element, Network network,
- NicProfile profile, VirtualMachineProfile vmProfile,
- DeployDestination dest, ReservationContext context) throws InsufficientCapacityException,
- ConcurrentOperationException, ResourceUnavailableException {
- element.prepare(network, profile, vmProfile, dest, context);
- if (vmProfile.getType() == Type.User && element.getProvider() != null) {
- if (_networkModel.areServicesSupportedInNetwork(network.getId(), Service.Dhcp) &&
- _networkModel.isProviderSupportServiceInNetwork(network.getId(), Service.Dhcp, element.getProvider()) &&
- element instanceof DhcpServiceProvider ) {
- DhcpServiceProvider sp = (DhcpServiceProvider) element;
- Map <Capability, String> dhcpCapabilities = element.getCapabilities().get(Service.Dhcp);
- String supportsMultipleSubnets = dhcpCapabilities.get(Capability.DhcpAccrossMultipleSubnets);
- if ((supportsMultipleSubnets != null && Boolean.valueOf(supportsMultipleSubnets)) && profile.getIp6Address() == null) {
- if (!sp.configDhcpSupportForSubnet(network, profile, vmProfile, dest, context)) {
- return false;
- }
- }
- sp.addDhcpEntry(network, profile, vmProfile, dest, context);
- }
- if (_networkModel.areServicesSupportedInNetwork(network.getId(), Service.UserData) &&
- _networkModel.isProviderSupportServiceInNetwork(network.getId(), Service.UserData, element.getProvider()) &&
- element instanceof UserDataServiceProvider) {
- UserDataServiceProvider sp = (UserDataServiceProvider) element;
- sp.addPasswordAndUserdata(network, profile, vmProfile, dest, context);
- }
- }
- return true;
- }
-
- @DB
- protected void updateNic(NicVO nic, long networkId, int count) {
- Transaction txn = Transaction.currentTxn();
- txn.start();
- _nicDao.update(nic.getId(), nic);
-
- if (nic.getVmType() == VirtualMachine.Type.User) {
- s_logger.debug("Changing active number of nics for network id=" + networkId + " on " + count);
- _networksDao.changeActiveNicsBy(networkId, count);
- }
-
- if (nic.getVmType() == VirtualMachine.Type.User || (nic.getVmType() == VirtualMachine.Type.DomainRouter && _networksDao.findById(networkId).getTrafficType() == TrafficType.Guest)) {
- _networksDao.setCheckForGc(networkId);
- }
-
- txn.commit();
- }
-
- @Override
- public void prepare(VirtualMachineProfile vmProfile, DeployDestination dest, ReservationContext context) throws InsufficientCapacityException,
- ConcurrentOperationException, ResourceUnavailableException {
- List<NicVO> nics = _nicDao.listByVmId(vmProfile.getId());
-
- // we have to implement default nics first - to ensure that default network elements start up first in multiple
- //nics case
- // (need for setting DNS on Dhcp to domR's Ip4 address)
- Collections.sort(nics, new Comparator<NicVO>() {
-
- @Override
- public int compare(NicVO nic1, NicVO nic2) {
- boolean isDefault1 = nic1.isDefaultNic();
- boolean isDefault2 = nic2.isDefaultNic();
-
- return (isDefault1 ^ isDefault2) ? ((isDefault1 ^ true) ? 1 : -1) : 0;
- }
- });
-
- for (NicVO nic : nics) {
- Pair<NetworkGuru, NetworkVO> implemented = implementNetwork(nic.getNetworkId(), dest, context);
- if (implemented.first() == null) {
- s_logger.warn("Failed to implement network id=" + nic.getNetworkId() + " as a part of preparing nic id=" + nic.getId());
- throw new CloudRuntimeException("Failed to implement network id=" + nic.getNetworkId() + " as a part preparing nic id=" +nic.getId());
- }
-
- NetworkVO network = implemented.second();
- NicProfile profile = prepareNic(vmProfile, dest, context, nic.getId(), network);
- vmProfile.addNic(profile);
- }
- }
-
- @Override
- public NicProfile prepareNic(VirtualMachineProfile vmProfile, DeployDestination
- dest, ReservationContext context, long nicId, Network network)
- throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException,
- ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException {
-
- Integer networkRate = _networkModel.getNetworkRate(network.getId(), vmProfile.getId());
- NetworkGuru guru = AdapterBase.getAdapterByName(_networkGurus, network.getGuruName());
- NicVO nic = _nicDao.findById(nicId);
-
- NicProfile profile = null;
- if (nic.getReservationStrategy() == Nic.ReservationStrategy.Start) {
- nic.setState(Nic.State.Reserving);
- nic.setReservationId(context.getReservationId());
- _nicDao.update(nic.getId(), nic);
- URI broadcastUri = nic.getBroadcastUri();
- if (broadcastUri == null) {
- broadcastUri = network.getBroadcastUri();
- }
-
- URI isolationUri = nic.getIsolationUri();
-
- profile = new NicProfile(nic, network, broadcastUri, isolationUri,
-
- networkRate, _networkModel.isSecurityGroupSupportedInNetwork(network), _networkModel.getNetworkTag(vmProfile.getHypervisorType(), network));
- guru.reserve(profile, network, vmProfile, dest, context);
- nic.setIp4Address(profile.getIp4Address());
- nic.setAddressFormat(profile.getFormat());
- nic.setIp6Address(profile.getIp6Address());
- nic.setMacAddress(profile.getMacAddress());
- nic.setIsolationUri(profile.getIsolationUri());
- nic.setBroadcastUri(profile.getBroadCastUri());
- nic.setReserver(guru.getName());
- nic.setState(Nic.State.Reserved);
- nic.setNetmask(profile.getNetmask());
- nic.setGateway(profile.getGateway());
-
- if (profile.getStrategy() != null) {
- nic.setReservationStrategy(profile.getStrategy());
- }
-
- updateNic(nic, network.getId(), 1);
- } else {
- profile = new NicProfile(nic, network, nic.getBroadcastUri(), nic.getIsolationUri(),
- networkRate, _networkModel.isSecurityGroupSupportedInNetwork(network), _networkModel.getNetworkTag(vmProfile.getHypervisorType(), network));
- guru.updateNicProfile(profile, network);
- nic.setState(Nic.State.Reserved);
- updateNic(nic, network.getId(), 1);
- }
-
- List<Provider> providersToImplement = getNetworkProviders(network.getId());
- for (NetworkElement element : _networkElements) {
- if (providersToImplement.contains(element.getProvider())) {
- if (!_networkModel.isProviderEnabledInPhysicalNetwork(_networkModel.getPhysicalNetworkId(network), element.getProvider().getName())) {
- throw new CloudRuntimeException("Service provider " + element.getProvider().getName() + " either doesn't exist or is not enabled in physical network id: " + network.getPhysicalNetworkId());
- }
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Asking " + element.getName() + " to prepare for " + nic);
- }
- if(!prepareElement(element, network, profile, vmProfile, dest, context)) {
- throw new InsufficientAddressCapacityException("unable to configure the dhcp service, due to insufficiant address capacity",Network.class, network.getId());
- }
- }
- }
-
- profile.setSecurityGroupEnabled(_networkModel.isSecurityGroupSupportedInNetwork(network));
- guru.updateNicProfile(profile, network);
- return profile;
- }
-
- @Override
- public void prepareNicForMigration(VirtualMachineProfile vm, DeployDestination dest) {
- List<NicVO> nics = _nicDao.listByVmId(vm.getId());
- ReservationContext context = new ReservationContextImpl(UUID.randomUUID().toString(), null, null);
- for (NicVO nic : nics) {
- NetworkVO network = _networksDao.findById(nic.getNetworkId());
- Integer networkRate = _networkModel.getNetworkRate(network.getId(), vm.getId());
-
- NetworkGuru guru = AdapterBase.getAdapterByName(_networkGurus, network.getGuruName());
- NicProfile profile = new NicProfile(nic, network, nic.getBroadcastUri(), nic.getIsolationUri(), networkRate,
- _networkModel.isSecurityGroupSupportedInNetwork(network), _networkModel.getNetworkTag(vm.getHypervisorType(), network));
- if(guru instanceof NetworkMigrationResponder){
- if(!((NetworkMigrationResponder) guru).prepareMigration(profile, network, vm, dest, context)){
- s_logger.error("NetworkGuru "+guru+" prepareForMigration failed."); // XXX: Transaction error
- }
- }
- List<Provider> providersToImplement = getNetworkProviders(network.getId());
- for (NetworkElement element : _networkElements) {
- if (providersToImplement.contains(element.getProvider())) {
- if (!_networkModel.isProviderEnabledInPhysicalNetwork(_networkModel.getPhysicalNetworkId(network), element.getProvider().getName())) {
- throw new CloudRuntimeException("Service provider " + element.getProvider().getName() + " either doesn't exist or is not enabled in physical network id: " + network.getPhysicalNetworkId());
- }
- if(element instanceof NetworkMigrationResponder){
- if(!((NetworkMigrationResponder) element).prepareMigration(profile, network, vm, dest, context)){
- s_logger.error("NetworkElement "+element+" prepareForMigration failed."); // XXX: Transaction error
- }
- }
- }
- }
- guru.updateNicProfile(profile, network);
- vm.addNic(profile);
- }
- }
-
- private NicProfile findNicProfileById(VirtualMachineProfile vm, long id){
- for(NicProfile nic: vm.getNics()){
- if(nic.getId() == id){
- return nic;
- }
- }
- return null;
- }
-
- @Override
- public void commitNicForMigration(
- VirtualMachineProfile src,
- VirtualMachineProfile dst) {
- for(NicProfile nicSrc: src.getNics()){
- NetworkVO network = _networksDao.findById(nicSrc.getNetworkId());
- NetworkGuru guru = AdapterBase.getAdapterByName(_networkGurus, network.getGuruName());
- NicProfile nicDst = findNicProfileById(dst, nicSrc.getId());
- ReservationContext src_context = new ReservationContextImpl(nicSrc.getReservationId(), null, null);
- ReservationContext dst_context = new ReservationContextImpl(nicDst.getReservationId(), null, null);
-
- if(guru instanceof NetworkMigrationResponder){
- ((NetworkMigrationResponder) guru).commitMigration(nicSrc, network, src, src_context, dst_context);
- }
- List<Provider> providersToImplement = getNetworkProviders(network.getId());
- for (NetworkElement element : _networkElements) {
- if (providersToImplement.contains(element.getProvider())) {
- if (!_networkModel.isProviderEnabledInPhysicalNetwork(_networkModel.getPhysicalNetworkId(network), element.getProvider().getName())) {
- throw new CloudRuntimeException("Service provider " + element.getProvider().getName() + " either doesn't exist or is not enabled in physical network id: " + network.getPhysicalNetworkId());
- }
- if(element instanceof NetworkMigrationResponder){
- ((NetworkMigrationResponder) element).commitMigration(nicSrc, network, src, src_context, dst_context);
- }
- }
- }
- // update the reservation id
- NicVO nicVo = _nicDao.findById(nicDst.getId());
- nicVo.setReservationId(nicDst.getReservationId());
- _nicDao.persist(nicVo);
- }
- }
-
- @Override
- public void rollbackNicForMigration(
- VirtualMachineProfile src,
- VirtualMachineProfile dst) {
- for(NicProfile nicDst: dst.getNics()){
- NetworkVO network = _networksDao.findById(nicDst.getNetworkId());
- NetworkGuru guru = AdapterBase.getAdapterByName(_networkGurus, network.getGuruName());
- NicProfile nicSrc = findNicProfileById(src, nicDst.getId());
- ReservationContext src_context = new ReservationContextImpl(nicSrc.getReservationId(), null, null);
- ReservationContext dst_context = new ReservationContextImpl(nicDst.getReservationId(), null, null);
-
- if(guru instanceof NetworkMigrationResponder){
- ((NetworkMigrationResponder) guru).rollbackMigration(nicDst, network, dst, src_context, dst_context);
- }
- List<Provider> providersToImplement = getNetworkProviders(network.getId());
- for (NetworkElement element : _networkElements) {
- if (providersToImplement.contains(element.getProvider())) {
- if (!_networkModel.isProviderEnabledInPhysicalNetwork(_networkModel.getPhysicalNetworkId(network), element.getProvider().getName())) {
- throw new CloudRuntimeException("Service provider " + element.getProvider().getName() + " either doesn't exist or is not enabled in physical network id: " + network.getPhysicalNetworkId());
- }
- if(element instanceof NetworkMigrationResponder){
- ((NetworkMigrationResponder) element).rollbackMigration(nicDst, network, dst, src_context, dst_context);
- }
- }
- }
- }
- }
-
- @Override
- @DB
- public void release(VirtualMachineProfile vmProfile, boolean forced) throws
- ConcurrentOperationException, ResourceUnavailableException {
- List<NicVO> nics = _nicDao.listByVmId(vmProfile.getId());
- for (NicVO nic : nics) {
- releaseNic(vmProfile, nic.getId());
- }
- }
-
-
- @Override
- @DB
- public void releaseNic(VirtualMachineProfile vmProfile, Nic nic)
- throws ConcurrentOperationException, ResourceUnavailableException {
- releaseNic(vmProfile, nic.getId());
- }
-
- @DB
- protected void releaseNic(VirtualMachineProfile vmProfile, long nicId)
- throws ConcurrentOperationException, ResourceUnavailableException {
- //lock the nic
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- NicVO nic = _nicDao.lockRow(nicId, true);
- if (nic == null) {
- throw new ConcurrentOperationException("Unable to acquire lock on nic " + nic);
- }
-
- Nic.State originalState = nic.getState();
- NetworkVO network = _networksDao.findById(nic.getNetworkId());
-
- if (originalState == Nic.State.Reserved || originalState == Nic.State.Reserving) {
- if (nic.getReservationStrategy() == Nic.ReservationStrategy.Start) {
- NetworkGuru guru = AdapterBase.getAdapterByName(_networkGurus, network.getGuruName());
- nic.setState(Nic.State.Releasing);
- _nicDao.update(nic.getId(), nic);
- NicProfile profile = new NicProfile(nic, network, nic.getBroadcastUri(), nic.getIsolationUri(), null,
- _networkModel.isSecurityGroupSupportedInNetwork(network), _networkModel.getNetworkTag(vmProfile.getHypervisorType(), network));
- if (guru.release(profile, vmProfile, nic.getReservationId())) {
- applyProfileToNicForRelease(nic, profile);
- nic.setState(Nic.State.Allocated);
- if (originalState == Nic.State.Reserved) {
- updateNic(nic, network.getId(), -1);
- } else {
- _nicDao.update(nic.getId(), nic);
- }
- }
- //commit the transaction before proceeding releasing nic profile on the network elements
- txn.commit();
-
- // Perform release on network elements
- List<Provider> providersToImplement = getNetworkProviders(network.getId());
- for (NetworkElement element : _networkElements) {
- if (providersToImplement.contains(element.getProvider())) {
- if (!_networkModel.isProviderEnabledInPhysicalNetwork(_networkModel.getPhysicalNetworkId(network), element.getProvider().getName())) {
- throw new CloudRuntimeException("Service provider " + element.getProvider().getName() + " either doesn't exist or is not enabled in physical network id: " + network.getPhysicalNetworkId());
- }
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Asking " + element.getName() + " to release " + nic);
- }
- //NOTE: Context appear to never be used in release method
- //implementations. Consider removing it from interface Element
- element.release(network, profile, vmProfile, null);
- }
- }
-
- } else {
- nic.setState(Nic.State.Allocated);
- updateNic(nic, network.getId(), -1);
- txn.commit();
- }
- }
- }
-
- @Override
- public void cleanupNics(VirtualMachineProfile vm) {
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Cleaning network for vm: " + vm.getId());
- }
-
- List<NicVO> nics = _nicDao.listByVmId(vm.getId());
- for (NicVO nic : nics) {
- removeNic(vm, nic);
- }
- }
-
-
- @Override
- public void removeNic(VirtualMachineProfile vm, Nic nic) {
- removeNic(vm, _nicDao.findById(nic.getId()));
- }
-
-
- protected void removeNic(VirtualMachineProfile vm, NicVO nic) {
- nic.setState(Nic.State.Deallocating);
- _nicDao.update(nic.getId(), nic);
- NetworkVO network = _networksDao.findById(nic.getNetworkId());
- NicProfile profile = new NicProfile(nic, network, null, null, null,
- _networkModel.isSecurityGroupSupportedInNetwork(network), _networkModel.getNetworkTag(vm.getHypervisorType(), network));
-
- /*
- * We need to release the nics with a Create ReservationStrategy here
- * because the nic is now being removed.
- */
- if (nic.getReservationStrategy() == Nic.ReservationStrategy.Create) {
- List<Provider> providersToImplement = getNetworkProviders(network.getId());
- for (NetworkElement element : _networkElements) {
- if (providersToImplement.contains(element.getProvider())) {
- if (!_networkModel.isProviderEnabledInPhysicalNetwork(_networkModel.getPhysicalNetworkId(network), element.getProvider().getName())) {
- throw new CloudRuntimeException("Service provider " + element.getProvider().getName() + " either doesn't exist or is not enabled in physical network id: " + network.getPhysicalNetworkId());
- }
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Asking " + element.getName() + " to release " + nic);
- }
- try {
- element.release(network, profile, vm, null);
- } catch (ConcurrentOperationException ex) {
- s_logger.warn("release failed during the nic " + nic.toString() + " removeNic due to ", ex);
- } catch (ResourceUnavailableException ex) {
- s_logger.warn("release failed during the nic " + nic.toString() + " removeNic due to ", ex);
- }
- }
- }
- }
-
- // remove the dhcpservice ip if this is the last nic in subnet.
- if (vm.getType() == Type.User && isDhcpAccrossMultipleSubnetsSupported(network) && isLastNicInSubnet(nic) &&
- network.getTrafficType() == TrafficType.Guest && network.getGuestType() == GuestType.Shared) {
- removeDhcpServiceInSubnet(nic);
- }
- NetworkGuru guru = AdapterBase.getAdapterByName(_networkGurus, network.getGuruName());
- guru.deallocate(network, profile, vm);
- _nicDao.remove(nic.getId());
- s_logger.debug("Removed nic id=" + nic.getId());
- //remove the secondary ip addresses corresponding to to this nic
- if (!removeVmSecondaryIpsOfNic(nic.getId())) {
- s_logger.debug("Removing nic " + nic.getId() + " secondary ip addreses failed");
- }
- }
-
- public boolean isDhcpAccrossMultipleSubnetsSupported(Network network) {
- DhcpServiceProvider dhcpServiceProvider = getDhcpServiceProvider(network);
- Map <Network.Capability, String> capabilities = dhcpServiceProvider.getCapabilities().get(Network.Service.Dhcp);
- String supportsMultipleSubnets = capabilities.get(Network.Capability.DhcpAccrossMultipleSubnets);
- if (supportsMultipleSubnets != null && Boolean.valueOf(supportsMultipleSubnets)) {
- return true;
- }
- return false;
- }
-
- private boolean isLastNicInSubnet(NicVO nic) {
- if (_nicDao.listByNetworkIdTypeAndGatewayAndBroadcastUri(nic.getNetworkId(), VirtualMachine.Type.User, nic.getGateway(), nic.getBroadcastUri()).size() > 1) {
- return false;
- }
- return true;
- }
-
- @DB
- @Override
- public void removeDhcpServiceInSubnet(Nic nic) {
- Network network = _networksDao.findById(nic.getNetworkId());
- DhcpServiceProvider dhcpServiceProvider = getDhcpServiceProvider(network);
- try {
- NicIpAliasVO ipAlias = _nicIpAliasDao.findByGatewayAndNetworkIdAndState(nic.getGateway(), network.getId(), NicIpAlias.state.active);
- if (ipAlias != null) {
- ipAlias.setState(NicIpAlias.state.revoked);
- Transaction txn = Transaction.currentTxn();
- txn.start();
- _nicIpAliasDao.update(ipAlias.getId(),ipAlias);
- IPAddressVO aliasIpaddressVo = _publicIpAddressDao.findByIpAndSourceNetworkId(ipAlias.getNetworkId(), ipAlias.getIp4Address());
- _publicIpAddressDao.unassignIpAddress(aliasIpaddressVo.getId());
- txn.commit();
- if (!dhcpServiceProvider.removeDhcpSupportForSubnet(network)) {
- s_logger.warn("Failed to remove the ip alias on the router, marking it as removed in db and freed the allocated ip " + ipAlias.getIp4Address());
- }
- }
- }
- catch (ResourceUnavailableException e) {
- //failed to remove the dhcpconfig on the router.
- s_logger.info ("Unable to delete the ip alias due to unable to contact the virtualrouter.");
- }
-
- }
-
-
-
- @Override
- public void expungeNics(VirtualMachineProfile vm) {
- List<NicVO> nics = _nicDao.listByVmIdIncludingRemoved(vm.getId());
- for (NicVO nic : nics) {
- _nicDao.expunge(nic.getId());
- }
- }
-
-
-
- @Override
- @DB
- public Network createGuestNetwork(long networkOfferingId, 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, String ip6Gateway, String ip6Cidr,
- Boolean isDisplayNetworkEnabled, String isolatedPvlan)
- throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException {
-
- NetworkOfferingVO ntwkOff = _networkOfferingDao.findById(networkOfferingId);
- // this method supports only guest network creation
- if (ntwkOff.getTrafficType() != TrafficType.Guest) {
- s_logger.warn("Only guest networks can be created using this method");
- return null;
- }
-
- boolean updateResourceCount = resourceCountNeedsUpdate(ntwkOff, aclType);
- //check resource limits
- if (updateResourceCount) {
- _resourceLimitMgr.checkResourceLimit(owner, ResourceType.network);
- }
-
- // Validate network offering
- if (ntwkOff.getState() != NetworkOffering.State.Enabled) {
- // see NetworkOfferingVO
- InvalidParameterValueException ex = new InvalidParameterValueException("Can't use specified network offering id as its stat is not " + NetworkOffering.State.Enabled);
- ex.addProxyObject(ntwkOff.getUuid(), "networkOfferingId");
- throw ex;
- }
-
- // Validate physical network
- if (pNtwk.getState() != PhysicalNetwork.State.Enabled) {
- // see PhysicalNetworkVO.java
- InvalidParameterValueException ex = new InvalidParameterValueException("Specified physical network id is" +
- " in incorrect state:" + pNtwk.getState());
- ex.addProxyObject(pNtwk.getUuid(), "physicalNetworkId");
- throw ex;
- }
-
- boolean ipv6 = false;
-
- if (ip6Gateway != null && ip6Cidr != null) {
- ipv6 = true;
- }
- // Validate zone
- DataCenterVO zone = _dcDao.findById(zoneId);
- if (zone.getNetworkType() == NetworkType.Basic) {
- if (ipv6) {
- throw new InvalidParameterValueException("IPv6 is not supported in Basic zone");
- }
-
- // In Basic zone the network should have aclType=Domain, domainId=1, subdomainAccess=true
- if (aclType == null || aclType != ACLType.Domain) {
- throw new InvalidParameterValueException("Only AclType=Domain can be specified for network creation in Basic zone");
- }
-
- // Only one guest network is supported in Basic zone
- List<NetworkVO> guestNetworks = _networksDao.listByZoneAndTrafficType(zone.getId(), TrafficType.Guest);
- if (!guestNetworks.isEmpty()) {
- throw new InvalidParameterValueException("Can't have more than one Guest network in zone with network type "
- + NetworkType.Basic);
- }
-
- // if zone is basic, only Shared network offerings w/o source nat service are allowed
- if (!(ntwkOff.getGuestType() == GuestType.Shared &&
- !_networkModel.areServicesSupportedByNetworkOffering(ntwkOff.getId(), Service.SourceNat))) {
- throw new InvalidParameterValueException("For zone of type " + NetworkType.Basic + " only offerings of " +
- "guestType " + GuestType.Shared + " with disabled " + Service.SourceNat.getName()
- + " service are allowed");
- }
-
- if (domainId == null || domainId != Domain.ROOT_DOMAIN) {
- throw new InvalidParameterValueException("Guest network in Basic zone should be dedicated to ROOT domain");
- }
-
- if (subdomainAccess == null) {
- subdomainAccess = true;
- } else if (!subdomainAccess) {
- throw new InvalidParameterValueException("Subdomain access should be set to true for the" +
- " guest network in the Basic zone");
- }
-
- if (vlanId == null) {
- vlanId = Vlan.UNTAGGED;
- } else {
- if (!vlanId.equalsIgnoreCase(Vlan.UNTAGGED)) {
- throw new InvalidParameterValueException("Only vlan " + Vlan.UNTAGGED + " can be created in " +
- "the zone of type " + NetworkType.Basic);
- }
- }
-
- } else if (zone.getNetworkType() == NetworkType.Advanced) {
- if (zone.isSecurityGroupEnabled()) {
- if (ipv6) {
- throw new InvalidParameterValueException("IPv6 is not supported with security group!");
- }
- if (isolatedPvlan != null) {
- throw new InvalidParameterValueException("Isolated Private VLAN is not supported with security group!");
- }
- // Only Account specific Isolated network with sourceNat service disabled are allowed in security group
- // enabled zone
- if ( ntwkOff.getGuestType() != GuestType.Shared ){
- throw new InvalidParameterValueException("Only shared guest network can be created in security group enabled zone");
- }
- if ( _networkModel.areServicesSupportedByNetworkOffering(ntwkOff.getId(), Service.SourceNat)) {
- throw new InvalidParameterValueException("Service SourceNat is not allowed in security group enabled zone");
- }
- if (!( _networkModel.areServicesSupportedByNetworkOffering(ntwkOff.getId(), Service.SecurityGroup))) {
- throw new InvalidParameterValueException("network must have SecurityGroup provider in security group enabled zone");
- }
- }
-
- //don't allow eip/elb networks in Advance zone
- if (ntwkOff.getElasticIp() || ntwkOff.getElasticLb()) {
- throw new InvalidParameterValueException("Elastic IP and Elastic LB services are supported in zone of type " + NetworkType.Basic);
- }
- }
-
- // VlanId can be specified only when network offering supports it
- boolean vlanSpecified = (vlanId != null);
- if (vlanSpecified != ntwkOff.getSpecifyVlan()) {
- if (vlanSpecified) {
- throw new InvalidParameterValueException("Can't specify vlan; corresponding offering says specifyVlan=false");
- } else {
- throw new InvalidParameterValueException("Vlan has to be specified; corresponding offering says specifyVlan=true");
- }
- }
-
- if (vlanSpecified) {
- //don't allow to specify vlan tag used by physical network for dynamic vlan allocation
- if (_dcDao.findVnet(zoneId, pNtwk.getId(), vlanId).size() > 0) {
- throw new InvalidParameterValueException("The VLAN tag " + vlanId
- + " is already being used for dynamic vlan allocation for the guest network in zone " + zone.getName());
- }
-
- String uri = BroadcastDomainType.fromString(vlanId).toString();
- // For Isolated networks, don't allow to create network with vlan that already exists in the zone
- if (ntwkOff.getGuestType() == GuestType.Isolated) {
- if (_networksDao.countByZoneAndUri(zoneId, uri) > 0) {
- throw new InvalidParameterValueException("Network with vlan " + vlanId + " already exists in zone " + zoneId);
- } else {
- List<DataCenterVnetVO> dcVnets = _datacenterVnetDao.findVnet(zoneId, vlanId.toString());
- //for the network that is created as part of private gateway,
- //the vnet is not coming from the data center vnet table, so the list can be empty
-
<TRUNCATED>