diff --git a/core/src/com/cloud/agent/api/routing/DhcpEntryCommand.java b/api/src/com/cloud/agent/api/routing/DhcpEntryCommand.java similarity index 86% rename from core/src/com/cloud/agent/api/routing/DhcpEntryCommand.java rename to api/src/com/cloud/agent/api/routing/DhcpEntryCommand.java index 291a8f6882e..e070cd8adf1 100644 --- a/core/src/com/cloud/agent/api/routing/DhcpEntryCommand.java +++ b/api/src/com/cloud/agent/api/routing/DhcpEntryCommand.java @@ -23,7 +23,6 @@ public class DhcpEntryCommand extends NetworkElementCommand { String vmMac; String vmIpAddress; - String routerPrivateIpAddress; String vmName; protected DhcpEntryCommand() { @@ -35,10 +34,9 @@ public class DhcpEntryCommand extends NetworkElementCommand { return true; } - public DhcpEntryCommand(String vmMac, String vmIpAddress, String routerPrivateIpAddress, String vmName) { + public DhcpEntryCommand(String vmMac, String vmIpAddress, String vmName) { this.vmMac = vmMac; this.vmIpAddress = vmIpAddress; - this.routerPrivateIpAddress = routerPrivateIpAddress; this.vmName = vmName; } @@ -46,10 +44,6 @@ public class DhcpEntryCommand extends NetworkElementCommand { return vmMac; } - public String getRouterPrivateIpAddress() { - return routerPrivateIpAddress; - } - public String getVmIpAddress() { return vmIpAddress; } diff --git a/core/src/com/cloud/agent/api/routing/VmDataCommand.java b/api/src/com/cloud/agent/api/routing/VmDataCommand.java similarity index 85% rename from core/src/com/cloud/agent/api/routing/VmDataCommand.java rename to api/src/com/cloud/agent/api/routing/VmDataCommand.java index dfd7689c3f7..3d222c3fbc8 100644 --- a/core/src/com/cloud/agent/api/routing/VmDataCommand.java +++ b/api/src/com/cloud/agent/api/routing/VmDataCommand.java @@ -22,8 +22,7 @@ import java.util.ArrayList; import java.util.List; public class VmDataCommand extends NetworkElementCommand { - - String routerPrivateIpAddress; + String vmIpAddress; List vmData; @@ -35,16 +34,11 @@ public class VmDataCommand extends NetworkElementCommand { return true; } - public VmDataCommand(String routerPrivateIpAddress, String vmIpAddress) { - this.routerPrivateIpAddress = routerPrivateIpAddress; + public VmDataCommand(String vmIpAddress) { this.vmIpAddress = vmIpAddress; this.vmData = new ArrayList(); } - public String getRouterPrivateIpAddress() { - return routerPrivateIpAddress; - } - public String getVmIpAddress() { return vmIpAddress; } diff --git a/api/src/com/cloud/api/commands/DisableAccountCmd.java b/api/src/com/cloud/api/commands/DisableAccountCmd.java index 37cfab639ce..22b44c17023 100644 --- a/api/src/com/cloud/api/commands/DisableAccountCmd.java +++ b/api/src/com/cloud/api/commands/DisableAccountCmd.java @@ -27,6 +27,8 @@ import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.api.response.AccountResponse; import com.cloud.event.EventTypes; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.ResourceUnavailableException; import com.cloud.user.Account; import com.cloud.user.UserContext; @@ -90,7 +92,7 @@ public class DisableAccountCmd extends BaseAsyncCmd { } @Override - public void execute(){ + public void execute() throws ConcurrentOperationException, ResourceUnavailableException{ Account result = null; if(lockRequested) result = _accountService.lockAccount(this); diff --git a/api/src/com/cloud/api/commands/RebootRouterCmd.java b/api/src/com/cloud/api/commands/RebootRouterCmd.java index f2baa4ce2b5..09ee0479b4b 100644 --- a/api/src/com/cloud/api/commands/RebootRouterCmd.java +++ b/api/src/com/cloud/api/commands/RebootRouterCmd.java @@ -29,6 +29,9 @@ import com.cloud.api.ServerApiException; import com.cloud.api.response.DomainRouterResponse; import com.cloud.async.AsyncJob; import com.cloud.event.EventTypes; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.ResourceUnavailableException; import com.cloud.network.router.VirtualRouter; import com.cloud.user.Account; @@ -91,8 +94,8 @@ public class RebootRouterCmd extends BaseAsyncCmd { @Override - public void execute(){ - VirtualRouter result = _routerService.rebootRouter(this); + public void execute() throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException{ + VirtualRouter result = _routerService.rebootRouter(this.getId()); if (result != null){ DomainRouterResponse response = _responseGenerator.createDomainRouterResponse(result); response.setResponseName("router"); diff --git a/api/src/com/cloud/api/commands/StartRouterCmd.java b/api/src/com/cloud/api/commands/StartRouterCmd.java index 8f257c90ac0..63db3bb432a 100644 --- a/api/src/com/cloud/api/commands/StartRouterCmd.java +++ b/api/src/com/cloud/api/commands/StartRouterCmd.java @@ -101,7 +101,7 @@ public class StartRouterCmd extends BaseAsyncCmd { @Override public void execute() throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException{ - VirtualRouter result = _routerService.startRouter(this); + VirtualRouter result = _routerService.startRouter(this.getId()); if (result != null){ DomainRouterResponse routerResponse = _responseGenerator.createDomainRouterResponse(result); routerResponse.setResponseName(getCommandName()); diff --git a/api/src/com/cloud/api/commands/StopRouterCmd.java b/api/src/com/cloud/api/commands/StopRouterCmd.java index c3b94afa758..40a26f7ed61 100644 --- a/api/src/com/cloud/api/commands/StopRouterCmd.java +++ b/api/src/com/cloud/api/commands/StopRouterCmd.java @@ -95,7 +95,7 @@ public class StopRouterCmd extends BaseAsyncCmd { @Override public void execute() throws ConcurrentOperationException, ResourceUnavailableException{ - VirtualRouter result = _routerService.stopRouter(this); + VirtualRouter result = _routerService.stopRouter(this.getId()); if (result != null){ DomainRouterResponse response =_responseGenerator.createDomainRouterResponse(result); response.setResponseName(getCommandName()); diff --git a/api/src/com/cloud/network/VirtualNetworkApplianceService.java b/api/src/com/cloud/network/VirtualNetworkApplianceService.java index ab7aaae7534..707946b0b05 100644 --- a/api/src/com/cloud/network/VirtualNetworkApplianceService.java +++ b/api/src/com/cloud/network/VirtualNetworkApplianceService.java @@ -17,13 +17,11 @@ */ package com.cloud.network; -import com.cloud.api.commands.RebootRouterCmd; -import com.cloud.api.commands.StartRouterCmd; -import com.cloud.api.commands.StopRouterCmd; import com.cloud.api.commands.UpgradeRouterCmd; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.InvalidParameterValueException; +import com.cloud.exception.PermissionDeniedException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.network.router.VirtualRouter; @@ -34,26 +32,7 @@ public interface VirtualNetworkApplianceService { * @return DomainRouter object * @throws InvalidParameterValueException, PermissionDeniedException */ - VirtualRouter startRouter(StartRouterCmd cmd) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException; - - /** - * Stops domain router - * @param cmd the command specifying router's id - * @return router if successful, null otherwise - */ - VirtualRouter stopRouter(StopRouterCmd cmd) throws ConcurrentOperationException, ResourceUnavailableException; - - VirtualRouter startRouter(long routerId) throws ResourceUnavailableException, InsufficientCapacityException, ConcurrentOperationException; - - /** - * Stops domain router - * @param cmd the command specifying router's id - * @return router if successful, null otherwise - * @throws ConcurrentOperationException - * @throws ResourceUnavailableException - * @throws InvalidParameterValueException, PermissionDeniedException - */ - VirtualRouter stopDomainRouter(long routerId) throws ResourceUnavailableException, ConcurrentOperationException; + VirtualRouter startRouter(long routerId) throws InvalidParameterValueException, PermissionDeniedException, ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException; /** * Reboots domain router @@ -61,10 +40,18 @@ public interface VirtualNetworkApplianceService { * @return router if successful * @throws InvalidParameterValueException, PermissionDeniedException */ - VirtualRouter rebootRouter(RebootRouterCmd cmd); + VirtualRouter rebootRouter(long routerId) throws InvalidParameterValueException, PermissionDeniedException, ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException; VirtualRouter upgradeRouter(UpgradeRouterCmd cmd); - + /** + * Stops domain router + * @param id of the router + * @return router if successful, null otherwise + * @throws ConcurrentOperationException + * @throws ResourceUnavailableException + * @throws InvalidParameterValueException, PermissionDeniedException + */ + VirtualRouter stopRouter(long routerId) throws InvalidParameterValueException, PermissionDeniedException, ResourceUnavailableException, ConcurrentOperationException; } diff --git a/api/src/com/cloud/user/AccountService.java b/api/src/com/cloud/user/AccountService.java index 99836e444f5..3a0baa6df74 100644 --- a/api/src/com/cloud/user/AccountService.java +++ b/api/src/com/cloud/user/AccountService.java @@ -28,14 +28,15 @@ import com.cloud.api.commands.DisableUserCmd; import com.cloud.api.commands.EnableAccountCmd; import com.cloud.api.commands.EnableUserCmd; import com.cloud.api.commands.ListResourceLimitsCmd; -import com.cloud.api.commands.LockAccountCmd; import com.cloud.api.commands.LockUserCmd; import com.cloud.api.commands.UpdateAccountCmd; import com.cloud.api.commands.UpdateResourceLimitCmd; import com.cloud.api.commands.UpdateUserCmd; import com.cloud.configuration.ResourceLimit; +import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.PermissionDeniedException; +import com.cloud.exception.ResourceUnavailableException; public interface AccountService { @@ -88,7 +89,7 @@ public interface AccountService { * @return true if disable was successful, false otherwise * @throws InvalidParameterValueException, PermissionDeniedException */ - Account disableAccount(DisableAccountCmd cmd); + Account disableAccount(DisableAccountCmd cmd) throws InvalidParameterValueException, PermissionDeniedException, ConcurrentOperationException, ResourceUnavailableException; /** * Enables an account by accountId diff --git a/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java b/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java index 783316f7899..c1357c1385d 100755 --- a/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java +++ b/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java @@ -211,7 +211,7 @@ public class VirtualRoutingResource implements Manager { } final Script command = new Script(_vmDataPath, _timeout, s_logger); - command.add("-r", cmd.getRouterPrivateIpAddress()); + command.add("-r", cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP)); command.add("-v", cmd.getVmIpAddress()); command.add("-F", folder); command.add("-f", file); @@ -339,7 +339,7 @@ public class VirtualRoutingResource implements Manager { protected synchronized Answer execute (final DhcpEntryCommand cmd) { final Script command = new Script(_dhcpEntryPath, _timeout, s_logger); - command.add("-r", cmd.getRouterPrivateIpAddress()); + command.add("-r", cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP)); command.add("-v", cmd.getVmIpAddress()); command.add("-m", cmd.getVmMac()); command.add("-n", cmd.getVmName()); diff --git a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java index f518ce54ac6..7520cd70028 100644 --- a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java +++ b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java @@ -126,8 +126,8 @@ import com.cloud.agent.api.routing.IPAssocCommand; import com.cloud.agent.api.routing.IpAssocAnswer; import com.cloud.agent.api.routing.LoadBalancerCfgCommand; import com.cloud.agent.api.routing.LoadBalancerConfigCommand; -import com.cloud.agent.api.routing.RemoteAccessVpnCfgCommand; import com.cloud.agent.api.routing.NetworkElementCommand; +import com.cloud.agent.api.routing.RemoteAccessVpnCfgCommand; import com.cloud.agent.api.routing.SavePasswordCommand; import com.cloud.agent.api.routing.SetPortForwardingRulesAnswer; import com.cloud.agent.api.routing.SetPortForwardingRulesCommand; @@ -1106,7 +1106,7 @@ public abstract class CitrixResourceBase implements ServerResource { protected synchronized Answer execute(final DhcpEntryCommand cmd) { Connection conn = getConnection(); - String args = "-r " + cmd.getRouterPrivateIpAddress(); + String args = "-r " + cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP); args += " -v " + cmd.getVmIpAddress(); args += " -m " + cmd.getVmMac(); args += " -n " + cmd.getVmName(); @@ -1158,7 +1158,7 @@ public abstract class CitrixResourceBase implements ServerResource { protected Answer execute(final VmDataCommand cmd) { Connection conn = getConnection(); - String routerPrivateIpAddress = cmd.getRouterPrivateIpAddress(); + String routerPrivateIpAddress = cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP); String vmIpAddress = cmd.getVmIpAddress(); List vmData = cmd.getVmData(); String[] vmDataArgs = new String[vmData.size() * 2 + 4]; diff --git a/core/src/com/cloud/vm/DomainRouterVO.java b/core/src/com/cloud/vm/DomainRouterVO.java index 0a65117ee9e..3eb47f2aa19 100755 --- a/core/src/com/cloud/vm/DomainRouterVO.java +++ b/core/src/com/cloud/vm/DomainRouterVO.java @@ -1,4 +1,5 @@ /** + * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. * * This software is licensed under the GNU General Public License v3 or later. diff --git a/server/src/com/cloud/consoleproxy/AgentBasedConsoleProxyManager.java b/server/src/com/cloud/consoleproxy/AgentBasedConsoleProxyManager.java index 6c07c7864bf..c953144543c 100644 --- a/server/src/com/cloud/consoleproxy/AgentBasedConsoleProxyManager.java +++ b/server/src/com/cloud/consoleproxy/AgentBasedConsoleProxyManager.java @@ -27,6 +27,7 @@ import org.apache.log4j.Logger; import com.cloud.agent.AgentManager; import com.cloud.agent.api.AgentControlAnswer; +import com.cloud.agent.api.Answer; import com.cloud.agent.api.Command; import com.cloud.agent.api.ConsoleAccessAuthenticationAnswer; import com.cloud.agent.api.ConsoleAccessAuthenticationCommand; @@ -372,7 +373,7 @@ public class AgentBasedConsoleProxyManager implements ConsoleProxyManager, Virtu } @Override - public void finalizeStop(VirtualMachineProfile profile, long hostId, String reservationId) { + public void finalizeStop(VirtualMachineProfile profile, long hostId, String reservationId, Answer... answer) { // TODO Auto-generated method stub } diff --git a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java index a2147189b32..afcfaf43574 100644 --- a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java +++ b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java @@ -2105,6 +2105,6 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx } @Override - public void finalizeStop(VirtualMachineProfile profile, long hostId, String reservationId) { + public void finalizeStop(VirtualMachineProfile profile, long hostId, String reservationId, Answer... answer) { } } diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 05bcb5470a6..f481f97dee0 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -584,6 +584,8 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag event.setParameters("address=" + ipAddress + "\nsourceNat=" + false + "\ndcId=" + zoneId); event.setDescription("Assigned a public IP address: " + ipAddress); _eventDao.persist(event); + + s_logger.debug("Got " + ipAddress + " to assign for account " + owner.getId() + " in zone " + network.getDataCenterId()); txn.commit(); @@ -599,7 +601,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag s_logger.error("Unable to associate ip address due to resource unavailable exception", e); return null; } finally { - if (caller != null) { + if (accountToLock != null) { _accountDao.releaseFromLockTable(ownerId); s_logger.debug("Associate IP address lock released"); } @@ -607,6 +609,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag if (!success) { if (ip != null) { try { + s_logger.warn("Failed to associate ip address " + ip); _ipAddressDao.markAsUnavailable(ip.getAddress(), ip.getAccountId()); applyIpAssociations(network, true); } catch (Exception e) { diff --git a/server/src/com/cloud/network/element/DhcpElement.java b/server/src/com/cloud/network/element/DhcpElement.java index 00871a8c127..3f9767f32d9 100644 --- a/server/src/com/cloud/network/element/DhcpElement.java +++ b/server/src/com/cloud/network/element/DhcpElement.java @@ -106,12 +106,12 @@ public class DhcpElement extends AdapterBase implements NetworkElement{ } @Override - public boolean shutdown(Network network, ReservationContext context) throws ConcurrentOperationException { + public boolean shutdown(Network network, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException { DomainRouterVO router = _routerDao.findByNetworkConfiguration(network.getId()); if (router == null) { return true; } - return _routerMgr.stopRouter(router.getId()); + return _routerMgr.stopRouterInternal(router.getId()); } @Override diff --git a/server/src/com/cloud/network/element/VirtualRouterElement.java b/server/src/com/cloud/network/element/VirtualRouterElement.java index 5f18c62659f..c6a365c3e9f 100644 --- a/server/src/com/cloud/network/element/VirtualRouterElement.java +++ b/server/src/com/cloud/network/element/VirtualRouterElement.java @@ -49,6 +49,7 @@ import com.cloud.network.lb.LoadBalancingRulesManager; import com.cloud.network.router.VirtualNetworkApplianceManager; import com.cloud.network.rules.FirewallRule; import com.cloud.network.rules.FirewallRule.Purpose; +import com.cloud.network.rules.PortForwardingRule; import com.cloud.network.vpn.RemoteAccessVpnElement; import com.cloud.offering.NetworkOffering; import com.cloud.offering.NetworkOffering.GuestIpType; @@ -122,12 +123,12 @@ public class VirtualRouterElement extends AdapterBase implements NetworkElement, } @Override - public boolean shutdown(Network config, ReservationContext context) throws ConcurrentOperationException { + public boolean shutdown(Network config, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException { DomainRouterVO router = _routerDao.findByNetworkConfiguration(config.getId()); if (router == null) { return true; } - return _routerMgr.stopRouter(router.getId()); + return _routerMgr.stopRouterInternal(router.getId()); } @Override @@ -157,7 +158,7 @@ public class VirtualRouterElement extends AdapterBase implements NetworkElement, return _routerMgr.applyLBRules(config, lbRules); } else if (rules.get(0).getPurpose() == Purpose.PortForwarding) { - return _routerMgr.applyPortForwardingRules(config, rules); + return _routerMgr.applyPortForwardingRules(config, (List)rules); } } else { return true; diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManager.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManager.java index a9bed9f9840..4da4f716351 100644 --- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManager.java +++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManager.java @@ -31,10 +31,9 @@ import com.cloud.exception.ResourceUnavailableException; import com.cloud.network.Network; import com.cloud.network.PublicIpAddress; import com.cloud.network.RemoteAccessVpn; -import com.cloud.network.RemoteAccessVpnVO; import com.cloud.network.VpnUser; -import com.cloud.network.VpnUserVO; -import com.cloud.network.rules.FirewallRule; +import com.cloud.network.lb.LoadBalancingRule; +import com.cloud.network.rules.PortForwardingRule; import com.cloud.user.Account; import com.cloud.uservm.UserVm; import com.cloud.utils.component.Manager; @@ -68,27 +67,11 @@ public interface VirtualNetworkApplianceManager extends Manager { */ boolean savePasswordToRouter(long routerId, String vmIpAddress, String password); - boolean destroyRouter(long routerId); + boolean destroyRouterInternal(long routerId) throws ResourceUnavailableException, ConcurrentOperationException; - boolean stopRouter(long routerId); + boolean stopRouterInternal(long routerId) throws ResourceUnavailableException, ConcurrentOperationException; boolean getRouterStatistics(long vmId, Map netStats, Map diskStats); - - boolean rebootRouter(long routerId); - - VirtualRouter startRouter(long routerId) throws ResourceUnavailableException, InsufficientCapacityException, ConcurrentOperationException; - - /** - * @param hostId get all of the virtual machine routers on a host. - * @return collection of VirtualMachineRouter - */ - List getRouters(long hostId); - - /** - * @param routerId id of the router - * @return VirtualMachineRouter - */ - DomainRouterVO getRouter(long routerId); VirtualRouter upgradeRouter(UpgradeRouterCmd cmd) throws InvalidParameterValueException, PermissionDeniedException; @@ -101,16 +84,14 @@ public interface VirtualNetworkApplianceManager extends Manager { boolean startRemoteAccessVpn(Network network, RemoteAccessVpn vpn) throws ResourceUnavailableException; - boolean addRemoveVpnUsers(RemoteAccessVpnVO vpnVO, List addUsers, List removeUsers); - boolean deleteRemoteAccessVpn(Network network, RemoteAccessVpn vpn) throws ResourceUnavailableException; VirtualRouter addVirtualMachineIntoNetwork(Network config, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context, Boolean startDhcp) throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException; boolean associateIP (Network network, List ipAddress) throws ResourceUnavailableException; - boolean applyLBRules(Network network, List rules) throws ResourceUnavailableException; - boolean applyPortForwardingRules(Network network, List rules) throws AgentUnavailableException; + boolean applyLBRules(Network network, List rules) throws ResourceUnavailableException; + boolean applyPortForwardingRules(Network network, List rules) throws AgentUnavailableException; String[] applyVpnUsers(Network network, List users) throws ResourceUnavailableException; diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java index 06e3494da8e..d09b9735844 100644 --- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java +++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java @@ -61,9 +61,6 @@ import com.cloud.agent.api.to.IpAddressTO; import com.cloud.agent.api.to.LoadBalancerTO; import com.cloud.agent.manager.Commands; import com.cloud.alert.AlertManager; -import com.cloud.api.commands.RebootRouterCmd; -import com.cloud.api.commands.StartRouterCmd; -import com.cloud.api.commands.StopRouterCmd; import com.cloud.api.commands.UpgradeRouterCmd; import com.cloud.async.AsyncJobExecutor; import com.cloud.async.AsyncJobManager; @@ -104,6 +101,7 @@ import com.cloud.hypervisor.Hypervisor; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.network.IPAddressVO; import com.cloud.network.IpAddress; +import com.cloud.network.LoadBalancerVO; import com.cloud.network.Network; import com.cloud.network.NetworkManager; import com.cloud.network.NetworkVO; @@ -112,7 +110,6 @@ import com.cloud.network.Networks.IsolationType; import com.cloud.network.Networks.TrafficType; import com.cloud.network.PublicIpAddress; import com.cloud.network.RemoteAccessVpn; -import com.cloud.network.RemoteAccessVpnVO; import com.cloud.network.SshKeysDistriMonitor; import com.cloud.network.VirtualNetworkApplianceService; import com.cloud.network.VpnUser; @@ -128,10 +125,13 @@ import com.cloud.network.dao.RemoteAccessVpnDao; import com.cloud.network.dao.VpnUserDao; import com.cloud.network.lb.LoadBalancingRule; import com.cloud.network.lb.LoadBalancingRule.LbDestination; +import com.cloud.network.lb.LoadBalancingRulesManager; import com.cloud.network.router.VirtualRouter.Role; import com.cloud.network.rules.FirewallRule; import com.cloud.network.rules.PortForwardingRule; +import com.cloud.network.rules.PortForwardingRuleVO; import com.cloud.network.rules.RulesManager; +import com.cloud.network.rules.dao.PortForwardingRulesDao; import com.cloud.offering.NetworkOffering; import com.cloud.offering.NetworkOffering.GuestIpType; import com.cloud.offerings.NetworkOfferingVO; @@ -172,6 +172,7 @@ import com.cloud.vm.NicProfile; import com.cloud.vm.NicVO; import com.cloud.vm.ReservationContext; import com.cloud.vm.State; +import com.cloud.vm.UserVmVO; import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachineGuru; import com.cloud.vm.VirtualMachineManager; @@ -282,10 +283,15 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian RulesManager _rulesMgr; @Inject NetworkDao _networkDao; + @Inject + LoadBalancingRulesManager _lbMgr; + @Inject + PortForwardingRulesDao _pfRulesDao; + @Inject + RemoteAccessVpnDao _vpnDao; long _routerTemplateId = -1; int _routerRamSize; - // String _privateNetmask; int _retry = 2; String _domain; String _instance; @@ -329,7 +335,7 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian } @Override - public boolean destroyRouter(final long routerId) { + public boolean destroyRouterInternal(final long routerId) throws ResourceUnavailableException, ConcurrentOperationException{ if (s_logger.isDebugEnabled()) { s_logger.debug("Attempting to destroy router " + routerId); @@ -349,15 +355,10 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian } return true; } - - long startEventId = EventUtils.saveStartedEvent(User.UID_SYSTEM, router.getAccountId(), EventTypes.EVENT_ROUTER_STOP, "Starting to stop router : " + router.getName()); - if (!stop(router)) { - s_logger.debug("Unable to stop the router: " + routerId); - EventUtils.saveEvent(User.UID_SYSTEM, router.getAccountId(), EventVO.LEVEL_ERROR, EventTypes.EVENT_ROUTER_STOP, "Unable to stop router: " + router.getName(), startEventId); + + if (stopRouterInternal(router.getId())) { return false; - } else { - EventUtils.saveEvent(User.UID_SYSTEM, router.getAccountId(), EventVO.LEVEL_INFO, EventTypes.EVENT_ROUTER_STOP, "successfully stopped router : " + router.getName(), startEventId); - } + } router = _routerDao.findById(routerId); if (!_itMgr.stateTransitTo(router, VirtualMachine.Event.DestroyRequested, router.getHostId())) { @@ -467,143 +468,35 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian return false; } } - - @Override - public VirtualRouter startRouter(StartRouterCmd cmd) throws InvalidParameterValueException, PermissionDeniedException, - ResourceUnavailableException, InsufficientCapacityException, ConcurrentOperationException { - return startRouter(cmd.getId()); - } - -// private boolean resendRouterState(final DomainRouterVO router) { -// if (router.getRole() == Role.DHCP_FIREWALL_LB_PASSWD_USERDATA) { -// //source NAT address is stored in /proc/cmdline of the domR and gets -// //reassigned upon powerup. Source NAT rule gets configured in StartRouter command -// final List ipAddrs = _networkMgr.listPublicIpAddressesInVirtualNetwork(router.getAccountId(), router.getDataCenterId(), null); -// final List ipAddrList = new ArrayList(); -// for (final IPAddressVO ipVO : ipAddrs) { -// ipAddrList.add(ipVO.getAddress()); -// } -// if (!ipAddrList.isEmpty()) { -// try { -// final boolean success = _networkMgr.associateIP(router, ipAddrList, true, 0); -// if (!success) { -// return false; -// } -// } catch (ConcurrentOperationException e) { -// s_logger.warn("unable to associate ip due to ", e); -// return false; -// } -// } -// final List fwRules = new ArrayList(); -////FIXME: for (final IPAddressVO ipVO : ipAddrs) { -//// //We need only firewall rules that are either forwarding or for load balancers -//// fwRules.addAll(_rulesDao.listIPForwarding(ipVO.getAddress(), true)); -//// fwRules.addAll(_rulesDao.listIpForwardingRulesForLoadBalancers(ipVO.getAddress())); -//// } -//// final List result = _networkMgr.updateFirewallRules(router -//// .getPublicIpAddress(), fwRules, router); -//// if (result.size() != fwRules.size()) { -//// return false; -//// } -// } -// return resendDhcpEntries(router) && resendVpnServerData(router); -// -// } - private boolean resendDhcpEntries(final DomainRouterVO router){ - final List vms = _vmDao.listBy(router.getId(), State.Creating, State.Starting, State.Running, State.Stopping, State.Stopped, State.Migrating); - Commands cmds = new Commands(OnError.Continue); - for (UserVm vm: vms) { - if (vm.getGuestIpAddress() == null || vm.getGuestMacAddress() == null || vm.getName() == null) { - continue; - } - DhcpEntryCommand decmd = new DhcpEntryCommand(vm.getGuestMacAddress(), vm.getGuestIpAddress(), router.getPrivateIpAddress(), vm.getName()); - cmds.addCommand(decmd); - } - if (cmds.size() > 0) { - try { - _agentMgr.send(router.getHostId(), cmds); - } catch (final AgentUnavailableException e) { - s_logger.warn("agent unavailable", e); - } catch (final OperationTimedoutException e) { - s_logger.warn("Timed Out", e); - } - Answer[] answers = cmds.getAnswers(); - if (answers == null) { - return false; - } - int i = 0; - while (i < cmds.size()) { - Answer ans = answers[i]; - i++; - if ((ans != null) && (ans.getResult())) { - continue; - } else { - return false; - } - } - } - return true; - } - - /* - * private boolean resendUserData(final DomainRouterVO router){ - * final List vms = _vmDao.listByRouterId(router.getId()); - * final List cmdList = new ArrayList(); - * for (UserVmVO vm: vms) { - * if (vm.getGuestIpAddress() == null || vm.getGuestMacAddress() == null || - * vm.getName() == null) - * continue; - * if (vm.getUserData() == null) - * continue; - * UserDataCommand userDataCmd = new UserDataCommand(vm.getUserData(), - * vm.getGuestIpAddress(), router.getPrivateIpAddress(), vm.getName()); - * cmdList.add(userDataCmd); - * } - * final Command [] cmds = new Command[cmdList.size()]; - * Answer [] answers = null; - * try { - * answers = _agentMgr.send(router.getHostId(), cmdList.toArray(cmds), - * false); - * } catch (final AgentUnavailableException e) { - * s_logger.warn("agent unavailable", e); - * } catch (final OperationTimedoutException e) { - * s_logger.warn("Timed Out", e); - * } - * if (answers == null ){ - * return false; - * } - * int i=0; - * while (i < cmdList.size()) { - * Answer ans = answers[i]; - * i++; - * if ((ans != null) && (ans.getResult())) { - * continue; - * } else { - * return false; - * } - * } - * return true; - * } - */ - -// private boolean resendVpnServerData(final DomainRouterVO router) { -// RemoteAccessVpnVO vpnVO = _remoteAccessVpnDao.findByAccountAndNetwork(router.getAccountId(), router.getDataCenterId()); -// -// if (vpnVO != null) { -// try { -// vpnVO = startRemoteAccessVpn(vpnVO); -// } catch (ResourceUnavailableException e) { -// s_logger.warn("Unable to resend vpn server information to restarted router: " + router.getInstanceName()); -// return false; -// } -// return (vpnVO != null); -// } -// return true; -// } - + @Override - public boolean stopRouter(final long routerId) { + public VirtualRouter stopRouter(long routerId) throws ResourceUnavailableException, ConcurrentOperationException { + UserContext context = UserContext.current(); + Account account = context.getCaller(); + + // verify parameters + DomainRouterVO router = _routerDao.findById(routerId); + if (router == null) { + throw new InvalidParameterValueException("Unable to find router by id " + routerId + "."); + } + + _accountMgr.checkAccess(account, router); + + UserVO user = _userDao.findById(UserContext.current().getCallerUserId()); + + return this.stop(router, user, account); + } + + + @Override + public boolean stopRouterInternal(long routerId) throws ResourceUnavailableException, ConcurrentOperationException { + + DomainRouterVO router = _routerDao.findById(routerId); + if (router == null) { + throw new InvalidParameterValueException("Unable to find router by id " + routerId + "."); + } + AsyncJobExecutor asyncExecutor = BaseAsyncJobExecutor.getCurrentExecutor(); if (asyncExecutor != null) { AsyncJobVO job = asyncExecutor.getJob(); @@ -613,28 +506,26 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian } _asyncMgr.updateAsyncJobAttachment(job.getId(), "domain_router", routerId); } - - if (s_logger.isDebugEnabled()) { - s_logger.debug("Stopping router " + routerId); - } - DomainRouterVO router = _routerDao.findById(routerId); + long startEventId = EventUtils.saveStartedEvent(User.UID_SYSTEM, router.getAccountId(), EventTypes.EVENT_ROUTER_STOP, "Starting to stop router : " + router.getName()); - if (!stop(router)) { - s_logger.debug("Unable to stop the router: " + routerId); - EventUtils.saveEvent(User.UID_SYSTEM, router.getAccountId(), EventVO.LEVEL_ERROR, EventTypes.EVENT_ROUTER_STOP, "Unable to stop router: " + router.getName(), startEventId); - return false; - } else { - EventUtils.saveEvent(User.UID_SYSTEM, router.getAccountId(), EventVO.LEVEL_INFO, EventTypes.EVENT_ROUTER_STOP, "successfully stopped router : " + router.getName(), startEventId); + + Account account = _accountDao.findById(router.getAccountId()); + + //If domR is stopped, not need to stop it again + if (router.getState() == State.Stopped) { + s_logger.debug("domR is already stopped: " + router); return true; + } else { + if (this.stop(router, _accountService.getSystemUser(), account) == null) { + EventUtils.saveEvent(User.UID_SYSTEM, router.getAccountId(), EventVO.LEVEL_ERROR, EventTypes.EVENT_ROUTER_STOP, "Unable to stop router: " + router.getName(), startEventId); + return false; + } else { + EventUtils.saveEvent(User.UID_SYSTEM, router.getAccountId(), EventVO.LEVEL_INFO, EventTypes.EVENT_ROUTER_STOP, "successfully stopped router : " + router.getName(), startEventId); + return true; + } } } - - @Override - public VirtualRouter stopRouter(StopRouterCmd cmd) throws InvalidParameterValueException, PermissionDeniedException, - ResourceUnavailableException, ConcurrentOperationException { - return stopDomainRouter(cmd.getId()); - } - + @DB public void processStopOrRebootAnswer(final DomainRouterVO router, Answer answer) { final Transaction txn = Transaction.currentTxn(); @@ -671,11 +562,13 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian userStats.setNetBytesSent(userStats.getNetBytesSent() + netBytes); userStats.setCurrentBytesSent(0); _userStatsDao.update(userStats.getId(), userStats); + s_logger.debug("Successfully updated user statistics as a part of domR id=" + router.getId() + " reboot/stop"); } else { s_logger.warn("User stats were not created for account " + router.getAccountId() + " and dc " + router.getDataCenterId()); } txn.commit(); } catch (final Exception e) { + txn.rollback(); throw new CloudRuntimeException("Problem getting stats after reboot/stop ", e); } } @@ -706,54 +599,7 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian } @Override - public boolean rebootRouter(final long routerId) { - AsyncJobExecutor asyncExecutor = BaseAsyncJobExecutor.getCurrentExecutor(); - if (asyncExecutor != null) { - AsyncJobVO job = asyncExecutor.getJob(); - - if (s_logger.isInfoEnabled()) { - s_logger.info("Reboot router " + routerId + ", update async job-" + job.getId()); - } - _asyncMgr.updateAsyncJobAttachment(job.getId(), "domain_router", routerId); - } - - final DomainRouterVO router = _routerDao.findById(routerId); - - if (router == null || router.getState() == State.Destroyed) { - return false; - } - - return false; - - // FIXME Alena if (router.getState() == State.Running && - // router.getHostId() != null) { - // final RebootRouterCommand cmd = new - // RebootRouterCommand(router.getInstanceName(), - // router.getPrivateIpAddress()); - // final RebootAnswer answer = - // (RebootAnswer)_agentMgr.easySend(router.getHostId(), cmd); - // - // if (answer != null && resendRouterState(router)) { - // processStopOrRebootAnswer(router, answer); - // event.setDescription("successfully rebooted Domain Router : " + - // router.getName()); - // _eventDao.persist(event); - // return true; - // } else { - // event.setDescription("failed to reboot Domain Router : " + - // router.getName()); - // event.setLevel(EventVO.LEVEL_ERROR); - // _eventDao.persist(event); - // return false; - // } - // } else { - // return startRouter(routerId, 0) != null; - // } - } - - @Override - public VirtualRouter rebootRouter(RebootRouterCmd cmd) throws InvalidParameterValueException, PermissionDeniedException { - Long routerId = cmd.getId(); + public VirtualRouter rebootRouter(long routerId) throws InvalidParameterValueException, PermissionDeniedException, ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException { Account account = UserContext.current().getCaller(); // verify parameters @@ -765,22 +611,20 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian if ((account != null) && !_domainDao.isChildDomain(account.getDomainId(), router.getDomainId())) { throw new PermissionDeniedException("Unable to reboot domain router with id " + routerId + ". Permission denied"); } - - if (rebootRouter(routerId)) { - return _routerDao.findById(routerId); - } else { - throw new CloudRuntimeException("Fail to reboot router " + routerId); + + //Can reboot domain router only in Running state + if (router == null || router.getState() != State.Running) { + s_logger.warn("Unable to reboot, virtual router is not in the right state " + router.getState()); + throw new ResourceUnavailableException("Unable to reboot domR, it is not in right state " + router.getState(), DataCenter.class, router.getDataCenterId()); + } + + s_logger.debug("Stopping and starting router id=" + router.getId() + " as a part of router reboot"); + + if (stopRouter(routerId) != null) { + return startRouter(routerId); + } else { + throw new CloudRuntimeException("Failed to reboot router id=" + router.getId()); } - } - - @Override - public DomainRouterVO getRouter(final long routerId) { - return _routerDao.findById(routerId); - } - - @Override - public List getRouters(final long hostId) { - return _routerDao.listByHostId(hostId); } @Override @@ -796,12 +640,6 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian _mgmt_host = configs.get("host"); _routerRamSize = NumbersUtil.parseInt(configs.get("router.ram.size"), 128); - // String value = configs.get("guest.ip.network"); - // _guestIpAddress = value != null ? value : "10.1.1.1"; - // - // value = configs.get("guest.netmask"); - // _guestNetmask = value != null ? value : "255.255.255.0"; - String value = configs.get("start.retry"); _retry = NumbersUtil.parseInt(value, 2); @@ -943,7 +781,7 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian @Override public DomainRouterVO get(final long id) { - return getRouter(id); + return findById(id); } @Override @@ -955,118 +793,6 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian return VirtualMachineName.getRouterId(vmName); } - private boolean sendStopCommand(DomainRouterVO router) { - final StopCommand stop = new StopCommand(router, router.getInstanceName(), router.getVnet()); - - Answer answer = null; - boolean stopped = false; - try { - answer = _agentMgr.send(router.getHostId(), stop); - if (!answer.getResult()) { - s_logger.error("Unable to stop router"); - } else { - stopped = true; - } - } catch (AgentUnavailableException e) { - s_logger.warn("Unable to reach agent to stop vm: " + router.getId()); - } catch (OperationTimedoutException e) { - s_logger.warn("Unable to reach agent to stop vm: " + router.getId()); - s_logger.error("Unable to stop router"); - } - - return stopped; - } - - @Override - @DB - public boolean stop(DomainRouterVO router) { - long routerId = router.getId(); - - router = _routerDao.acquireInLockTable(routerId); - if (router == null) { - s_logger.debug("Unable to acquire lock on router " + routerId); - return false; - } - - try { - - if (s_logger.isDebugEnabled()) { - s_logger.debug("Lock on router " + routerId + " for stop is acquired"); - } - - if (router.getRemoved() != null) { - s_logger.debug("router " + routerId + " is removed"); - return false; - } - - final Long hostId = router.getHostId(); - final State state = router.getState(); - if (state == State.Stopped || state == State.Destroyed || state == State.Expunging || router.getRemoved() != null) { - s_logger.debug("Router was either not found or the host id is null"); - return true; - } - - EventVO event = new EventVO(); - event.setUserId(1L); - event.setAccountId(router.getAccountId()); - event.setType(EventTypes.EVENT_ROUTER_STOP); - - if (!_itMgr.stateTransitTo(router, VirtualMachine.Event.StopRequested, hostId)) { - s_logger.debug("VM " + router.toString() + " is not in a state to be stopped."); - return false; - } - - if (hostId == null) { - s_logger.debug("VM " + router.toString() + " doesn't have a host id"); - return false; - } - - final StopCommand stop = new StopCommand(router, router.getInstanceName(), router.getVnet(), router.getPrivateIpAddress()); - - Answer answer = null; - boolean stopped = false; - try { - answer = _agentMgr.send(hostId, stop); - if (!answer.getResult()) { - s_logger.error("Unable to stop router"); - event.setDescription("failed to stop Domain Router : " + router.getName()); - event.setLevel(EventVO.LEVEL_ERROR); - _eventDao.persist(event); - } else { - stopped = true; - } - } catch (AgentUnavailableException e) { - s_logger.warn("Unable to reach agent to stop vm: " + router.getId()); - } catch (OperationTimedoutException e) { - s_logger.warn("Unable to reach agent to stop vm: " + router.getId()); - s_logger.error("Unable to stop router"); - } - - if (!stopped) { - event.setDescription("failed to stop Domain Router : " + router.getName()); - event.setLevel(EventVO.LEVEL_ERROR); - _eventDao.persist(event); - _itMgr.stateTransitTo(router, VirtualMachine.Event.OperationFailed, router.getHostId()); - return false; - } - - completeStopCommand(router, VirtualMachine.Event.OperationSucceeded); - event.setDescription("successfully stopped Domain Router : " + router.getName()); - _eventDao.persist(event); - if (s_logger.isDebugEnabled()) { - s_logger.debug("Router " + router.toString() + " is stopped"); - } - - processStopOrRebootAnswer(router, answer); - } finally { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Release lock on router " + routerId + " for stop"); - } - _routerDao.releaseFromLockTable(routerId); - } - return true; - } - @Override public HostVO prepareForMigration(final DomainRouterVO router) throws StorageUnavailableException { final long routerId = router.getId(); @@ -1179,7 +905,7 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian s_logger.info("Found " + ids.size() + " routers to stop. "); for (final Long id : ids) { - stopRouter(id); + stopRouterInternal(id); } s_logger.info("Done my job. Time to rest."); } catch (Exception e) { @@ -1188,17 +914,20 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian } } - private VmDataCommand generateVmDataCommand(String routerPrivateIpAddress, String routerPublicIpAddress, String vmPrivateIpAddress, + private VmDataCommand generateVmDataCommand(VirtualRouter router, String vmPrivateIpAddress, String userData, String serviceOffering, String zoneName, String guestIpAddress, String vmName, String vmInstanceName, long vmId) { - VmDataCommand cmd = new VmDataCommand(routerPrivateIpAddress, vmPrivateIpAddress); + VmDataCommand cmd = new VmDataCommand(vmPrivateIpAddress); + + cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, router.getPrivateIpAddress()); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); cmd.addVmData("userdata", "user-data", userData); cmd.addVmData("metadata", "service-offering", serviceOffering); cmd.addVmData("metadata", "availability-zone", zoneName); cmd.addVmData("metadata", "local-ipv4", guestIpAddress); cmd.addVmData("metadata", "local-hostname", vmName); - cmd.addVmData("metadata", "public-ipv4", routerPublicIpAddress); - cmd.addVmData("metadata", "public-hostname", routerPublicIpAddress); + cmd.addVmData("metadata", "public-ipv4", router.getPublicIpAddress()); + cmd.addVmData("metadata", "public-hostname", router.getPublicIpAddress()); cmd.addVmData("metadata", "instance-id", vmInstanceName); cmd.addVmData("metadata", "vm-id", String.valueOf(vmId)); @@ -1345,7 +1074,7 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian State state = router.getState(); if (state != State.Starting && state != State.Running) { long startEventId = EventUtils.saveStartedEvent(User.UID_SYSTEM, owner.getId(), EventTypes.EVENT_ROUTER_START, "Starting router : " +router.getName()); - router = _itMgr.start(router, null, _accountService.getSystemUser(), _accountService.getSystemAccount(), null); + router = this.start(router, _accountService.getSystemUser(), _accountService.getSystemAccount()); if(router != null){ EventUtils.saveEvent(User.UID_SYSTEM, owner.getAccountId(), EventVO.LEVEL_INFO, EventTypes.EVENT_ROUTER_START, "successfully started router : " + router.getName(), startEventId); } else { @@ -1399,7 +1128,7 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian State state = router.getState(); if (state != State.Starting && state != State.Running) { long startEventId = EventUtils.saveStartedEvent(User.UID_SYSTEM, owner.getId(), EventTypes.EVENT_ROUTER_START, "Starting router : " +router.getName()); - router = _itMgr.start(router, null, _accountService.getSystemUser(), _accountService.getSystemAccount(), null); + router = this.start(router, _accountService.getSystemUser(), _accountService.getSystemAccount()); if(router != null){ EventUtils.saveEvent(User.UID_SYSTEM, owner.getAccountId(), EventVO.LEVEL_INFO, EventTypes.EVENT_ROUTER_START, "successfully started router : " + router.getName(), startEventId); } else { @@ -1489,7 +1218,7 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian } @Override - public boolean finalizeDeployment(Commands cmds, VirtualMachineProfile profile, DeployDestination dest, ReservationContext context) { + public boolean finalizeDeployment(Commands cmds, VirtualMachineProfile profile, DeployDestination dest, ReservationContext context) throws ResourceUnavailableException{ NicProfile controlNic = (NicProfile) profile.getParameter("control.nic"); cmds.addCommand("checkSsh", new CheckSshCommand(profile.getInstanceName(), controlNic.getIp4Address(), 3922, 5, 20)); @@ -1512,23 +1241,78 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian } } _routerDao.update(router.getId(), router); - //source NAT address is stored in /proc/cmdline of the domR and gets - //reassigned upon powerup. Source NAT rule gets configured in StartRouter command - //The command should be sent for domR only, skip for DHCP + + + //The commands should be sent for domR only, skip for DHCP if (router.getRole() == VirtualRouter.Role.DHCP_FIREWALL_LB_PASSWD_USERDATA) { - final List userIps = _networkMgr.listPublicIpAddressesInVirtualNetwork(router.getAccountId(), router.getDataCenterId(), null); + long networkId = router.getNetworkId(); + long ownerId = router.getAccountId(); + long zoneId = router.getDataCenterId(); + + + final List userIps = _networkMgr.listPublicIpAddressesInVirtualNetwork(ownerId, zoneId, null); List publicIps = new ArrayList(); if (userIps != null && !userIps.isEmpty()) { for (IPAddressVO userIp : userIps) { PublicIp publicIp = new PublicIp(userIp, _vlanDao.findById(userIp.getVlanId()), userIp.getMacAddress()); publicIps.add(publicIp); } - } + + s_logger.debug("Found " + publicIps.size() + " ip(s) to apply as a part of domR " + router.getId() + " start."); + if (!publicIps.isEmpty()) { - cmds = getAssociateIPCommands(router, publicIps, cmds, 0); - } + + //Re-apply public ip addresses - should come before PF/LB/VPN + createAssociateIPCommands(router, publicIps, cmds, 0); + + //Re-apply port forwarding rules for all public ips + List rulesToReapply = new ArrayList(); + List vpns = new ArrayList(); + + for (PublicIpAddress ip : publicIps) { + List rules = _pfRulesDao.listForApplication(ip.getAddress()); + rulesToReapply.addAll(rules); + RemoteAccessVpn vpn = _vpnDao.findById(ip.getAddress()); + if (vpn != null) { + vpns.add(vpn); + } + } + + s_logger.debug("Found " + rulesToReapply.size() + " port forwarding rule(s) to apply as a part of domR " + router.getId() + " start."); + if (!rulesToReapply.isEmpty()) { + createApplyPortForwardingRulesCommands(rulesToReapply, router, cmds); + } + + s_logger.debug("Found " + vpns.size() + " vpn(s) to apply as a part of domR " + router.getId() + " start."); + if (!vpns.isEmpty()) { + for (RemoteAccessVpn vpn : vpns) { + createApplyVpnCommands(vpn, router, cmds); + } + } + + //Re-apply load balancing rules + List lbs = _loadBalancerDao.listByNetworkId(networkId); + List lbRules = new ArrayList(); + for (LoadBalancerVO lb : lbs) { + List dstList = _lbMgr.getExistingDestinations(lb.getId()); + LoadBalancingRule loadBalancing = new LoadBalancingRule(lb, dstList); + lbRules.add(loadBalancing); + } + + s_logger.debug("Found " + lbRules.size() + " load balancing rule(s) to apply as a part of domR " + router.getId() + " start."); + if (!lbRules.isEmpty()) { + createApplyLoadBalancingRulesCommands(lbRules, router, cmds); + } + + //Resend dhcp + createDhcpEntriesCommands(router, cmds); + + //Resend user data + createUserDataCommands(router, cmds); + } } + return true; } @@ -1544,7 +1328,10 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian } @Override - public void finalizeStop(VirtualMachineProfile profile, long hostId, String reservationId) { + public void finalizeStop(VirtualMachineProfile profile, long hostId, String reservationId, Answer... answer) { + if (answer != null && answer.length > 0) { + processStopOrRebootAnswer(profile.getVirtualMachine(), answer[0]); + } } @Override @@ -1560,31 +1347,10 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian throw new ResourceUnavailableException("Unable to assign ip addresses, domR is not in right state " + router.getState(), DataCenter.class, network.getDataCenterId()); } - List vpnUsers = _vpnUsersDao.listByAccount(vpn.getAccountId()); - List addUsers = new ArrayList(); - List removeUsers = new ArrayList(); - for (VpnUser user: vpnUsers) { - if (user.getState() == VpnUser.State.Add) { - addUsers.add(user); - } else if (user.getState() == VpnUser.State.Revoke) { - removeUsers.add(user); - } - } - - VpnUsersCfgCommand addUsersCmd = new VpnUsersCfgCommand(addUsers, removeUsers); - addUsersCmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, router.getPrivateIpAddress()); - addUsersCmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); - - RemoteAccessVpnCfgCommand startVpnCmd = new RemoteAccessVpnCfgCommand(true, vpn.getServerAddress().addr(), - vpn.getLocalIp(), vpn.getIpRange(), vpn.getIpsecPresharedKey()); - startVpnCmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, router.getPrivateIpAddress()); - startVpnCmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); - Commands cmds = new Commands(OnError.Stop); - cmds.addCommand("users", addUsersCmd); - cmds.addCommand("startVpn", startVpnCmd); - //return sendCommandsToRouter(router, cmds); + createApplyVpnCommands(vpn, router, cmds); + try { _agentMgr.send(router.getHostId(), cmds); } catch (OperationTimedoutException e) { @@ -1619,7 +1385,7 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian } if (router.getState() != State.Running) { s_logger.warn("Failed to delete remote access VPN: router not in running state"); - throw new ResourceUnavailableException("Unable to assign ip addresses, domR is not in right state " + router.getState(), DataCenter.class, network.getDataCenterId()); + throw new ResourceUnavailableException("Failed to delete remote access VPN: domR is not in right state " + router.getState(), DataCenter.class, network.getDataCenterId()); } Commands cmds = new Commands(OnError.Continue); RemoteAccessVpnCfgCommand removeVpnCmd = new RemoteAccessVpnCfgCommand(false, vpn.getServerAddress().addr(), vpn.getLocalIp(), vpn.getIpRange(), vpn.getIpsecPresharedKey()); @@ -1630,15 +1396,25 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian return sendCommandsToRouter(router, cmds); } - public DomainRouterVO start(long routerId, User user, Account caller) throws StorageUnavailableException, InsufficientCapacityException, + private DomainRouterVO start(DomainRouterVO router, User user, Account caller) throws StorageUnavailableException, InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException { - return start(_routerDao.findById(routerId), user, caller); + s_logger.debug("Starting router id=" + router.getId()); + if (_itMgr.start(router, null, user, caller, null) != null) { + return _routerDao.findById(router.getId()); + } else { + return null; + } } - - public DomainRouterVO start(DomainRouterVO router, User user, Account caller) throws StorageUnavailableException, InsufficientCapacityException, - ConcurrentOperationException, ResourceUnavailableException { - return _itMgr.start(router, null, user, caller, null); + + private DomainRouterVO stop(DomainRouterVO router, User user, Account caller) throws ConcurrentOperationException, ResourceUnavailableException { + s_logger.debug("Stopping router id=" + router.getId()); + if (_itMgr.stop(router, user, caller)) { + return _routerDao.findById(router.getId()); + } else { + return null; + } } + @Override public VirtualRouter addVirtualMachineIntoNetwork(Network network, NicProfile nic, VirtualMachineProfile profile, DeployDestination dest, @@ -1649,20 +1425,22 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian String password = profile.getVirtualMachine().getPassword(); String userData = profile.getVirtualMachine().getUserData(); Commands cmds = new Commands(OnError.Stop); - String routerPublicIpAddress = nic.getIp4Address(); + String routerControlIpAddress = null; List nics = _nicDao.listBy(router.getId()); for (NicVO n : nics) { NetworkVO nc = _networksDao.findById(n.getNetworkId()); - if (n.getIp4Address() != null && nc.getTrafficType() == TrafficType.Public) { - routerPublicIpAddress = nic.getIp4Address(); - } else if (nc.getTrafficType() == TrafficType.Control) { + if (nc.getTrafficType() == TrafficType.Control) { routerControlIpAddress = n.getIp4Address(); } } - - cmds.addCommand("dhcp", new DhcpEntryCommand(nic.getMacAddress(), nic.getIp4Address(), routerControlIpAddress, profile.getVirtualMachine() - .getName())); + + DhcpEntryCommand dhcpCommand = new DhcpEntryCommand(nic.getMacAddress(), nic.getIp4Address(), profile.getVirtualMachine() + .getName()); + dhcpCommand.setAccessDetail(NetworkElementCommand.ROUTER_IP, routerControlIpAddress); + dhcpCommand.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); + cmds.addCommand("dhcp", dhcpCommand); + if (password != null) { final String encodedPassword = rot13(password); cmds.addCommand("password", new SavePasswordCommand(encodedPassword, nic.getIp4Address(), routerControlIpAddress, profile @@ -1671,10 +1449,10 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian String serviceOffering = _serviceOfferingDao.findById(profile.getServiceOfferingId()).getDisplayText(); String zoneName = _dcDao.findById(network.getDataCenterId()).getName(); - + cmds.addCommand( "vmdata", - generateVmDataCommand(routerControlIpAddress, routerPublicIpAddress, nic.getIp4Address(), userData, serviceOffering, zoneName, + generateVmDataCommand(router, nic.getIp4Address(), userData, serviceOffering, zoneName, nic.getIp4Address(), profile.getVirtualMachine().getName(), profile.getVirtualMachine().getInstanceName(), profile.getId())); try { @@ -1707,37 +1485,7 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian @Override public DomainRouterVO persist(DomainRouterVO router) { return _routerDao.persist(router); - } - - @Override - public boolean addRemoveVpnUsers(RemoteAccessVpnVO vpnVO, List addUsers, List removeUsers) { - return false; -// DomainRouterVO router = getRouter(vpnVO.getAccountId(), vpnVO.getZoneId()); -// if (router == null) { -// s_logger.warn("Failed to add/remove VPN users: no router found for account and zone"); -// return false; -// } -// if (router.getState() != State.Running) { -// s_logger.warn("Failed to add/remove VPN users: router not in running state"); -// return false; -// } -// try { -// Answer answer = _agentMgr.send(router.getHostId(), new VpnUsersCfgCommand(router.getPrivateIpAddress(), addUsers, removeUsers)); -// if (answer != null && answer.getResult()) { -// return true; -// } else { -// s_logger.debug("Failed to add/remove VPN users: " + answer.getDetails()); -// return false; -// } -// } catch (AgentUnavailableException e) { -// s_logger.debug("Failed to add/remove VPN users:: ", e); -// return false; -// } catch (OperationTimedoutException e) { -// s_logger.debug("Failed to add/remove VPN users:: ", e); -// return false; -// } - } - + } @Override public String[] applyVpnUsers(Network network, List users) throws ResourceUnavailableException{ @@ -1802,51 +1550,16 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian // verify parameters DomainRouterVO router = _routerDao.findById(routerId); if (router == null) { - throw new PermissionDeniedException("Unable to start router with id " + routerId + ". Permisssion denied"); + throw new InvalidParameterValueException("Unable to find router by id " + routerId + "."); } _accountMgr.checkAccess(account, router); UserVO user = _userDao.findById(UserContext.current().getCallerUserId()); + return this.start(router, user, account); } - /** - * Stops domain router - * - * @param cmd - * the command specifying router's id - * @return router if successful, null otherwise - * @throws OperationTimedoutException - * @throws ConcurrentOperationException - * @throws ResourceUnavailableException - * @throws InvalidParameterValueException - * , PermissionDeniedException - */ - @Override - public VirtualRouter stopDomainRouter(long routerId) throws ResourceUnavailableException, ConcurrentOperationException { - UserContext context = UserContext.current(); - Account account = context.getCaller(); - long accountId = account.getId(); - long userId = context.getCallerUserId(); - - // verify parameters - DomainRouterVO router = _routerDao.findById(routerId); - if (router == null) { - throw new PermissionDeniedException("Unable to stop router with id " + routerId + ". Permission denied."); - } - - _accountMgr.checkAccess(account, router); - - UserVO user = _userDao.findById(context.getCallerUserId()); - - if (!_itMgr.stop(router, user, account)) { - return null; - } - - return router; - } - - private Commands getAssociateIPCommands(final DomainRouterVO router, final List ips, Commands cmds, long vmId) { + private void createAssociateIPCommands(final DomainRouterVO router, final List ips, Commands cmds, long vmId) { //Ensure that in multiple vlans case we first send all ip addresses of vlan1, then all ip addresses of vlan2, etc.. Map> vlanIpMap = new HashMap>(); @@ -1896,7 +1609,101 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); cmds.addCommand("IPAssocCommand", cmd); } - return cmds; + } + + private void createApplyPortForwardingRulesCommands(List rules, DomainRouterVO router, Commands cmds) { + + SetPortForwardingRulesCommand cmd = new SetPortForwardingRulesCommand(rules); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, router.getPrivateIpAddress()); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); + cmds.addCommand(cmd); + } + + private void createApplyLoadBalancingRulesCommands(List rules, DomainRouterVO router, Commands cmds) { + + LoadBalancerTO[] lbs = new LoadBalancerTO[rules.size()]; + int i = 0; + for (LoadBalancingRule rule : rules) { + boolean revoked = (rule.getState().equals(FirewallRule.State.Revoke)); + String protocol = rule.getProtocol(); + String algorithm = rule.getAlgorithm(); + String srcIp = rule.getSourceIpAddress().addr(); + int srcPort = rule.getSourcePortStart(); + List destinations = rule.getDestinations(); + LoadBalancerTO lb = new LoadBalancerTO(srcIp, srcPort, protocol, algorithm, revoked, false, destinations); + lbs[i++] = lb; + } + + LoadBalancerConfigCommand cmd = new LoadBalancerConfigCommand(lbs); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, router.getPrivateIpAddress()); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); + cmds.addCommand(cmd); + + } + + private void createApplyVpnCommands(RemoteAccessVpn vpn, DomainRouterVO router, Commands cmds) { + List vpnUsers = _vpnUsersDao.listByAccount(vpn.getAccountId()); + List addUsers = new ArrayList(); + List removeUsers = new ArrayList(); + for (VpnUser user: vpnUsers) { + if (user.getState() == VpnUser.State.Add) { + addUsers.add(user); + } else if (user.getState() == VpnUser.State.Revoke) { + removeUsers.add(user); + } + } + + VpnUsersCfgCommand addUsersCmd = new VpnUsersCfgCommand(addUsers, removeUsers); + addUsersCmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, router.getPrivateIpAddress()); + addUsersCmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); + + RemoteAccessVpnCfgCommand startVpnCmd = new RemoteAccessVpnCfgCommand(true, vpn.getServerAddress().addr(), + vpn.getLocalIp(), vpn.getIpRange(), vpn.getIpsecPresharedKey()); + startVpnCmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, router.getPrivateIpAddress()); + startVpnCmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); + + cmds.addCommand("users", addUsersCmd); + cmds.addCommand("startVpn", startVpnCmd); + } + + + private void createUserDataCommands(DomainRouterVO router, Commands cmds) { + long networkId = router.getNetworkId(); + List vms = _userVmDao.listByNetworkId(networkId); + if (vms != null && !vms.isEmpty()) { + for (UserVmVO vm : vms) { + if (vm.getUserData() != null) { + NicVO nic = _nicDao.findByInstanceIdAndNetworkId(networkId, vm.getId()); + if (nic != null) { + s_logger.debug("Creating user data entry for vm id=" + vm.getId() + " on domR " + router.getId()); + String serviceOffering = _serviceOfferingDao.findById(vm.getServiceOfferingId()).getDisplayText(); + String zoneName = _dcDao.findById(router.getDataCenterId()).getName(); + cmds.addCommand( + "vmdata", + generateVmDataCommand(router, nic.getIp4Address(), vm.getUserData(), serviceOffering, zoneName, + nic.getIp4Address(), vm.getName(), vm.getInstanceName(), vm.getId())); + } + } + } + } + } + + private void createDhcpEntriesCommands(DomainRouterVO router, Commands cmds) { + long networkId = router.getNetworkId(); + List vms = _userVmDao.listByNetworkId(networkId); + if (vms != null && !vms.isEmpty()) { + for (UserVmVO vm : vms) { + NicVO nic = _nicDao.findByInstanceIdAndNetworkId(networkId, vm.getId()); + if (nic != null) { + s_logger.debug("Creating dhcp entry for vm id=" + vm.getId() + " on domR " + router.getId()); + + DhcpEntryCommand dhcpCommand = new DhcpEntryCommand(nic.getMacAddress(), nic.getIp4Address(), vm.getName()); + dhcpCommand.setAccessDetail(NetworkElementCommand.ROUTER_IP, router.getPrivateIpAddress()); + dhcpCommand.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); + cmds.addCommand("dhcp", dhcpCommand); + } + } + } } @@ -1943,7 +1750,7 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian if (router.getState() == State.Running) { Commands cmds = new Commands(OnError.Continue); //Have to resend all already associated ip addresses - cmds = getAssociateIPCommands(router, ipAddress, cmds, 0); + createAssociateIPCommands(router, ipAddress, cmds, 0); return sendCommandsToRouter(router, cmds); } else if (router.getState() == State.Stopped) { @@ -1955,63 +1762,25 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian } @Override - public boolean applyLBRules(Network network, List rules) throws ResourceUnavailableException { + public boolean applyLBRules(Network network, List rules) throws ResourceUnavailableException { DomainRouterVO router = _routerDao.findByNetworkConfiguration(network.getId()); if (router == null) { s_logger.warn("Unable to apply lb rules, virtual router doesn't exist in the network " + network.getId()); throw new ResourceUnavailableException("Unable to apply lb rules", DataCenter.class, network.getDataCenterId()); } - - if (router.getState() == State.Running || router.getState() == State.Starting) { - - Commands cmds = new Commands(OnError.Continue); - LoadBalancerTO[] lbs = new LoadBalancerTO[rules.size()]; - int i = 0; - for (FirewallRule fwRule : rules) { - LoadBalancingRule rule = (LoadBalancingRule) fwRule; - boolean revoked = (rule.getState().equals(FirewallRule.State.Revoke)); - String protocol = rule.getProtocol(); - String algorithm = rule.getAlgorithm(); - String srcIp = rule.getSourceIpAddress().addr(); - int srcPort = rule.getSourcePortStart(); - List destinations = rule.getDestinations(); - LoadBalancerTO lb = new LoadBalancerTO(srcIp, srcPort, protocol, algorithm, revoked, false, destinations); - lbs[i++] = lb; - } - - LoadBalancerConfigCommand cmd = new LoadBalancerConfigCommand(lbs); - cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, router.getPrivateIpAddress()); - cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); - cmds.addCommand(cmd); - - //Send commands to router - return sendCommandsToRouter(router, cmds); - - } else if (router.getState() == State.Stopped || router.getState() == State.Stopping){ - s_logger.debug("Router is in " + router.getState() + ", so not sending apply LB rules commands to the backend"); - return true; - } else { - s_logger.warn("Unable to apply load balancer rules, virtual router is not in the right state " + router.getState()); - throw new ResourceUnavailableException("Unable to apply load balancer rules, domR is not in right state " + router.getState(), DataCenter.class, network.getDataCenterId()); - } - + Commands cmds = new Commands(OnError.Continue); + createApplyLoadBalancingRulesCommands(rules, router, cmds); + //Send commands to router + return sendCommandsToRouter(router, cmds); } @Override - public boolean applyPortForwardingRules(Network network, List rules) throws AgentUnavailableException { + public boolean applyPortForwardingRules(Network network, List rules) throws AgentUnavailableException { DomainRouterVO router = _routerDao.findByNetworkConfiguration(network.getId()); - Commands cmds = new Commands(OnError.Continue); - List pfs = new ArrayList(); - for (FirewallRule fwRule: rules) { - PortForwardingRule pf = (PortForwardingRule)fwRule; - pfs.add(pf); - } - SetPortForwardingRulesCommand cmd = new SetPortForwardingRulesCommand(pfs); - cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, router.getPrivateIpAddress()); - cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); - cmds.addCommand(cmd); + Commands cmds = new Commands(OnError.Continue); + createApplyPortForwardingRulesCommands(rules, router, cmds); //Send commands to router return sendCommandsToRouter(router, cmds); } @@ -2023,6 +1792,9 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian return null; } - - + @Override + public boolean stop(DomainRouterVO router) throws AgentUnavailableException { + // TODO Auto-generated method stub + return false; + } } diff --git a/server/src/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java b/server/src/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java index dd70047cb98..7e65b4a28d8 100644 --- a/server/src/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java +++ b/server/src/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java @@ -34,7 +34,6 @@ import com.cloud.domain.DomainVO; import com.cloud.domain.dao.DomainDao; import com.cloud.event.EventTypes; import com.cloud.event.EventUtils; -import com.cloud.event.EventVO; import com.cloud.exception.AccountLimitException; import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.NetworkRuleConflictException; diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index 9afa05205ad..b4cec3411ef 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -171,6 +171,7 @@ import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.ManagementServerException; import com.cloud.exception.OperationTimedoutException; import com.cloud.exception.PermissionDeniedException; +import com.cloud.exception.ResourceUnavailableException; import com.cloud.host.Host; import com.cloud.host.HostVO; import com.cloud.host.Status; @@ -3198,7 +3199,7 @@ public class ManagementServerImpl implements ManagementServer { } } - private boolean cleanupDomain(Long domainId, Long ownerId) { + private boolean cleanupDomain(Long domainId, Long ownerId) throws ConcurrentOperationException, ResourceUnavailableException{ boolean success = true; { SearchCriteria sc = _domainDao.createSearchCriteria(); diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java index 533db871e9a..503e926278c 100755 --- a/server/src/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/com/cloud/storage/StorageManagerImpl.java @@ -114,6 +114,7 @@ import com.cloud.host.dao.DetailsDao; import com.cloud.host.dao.HostDao; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.network.NetworkManager; +import com.cloud.network.VirtualNetworkApplianceService; import com.cloud.network.router.VirtualNetworkApplianceManager; import com.cloud.offering.ServiceOffering; import com.cloud.service.ServiceOfferingVO; @@ -2265,7 +2266,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag //if the instance is of type domain router vm, call the network manager if(vmInstance.getType().equals(VirtualMachine.Type.DomainRouter)) { - if(!_routerMgr.stopRouter(vmInstance.getId())) + if(_routerMgr.stopRouterInternal(vmInstance.getId())) { String errorMsg = "There was an error stopping the domain router id: "+vmInstance.getId()+" ,cannot enable primary storage maintenance"; s_logger.warn(errorMsg); @@ -2275,7 +2276,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag } else if(restart) { - if(_routerMgr.startRouter(vmInstance.getId()) == null) + if(_routerMgr.stopRouterInternal(vmInstance.getId())) { String errorMsg = "There was an error starting the domain router id: "+vmInstance.getId()+" on another storage pool, cannot enable primary storage maintenance"; s_logger.warn(errorMsg); diff --git a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java index 6eb57085b12..e4ccb7d6341 100644 --- a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java +++ b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java @@ -1541,6 +1541,6 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V @Override public void finalizeStop( VirtualMachineProfile profile, long hostId, - String reservationId) { + String reservationId, Answer... answer) { } } diff --git a/server/src/com/cloud/user/AccountManager.java b/server/src/com/cloud/user/AccountManager.java index c1f2270644b..b24428a1f29 100755 --- a/server/src/com/cloud/user/AccountManager.java +++ b/server/src/com/cloud/user/AccountManager.java @@ -27,7 +27,9 @@ import com.cloud.configuration.ResourceCount.ResourceType; import com.cloud.configuration.ResourceLimitVO; import com.cloud.domain.Domain; import com.cloud.domain.DomainVO; +import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.PermissionDeniedException; +import com.cloud.exception.ResourceUnavailableException; import com.cloud.server.Criteria; /** @@ -103,7 +105,7 @@ public interface AccountManager extends AccountService { * @param accountId * @return true if disable was successful, false otherwise */ - boolean disableAccount(long accountId); + boolean disableAccount(long accountId) throws ConcurrentOperationException, ResourceUnavailableException; boolean deleteAccount(AccountVO account, long callerUserId, Account caller); @@ -111,7 +113,7 @@ public interface AccountManager extends AccountService { void checkAccess(Account account, ControlledEntity... entities) throws PermissionDeniedException; - boolean cleanupAccount(AccountVO account, long callerUserId, Account caller); + boolean cleanupAccount(AccountVO account, long callerUserId, Account caller) throws ConcurrentOperationException, ResourceUnavailableException; @Override UserVO createUser(CreateUserCmd cmd); diff --git a/server/src/com/cloud/user/AccountManagerImpl.java b/server/src/com/cloud/user/AccountManagerImpl.java index 52980703f73..d952e9a1a49 100755 --- a/server/src/com/cloud/user/AccountManagerImpl.java +++ b/server/src/com/cloud/user/AccountManagerImpl.java @@ -67,11 +67,14 @@ import com.cloud.event.EventTypes; import com.cloud.event.EventUtils; import com.cloud.event.EventVO; import com.cloud.exception.AgentUnavailableException; +import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.PermissionDeniedException; +import com.cloud.exception.ResourceUnavailableException; import com.cloud.network.IPAddressVO; import com.cloud.network.NetworkManager; import com.cloud.network.NetworkVO; +import com.cloud.network.VirtualNetworkApplianceService; import com.cloud.network.dao.IPAddressDao; import com.cloud.network.dao.NetworkDao; import com.cloud.network.router.VirtualNetworkApplianceManager; @@ -802,7 +805,7 @@ public class AccountManagerImpl implements AccountManager, AccountService, Manag } @Override - public boolean cleanupAccount(AccountVO account, long callerUserId, Account caller) { + public boolean cleanupAccount(AccountVO account, long callerUserId, Account caller) throws ConcurrentOperationException, ResourceUnavailableException{ long accountId = account.getId(); boolean accountCleanupNeeded = false; @@ -858,7 +861,7 @@ public class AccountManagerImpl implements AccountManager, AccountService, Manag boolean routersCleanedUp = true; for (DomainRouterVO router : routers) { long startEventId = EventUtils.saveStartedEvent(callerUserId, router.getAccountId(), EventTypes.EVENT_ROUTER_DESTROY, "Starting to destroy router : " + router.getName()); - if (!_routerMgr.destroyRouter(router.getId())) { + if (!_routerMgr.destroyRouterInternal(router.getId())) { s_logger.error("Unable to destroy router: " + router.getId()); routersCleanedUp = false; EventUtils.saveEvent(callerUserId, router.getAccountId(), EventVO.LEVEL_ERROR, EventTypes.EVENT_ROUTER_DESTROY, "Unable to destroy router: " + router.getName(), startEventId); @@ -946,7 +949,7 @@ public class AccountManagerImpl implements AccountManager, AccountService, Manag } @Override - public boolean disableAccount(long accountId) { + public boolean disableAccount(long accountId) throws ConcurrentOperationException, ResourceUnavailableException{ boolean success = false; if (accountId <= 2) { if (s_logger.isInfoEnabled()) { @@ -968,7 +971,7 @@ public class AccountManagerImpl implements AccountManager, AccountService, Manag return success; } - private boolean doDisableAccount(long accountId) { + private boolean doDisableAccount(long accountId) throws ConcurrentOperationException, ResourceUnavailableException{ List vms = _userVmDao.listByAccountId(accountId); boolean success = true; for (UserVmVO vm : vms) { @@ -982,7 +985,7 @@ public class AccountManagerImpl implements AccountManager, AccountService, Manag List routers = _routerDao.listBy(accountId); for (DomainRouterVO router : routers) { - success = (success && _routerMgr.stopRouter(router.getId())); + success = (success && _routerMgr.stopRouterInternal(router.getId())); } return success; @@ -1439,7 +1442,7 @@ public class AccountManagerImpl implements AccountManager, AccountService, Manag } @Override - public AccountVO disableAccount(DisableAccountCmd cmd) throws InvalidParameterValueException, PermissionDeniedException { + public AccountVO disableAccount(DisableAccountCmd cmd) throws InvalidParameterValueException, PermissionDeniedException, ConcurrentOperationException, ResourceUnavailableException { String accountName = cmd.getAccountName(); Long domainId = cmd.getDomainId(); diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 4003bf6b5de..a67bac5316f 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -2451,7 +2451,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager } @Override - public void finalizeStop(VirtualMachineProfile profile, long hostId, String reservationId) { + public void finalizeStop(VirtualMachineProfile profile, long hostId, String reservationId, Answer...answer) { } public String generateRandomPassword() { diff --git a/server/src/com/cloud/vm/VirtualMachineGuru.java b/server/src/com/cloud/vm/VirtualMachineGuru.java index 92eabe1febf..4a037f479d1 100644 --- a/server/src/com/cloud/vm/VirtualMachineGuru.java +++ b/server/src/com/cloud/vm/VirtualMachineGuru.java @@ -17,6 +17,7 @@ */ package com.cloud.vm; +import com.cloud.agent.api.Answer; import com.cloud.agent.api.Command; import com.cloud.agent.manager.Commands; import com.cloud.deploy.DeployDestination; @@ -54,7 +55,7 @@ public interface VirtualMachineGuru { * @param dest destination to send the command. * @return true if everything checks out. false if not and we should try again. */ - boolean finalizeDeployment(Commands cmds, VirtualMachineProfile profile, DeployDestination dest, ReservationContext context); + boolean finalizeDeployment(Commands cmds, VirtualMachineProfile profile, DeployDestination dest, ReservationContext context) throws ResourceUnavailableException; /** * Check the deployment results. @@ -65,7 +66,7 @@ public interface VirtualMachineGuru { */ boolean finalizeStart(Commands cmds, VirtualMachineProfile profile, DeployDestination dest, ReservationContext context); - void finalizeStop(VirtualMachineProfile profile, long hostId, String reservationId); + void finalizeStop(VirtualMachineProfile profile, long hostId, String reservationId, Answer... answer); /** * Returns the id parsed from the name. If it cannot parse the name, * then return null. This method is used to determine if this is diff --git a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java index fa1f0817b69..2ef754d33d2 100644 --- a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java @@ -421,6 +421,7 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, Cluster avoids.add(e); continue; } catch (RuntimeException e) { + s_logger.warn("Failed to start instance " + vm, e); stateTransitTo(vm, Event.OperationFailed, null); return null; } @@ -504,8 +505,9 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, Cluster StopCommand stop = new StopCommand(vm, vm.getInstanceName(), null); boolean stopped = false; + StopAnswer answer = null; try { - StopAnswer answer = (StopAnswer)_agentMgr.send(vm.getHostId(), stop); + answer = (StopAnswer)_agentMgr.send(vm.getHostId(), stop); stopped = answer.getResult(); if (!stopped) { throw new CloudRuntimeException("Unable to stop the virtual machine due to " + answer.getDetails()); @@ -526,8 +528,9 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, Cluster boolean cleanup = false; VirtualMachineProfile profile = new VirtualMachineProfileImpl(vm); - try { + try { _networkMgr.release(profile); + s_logger.debug("Successfully released network resources for the vm " + vm); } catch (Exception e) { s_logger.warn("Unable to release some network resources.", e); cleanup = true; @@ -535,6 +538,7 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, Cluster try { _storageMgr.release(profile); + s_logger.debug("Successfully released storage resources for the vm " + vm); } catch (Exception e) { s_logger.warn("Unable to release storage resources.", e); cleanup = true; @@ -543,7 +547,7 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, Cluster @SuppressWarnings("unchecked") VirtualMachineGuru guru = (VirtualMachineGuru)_vmGurus.get(vm.getType()); try { - guru.finalizeStop(profile, vm.getHostId(), vm.getReservationId()); + guru.finalizeStop(profile, vm.getHostId(), vm.getReservationId(), answer); } catch (Exception e) { s_logger.warn("Guru " + guru.getClass() + " has trouble processing stop "); cleanup = true; diff --git a/server/src/com/cloud/vm/dao/UserVmDao.java b/server/src/com/cloud/vm/dao/UserVmDao.java index 68a85af44cc..a1a0e79ed20 100755 --- a/server/src/com/cloud/vm/dao/UserVmDao.java +++ b/server/src/com/cloud/vm/dao/UserVmDao.java @@ -93,6 +93,8 @@ public interface UserVmDao extends GenericDao, StateDao listVirtualNetworkInstancesByAcctAndZone(long accountId, long dcId, long networkId); + List listByNetworkId(long networkId); + List listVmsUsingGuestIpAddress(long dcId, String ipAddress); UserVm findByZoneAndAcctAndGuestIpAddress(long zoneId, long accountId, String ipAddress); diff --git a/server/src/com/cloud/vm/dao/UserVmDaoImpl.java b/server/src/com/cloud/vm/dao/UserVmDaoImpl.java index e6ea51211db..f4d89663e9d 100755 --- a/server/src/com/cloud/vm/dao/UserVmDaoImpl.java +++ b/server/src/com/cloud/vm/dao/UserVmDaoImpl.java @@ -304,6 +304,25 @@ public class UserVmDaoImpl extends GenericDaoBase implements Use return listBy(sc); } + + @Override + public List listByNetworkId(long networkId) { + if (AccountDataCenterVirtualSearch == null) { + NicDao _nicDao = ComponentLocator.getLocator("management-server").getDao(NicDao.class); + SearchBuilder nicSearch = _nicDao.createSearchBuilder(); + nicSearch.and("networkId", nicSearch.entity().getNetworkId(), SearchCriteria.Op.EQ); + nicSearch.and("ip4Address", nicSearch.entity().getIp4Address(), SearchCriteria.Op.NNULL); + + AccountDataCenterVirtualSearch = createSearchBuilder(); + AccountDataCenterVirtualSearch.join("nicSearch", nicSearch, AccountDataCenterVirtualSearch.entity().getId(), nicSearch.entity().getInstanceId(), JoinBuilder.JoinType.INNER); + AccountDataCenterVirtualSearch.done(); + } + + SearchCriteria sc = AccountDataCenterVirtualSearch.create(); + sc.setJoinParameters("nicSearch", "networkId", networkId); + + return listBy(sc); + } @Override public List listVmsUsingGuestIpAddress(long dcId, String ipAddress) { diff --git a/server/src/com/cloud/vm/dao/VMInstanceDao.java b/server/src/com/cloud/vm/dao/VMInstanceDao.java index 73a8771e125..e39df479427 100644 --- a/server/src/com/cloud/vm/dao/VMInstanceDao.java +++ b/server/src/com/cloud/vm/dao/VMInstanceDao.java @@ -24,7 +24,6 @@ import java.util.List; import com.cloud.utils.db.GenericDao; import com.cloud.utils.fsm.StateDao; import com.cloud.vm.State; -import com.cloud.vm.UserVmVO; import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VirtualMachine;