Search in sources :

Example 1 with NetworkAccountVO

use of com.cloud.network.dao.NetworkAccountVO in project cosmic by MissionCriticalCloud.

the class NetworkOrchestrator method destroyNetwork.

@Override
@DB
public boolean destroyNetwork(final long networkId, final ReservationContext context, final boolean forced) {
    final Account callerAccount = context.getAccount();
    NetworkVO network = _networksDao.findById(networkId);
    if (network == null) {
        s_logger.debug("Unable to find network with id: " + networkId);
        return false;
    }
    // Make sure that there are no user vms in the network that are not Expunged/Error
    final List<UserVmVO> userVms = _userVmDao.listByNetworkIdAndStates(networkId);
    for (final UserVmVO vm : userVms) {
        if (!(vm.getState() == VirtualMachine.State.Expunging && vm.getRemoved() != null)) {
            s_logger.warn("Can't delete the network, not all user vms are expunged. Vm " + vm + " is in " + vm.getState() + " state");
            return false;
        }
    }
    // Don't allow to delete network via api call when it has vms assigned to it
    final int nicCount = getActiveNicsInNetwork(networkId);
    if (nicCount > 0) {
        s_logger.debug("The network id=" + networkId + " has active Nics, but shouldn't.");
        // at this point we have already determined that there are no active user vms in network
        // if the op_networks table shows active nics, it's a bug in releasing nics updating op_networks
        _networksDao.changeActiveNicsBy(networkId, -1 * nicCount);
    }
    // In Basic zone, make sure that there are no non-removed console proxies and SSVMs using the network
    final Zone zone = _zoneRepository.findOne(network.getDataCenterId());
    if (zone.getNetworkType() == com.cloud.model.enumeration.NetworkType.Basic) {
        final List<VMInstanceVO> systemVms = _vmDao.listNonRemovedVmsByTypeAndNetwork(network.getId(), Type.ConsoleProxy, Type.SecondaryStorageVm);
        if (systemVms != null && !systemVms.isEmpty()) {
            s_logger.warn("Can't delete the network, not all consoleProxy/secondaryStorage vms are expunged");
            return false;
        }
    }
    // Shutdown network first
    shutdownNetwork(networkId, context, false);
    // get updated state for the network
    network = _networksDao.findById(networkId);
    if (network.getState() != Network.State.Allocated && network.getState() != Network.State.Setup && !forced) {
        s_logger.debug("Network is not not in the correct state to be destroyed: " + network.getState());
        return false;
    }
    boolean success = true;
    if (!cleanupNetworkResources(networkId, callerAccount, context.getCaller().getId())) {
        s_logger.warn("Unable to delete network id=" + networkId + ": failed to cleanup network resources");
        return false;
    }
    // get providers to destroy
    final List<Provider> providersToDestroy = getNetworkProviders(network.getId());
    for (final NetworkElement element : networkElements) {
        if (providersToDestroy.contains(element.getProvider())) {
            try {
                if (s_logger.isDebugEnabled()) {
                    s_logger.debug("Sending destroy to " + element);
                }
                if (!element.destroy(network, context)) {
                    success = false;
                    s_logger.warn("Unable to complete destroy of the network: failed to destroy network element " + element.getName());
                }
            } catch (final ResourceUnavailableException e) {
                s_logger.warn("Unable to complete destroy of the network due to element: " + element.getName(), e);
                success = false;
            } catch (final ConcurrentOperationException e) {
                s_logger.warn("Unable to complete destroy of the network due to element: " + element.getName(), e);
                success = false;
            } catch (final Exception e) {
                s_logger.warn("Unable to complete destroy of the network due to element: " + element.getName(), e);
                success = false;
            }
        }
    }
    if (success) {
        if (s_logger.isDebugEnabled()) {
            s_logger.debug("Network id=" + networkId + " is destroyed successfully, cleaning up corresponding resources now.");
        }
        final NetworkVO networkFinal = network;
        try {
            Transaction.execute(new TransactionCallbackNoReturn() {

                @Override
                public void doInTransactionWithoutResult(final TransactionStatus status) {
                    final NetworkGuru guru = AdapterBase.getAdapterByName(networkGurus, networkFinal.getGuruName());
                    // Deleting sync networks
                    final List<NetworkVO> syncNetworks = _networksDao.listSyncNetworksByRelatedNetwork(networkId);
                    syncNetworks.forEach(syncNetwork -> removeAndShutdownSyncNetwork(syncNetwork.getId()));
                    guru.trash(networkFinal, _networkOfferingDao.findById(networkFinal.getNetworkOfferingId()));
                    if (!deleteVlansInNetwork(networkFinal.getId(), context.getCaller().getId(), callerAccount)) {
                        s_logger.warn("Failed to delete network " + networkFinal + "; was unable to cleanup corresponding ip ranges");
                        throw new CloudRuntimeException("Failed to delete network " + networkFinal + "; was unable to cleanup corresponding ip ranges");
                    } else {
                        // commit transaction only when ips and vlans for the network are released successfully
                        try {
                            stateTransitTo(networkFinal, Event.DestroyNetwork);
                        } catch (final NoTransitionException e) {
                            s_logger.debug(e.getMessage());
                        }
                        if (_networksDao.remove(networkFinal.getId())) {
                            final NetworkDomainVO networkDomain = _networkDomainDao.getDomainNetworkMapByNetworkId(networkFinal.getId());
                            if (networkDomain != null) {
                                _networkDomainDao.remove(networkDomain.getId());
                            }
                            final NetworkAccountVO networkAccount = _networkAccountDao.getAccountNetworkMapByNetworkId(networkFinal.getId());
                            if (networkAccount != null) {
                                _networkAccountDao.remove(networkAccount.getId());
                            }
                        }
                        final NetworkOffering ntwkOff = _entityMgr.findById(NetworkOffering.class, networkFinal.getNetworkOfferingId());
                        final boolean updateResourceCount = resourceCountNeedsUpdate(ntwkOff, networkFinal.getAclType());
                        if (updateResourceCount) {
                            _resourceLimitMgr.decrementResourceCount(networkFinal.getAccountId(), ResourceType.network, networkFinal.getDisplayNetwork());
                        }
                    }
                }
            });
            if (_networksDao.findById(network.getId()) == null) {
                // remove its related ACL permission
                final Pair<Class<?>, Long> networkMsg = new Pair<>(Network.class, networkFinal.getId());
                _messageBus.publish(_name, EntityManager.MESSAGE_REMOVE_ENTITY_EVENT, PublishScope.LOCAL, networkMsg);
            }
            return true;
        } catch (final CloudRuntimeException e) {
            s_logger.error("Failed to delete network", e);
            return false;
        }
    }
    return success;
}
Also used : PhysicalNetworkTrafficTypeDao(com.cloud.network.dao.PhysicalNetworkTrafficTypeDao) NetworkModel(com.cloud.network.NetworkModel) ConfigKey(com.cloud.framework.config.ConfigKey) HostDao(com.cloud.host.dao.HostDao) VMNetworkMapVO(com.cloud.engine.cloud.entity.api.db.VMNetworkMapVO) ACLType(com.cloud.acl.ControlledEntity.ACLType) PodVlanMapDao(com.cloud.dc.dao.PodVlanMapDao) Scope(com.cloud.framework.config.ConfigKey.Scope) Transaction(com.cloud.utils.db.Transaction) TransactionCallbackWithExceptionNoReturn(com.cloud.utils.db.TransactionCallbackWithExceptionNoReturn) ConnectionException(com.cloud.exception.ConnectionException) NoTransitionException(com.cloud.utils.fsm.NoTransitionException) AgentManager(com.cloud.agent.AgentManager) PhysicalNetworkTrafficTypeVO(com.cloud.network.dao.PhysicalNetworkTrafficTypeVO) ReservationContext(com.cloud.vm.ReservationContext) VlanDao(com.cloud.dc.dao.VlanDao) Map(java.util.Map) NetworkServiceMapDao(com.cloud.network.dao.NetworkServiceMapDao) TrafficType(com.cloud.network.Networks.TrafficType) ZoneRepository(com.cloud.db.repository.ZoneRepository) StaticNatRule(com.cloud.network.rules.StaticNatRule) AgentControlAnswer(com.cloud.agent.api.AgentControlAnswer) Service(com.cloud.network.Network.Service) PhysicalNetworkDao(com.cloud.network.dao.PhysicalNetworkDao) AgentControlCommand(com.cloud.agent.api.AgentControlCommand) PhysicalNetworkVO(com.cloud.network.dao.PhysicalNetworkVO) NetworkGuru(com.cloud.network.guru.NetworkGuru) DataCenterVnetVO(com.cloud.dc.DataCenterVnetVO) Network(com.cloud.network.Network) TransactionStatus(com.cloud.utils.db.TransactionStatus) Set(java.util.Set) NetworkElement(com.cloud.network.element.NetworkElement) NetworkOfferingVO(com.cloud.offerings.NetworkOfferingVO) Executors(java.util.concurrent.Executors) GuestType(com.cloud.network.Network.GuestType) InsufficientCapacityException(com.cloud.exception.InsufficientCapacityException) PortForwardingRulesDao(com.cloud.network.rules.dao.PortForwardingRulesDao) IllegalVirtualMachineException(com.cloud.exception.IllegalVirtualMachineException) InsufficientAddressCapacityException(com.cloud.exception.InsufficientAddressCapacityException) StaticNatRuleImpl(com.cloud.network.rules.StaticNatRuleImpl) AccountDao(com.cloud.user.dao.AccountDao) AdapterBase(com.cloud.utils.component.AdapterBase) IpAddressManager(com.cloud.network.IpAddressManager) Event(com.cloud.network.Network.Event) NumbersUtil(com.cloud.utils.NumbersUtil) ManagerBase(com.cloud.utils.component.ManagerBase) NetworkOrchestrationService(com.cloud.engine.orchestration.service.NetworkOrchestrationService) UserDataServiceProvider(com.cloud.network.element.UserDataServiceProvider) FirewallRule(com.cloud.network.rules.FirewallRule) CallContext(com.cloud.context.CallContext) ResourceUnavailableException(com.cloud.exception.ResourceUnavailableException) Zone(com.cloud.db.model.Zone) Purpose(com.cloud.network.rules.FirewallRule.Purpose) IpDeployer(com.cloud.network.element.IpDeployer) NetworkOfferingServiceMapDao(com.cloud.offerings.dao.NetworkOfferingServiceMapDao) NicProfile(com.cloud.vm.NicProfile) ArrayList(java.util.ArrayList) LinkedHashMap(java.util.LinkedHashMap) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) LoadBalancingServiceProvider(com.cloud.network.element.LoadBalancingServiceProvider) VlanVO(com.cloud.dc.VlanVO) ConfigurationDao(com.cloud.framework.config.dao.ConfigurationDao) DomainRouterVO(com.cloud.vm.DomainRouterVO) User(com.cloud.user.User) StaticNatServiceProvider(com.cloud.network.element.StaticNatServiceProvider) ScheduledExecutorService(java.util.concurrent.ScheduledExecutorService) VMInstanceDao(com.cloud.vm.dao.VMInstanceDao) DomainRouterDao(com.cloud.vm.dao.DomainRouterDao) MessageBus(com.cloud.framework.messagebus.MessageBus) HypervisorType(com.cloud.hypervisor.Hypervisor.HypervisorType) Op(com.cloud.utils.db.SearchCriteria.Op) EntityManager(com.cloud.dao.EntityManager) NicTO(com.cloud.agent.api.to.NicTO) Vlan(com.cloud.dc.Vlan) Vpc(com.cloud.network.vpc.Vpc) UserVmDao(com.cloud.vm.dao.UserVmDao) CheckNetworkAnswer(com.cloud.agent.api.CheckNetworkAnswer) NicDao(com.cloud.vm.dao.NicDao) StartupRoutingCommand(com.cloud.agent.api.StartupRoutingCommand) PhysicalNetwork(com.cloud.network.PhysicalNetwork) RemoteAccessVpn(com.cloud.network.RemoteAccessVpn) DB(com.cloud.utils.db.DB) Command(com.cloud.agent.api.Command) ReservationContextImpl(com.cloud.vm.ReservationContextImpl) Host(com.cloud.host.Host) GlobalLock(com.cloud.utils.db.GlobalLock) NetworkOfferingDetailsDao(com.cloud.offerings.dao.NetworkOfferingDetailsDao) RulesManager(com.cloud.network.rules.RulesManager) NicSecondaryIpDao(com.cloud.vm.dao.NicSecondaryIpDao) AggregatedCommandExecutor(com.cloud.network.element.AggregatedCommandExecutor) LoggerFactory(org.slf4j.LoggerFactory) NetworkType(com.cloud.model.enumeration.NetworkType) Networks(com.cloud.network.Networks) NetworkAccountVO(com.cloud.network.dao.NetworkAccountVO) AlertManager(com.cloud.alert.AlertManager) CheckNetworkCommand(com.cloud.agent.api.CheckNetworkCommand) ResourceType(com.cloud.configuration.Resource.ResourceType) StartupCommand(com.cloud.agent.api.StartupCommand) ResourceAllocationException(com.cloud.exception.ResourceAllocationException) NetworkMigrationResponder(com.cloud.network.NetworkMigrationResponder) DeploymentPlan(com.cloud.deploy.DeploymentPlan) VMNetworkMapDao(com.cloud.engine.cloud.entity.api.db.dao.VMNetworkMapDao) ResourceLimitService(com.cloud.user.ResourceLimitService) Answer(com.cloud.agent.api.Answer) URI(java.net.URI) NetworkProfile(com.cloud.network.NetworkProfile) PhysicalNetworkSetupInfo(com.cloud.network.PhysicalNetworkSetupInfo) TransactionCallbackNoReturn(com.cloud.utils.db.TransactionCallbackNoReturn) PublishScope(com.cloud.framework.messagebus.PublishScope) VMInstanceVO(com.cloud.vm.VMInstanceVO) TransactionCallback(com.cloud.utils.db.TransactionCallback) StateMachine2(com.cloud.utils.fsm.StateMachine2) DeployDestination(com.cloud.deploy.DeployDestination) IpAddress(com.cloud.network.IpAddress) VpcVirtualNetworkApplianceService(com.cloud.network.VpcVirtualNetworkApplianceService) AccountGuestVlanMapVO(com.cloud.network.dao.AccountGuestVlanMapVO) Account(com.cloud.user.Account) Type(com.cloud.vm.VirtualMachine.Type) Pair(com.cloud.utils.Pair) NicVO(com.cloud.vm.NicVO) UUID(java.util.UUID) VpcManager(com.cloud.network.vpc.VpcManager) Scheme(com.cloud.network.rules.LoadBalancerContainer.Scheme) PodVlanMapVO(com.cloud.dc.PodVlanMapVO) Status(com.cloud.host.Status) List(java.util.List) NetworkDomainVO(com.cloud.network.dao.NetworkDomainVO) NetworkOfferingServiceMapVO(com.cloud.offerings.NetworkOfferingServiceMapVO) ConcurrentOperationException(com.cloud.exception.ConcurrentOperationException) DhcpServiceProvider(com.cloud.network.element.DhcpServiceProvider) NetUtils(com.cloud.utils.net.NetUtils) NetworkServiceMapVO(com.cloud.network.dao.NetworkServiceMapVO) InsufficientVirtualNetworkCapacityException(com.cloud.exception.InsufficientVirtualNetworkCapacityException) Capability(com.cloud.network.Network.Capability) NetworkDomainDao(com.cloud.network.dao.NetworkDomainDao) RedundantState(com.cloud.network.router.VirtualRouter.RedundantState) DataCenterVnetDao(com.cloud.dc.dao.DataCenterVnetDao) VirtualMachine(com.cloud.vm.VirtualMachine) VirtualMachineProfile(com.cloud.vm.VirtualMachineProfile) BroadcastDomainType(com.cloud.network.Networks.BroadcastDomainType) InvalidParameterValueException(com.cloud.utils.exception.InvalidParameterValueException) ReservationStrategy(com.cloud.vm.Nic.ReservationStrategy) DataCenterDeployment(com.cloud.deploy.DataCenterDeployment) SearchBuilder(com.cloud.utils.db.SearchBuilder) UnsupportedServiceException(com.cloud.exception.UnsupportedServiceException) Configurable(com.cloud.framework.config.Configurable) HashMap(java.util.HashMap) Domain(com.cloud.domain.Domain) NetworkDao(com.cloud.network.dao.NetworkDao) ConfigurationException(javax.naming.ConfigurationException) PortForwardingRuleVO(com.cloud.network.rules.PortForwardingRuleVO) JoinType(com.cloud.utils.db.JoinBuilder.JoinType) Nic(com.cloud.vm.Nic) Inject(javax.inject.Inject) HashSet(java.util.HashSet) Listener(com.cloud.agent.Listener) IPAddressVO(com.cloud.network.dao.IPAddressVO) NetworkVO(com.cloud.network.dao.NetworkVO) PhysicalNetworkServiceProviderDao(com.cloud.network.dao.PhysicalNetworkServiceProviderDao) IPAddressDao(com.cloud.network.dao.IPAddressDao) FirewallRulesDao(com.cloud.network.dao.FirewallRulesDao) NamedThreadFactory(com.cloud.utils.concurrency.NamedThreadFactory) DataCenter(com.cloud.dc.DataCenter) PublicIp(com.cloud.network.addr.PublicIp) ManagedContextRunnable(com.cloud.managed.context.ManagedContextRunnable) ConfigurationManager(com.cloud.configuration.ConfigurationManager) LoadBalancingRulesManager(com.cloud.network.lb.LoadBalancingRulesManager) Logger(org.slf4j.Logger) NetworkACLManager(com.cloud.network.vpc.NetworkACLManager) PrivateIpDao(com.cloud.network.vpc.dao.PrivateIpDao) AccountGuestVlanMapDao(com.cloud.network.dao.AccountGuestVlanMapDao) NetworkOffering(com.cloud.offering.NetworkOffering) TimeUnit(java.util.concurrent.TimeUnit) UserVmVO(com.cloud.vm.UserVmVO) RemoteAccessVpnService(com.cloud.network.vpn.RemoteAccessVpnService) NetworkOfferingDao(com.cloud.offerings.dao.NetworkOfferingDao) NetworkAccountDao(com.cloud.network.dao.NetworkAccountDao) FirewallRuleVO(com.cloud.network.rules.FirewallRuleVO) Provider(com.cloud.network.Network.Provider) FirewallManager(com.cloud.network.rules.FirewallManager) NicSecondaryIpVO(com.cloud.vm.dao.NicSecondaryIpVO) Comparator(java.util.Comparator) Collections(java.util.Collections) Account(com.cloud.user.Account) UserVmVO(com.cloud.vm.UserVmVO) TransactionStatus(com.cloud.utils.db.TransactionStatus) TransactionCallbackNoReturn(com.cloud.utils.db.TransactionCallbackNoReturn) NetworkElement(com.cloud.network.element.NetworkElement) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) NetworkDomainVO(com.cloud.network.dao.NetworkDomainVO) ArrayList(java.util.ArrayList) List(java.util.List) Pair(com.cloud.utils.Pair) PhysicalNetworkVO(com.cloud.network.dao.PhysicalNetworkVO) NetworkVO(com.cloud.network.dao.NetworkVO) NetworkOffering(com.cloud.offering.NetworkOffering) Zone(com.cloud.db.model.Zone) NetworkGuru(com.cloud.network.guru.NetworkGuru) VMInstanceVO(com.cloud.vm.VMInstanceVO) ConcurrentOperationException(com.cloud.exception.ConcurrentOperationException) ConnectionException(com.cloud.exception.ConnectionException) NoTransitionException(com.cloud.utils.fsm.NoTransitionException) InsufficientCapacityException(com.cloud.exception.InsufficientCapacityException) IllegalVirtualMachineException(com.cloud.exception.IllegalVirtualMachineException) InsufficientAddressCapacityException(com.cloud.exception.InsufficientAddressCapacityException) ResourceUnavailableException(com.cloud.exception.ResourceUnavailableException) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) ResourceAllocationException(com.cloud.exception.ResourceAllocationException) ConcurrentOperationException(com.cloud.exception.ConcurrentOperationException) InsufficientVirtualNetworkCapacityException(com.cloud.exception.InsufficientVirtualNetworkCapacityException) InvalidParameterValueException(com.cloud.utils.exception.InvalidParameterValueException) UnsupportedServiceException(com.cloud.exception.UnsupportedServiceException) ConfigurationException(javax.naming.ConfigurationException) UserDataServiceProvider(com.cloud.network.element.UserDataServiceProvider) LoadBalancingServiceProvider(com.cloud.network.element.LoadBalancingServiceProvider) StaticNatServiceProvider(com.cloud.network.element.StaticNatServiceProvider) DhcpServiceProvider(com.cloud.network.element.DhcpServiceProvider) Provider(com.cloud.network.Network.Provider) NoTransitionException(com.cloud.utils.fsm.NoTransitionException) ResourceUnavailableException(com.cloud.exception.ResourceUnavailableException) NetworkAccountVO(com.cloud.network.dao.NetworkAccountVO) DB(com.cloud.utils.db.DB)

Example 2 with NetworkAccountVO

use of com.cloud.network.dao.NetworkAccountVO in project cloudstack by apache.

the class NetworkOrchestrator method destroyNetwork.

@Override
@DB
public boolean destroyNetwork(final long networkId, final ReservationContext context, final boolean forced) {
    final Account callerAccount = context.getAccount();
    NetworkVO network = _networksDao.findById(networkId);
    if (network == null) {
        s_logger.debug("Unable to find network with id: " + networkId);
        return false;
    }
    // Make sure that there are no user vms in the network that are not Expunged/Error
    final List<UserVmVO> userVms = _userVmDao.listByNetworkIdAndStates(networkId);
    for (final UserVmVO vm : userVms) {
        if (!(vm.getState() == VirtualMachine.State.Expunging && vm.getRemoved() != null)) {
            s_logger.warn("Can't delete the network, not all user vms are expunged. Vm " + vm + " is in " + vm.getState() + " state");
            return false;
        }
    }
    // Don't allow to delete network via api call when it has vms assigned to it
    final int nicCount = getActiveNicsInNetwork(networkId);
    if (nicCount > 0) {
        s_logger.debug("The network id=" + networkId + " has active Nics, but shouldn't.");
        // at this point we have already determined that there are no active user vms in network
        // if the op_networks table shows active nics, it's a bug in releasing nics updating op_networks
        _networksDao.changeActiveNicsBy(networkId, -1 * nicCount);
    }
    // In Basic zone, make sure that there are no non-removed console proxies and SSVMs using the network
    final DataCenter zone = _entityMgr.findById(DataCenter.class, network.getDataCenterId());
    if (zone.getNetworkType() == NetworkType.Basic) {
        final List<VMInstanceVO> systemVms = _vmDao.listNonRemovedVmsByTypeAndNetwork(network.getId(), Type.ConsoleProxy, Type.SecondaryStorageVm);
        if (systemVms != null && !systemVms.isEmpty()) {
            s_logger.warn("Can't delete the network, not all consoleProxy/secondaryStorage vms are expunged");
            return false;
        }
    }
    cleanupPersistentnNetworkResources(network);
    // Shutdown network first
    shutdownNetwork(networkId, context, false);
    // get updated state for the network
    network = _networksDao.findById(networkId);
    if (network.getState() != Network.State.Allocated && network.getState() != Network.State.Setup && !forced) {
        s_logger.debug("Network is not not in the correct state to be destroyed: " + network.getState());
        return false;
    }
    boolean success = true;
    if (!cleanupNetworkResources(networkId, callerAccount, context.getCaller().getId())) {
        s_logger.warn("Unable to delete network id=" + networkId + ": failed to cleanup network resources");
        return false;
    }
    // get providers to destroy
    final List<Provider> providersToDestroy = getNetworkProviders(network.getId());
    for (final NetworkElement element : networkElements) {
        if (providersToDestroy.contains(element.getProvider())) {
            try {
                if (s_logger.isDebugEnabled()) {
                    s_logger.debug("Sending destroy to " + element);
                }
                if (!element.destroy(network, context)) {
                    success = false;
                    s_logger.warn("Unable to complete destroy of the network: failed to destroy network element " + element.getName());
                }
            } catch (final ResourceUnavailableException e) {
                s_logger.warn("Unable to complete destroy of the network due to element: " + element.getName(), e);
                success = false;
            } catch (final ConcurrentOperationException e) {
                s_logger.warn("Unable to complete destroy of the network due to element: " + element.getName(), e);
                success = false;
            } catch (final Exception e) {
                s_logger.warn("Unable to complete destroy of the network due to element: " + element.getName(), e);
                success = false;
            }
        }
    }
    if (success) {
        if (s_logger.isDebugEnabled()) {
            s_logger.debug("Network id=" + networkId + " is destroyed successfully, cleaning up corresponding resources now.");
        }
        final NetworkVO networkFinal = network;
        try {
            Transaction.execute(new TransactionCallbackNoReturn() {

                @Override
                public void doInTransactionWithoutResult(final TransactionStatus status) {
                    final NetworkGuru guru = AdapterBase.getAdapterByName(networkGurus, networkFinal.getGuruName());
                    if (!guru.trash(networkFinal, _networkOfferingDao.findById(networkFinal.getNetworkOfferingId()))) {
                        throw new CloudRuntimeException("Failed to trash network.");
                    }
                    if (!deleteVlansInNetwork(networkFinal.getId(), context.getCaller().getId(), callerAccount)) {
                        s_logger.warn("Failed to delete network " + networkFinal + "; was unable to cleanup corresponding ip ranges");
                        throw new CloudRuntimeException("Failed to delete network " + networkFinal + "; was unable to cleanup corresponding ip ranges");
                    } else {
                        // commit transaction only when ips and vlans for the network are released successfully
                        try {
                            stateTransitTo(networkFinal, Event.DestroyNetwork);
                        } catch (final NoTransitionException e) {
                            s_logger.debug(e.getMessage());
                        }
                        if (_networksDao.remove(networkFinal.getId())) {
                            final NetworkDomainVO networkDomain = _networkDomainDao.getDomainNetworkMapByNetworkId(networkFinal.getId());
                            if (networkDomain != null) {
                                _networkDomainDao.remove(networkDomain.getId());
                            }
                            final NetworkAccountVO networkAccount = _networkAccountDao.getAccountNetworkMapByNetworkId(networkFinal.getId());
                            if (networkAccount != null) {
                                _networkAccountDao.remove(networkAccount.getId());
                            }
                            networkDetailsDao.removeDetails(networkFinal.getId());
                        }
                        final NetworkOffering ntwkOff = _entityMgr.findById(NetworkOffering.class, networkFinal.getNetworkOfferingId());
                        final boolean updateResourceCount = resourceCountNeedsUpdate(ntwkOff, networkFinal.getAclType());
                        if (updateResourceCount) {
                            _resourceLimitMgr.decrementResourceCount(networkFinal.getAccountId(), ResourceType.network, networkFinal.getDisplayNetwork());
                        }
                    }
                }
            });
            if (_networksDao.findById(network.getId()) == null) {
                // remove its related ACL permission
                final Pair<Class<?>, Long> networkMsg = new Pair<Class<?>, Long>(Network.class, networkFinal.getId());
                _messageBus.publish(_name, EntityManager.MESSAGE_REMOVE_ENTITY_EVENT, PublishScope.LOCAL, networkMsg);
            }
            return true;
        } catch (final CloudRuntimeException e) {
            s_logger.error("Failed to delete network", e);
            return false;
        }
    }
    return success;
}
Also used : Account(com.cloud.user.Account) UserVmVO(com.cloud.vm.UserVmVO) TransactionStatus(com.cloud.utils.db.TransactionStatus) TransactionCallbackNoReturn(com.cloud.utils.db.TransactionCallbackNoReturn) NetworkElement(com.cloud.network.element.NetworkElement) ConfigDriveNetworkElement(com.cloud.network.element.ConfigDriveNetworkElement) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) NetworkDomainVO(com.cloud.network.dao.NetworkDomainVO) Pair(com.cloud.utils.Pair) PhysicalNetworkVO(com.cloud.network.dao.PhysicalNetworkVO) NetworkVO(com.cloud.network.dao.NetworkVO) NetworkOffering(com.cloud.offering.NetworkOffering) NetworkGuru(com.cloud.network.guru.NetworkGuru) VMInstanceVO(com.cloud.vm.VMInstanceVO) ConcurrentOperationException(com.cloud.exception.ConcurrentOperationException) ConnectionException(com.cloud.exception.ConnectionException) AgentUnavailableException(com.cloud.exception.AgentUnavailableException) ResourceUnavailableException(com.cloud.exception.ResourceUnavailableException) UnsupportedServiceException(com.cloud.exception.UnsupportedServiceException) NoTransitionException(com.cloud.utils.fsm.NoTransitionException) OperationTimedoutException(com.cloud.exception.OperationTimedoutException) InsufficientCapacityException(com.cloud.exception.InsufficientCapacityException) InsufficientAddressCapacityException(com.cloud.exception.InsufficientAddressCapacityException) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) InvalidParameterValueException(com.cloud.exception.InvalidParameterValueException) ResourceAllocationException(com.cloud.exception.ResourceAllocationException) ConcurrentOperationException(com.cloud.exception.ConcurrentOperationException) InsufficientVirtualNetworkCapacityException(com.cloud.exception.InsufficientVirtualNetworkCapacityException) ConfigurationException(javax.naming.ConfigurationException) DnsServiceProvider(com.cloud.network.element.DnsServiceProvider) UserDataServiceProvider(com.cloud.network.element.UserDataServiceProvider) DhcpServiceProvider(com.cloud.network.element.DhcpServiceProvider) LoadBalancingServiceProvider(com.cloud.network.element.LoadBalancingServiceProvider) StaticNatServiceProvider(com.cloud.network.element.StaticNatServiceProvider) Provider(com.cloud.network.Network.Provider) DataCenter(com.cloud.dc.DataCenter) NoTransitionException(com.cloud.utils.fsm.NoTransitionException) ResourceUnavailableException(com.cloud.exception.ResourceUnavailableException) NetworkAccountVO(com.cloud.network.dao.NetworkAccountVO) DB(com.cloud.utils.db.DB)

Example 3 with NetworkAccountVO

use of com.cloud.network.dao.NetworkAccountVO in project cloudstack by apache.

the class ManagementServerImpl method searchForIPAddresses.

@Override
public Pair<List<? extends IpAddress>, Integer> searchForIPAddresses(final ListPublicIpAddressesCmd cmd) {
    final Long associatedNetworkId = cmd.getAssociatedNetworkId();
    final Long zone = cmd.getZoneId();
    final Long vlan = cmd.getVlanId();
    final Boolean forVirtualNetwork = cmd.isForVirtualNetwork();
    final Long ipId = cmd.getId();
    final Long networkId = cmd.getNetworkId();
    final Long vpcId = cmd.getVpcId();
    final String state = cmd.getState();
    Boolean isAllocated = cmd.isAllocatedOnly();
    if (isAllocated == null) {
        if (state != null && state.equalsIgnoreCase(IpAddress.State.Free.name())) {
            isAllocated = Boolean.FALSE;
        } else {
            // default
            isAllocated = Boolean.TRUE;
        }
    } else {
        if (state != null && state.equalsIgnoreCase(IpAddress.State.Free.name())) {
            if (isAllocated) {
                throw new InvalidParameterValueException("Conflict: allocatedonly is true but state is Free");
            }
        } else if (state != null && state.equalsIgnoreCase(IpAddress.State.Allocated.name())) {
            isAllocated = Boolean.TRUE;
        }
    }
    VlanType vlanType = null;
    if (forVirtualNetwork != null) {
        vlanType = forVirtualNetwork ? VlanType.VirtualNetwork : VlanType.DirectAttached;
    } else {
        vlanType = VlanType.VirtualNetwork;
    }
    final Account caller = getCaller();
    List<IPAddressVO> addrs = new ArrayList<>();
    if (vlanType == VlanType.DirectAttached && networkId == null && ipId == null) {
        // only root admin can list public ips in all shared networks
        if (caller.getType() != Account.ACCOUNT_TYPE_ADMIN) {
            isAllocated = true;
        }
    } else if (vlanType == VlanType.DirectAttached) {
        // list public ip address on shared network
        // access control. admin: all Ips, domain admin/user: all Ips in shared network in the domain/sub-domain/user
        NetworkVO network = null;
        if (networkId == null) {
            IPAddressVO ip = _publicIpAddressDao.findById(ipId);
            if (ip == null) {
                throw new InvalidParameterValueException("Please specify a valid ipaddress id");
            }
            network = _networkDao.findById(ip.getSourceNetworkId());
        } else {
            network = _networkDao.findById(networkId);
        }
        if (network == null || network.getGuestType() != Network.GuestType.Shared) {
            throw new InvalidParameterValueException("Please specify a valid network id");
        }
        if (network.getAclType() == ControlledEntity.ACLType.Account) {
            NetworkAccountVO networkMap = _networkAccountDao.getAccountNetworkMapByNetworkId(network.getId());
            if (networkMap == null) {
                return new Pair<>(addrs, 0);
            }
            _accountMgr.checkAccess(caller, null, false, _accountDao.findById(networkMap.getAccountId()));
        } else {
            // Domain level
            NetworkDomainVO networkMap = _networkDomainDao.getDomainNetworkMapByNetworkId(network.getId());
            if (networkMap == null) {
                return new Pair<>(addrs, 0);
            }
            if (caller.getType() == Account.ACCOUNT_TYPE_NORMAL || caller.getType() == Account.ACCOUNT_TYPE_PROJECT) {
                if (_networkMgr.isNetworkAvailableInDomain(network.getId(), caller.getDomainId())) {
                    isAllocated = Boolean.TRUE;
                } else {
                    return new Pair<>(addrs, 0);
                }
            } else if (caller.getType() == Account.ACCOUNT_TYPE_DOMAIN_ADMIN || caller.getType() == Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN) {
                if (caller.getDomainId() == networkMap.getDomainId() || _domainDao.isChildDomain(caller.getDomainId(), networkMap.getDomainId())) {
                    s_logger.debug("Caller " + caller.getUuid() + " has permission to access the network : " + network.getUuid());
                } else {
                    if (_networkMgr.isNetworkAvailableInDomain(network.getId(), caller.getDomainId())) {
                        isAllocated = Boolean.TRUE;
                    } else {
                        return new Pair<>(addrs, 0);
                    }
                }
            }
        }
    }
    final Filter searchFilter = new Filter(IPAddressVO.class, "address", false, null, null);
    final SearchBuilder<IPAddressVO> sb = _publicIpAddressDao.createSearchBuilder();
    Long domainId = null;
    Boolean isRecursive = null;
    final List<Long> permittedAccounts = new ArrayList<>();
    ListProjectResourcesCriteria listProjectResourcesCriteria = null;
    if (isAllocated || (vlanType == VlanType.VirtualNetwork && (caller.getType() != Account.ACCOUNT_TYPE_ADMIN || cmd.getDomainId() != null))) {
        final Ternary<Long, Boolean, ListProjectResourcesCriteria> domainIdRecursiveListProject = new Ternary<>(cmd.getDomainId(), cmd.isRecursive(), null);
        _accountMgr.buildACLSearchParameters(caller, cmd.getId(), cmd.getAccountName(), cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, cmd.listAll(), false);
        domainId = domainIdRecursiveListProject.first();
        isRecursive = domainIdRecursiveListProject.second();
        listProjectResourcesCriteria = domainIdRecursiveListProject.third();
        _accountMgr.buildACLSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria);
    }
    buildParameters(sb, cmd, vlanType == VlanType.VirtualNetwork ? true : isAllocated);
    SearchCriteria<IPAddressVO> sc = sb.create();
    setParameters(sc, cmd, vlanType);
    if (isAllocated || (vlanType == VlanType.VirtualNetwork && (caller.getType() != Account.ACCOUNT_TYPE_ADMIN || cmd.getDomainId() != null))) {
        _accountMgr.buildACLSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria);
    }
    if (associatedNetworkId != null) {
        _accountMgr.checkAccess(caller, null, false, _networkDao.findById(associatedNetworkId));
        sc.setParameters("associatedNetworkIdEq", associatedNetworkId);
    }
    if (vpcId != null) {
        _accountMgr.checkAccess(caller, null, false, _vpcDao.findById(vpcId));
        sc.setParameters("vpcId", vpcId);
    }
    // Allocated
    addrs = _publicIpAddressDao.search(sc, searchFilter);
    // Free IP addresses in system IP ranges
    List<Long> freeAddrIds = new ArrayList<>();
    if (!(isAllocated || vlanType == VlanType.DirectAttached)) {
        Long zoneId = zone;
        Account owner = _accountMgr.finalizeOwner(CallContext.current().getCallingAccount(), cmd.getAccountName(), cmd.getDomainId(), cmd.getProjectId());
        if (associatedNetworkId != null) {
            NetworkVO guestNetwork = _networkDao.findById(associatedNetworkId);
            if (zoneId == null) {
                zoneId = guestNetwork.getDataCenterId();
            } else if (zoneId != guestNetwork.getDataCenterId()) {
                InvalidParameterValueException ex = new InvalidParameterValueException("Please specify a valid associated network id in the specified zone.");
                throw ex;
            }
            owner = _accountDao.findById(guestNetwork.getAccountId());
        }
        List<DataCenterVO> dcList = new ArrayList<>();
        if (zoneId == null) {
            dcList = ApiDBUtils.listZones();
        } else {
            dcList.add(ApiDBUtils.findZoneById(zoneId));
        }
        List<Long> vlanDbIds = null;
        if (vlan != null) {
            vlanDbIds = new ArrayList<>();
            vlanDbIds.add(vlan);
        }
        List<IPAddressVO> freeAddrs = new ArrayList<>();
        for (DataCenterVO dc : dcList) {
            long dcId = dc.getId();
            try {
                freeAddrs.addAll(_ipAddressMgr.listAvailablePublicIps(dcId, null, vlanDbIds, owner, VlanType.VirtualNetwork, associatedNetworkId, false, false, false, null, null, false, cmd.getVpcId(), cmd.isDisplay(), false, // Free
                false));
            } catch (InsufficientAddressCapacityException e) {
                s_logger.warn("no free address is found in zone " + dcId);
            }
        }
        for (IPAddressVO addr : freeAddrs) {
            freeAddrIds.add(addr.getId());
        }
    }
    if (freeAddrIds.size() > 0) {
        final SearchBuilder<IPAddressVO> sb2 = _publicIpAddressDao.createSearchBuilder();
        buildParameters(sb2, cmd, false);
        sb2.and("ids", sb2.entity().getId(), SearchCriteria.Op.IN);
        SearchCriteria<IPAddressVO> sc2 = sb2.create();
        setParameters(sc2, cmd, vlanType);
        sc2.setParameters("ids", freeAddrIds.toArray());
        // Allocated + Free
        addrs.addAll(_publicIpAddressDao.search(sc2, searchFilter));
    }
    Collections.sort(addrs, Comparator.comparing(IPAddressVO::getAddress));
    List<? extends IpAddress> wPagination = com.cloud.utils.StringUtils.applyPagination(addrs, cmd.getStartIndex(), cmd.getPageSizeVal());
    if (wPagination != null) {
        return new Pair<List<? extends IpAddress>, Integer>(wPagination, addrs.size());
    }
    return new Pair<>(addrs, addrs.size());
}
Also used : Account(com.cloud.user.Account) InsufficientAddressCapacityException(com.cloud.exception.InsufficientAddressCapacityException) ArrayList(java.util.ArrayList) InvalidParameterValueException(com.cloud.exception.InvalidParameterValueException) NetworkDomainVO(com.cloud.network.dao.NetworkDomainVO) VlanType(com.cloud.dc.Vlan.VlanType) Pair(com.cloud.utils.Pair) SSHKeyPair(com.cloud.user.SSHKeyPair) DataCenterVO(com.cloud.dc.DataCenterVO) NetworkVO(com.cloud.network.dao.NetworkVO) Ternary(com.cloud.utils.Ternary) ListProjectResourcesCriteria(com.cloud.projects.Project.ListProjectResourcesCriteria) Filter(com.cloud.utils.db.Filter) IPAddressVO(com.cloud.network.dao.IPAddressVO) NetworkAccountVO(com.cloud.network.dao.NetworkAccountVO)

Aggregations

InsufficientAddressCapacityException (com.cloud.exception.InsufficientAddressCapacityException)3 DataCenter (com.cloud.dc.DataCenter)2 ConcurrentOperationException (com.cloud.exception.ConcurrentOperationException)2 ConnectionException (com.cloud.exception.ConnectionException)2 InsufficientCapacityException (com.cloud.exception.InsufficientCapacityException)2 InsufficientVirtualNetworkCapacityException (com.cloud.exception.InsufficientVirtualNetworkCapacityException)2 InvalidParameterValueException (com.cloud.exception.InvalidParameterValueException)2 NetworkAccountVO (com.cloud.network.dao.NetworkAccountVO)2 NetworkDomainVO (com.cloud.network.dao.NetworkDomainVO)2 NetworkVO (com.cloud.network.dao.NetworkVO)2 Account (com.cloud.user.Account)2 Pair (com.cloud.utils.Pair)2 ACLType (com.cloud.acl.ControlledEntity.ACLType)1 AgentManager (com.cloud.agent.AgentManager)1 Listener (com.cloud.agent.Listener)1 AgentControlAnswer (com.cloud.agent.api.AgentControlAnswer)1 AgentControlCommand (com.cloud.agent.api.AgentControlCommand)1 Answer (com.cloud.agent.api.Answer)1 CheckNetworkAnswer (com.cloud.agent.api.CheckNetworkAnswer)1 CheckNetworkCommand (com.cloud.agent.api.CheckNetworkCommand)1