From 356526db8311fadd59c66617d8d608e1177011bb Mon Sep 17 00:00:00 2001 From: Alex Huang Date: Mon, 20 Dec 2010 12:19:35 -0800 Subject: [PATCH] Changed exception code to give the scope of the problem --- .../exception/AgentUnavailableException.java | 6 +- .../ResourceUnavailableException.java | 13 +- .../StorageUnavailableException.java | 13 +- api/src/com/cloud/network/NetworkService.java | 4 +- .../cloud/network/element/NetworkElement.java | 5 +- .../async/executor/DestroyVMExecutor.java | 195 --- .../consoleproxy/ConsoleProxyManagerImpl.java | 6 - .../cloud/ha/HighAvailabilityManagerImpl.java | 8 +- .../src/com/cloud/network/NetworkManager.java | 5 +- .../com/cloud/network/NetworkManagerImpl.java | 18 +- .../cloud/network/element/DhcpElement.java | 16 +- .../network/element/DomainRouterElement.java | 22 +- .../network/router/DomainRouterManager.java | 15 +- .../router/DomainRouterManagerImpl.java | 1417 ++++++++--------- .../cloud/server/ManagementServerImpl.java | 16 +- .../com/cloud/storage/StorageManagerImpl.java | 39 +- .../SecondaryStorageManagerImpl.java | 3 - .../cloud/template/TemplateManagerImpl.java | 21 +- .../src/com/cloud/vm/UserVmManagerImpl.java | 26 +- .../src/com/cloud/vm/VirtualMachineGuru.java | 2 +- .../com/cloud/vm/VirtualMachineManager.java | 7 +- .../cloud/vm/VirtualMachineManagerImpl.java | 5 +- .../src/com/cloud/utils/SerialVersionUID.java | 2 +- .../utils/exception/ExecutionException.java | 7 + 24 files changed, 785 insertions(+), 1086 deletions(-) delete mode 100644 server/src/com/cloud/async/executor/DestroyVMExecutor.java diff --git a/api/src/com/cloud/exception/AgentUnavailableException.java b/api/src/com/cloud/exception/AgentUnavailableException.java index ab45716abd0..3ecc7176bd8 100644 --- a/api/src/com/cloud/exception/AgentUnavailableException.java +++ b/api/src/com/cloud/exception/AgentUnavailableException.java @@ -30,10 +30,14 @@ public class AgentUnavailableException extends ResourceUnavailableException { private static final long serialVersionUID = SerialVersionUID.AgentUnavailableException; public AgentUnavailableException(String msg, long agentId) { - super("Host " + agentId + ": " + msg, Host.class, agentId); + this(msg, agentId, null); } public AgentUnavailableException(long agentId) { this("Unable to reach host.", agentId); } + + public AgentUnavailableException(String msg, long agentId, Throwable cause) { + super("Host " + agentId + ": " + msg, Host.class, agentId, cause); + } } diff --git a/api/src/com/cloud/exception/ResourceUnavailableException.java b/api/src/com/cloud/exception/ResourceUnavailableException.java index cf5761fafa3..ffe8a9bc999 100644 --- a/api/src/com/cloud/exception/ResourceUnavailableException.java +++ b/api/src/com/cloud/exception/ResourceUnavailableException.java @@ -18,28 +18,19 @@ package com.cloud.exception; import com.cloud.utils.SerialVersionUID; -import com.cloud.utils.exception.CloudRuntimeException; -public class ResourceUnavailableException extends CloudRuntimeException { +public class ResourceUnavailableException extends Exception { private static final long serialVersionUID = SerialVersionUID.ResourceUnavailableException; Class _scope; long _id; - public ResourceUnavailableException(String msg) { - super(msg); - } - - public ResourceUnavailableException(String msg, Throwable cause) { - super(msg, cause); - } - public ResourceUnavailableException(String msg, Class scope, long resourceId) { this(msg, scope, resourceId, null); } public ResourceUnavailableException(String msg, Class scope, long resourceId, Throwable cause) { - super(msg, cause); + super(new StringBuilder("Resource [").append(scope).append(":").append(resourceId).append("] is unreachable: ").append(msg).toString(), cause); _scope = scope; _id = resourceId; } diff --git a/api/src/com/cloud/exception/StorageUnavailableException.java b/api/src/com/cloud/exception/StorageUnavailableException.java index 7a96b9d5918..db958c6b3b4 100644 --- a/api/src/com/cloud/exception/StorageUnavailableException.java +++ b/api/src/com/cloud/exception/StorageUnavailableException.java @@ -30,15 +30,18 @@ import com.cloud.utils.SerialVersionUID; public class StorageUnavailableException extends ResourceUnavailableException { private static final long serialVersionUID = SerialVersionUID.StorageUnavailableException; - public StorageUnavailableException(String msg) { - super(msg); - } - public StorageUnavailableException(String msg, long poolId) { this(msg, poolId, null); } public StorageUnavailableException(String msg, long poolId, Throwable cause) { - super(msg, StoragePool.class, poolId, cause); + this(msg, StoragePool.class, poolId, cause); } + public StorageUnavailableException(String msg, Class scope, long resourceId) { + this(msg, scope, resourceId, null); + } + + public StorageUnavailableException(String msg, Class scope, long resourceId, Throwable th) { + super(msg, scope, resourceId, th); + } } diff --git a/api/src/com/cloud/network/NetworkService.java b/api/src/com/cloud/network/NetworkService.java index 6404cb0d402..2471ff5f3e9 100644 --- a/api/src/com/cloud/network/NetworkService.java +++ b/api/src/com/cloud/network/NetworkService.java @@ -26,8 +26,8 @@ import com.cloud.api.commands.CreateRemoteAccessVpnCmd; import com.cloud.api.commands.DeleteRemoteAccessVpnCmd; import com.cloud.api.commands.DisassociateIPAddrCmd; import com.cloud.api.commands.ListNetworksCmd; -import com.cloud.api.commands.RestartNetworkCmd; import com.cloud.api.commands.RemoveVpnUserCmd; +import com.cloud.api.commands.RestartNetworkCmd; import com.cloud.exception.AccountLimitException; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientAddressCapacityException; @@ -87,7 +87,7 @@ public interface NetworkService { List searchForNetworks(ListNetworksCmd cmd) throws InvalidParameterValueException, PermissionDeniedException; boolean deleteNetwork(long networkId) throws InvalidParameterValueException, PermissionDeniedException; - boolean restartNetwork(RestartNetworkCmd cmd) throws ConcurrentOperationException; + boolean restartNetwork(RestartNetworkCmd cmd) throws ConcurrentOperationException, ResourceUnavailableException; int getActiveNicsInNetwork(long networkId); } diff --git a/api/src/com/cloud/network/element/NetworkElement.java b/api/src/com/cloud/network/element/NetworkElement.java index 0ac546708ec..4854a391ec0 100644 --- a/api/src/com/cloud/network/element/NetworkElement.java +++ b/api/src/com/cloud/network/element/NetworkElement.java @@ -29,8 +29,9 @@ public interface NetworkElement extends Adapter { * @param config fully specified network configuration. * @param offering network offering that originated the network configuration. * @return true if network configuration is now usable; false if not; null if not handled by this element. + * @throws InsufficientNetworkCapacityException TODO */ - boolean implement(Network network, NetworkOffering offering, DeployDestination dest, ReservationContext context) throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException; + boolean implement(Network network, NetworkOffering offering, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException; /** * Prepare for a nic to be added into this network. @@ -44,7 +45,7 @@ public interface NetworkElement extends Adapter { * @throws ResourceUnavailableException * @throws InsufficientNetworkCapacityException */ - boolean prepare(Network network, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientNetworkCapacityException; + boolean prepare(Network network, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException; /** * A nic is released from this network. diff --git a/server/src/com/cloud/async/executor/DestroyVMExecutor.java b/server/src/com/cloud/async/executor/DestroyVMExecutor.java deleted file mode 100644 index a7dd12ad0fd..00000000000 --- a/server/src/com/cloud/async/executor/DestroyVMExecutor.java +++ /dev/null @@ -1,195 +0,0 @@ -/** - * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. - * - * This software is licensed under the GNU General Public License v3 or later. - * - * It is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or any later version. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -package com.cloud.async.executor; - -import java.util.List; - -import org.apache.log4j.Logger; - -import com.cloud.agent.api.Answer; -import com.cloud.api.BaseCmd; -import com.cloud.async.AsyncJobManager; -import com.cloud.async.AsyncJobResult; -import com.cloud.async.AsyncJobVO; -import com.cloud.configuration.ResourceCount.ResourceType; -import com.cloud.event.EventTypes; -import com.cloud.event.EventVO; -import com.cloud.serializer.GsonHelper; -import com.cloud.server.ManagementServer; -import com.cloud.storage.Volume.VolumeType; -import com.cloud.storage.VolumeVO; -import com.cloud.utils.db.DB; -import com.cloud.utils.db.Transaction; -import com.cloud.vm.UserVmVO; -import com.cloud.vm.VirtualMachine; -import com.cloud.vm.VirtualMachine.Event; -import com.google.gson.Gson; - -public class DestroyVMExecutor extends VMOperationExecutor { - public static final Logger s_logger = Logger.getLogger(DestroyVMExecutor.class.getName()); - - @Override - public boolean execute() { - Gson gson = GsonHelper.getBuilder().create(); - AsyncJobManager asyncMgr = getAsyncJobMgr(); - AsyncJobVO job = getJob(); - VMOperationParam param = gson.fromJson(job.getCmdInfo(), VMOperationParam.class); - ManagementServer managementServer = asyncMgr.getExecutorContext().getManagementServer(); - OperationResponse response; - /* - if(getSyncSource() == null) { - asyncMgr.syncAsyncJobExecution(job.getId(), "UserVM", param.getVmId()); - return true; - // always true if it does not have sync-source - } else { - managementServer.saveStartedEvent(param.getUserId(), param.getAccountId(), EventTypes.EVENT_VM_DESTROY, "Destroying VM " +param.getVmId(), param.getEventId()); - asyncMgr.updateAsyncJobAttachment(job.getId(), "vm_instance", param.getVmId()); - response = asyncMgr.getExecutorContext().getVmMgr().executeDestroyVM(this, param); - UserVmVO vm = managementServer.findUserVMInstanceById(param.getVmId()); - String params = "id="+vm.getId() + "\nvmName=" + vm.getName() + "\nsoId=" + vm.getServiceOfferingId() + "\ntId=" + vm.getTemplateId() + "\ndcId=" + vm.getDataCenterId(); - - if (OperationResponse.STATUS_SUCCEEDED == response.getResultCode() ){ - managementServer.saveEvent(param.getUserId(), param.getAccountId(), EventVO.LEVEL_INFO, EventTypes.EVENT_VM_DESTROY, "Successfully destroyed VM instance : " + param.getVmId(), params, param.getEventId()); - return true; - }else if (OperationResponse.STATUS_FAILED == response.getResultCode()){ - managementServer.saveEvent(param.getUserId(), param.getAccountId(), EventVO.LEVEL_ERROR, EventTypes.EVENT_VM_DESTROY, "Failed to stop VM instance : " + response.getResultDescription(), params, param.getEventId()); - return true; - } - - } - */ - return false; - } - - @Override - @DB - public void processAnswer(VMOperationListener listener, long agentId, long seq, Answer answer) { - UserVmVO vm = listener.getVm(); - VMOperationParam param = listener.getParam(); - AsyncJobManager asyncMgr = getAsyncJobMgr(); - ManagementServer managementServer = asyncMgr.getExecutorContext().getManagementServer(); - String params = "id="+vm.getId() + "\nvmName=" + vm.getName() + "\nsoId=" + vm.getServiceOfferingId() + "\ntId=" + vm.getTemplateId() + "\ndcId=" + vm.getDataCenterId(); - if(s_logger.isDebugEnabled()) - s_logger.debug("Execute asynchronize destroy VM command: received stop-VM answer, " + vm.getHostId() + "-" + seq); - - boolean stopped = false; - if(answer != null && answer.getResult()) - stopped = true; - - try { - if(stopped) { - asyncMgr.getExecutorContext().getVmMgr().completeStopCommand(param.getUserId(), vm, Event.OperationSucceeded, param.getChildEventId()); - // completeStopCommand will log the stop event, if we log it here we will end up with duplicated stop event - Transaction txn = Transaction.currentTxn(); - txn.start(); - - asyncMgr.getExecutorContext().getAccountMgr().decrementResourceCount(vm.getAccountId(), ResourceType.user_vm); - if (!asyncMgr.getExecutorContext().getItMgr().stateTransitTo(vm, VirtualMachine.Event.DestroyRequested, vm.getHostId())) { - s_logger.debug("Unable to destroy the vm because it is not in the correct state: " + vm.toString()); - - txn.rollback(); -// managementServer.saveEvent(param.getUserId(), param.getAccountId(), EventVO.LEVEL_ERROR, EventTypes.EVENT_VM_DESTROY, -// "Failed to stop VM instance : " + vm.getName(), params, param.getEventId()); - asyncMgr.completeAsyncJob(getJob().getId(), - AsyncJobResult.STATUS_FAILED, 0, "Unable to destroy the vm because it is not in the correct state"); - return; - } - - asyncMgr.getExecutorContext().getVmMgr().cleanNetworkRules(param.getUserId(), vm.getId()); - - // Mark the VM's root disk as destroyed - List volumes = asyncMgr.getExecutorContext().getVolumeDao().findByInstanceAndType(vm.getId(), VolumeType.ROOT); - for (VolumeVO volume : volumes) { - asyncMgr.getExecutorContext().getStorageMgr().destroyVolume(volume); - } - - // Mark the VM's data disks as detached - volumes = asyncMgr.getExecutorContext().getVolumeDao().findByInstanceAndType(vm.getId(), VolumeType.DATADISK); - for (VolumeVO volume : volumes) { - asyncMgr.getExecutorContext().getVolumeDao().detachVolume(volume.getId()); - } -// managementServer.saveEvent(param.getUserId(), vm.getAccountId(), EventVO.LEVEL_INFO, EventTypes.EVENT_VM_DESTROY, -// "Successfully destroyed VM instance : " + vm.getName(), params, param.getEventId()); - txn.commit(); - - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_SUCCEEDED, 0, "success"); - } else { - asyncMgr.getExecutorContext().getItMgr().stateTransitTo(vm, Event.OperationFailed, vm.getHostId()); - asyncMgr.completeAsyncJob(getJob().getId(), - AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, "Agent failed to stop VM: " + vm.getName()); -// managementServer.saveEvent(param.getUserId(), vm.getAccountId(), EventVO.LEVEL_ERROR, EventTypes.EVENT_VM_STOP, -// "failed to stop VM instance : " + vm.getName(), params, param.getChildEventId()); -// managementServer.saveEvent(param.getUserId(), param.getAccountId(), EventVO.LEVEL_ERROR, EventTypes.EVENT_VM_DESTROY, -// "failed to stop VM instance : " + vm.getName(), params, param.getEventId()); - - } - } catch(Exception e) { - s_logger.error("Unexpected exception " + e.getMessage(), e); - } finally { - asyncMgr.releaseSyncSource(this); - } - } - - @Override - public void processDisconnect(VMOperationListener listener, long agentId) { - if(s_logger.isDebugEnabled()) - s_logger.debug("Execute asynchronize destroy VM command: agent " + agentId + " disconnected"); - - processDisconnectAndTimeout(listener, "agent is disconnected"); - } - - @Override - public void processTimeout(VMOperationListener listener, long agentId, long seq) { - if(s_logger.isDebugEnabled()) - s_logger.debug("Execute asynchronize destroy VM command: timed out, " + agentId + "-" + seq); - - processDisconnectAndTimeout(listener, "operation timed out"); - } - - private void processDisconnectAndTimeout(VMOperationListener listener, String resultMessage) { - UserVmVO vm = listener.getVm(); - VMOperationParam param = listener.getParam(); - AsyncJobManager asyncMgr = getAsyncJobMgr(); - - EventVO event = new EventVO(); - event.setUserId(param.getUserId()); - event.setAccountId(vm.getAccountId()); - event.setType(EventTypes.EVENT_VM_DESTROY); - event.setParameters("id="+vm.getId() + "\nvmName=" + vm.getName() + "\nsoId=" + vm.getServiceOfferingId() + "\ntId=" + vm.getTemplateId() + "\ndcId=" + vm.getDataCenterId()); - event.setDescription("failed to stop VM instance : " + vm.getName() + " due to " + resultMessage); - event.setLevel(EventVO.LEVEL_ERROR); - - boolean jobStatusUpdated = false; - try { - asyncMgr.completeAsyncJob(getJob().getId(), - AsyncJobResult.STATUS_FAILED, 0, resultMessage); - jobStatusUpdated = true; - - asyncMgr.getExecutorContext().getEventDao().persist(event); - } catch (Exception e) { - if(!jobStatusUpdated) - asyncMgr.completeAsyncJob(getJob().getId(), - AsyncJobResult.STATUS_FAILED, 0, resultMessage); - - s_logger.error("Unexpected exception " + e.getMessage(), e); - } finally { - asyncMgr.releaseSyncSource(this); - } - } -} diff --git a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java index dd0657cedb2..e494ea24ac7 100644 --- a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java +++ b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java @@ -703,12 +703,6 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx } catch (InsufficientCapacityException e) { s_logger.warn("InsufficientCapacity", e); throw new CloudRuntimeException("Insufficient capacity exception", e); - } catch (StorageUnavailableException e) { - s_logger.warn("Unable to contact storage", e); - throw new CloudRuntimeException("Unable to contact storage", e); - } catch (ResourceUnavailableException e) { - s_logger.warn("Unable to contact resource", e); - throw new CloudRuntimeException("Unable to contact resource", e); } Map context = new HashMap(); diff --git a/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java b/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java index 0fe4676dbc0..854daf37113 100644 --- a/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java +++ b/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java @@ -47,6 +47,7 @@ import com.cloud.exception.AgentUnavailableException; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.OperationTimedoutException; +import com.cloud.exception.ResourceUnavailableException; import com.cloud.exception.StorageUnavailableException; import com.cloud.ha.HaWorkVO.WorkType; import com.cloud.ha.dao.HighAvailabilityDao; @@ -65,7 +66,6 @@ import com.cloud.utils.component.ComponentLocator; import com.cloud.utils.component.Inject; import com.cloud.utils.concurrency.NamedThreadFactory; import com.cloud.utils.db.GlobalLock; -import com.cloud.utils.exception.ExecutionException; import com.cloud.vm.State; import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VirtualMachine; @@ -457,7 +457,7 @@ public class HighAvailabilityManagerImpl implements HighAvailabilityManager { s_logger.warn("Unable to restart " + vm.toString() + " due to " + e.getMessage()); _alertMgr.sendAlert(alertType, vm.getDataCenterId(), vm.getPodId(), "Unable to restart " + vm.getName() + " which was running on host " + hostDesc, "Insufficient capacity to restart VM, name: " + vm.getName() + ", id: " + vmId + " which was running on host " + hostDesc); return null; - } catch (final StorageUnavailableException e) { + } catch (final ResourceUnavailableException e) { s_logger.warn("Unable to restart " + vm.toString() + " due to " + e.getMessage()); _alertMgr.sendAlert(alertType, vm.getDataCenterId(), vm.getPodId(), "Unable to restart " + vm.getName() + " which was running on host " + hostDesc, "The Storage is unavailable for trying to restart VM, name: " + vm.getName() + ", id: " + vmId + " which was running on host " + hostDesc); return null; @@ -465,10 +465,6 @@ public class HighAvailabilityManagerImpl implements HighAvailabilityManager { s_logger.warn("Unable to restart " + vm.toString() + " due to " + e.getMessage()); _alertMgr.sendAlert(alertType, vm.getDataCenterId(), vm.getPodId(), "Unable to restart " + vm.getName() + " which was running on host " + hostDesc, "The Storage is unavailable for trying to restart VM, name: " + vm.getName() + ", id: " + vmId + " which was running on host " + hostDesc); return null; - } catch (ExecutionException e) { - s_logger.warn("Unable to restart " + vm.toString() + " due to " + e.getMessage()); - _alertMgr.sendAlert(alertType, vm.getDataCenterId(), vm.getPodId(), "Unable to restart " + vm.getName() + " which was running on host " + hostDesc, "The Storage is unavailable for trying to restart VM, name: " + vm.getName() + ", id: " + vmId + " which was running on host " + hostDesc); - return null; } } diff --git a/server/src/com/cloud/network/NetworkManager.java b/server/src/com/cloud/network/NetworkManager.java index d1704c51a41..6a302bdb42d 100644 --- a/server/src/com/cloud/network/NetworkManager.java +++ b/server/src/com/cloud/network/NetworkManager.java @@ -25,17 +25,14 @@ import com.cloud.deploy.DeploymentPlan; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientAddressCapacityException; import com.cloud.exception.InsufficientCapacityException; -import com.cloud.exception.InsufficientNetworkCapacityException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.network.addr.PublicIp; import com.cloud.network.rules.FirewallRule; -import com.cloud.network.rules.FirewallRuleVO; import com.cloud.offerings.NetworkOfferingVO; import com.cloud.service.ServiceOfferingVO; import com.cloud.user.Account; import com.cloud.user.AccountVO; import com.cloud.utils.Pair; -import com.cloud.utils.net.Ip; import com.cloud.vm.DomainRouterVO; import com.cloud.vm.Nic; import com.cloud.vm.NicProfile; @@ -110,7 +107,7 @@ public interface NetworkManager extends NetworkService { void allocate(VirtualMachineProfile vm, List> networks) throws InsufficientCapacityException, ConcurrentOperationException; - void prepare(VirtualMachineProfile profile, DeployDestination dest, ReservationContext context) throws InsufficientNetworkCapacityException, ConcurrentOperationException, ResourceUnavailableException; + void prepare(VirtualMachineProfile profile, DeployDestination dest, ReservationContext context) throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException; void release(VirtualMachineProfile vmProfile); List getNics (VirtualMachine vm); diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 341bbefe488..44aa948bdf9 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -80,7 +80,6 @@ import com.cloud.exception.AgentUnavailableException; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientAddressCapacityException; import com.cloud.exception.InsufficientCapacityException; -import com.cloud.exception.InsufficientNetworkCapacityException; import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.OperationTimedoutException; import com.cloud.exception.PermissionDeniedException; @@ -1015,7 +1014,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } @DB - protected Pair implementNetwork(long networkId, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientAddressCapacityException { + protected Pair implementNetwork(long networkId, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException { Transaction.currentTxn(); Pair implemented = new Pair(null, null); @@ -1045,20 +1044,19 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag network.setDns1(result.getDns1()); network.setDns2(result.getDns2()); network.setMode(result.getMode()); - network.setState(Network.State.Implemented); + network.setReservationId(context.getReservationId()); + network.setState(Network.State.Implementing); _networksDao.update(networkId, network); for (NetworkElement element : _networkElements) { if (s_logger.isDebugEnabled()) { s_logger.debug("Asking " + element.getName() + " to implmenet " + network); } - try { - element.implement(network, offering, dest, context); - } catch (InsufficientCapacityException e) { - throw new ResourceUnavailableException("Unable to start domain router for this VM", e); - } + element.implement(network, offering, dest, context); } + network.setState(Network.State.Implemented); + _networksDao.update(network.getId(), network); implemented.set(guru, network); return implemented; } finally { @@ -1070,7 +1068,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } @Override - public void prepare(VirtualMachineProfile vmProfile, DeployDestination dest, ReservationContext context) throws InsufficientNetworkCapacityException, ConcurrentOperationException, ResourceUnavailableException { + public void prepare(VirtualMachineProfile vmProfile, DeployDestination dest, ReservationContext context) throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException { List nics = _nicDao.listBy(vmProfile.getId()); for (NicVO nic : nics) { Pair implemented = implementNetwork(nic.getNetworkId(), dest, context); @@ -2054,7 +2052,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } @Override - public boolean restartNetwork(RestartNetworkCmd cmd) throws ConcurrentOperationException{ + public boolean restartNetwork(RestartNetworkCmd cmd) throws ConcurrentOperationException, ResourceUnavailableException { //This method reapplies Ip addresses, LoadBalancer and PortForwarding rules String accountName = cmd.getAccountName(); long domainId = cmd.getDomainId(); diff --git a/server/src/com/cloud/network/element/DhcpElement.java b/server/src/com/cloud/network/element/DhcpElement.java index 40d28c484cf..a9cd917402c 100644 --- a/server/src/com/cloud/network/element/DhcpElement.java +++ b/server/src/com/cloud/network/element/DhcpElement.java @@ -27,7 +27,6 @@ import com.cloud.dc.DataCenter; import com.cloud.deploy.DeployDestination; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientCapacityException; -import com.cloud.exception.InsufficientNetworkCapacityException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.network.Network; import com.cloud.network.NetworkManager; @@ -72,21 +71,16 @@ public class DhcpElement extends AdapterBase implements NetworkElement { } @Override - public boolean implement(Network guestConfig, NetworkOffering offering, DeployDestination dest, ReservationContext context) throws InsufficientCapacityException, ResourceUnavailableException, ConcurrentOperationException { - if (canHandle(offering.getGuestIpType(), dest)) { - DomainRouterVO router = _routerMgr.deployDhcp(guestConfig, dest, context.getAccount()); - if (router == null) { - throw new ResourceUnavailableException("Unable to deploy the router for " + guestConfig); - } - return true; - - } else { + public boolean implement(Network guestConfig, NetworkOffering offering, DeployDestination dest, ReservationContext context) throws ResourceUnavailableException, ConcurrentOperationException, InsufficientCapacityException { + if (!canHandle(offering.getGuestIpType(), dest)) { return false; } + _routerMgr.deployDhcp(guestConfig, dest, context.getAccount()); + return true; } @Override - public boolean prepare(Network config, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException, InsufficientNetworkCapacityException, ResourceUnavailableException { + public boolean prepare(Network config, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException { if (canHandle(config.getGuestType(), dest)) { if (vm.getType() != VirtualMachine.Type.User) { diff --git a/server/src/com/cloud/network/element/DomainRouterElement.java b/server/src/com/cloud/network/element/DomainRouterElement.java index e58edaf6dfd..ea5e92c6286 100644 --- a/server/src/com/cloud/network/element/DomainRouterElement.java +++ b/server/src/com/cloud/network/element/DomainRouterElement.java @@ -29,7 +29,6 @@ import com.cloud.dc.dao.DataCenterDao; import com.cloud.deploy.DeployDestination; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientCapacityException; -import com.cloud.exception.InsufficientNetworkCapacityException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.network.LoadBalancerVO; import com.cloud.network.Network; @@ -50,6 +49,7 @@ import com.cloud.offerings.dao.NetworkOfferingDao; import com.cloud.uservm.UserVm; import com.cloud.utils.component.AdapterBase; import com.cloud.utils.component.Inject; +import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.vm.DomainRouterVO; import com.cloud.vm.NicProfile; import com.cloud.vm.ReservationContext; @@ -83,21 +83,17 @@ public class DomainRouterElement extends AdapterBase implements NetworkElement { } @Override - public boolean implement(Network guestConfig, NetworkOffering offering, DeployDestination dest, ReservationContext context) throws InsufficientCapacityException, ResourceUnavailableException, ConcurrentOperationException { - if (canHandle(offering.getGuestIpType(), dest.getDataCenter())) { - DomainRouterVO router = _routerMgr.deployVirtualRouter(guestConfig, dest, context.getAccount()); - if (router == null) { - throw new ResourceUnavailableException("Unable to deploy the router for " + guestConfig); - } - - return true; - } else { + public boolean implement(Network guestConfig, NetworkOffering offering, DeployDestination dest, ReservationContext context) throws ResourceUnavailableException, ConcurrentOperationException, InsufficientCapacityException { + if (!canHandle(offering.getGuestIpType(), dest.getDataCenter())) { return false; } + _routerMgr.deployVirtualRouter(guestConfig, dest, context.getAccount()); + + return true; } @Override - public boolean prepare(Network config, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException, InsufficientNetworkCapacityException, ResourceUnavailableException { + public boolean prepare(Network config, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException { if (canHandle(config.getGuestType(), dest.getDataCenter())) { if (vm.getType() != VirtualMachine.Type.User) { return false; @@ -136,7 +132,7 @@ public class DomainRouterElement extends AdapterBase implements NetworkElement { DomainRouterVO router = _routerDao.findByNetworkConfiguration(networkId); if (router == null) { s_logger.warn("Unable to apply firewall rules, virtual router doesn't exist in the network " + config.getId()); - throw new ResourceUnavailableException("Unable to apply firewall rules"); + throw new CloudRuntimeException("Unable to apply firewall rules"); } if (router.getState() == State.Running || router.getState() == State.Starting) { @@ -163,7 +159,7 @@ public class DomainRouterElement extends AdapterBase implements NetworkElement { return true; } else { s_logger.warn("Unable to apply firewall rules, virtual router is not in the right state " + router.getState()); - throw new ResourceUnavailableException("Unable to apply firewall rules, domR is not in right state " + router.getState()); + throw new CloudRuntimeException("Unable to apply firewall rules, domR is not in right state " + router.getState()); } } return false; diff --git a/server/src/com/cloud/network/router/DomainRouterManager.java b/server/src/com/cloud/network/router/DomainRouterManager.java index 1a1bb353e11..4d05dc8c929 100644 --- a/server/src/com/cloud/network/router/DomainRouterManager.java +++ b/server/src/com/cloud/network/router/DomainRouterManager.java @@ -22,9 +22,9 @@ import java.util.Map; import com.cloud.api.commands.UpgradeRouterCmd; import com.cloud.deploy.DeployDestination; +import com.cloud.exception.AgentUnavailableException; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientCapacityException; -import com.cloud.exception.InsufficientNetworkCapacityException; import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.PermissionDeniedException; import com.cloud.exception.ResourceUnavailableException; @@ -33,7 +33,6 @@ import com.cloud.network.PublicIpAddress; import com.cloud.network.RemoteAccessVpnVO; import com.cloud.network.VpnUserVO; import com.cloud.network.rules.FirewallRule; -import com.cloud.service.ServiceOfferingVO; import com.cloud.user.Account; import com.cloud.uservm.UserVm; import com.cloud.utils.component.Manager; @@ -92,9 +91,9 @@ public interface DomainRouterManager extends Manager { DomainRouterVO getRouter(long accountId, long zoneId); DomainRouterVO getRouter(String publicIpAddress); - DomainRouterVO deployVirtualRouter(Network guestConfig, DeployDestination dest, Account owner) throws InsufficientCapacityException, ResourceUnavailableException, ConcurrentOperationException; + VirtualRouter deployVirtualRouter(Network guestNetwork, DeployDestination dest, Account owner) throws InsufficientCapacityException, ResourceUnavailableException, ConcurrentOperationException; - DomainRouterVO deployDhcp(Network guestConfig, DeployDestination dest, Account owner) throws InsufficientCapacityException, ResourceUnavailableException, ConcurrentOperationException; + VirtualRouter deployDhcp(Network guestNetwork, DeployDestination dest, Account owner) throws InsufficientCapacityException, ResourceUnavailableException, ConcurrentOperationException; RemoteAccessVpnVO startRemoteAccessVpn(RemoteAccessVpnVO vpnVO) throws ResourceUnavailableException; @@ -102,11 +101,11 @@ public interface DomainRouterManager extends Manager { boolean deleteRemoteAccessVpn(RemoteAccessVpnVO vpnVO); - DomainRouterVO addVirtualMachineIntoNetwork(Network config, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context, Boolean startDhcp) throws ConcurrentOperationException, InsufficientNetworkCapacityException, 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); + boolean associateIP (Network network, List ipAddress) throws ResourceUnavailableException; - boolean applyLBRules(Network network, List rules); - boolean applyPortForwardingRules(Network network, List rules); + boolean applyLBRules(Network network, List rules) throws ResourceUnavailableException; + boolean applyPortForwardingRules(Network network, List rules) throws AgentUnavailableException; } diff --git a/server/src/com/cloud/network/router/DomainRouterManagerImpl.java b/server/src/com/cloud/network/router/DomainRouterManagerImpl.java index 53fb7fb3d44..cdb6788ba81 100644 --- a/server/src/com/cloud/network/router/DomainRouterManagerImpl.java +++ b/server/src/com/cloud/network/router/DomainRouterManagerImpl.java @@ -59,7 +59,6 @@ import com.cloud.agent.api.routing.VmDataCommand; import com.cloud.agent.api.routing.VpnUsersCfgCommand; import com.cloud.agent.api.to.IpAddressTO; import com.cloud.agent.api.to.LoadBalancerTO; -import com.cloud.agent.api.to.PortForwardingRuleTO; import com.cloud.agent.manager.Commands; import com.cloud.alert.AlertManager; import com.cloud.api.commands.RebootRouterCmd; @@ -70,12 +69,12 @@ import com.cloud.async.AsyncJobExecutor; import com.cloud.async.AsyncJobManager; import com.cloud.async.AsyncJobVO; import com.cloud.async.BaseAsyncJobExecutor; -import com.cloud.async.AsyncJob.Type; import com.cloud.capacity.dao.CapacityDao; import com.cloud.configuration.Config; import com.cloud.configuration.ConfigurationManager; import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.configuration.dao.ResourceLimitDao; +import com.cloud.dc.DataCenter; import com.cloud.dc.DataCenterVO; import com.cloud.dc.HostPodVO; import com.cloud.dc.Vlan; @@ -97,7 +96,6 @@ import com.cloud.event.dao.EventDao; import com.cloud.exception.AgentUnavailableException; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientCapacityException; -import com.cloud.exception.InsufficientNetworkCapacityException; import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.OperationTimedoutException; import com.cloud.exception.PermissionDeniedException; @@ -190,111 +188,158 @@ import com.cloud.vm.dao.UserVmDao; /** * NetworkManagerImpl implements NetworkManager. */ -@Local(value={DomainRouterManager.class, DomainRouterService.class}) +@Local(value = { DomainRouterManager.class, DomainRouterService.class }) public class DomainRouterManagerImpl implements DomainRouterManager, DomainRouterService, VirtualMachineGuru { private static final Logger s_logger = Logger.getLogger(DomainRouterManagerImpl.class); String _name; - @Inject DataCenterDao _dcDao = null; - @Inject VlanDao _vlanDao = null; - @Inject FirewallRulesDao _rulesDao = null; - @Inject LoadBalancerDao _loadBalancerDao = null; - @Inject LoadBalancerVMMapDao _loadBalancerVMMapDao = null; - @Inject IPAddressDao _ipAddressDao = null; - @Inject VMTemplateDao _templateDao = null; - @Inject DomainRouterDao _routerDao = null; - @Inject UserDao _userDao = null; - @Inject AccountDao _accountDao = null; - @Inject DomainDao _domainDao = null; - @Inject UserStatisticsDao _userStatsDao = null; - @Inject VolumeDao _volsDao = null; - @Inject HostDao _hostDao = null; - @Inject EventDao _eventDao = null; - @Inject ConfigurationDao _configDao; - @Inject HostPodDao _podDao = null; - @Inject VMTemplateHostDao _vmTemplateHostDao = null; - @Inject UserVmDao _vmDao = null; - @Inject ResourceLimitDao _limitDao = null; - @Inject CapacityDao _capacityDao = null; - @Inject AgentManager _agentMgr; - @Inject StorageManager _storageMgr; - @Inject HighAvailabilityManager _haMgr; - @Inject AlertManager _alertMgr; - @Inject AccountManager _accountMgr; - @Inject AccountService _accountService; - @Inject ConfigurationManager _configMgr; - @Inject AsyncJobManager _asyncMgr; - @Inject StoragePoolDao _storagePoolDao = null; - @Inject ServiceOfferingDao _serviceOfferingDao = null; - @Inject UserVmDao _userVmDao; - @Inject FirewallRulesDao _firewallRulesDao; - @Inject NetworkRuleConfigDao _networkRuleConfigDao; - @Inject AccountVlanMapDao _accountVlanMapDao; - @Inject UserStatisticsDao _statsDao = null; - @Inject NetworkOfferingDao _networkOfferingDao = null; - @Inject NetworkDao _networkConfigurationDao = null; - @Inject NicDao _nicDao; - @Inject GuestOSDao _guestOSDao = null; - @Inject NetworkManager _networkMgr; - @Inject VirtualMachineManager _itMgr; - @Inject VpnUserDao _vpnUsersDao; - @Inject RemoteAccessVpnDao _remoteAccessVpnDao; - @Inject RulesManager _rulesMgr; - @Inject NetworkDao _networkDao; - + @Inject + DataCenterDao _dcDao = null; + @Inject + VlanDao _vlanDao = null; + @Inject + FirewallRulesDao _rulesDao = null; + @Inject + LoadBalancerDao _loadBalancerDao = null; + @Inject + LoadBalancerVMMapDao _loadBalancerVMMapDao = null; + @Inject + IPAddressDao _ipAddressDao = null; + @Inject + VMTemplateDao _templateDao = null; + @Inject + DomainRouterDao _routerDao = null; + @Inject + UserDao _userDao = null; + @Inject + AccountDao _accountDao = null; + @Inject + DomainDao _domainDao = null; + @Inject + UserStatisticsDao _userStatsDao = null; + @Inject + VolumeDao _volsDao = null; + @Inject + HostDao _hostDao = null; + @Inject + EventDao _eventDao = null; + @Inject + ConfigurationDao _configDao; + @Inject + HostPodDao _podDao = null; + @Inject + VMTemplateHostDao _vmTemplateHostDao = null; + @Inject + UserVmDao _vmDao = null; + @Inject + ResourceLimitDao _limitDao = null; + @Inject + CapacityDao _capacityDao = null; + @Inject + AgentManager _agentMgr; + @Inject + StorageManager _storageMgr; + @Inject + HighAvailabilityManager _haMgr; + @Inject + AlertManager _alertMgr; + @Inject + AccountManager _accountMgr; + @Inject + AccountService _accountService; + @Inject + ConfigurationManager _configMgr; + @Inject + AsyncJobManager _asyncMgr; + @Inject + StoragePoolDao _storagePoolDao = null; + @Inject + ServiceOfferingDao _serviceOfferingDao = null; + @Inject + UserVmDao _userVmDao; + @Inject + FirewallRulesDao _firewallRulesDao; + @Inject + NetworkRuleConfigDao _networkRuleConfigDao; + @Inject + AccountVlanMapDao _accountVlanMapDao; + @Inject + UserStatisticsDao _statsDao = null; + @Inject + NetworkOfferingDao _networkOfferingDao = null; + @Inject + NetworkDao _networksDao = null; + @Inject + NicDao _nicDao; + @Inject + GuestOSDao _guestOSDao = null; + @Inject + NetworkManager _networkMgr; + @Inject + VirtualMachineManager _itMgr; + @Inject + VpnUserDao _vpnUsersDao; + @Inject + RemoteAccessVpnDao _remoteAccessVpnDao; + @Inject + RulesManager _rulesMgr; + @Inject + NetworkDao _networkDao; + long _routerTemplateId = -1; int _routerRamSize; // String _privateNetmask; int _retry = 2; String _domain; String _instance; - String _defaultHypervisorType; - String _mgmt_host; - + String _defaultHypervisorType; + String _mgmt_host; + int _routerCleanupInterval = 3600; int _routerStatsInterval = 300; private ServiceOfferingVO _offering; private int _networkRate; private int _multicastRate; String _networkDomain; - + private VMTemplateVO _template; - + ScheduledExecutorService _executor; - + Account _systemAcct; boolean _useNewNetworking; - + @Override public DomainRouterVO getRouter(long accountId, long dataCenterId) { return _routerDao.findBy(accountId, dataCenterId); } - + @Override public DomainRouterVO getRouter(String publicIpAddress) { return _routerDao.findByPublicIpAddress(publicIpAddress); } - - @Override - public boolean destroy(DomainRouterVO router) { - return destroyRouter(router.getId()); - } + + @Override + public boolean destroy(DomainRouterVO router) { + return destroyRouter(router.getId()); + } @Override public boolean sendSshKeysToHost(Long hostId, String pubKey, String prvKey) { - ModifySshKeysCommand cmd = new ModifySshKeysCommand(pubKey, prvKey); - final Answer answer = _agentMgr.easySend(hostId, cmd); - - if (answer != null) { + ModifySshKeysCommand cmd = new ModifySshKeysCommand(pubKey, prvKey); + final Answer answer = _agentMgr.easySend(hostId, cmd); + + if (answer != null) { return true; } else { return false; } } - + @DB - public DomainRouterVO createDhcpServerForDirectlyAttachedGuests(long userId, long accountId, DataCenterVO dc, HostPodVO pod, Long candidateHost, VlanVO guestVlan) throws ConcurrentOperationException{ - + public DomainRouterVO createDhcpServerForDirectlyAttachedGuests(long userId, long accountId, DataCenterVO dc, HostPodVO pod, Long candidateHost, + VlanVO guestVlan) throws ConcurrentOperationException { + final AccountVO account = _accountDao.findById(accountId); boolean podVlan = guestVlan.getVlanType().equals(VlanType.DirectAttached) && guestVlan.getVlanTag().equals(Vlan.UNTAGGED); long accountIdForDHCPServer = podVlan ? Account.ACCOUNT_ID_SYSTEM : accountId; @@ -302,18 +347,18 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute String domainNameForDHCPServer = podVlan ? "root" : _domainDao.findById(account.getDomainId()).getName(); final VMTemplateVO rtrTemplate = _templateDao.findRoutingTemplate(); - + final Transaction txn = Transaction.currentTxn(); DomainRouterVO router = null; Long podId = pod.getId(); - pod = _podDao.acquireInLockTable(podId, 20*60); + pod = _podDao.acquireInLockTable(podId, 20 * 60); if (pod == null) { - throw new ConcurrentOperationException("Unable to acquire lock on pod " + podId ); + throw new ConcurrentOperationException("Unable to acquire lock on pod " + podId); } - if(s_logger.isDebugEnabled()) { + if (s_logger.isDebugEnabled()) { s_logger.debug("Lock on pod " + podId + " is acquired"); } - + final long id = _routerDao.getNextInSequence(Long.class, "id"); final String[] macAddresses = _dcDao.getNextAvailableMacAddressPair(dc.getId()); final String mgmtMacAddress = macAddresses[0]; @@ -325,42 +370,23 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute List rtrs = _routerDao.listByVlanDbId(guestVlan.getId()); assert rtrs.size() < 2 : "How did we get more than one router per vlan?"; if (rtrs.size() == 1) { - return rtrs.get(0); + return rtrs.get(0); } String mgmtNetmask = NetUtils.getCidrNetmask(pod.getCidrSize()); - final String guestIp = null;//_ipAddressDao.assignIpAddress(accountIdForDHCPServer, domainIdForDHCPServer, guestVlan.getId(), false).getAddress(); + final String guestIp = null;// _ipAddressDao.assignIpAddress(accountIdForDHCPServer, + // domainIdForDHCPServer, + // guestVlan.getId(), + // false).getAddress(); - router = - new DomainRouterVO(id, - _offering.getId(), - name, - mgmtMacAddress, - null, - mgmtNetmask, - _routerTemplateId, - rtrTemplate.getGuestOSId(), - guestMacAddress, - guestIp, - guestVlan.getVlanNetmask(), - accountIdForDHCPServer, - domainIdForDHCPServer, - "FE:FF:FF:FF:FF:FF", - null, - "255.255.255.255", - guestVlan.getId(), - guestVlan.getVlanTag(), - pod.getId(), - dc.getId(), - _routerRamSize, - guestVlan.getVlanGateway(), - domainNameForDHCPServer, - dc.getDns1(), - dc.getDns2()); + router = new DomainRouterVO(id, _offering.getId(), name, mgmtMacAddress, null, mgmtNetmask, _routerTemplateId, + rtrTemplate.getGuestOSId(), guestMacAddress, guestIp, guestVlan.getVlanNetmask(), accountIdForDHCPServer, domainIdForDHCPServer, + "FE:FF:FF:FF:FF:FF", null, "255.255.255.255", guestVlan.getId(), guestVlan.getVlanTag(), pod.getId(), dc.getId(), _routerRamSize, + guestVlan.getVlanGateway(), domainNameForDHCPServer, dc.getDns1(), dc.getDns2()); router.setRole(Role.DHCP_USERDATA); router.setVnet(guestVlan.getVlanTag()); router.setLastHostId(candidateHost); - + txn.start(); router = _routerDao.persist(router); router = _routerDao.acquireInLockTable(router.getId()); @@ -368,18 +394,18 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute s_logger.debug("Unable to acquire lock on router " + id); throw new CloudRuntimeException("Unable to acquire lock on router " + id); } - + routerLockAcquired = true; - + txn.commit(); - List vols = _storageMgr.create(account, router, rtrTemplate, dc, pod, _offering, null,0); - if (vols == null){ - _ipAddressDao.unassignIpAddress(guestIp); - _routerDao.expunge(router.getId()); - if (s_logger.isDebugEnabled()) { - s_logger.debug("Unable to create dhcp server in storage host or pool in pod " + pod.getName() + " (id:" + pod.getId() + ")"); - } + List vols = _storageMgr.create(account, router, rtrTemplate, dc, pod, _offering, null, 0); + if (vols == null) { + _ipAddressDao.unassignIpAddress(guestIp); + _routerDao.expunge(router.getId()); + if (s_logger.isDebugEnabled()) { + s_logger.debug("Unable to create dhcp server in storage host or pool in pod " + pod.getName() + " (id:" + pod.getId() + ")"); + } } final EventVO event = new EventVO(); @@ -395,7 +421,8 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute } _itMgr.stateTransitTo(router, VirtualMachine.Event.OperationSucceeded, null); - s_logger.info("DHCP server created: id=" + router.getId() + "; name=" + router.getName() + "; vlan=" + guestVlan.getVlanTag() + "; pod=" + pod.getName()); + s_logger.info("DHCP server created: id=" + router.getId() + "; name=" + router.getName() + "; vlan=" + guestVlan.getVlanTag() + "; pod=" + + pod.getName()); event.setDescription("successfully created DHCP Server : " + router.getName() + " with ip : " + router.getGuestIpAddress()); _eventDao.persist(event); @@ -421,16 +448,17 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute _routerDao.releaseFromLockTable(id); } if (pod != null) { - if(s_logger.isDebugEnabled()) { + if (s_logger.isDebugEnabled()) { s_logger.debug("Releasing lock on pod " + podId); } - _podDao.releaseFromLockTable(pod.getId()); + _podDao.releaseFromLockTable(pod.getId()); } } - } + } + @Override public boolean destroyRouter(final long routerId) { - + if (s_logger.isDebugEnabled()) { s_logger.debug("Attempting to destroy router " + routerId); } @@ -441,7 +469,7 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute s_logger.debug("Unable to acquire lock on router " + routerId); return false; } - + EventVO event = new EventVO(); event.setUserId(User.UID_SYSTEM); event.setAccountId(router.getAccountId()); @@ -464,7 +492,7 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute return false; } router = _routerDao.findById(routerId); - if (! _itMgr.stateTransitTo(router, VirtualMachine.Event.DestroyRequested, router.getHostId())) { + if (!_itMgr.stateTransitTo(router, VirtualMachine.Event.DestroyRequested, router.getHostId())) { s_logger.debug("VM " + router.toString() + " is not in a state to be destroyed."); return false; } @@ -474,7 +502,7 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute } _routerDao.releaseFromLockTable(routerId); } - + router.setPublicIpAddress(null); router.setVlanDbId(null); _routerDao.update(router.getId(), router); @@ -482,23 +510,23 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute List vols = _volsDao.findByInstance(routerId); _storageMgr.destroy(router, vols); - + if (s_logger.isDebugEnabled()) { s_logger.debug("Successfully destroyed router: " + routerId); } - + EventVO completedEvent = new EventVO(); completedEvent.setUserId(User.UID_SYSTEM); completedEvent.setAccountId(router.getAccountId()); completedEvent.setType(EventTypes.EVENT_ROUTER_DESTROY); completedEvent.setStartId(event.getId()); - completedEvent.setParameters("id=" + routerId); + completedEvent.setParameters("id=" + routerId); completedEvent.setDescription("successfully destroyed router : " + router.getName()); _eventDao.persist(completedEvent); return true; } - + @Override @DB public VirtualRouter upgradeRouter(UpgradeRouterCmd cmd) throws InvalidParameterValueException, PermissionDeniedException { @@ -528,12 +556,12 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute ServiceOfferingVO currentServiceOffering = _serviceOfferingDao.findById(router.getServiceOfferingId()); if (!currentServiceOffering.getGuestIpType().equals(newServiceOffering.getGuestIpType())) { - throw new InvalidParameterValueException("Can't upgrade router, due to the new network type: " + newServiceOffering.getGuestIpType() + " being different from " + - "current network type: " + currentServiceOffering.getGuestIpType()); + throw new InvalidParameterValueException("Can't upgrade router, due to the new network type: " + newServiceOffering.getGuestIpType() + + " being different from " + "current network type: " + currentServiceOffering.getGuestIpType()); } if (currentServiceOffering.getUseLocalStorage() != newServiceOffering.getUseLocalStorage()) { - throw new InvalidParameterValueException("Can't upgrade, due to new local storage status : " + newServiceOffering.getGuestIpType() + " is different from " + - "curruent local storage status: " + currentServiceOffering.getUseLocalStorage()); + throw new InvalidParameterValueException("Can't upgrade, due to new local storage status : " + newServiceOffering.getGuestIpType() + + " is different from " + "curruent local storage status: " + currentServiceOffering.getUseLocalStorage()); } router.setServiceOfferingId(serviceOfferingId); @@ -542,7 +570,7 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute } else { throw new CloudRuntimeException("Unable to upgrade router " + routerId); } - + } private String rot13(final String password) { @@ -553,7 +581,7 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute if ((c >= 'a' && c <= 'm') || ((c >= 'A' && c <= 'M'))) { c += 13; - } else if ((c >= 'n' && c <= 'z') || (c >= 'N' && c <= 'Z')) { + } else if ((c >= 'n' && c <= 'z') || (c >= 'N' && c <= 'Z')) { c -= 13; } @@ -576,13 +604,14 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute final Answer answer = _agentMgr.easySend(router.getHostId(), cmdSavePassword); return (answer != null && answer.getResult()); } else { - // either the router doesn't exist or router isn't running at all - return false; + // either the router doesn't exist or router isn't running at all + return false; } } @Override - public VirtualRouter startRouter(StartRouterCmd cmd) throws InvalidParameterValueException, PermissionDeniedException, ResourceUnavailableException, InsufficientCapacityException, ConcurrentOperationException{ + public VirtualRouter startRouter(StartRouterCmd cmd) throws InvalidParameterValueException, PermissionDeniedException, + ResourceUnavailableException, InsufficientCapacityException, ConcurrentOperationException { return startRouter(cmd.getId()); } @@ -629,10 +658,10 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute 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) { + 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) { @@ -641,10 +670,10 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute s_logger.warn("Timed Out", e); } Answer[] answers = cmds.getAnswers(); - if (answers == null ){ + if (answers == null) { return false; } - int i=0; + int i = 0; while (i < cmds.size()) { Answer ans = answers[i]; i++; @@ -654,62 +683,65 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute 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; - } + * 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.findByAccountAndZone(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; } - */ - - private boolean resendVpnServerData(final DomainRouterVO router) { - RemoteAccessVpnVO vpnVO = _remoteAccessVpnDao.findByAccountAndZone(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, long eventId) { @@ -722,35 +754,36 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute } _asyncMgr.updateAsyncJobAttachment(job.getId(), "domain_router", routerId); } - + if (s_logger.isDebugEnabled()) { s_logger.debug("Stopping router " + routerId); } - + return stop(_routerDao.findById(routerId), eventId); } - - + @Override - public VirtualRouter stopRouter(StopRouterCmd cmd) throws InvalidParameterValueException, PermissionDeniedException, ResourceUnavailableException, ConcurrentOperationException{ + public VirtualRouter stopRouter(StopRouterCmd cmd) throws InvalidParameterValueException, PermissionDeniedException, + ResourceUnavailableException, ConcurrentOperationException { if (_useNewNetworking) { return stopRouter(cmd.getId()); } - Long routerId = cmd.getId(); + Long routerId = cmd.getId(); Account account = UserContext.current().getAccount(); - // verify parameters + // verify parameters DomainRouterVO router = _routerDao.findById(routerId); if (router == null) { - throw new InvalidParameterValueException ("Unable to find router with id " + routerId); + throw new InvalidParameterValueException("Unable to find router with id " + routerId); } if ((account != null) && !_domainDao.isChildDomain(account.getDomainId(), router.getDomainId())) { - throw new PermissionDeniedException ("Unable to stop router with id " + routerId + ". Permission denied"); + throw new PermissionDeniedException("Unable to stop router with id " + routerId + ". Permission denied"); } - - long eventId = EventUtils.saveScheduledEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_ROUTER_STOP, "stopping Router with Id: "+routerId); - + + long eventId = EventUtils.saveScheduledEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_ROUTER_STOP, + "stopping Router with Id: " + routerId); + boolean success = stopRouter(routerId, eventId); if (success) { @@ -760,37 +793,37 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute } @DB - public void processStopOrRebootAnswer(final DomainRouterVO router, Answer answer) { - final Transaction txn = Transaction.currentTxn(); + public void processStopOrRebootAnswer(final DomainRouterVO router, Answer answer) { + final Transaction txn = Transaction.currentTxn(); try { txn.start(); final UserStatisticsVO userStats = _userStatsDao.lock(router.getAccountId(), router.getDataCenterId()); if (userStats != null) { - final RebootAnswer sa = (RebootAnswer)answer; + final RebootAnswer sa = (RebootAnswer) answer; final Long received = sa.getBytesReceived(); long netBytes = 0; if (received != null) { - if (received.longValue() >= userStats.getCurrentBytesReceived()) { - netBytes = received.longValue(); - } else { - netBytes = userStats.getCurrentBytesReceived() + received; - } + if (received.longValue() >= userStats.getCurrentBytesReceived()) { + netBytes = received.longValue(); + } else { + netBytes = userStats.getCurrentBytesReceived() + received; + } } else { - netBytes = userStats.getCurrentBytesReceived(); + netBytes = userStats.getCurrentBytesReceived(); } userStats.setCurrentBytesReceived(0); userStats.setNetBytesReceived(userStats.getNetBytesReceived() + netBytes); - + final Long sent = sa.getBytesSent(); - + if (sent != null) { - if (sent.longValue() >= userStats.getCurrentBytesSent()) { - netBytes = sent.longValue(); - } else { - netBytes = userStats.getCurrentBytesSent() + sent; - } - } else { - netBytes = userStats.getCurrentBytesSent(); + if (sent.longValue() >= userStats.getCurrentBytesSent()) { + netBytes = sent.longValue(); + } else { + netBytes = userStats.getCurrentBytesSent() + sent; + } + } else { + netBytes = userStats.getCurrentBytesSent(); } userStats.setNetBytesSent(userStats.getNetBytesSent() + netBytes); userStats.setCurrentBytesSent(0); @@ -802,7 +835,7 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute } catch (final Exception e) { throw new CloudRuntimeException("Problem getting stats after reboot/stop ", e); } - } + } @Override public boolean getRouterStatistics(final long vmId, final Map netStats, final Map diskStats) { @@ -813,22 +846,22 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute } /* - final GetVmStatsCommand cmd = new GetVmStatsCommand(router, router.getInstanceName()); - final Answer answer = _agentMgr.easySend(router.getHostId(), cmd); - if (answer == null) { - return false; - } - - final GetVmStatsAnswer stats = (GetVmStatsAnswer)answer; - - netStats.putAll(stats.getNetworkStats()); - diskStats.putAll(stats.getDiskStats()); - */ + * final GetVmStatsCommand cmd = new GetVmStatsCommand(router, + * router.getInstanceName()); + * final Answer answer = _agentMgr.easySend(router.getHostId(), cmd); + * if (answer == null) { + * return false; + * } + * + * final GetVmStatsAnswer stats = (GetVmStatsAnswer)answer; + * + * netStats.putAll(stats.getNetworkStats()); + * diskStats.putAll(stats.getDiskStats()); + */ return true; } - @Override public boolean rebootRouter(final long routerId, long startEventId) { AsyncJobExecutor asyncExecutor = BaseAsyncJobExecutor.getCurrentExecutor(); @@ -840,68 +873,74 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute } _asyncMgr.updateAsyncJobAttachment(job.getId(), "domain_router", routerId); } - + final DomainRouterVO router = _routerDao.findById(routerId); if (router == null || router.getState() == State.Destroyed) { return false; } - + EventVO event = new EventVO(); event.setUserId(1L); event.setAccountId(router.getAccountId()); event.setType(EventTypes.EVENT_ROUTER_REBOOT); event.setState(Event.State.Started); - event.setDescription("Rebooting Router with Id: "+routerId); + event.setDescription("Rebooting Router with Id: " + routerId); event.setStartId(startEventId); _eventDao.persist(event); - event = new EventVO(); event.setUserId(1L); event.setAccountId(router.getAccountId()); event.setType(EventTypes.EVENT_ROUTER_REBOOT); event.setStartId(startEventId); - + 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; -// } + // 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(); - Account account = UserContext.current().getAccount(); - - //verify parameters + public VirtualRouter rebootRouter(RebootRouterCmd cmd) throws InvalidParameterValueException, PermissionDeniedException { + Long routerId = cmd.getId(); + Account account = UserContext.current().getAccount(); + + // verify parameters DomainRouterVO router = _routerDao.findById(routerId); if (router == null) { - throw new InvalidParameterValueException("Unable to find domain router with id " + routerId + "."); + throw new InvalidParameterValueException("Unable to find domain router with id " + routerId + "."); } if ((account != null) && !_domainDao.isChildDomain(account.getDomainId(), router.getDomainId())) { throw new PermissionDeniedException("Unable to reboot domain router with id " + routerId + ". Permission denied"); } - long eventId = EventUtils.saveScheduledEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_ROUTER_REBOOT, "rebooting Router with Id: "+routerId); - - if (rebootRouter(routerId, eventId)) { + long eventId = EventUtils.saveScheduledEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_ROUTER_REBOOT, + "rebooting Router with Id: " + routerId); + + if (rebootRouter(routerId, eventId)) { return _routerDao.findById(routerId); } else { throw new CloudRuntimeException("Fail to reboot router " + routerId); @@ -925,23 +964,23 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute _executor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("RouterMonitor")); final ComponentLocator locator = ComponentLocator.getCurrentLocator(); - + final Map configs = _configDao.getConfiguration("AgentManager", params); _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("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); - _defaultHypervisorType = _configDao.getValue(Config.HypervisorDefaultType.key()); - + _defaultHypervisorType = _configDao.getValue(Config.HypervisorDefaultType.key()); + value = configs.get("router.stats.interval"); _routerStatsInterval = NumbersUtil.parseInt(value, 300); @@ -957,7 +996,7 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute if (_instance == null) { _instance = "DEFAULT"; } - + _networkDomain = configs.get("domain.suffix"); s_logger.info("Router configurations: " + "ramsize=" + _routerRamSize + "; templateId=" + _routerTemplateId); @@ -976,25 +1015,26 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute String multicastRateStr = _configDao.getValue("multicast.throttling.rate"); _networkRate = ((networkRateStr == null) ? 200 : Integer.parseInt(networkRateStr)); _multicastRate = ((multicastRateStr == null) ? 10 : Integer.parseInt(multicastRateStr)); - _offering = new ServiceOfferingVO("System Offering For Software Router", 1, _routerRamSize, 0, 0, 0, false, null, NetworkOffering.GuestIpType.Virtual, useLocalStorage, true, null, true); + _offering = new ServiceOfferingVO("System Offering For Software Router", 1, _routerRamSize, 0, 0, 0, false, null, + NetworkOffering.GuestIpType.Virtual, useLocalStorage, true, null, true); _offering.setUniqueName("Cloud.Com-SoftwareRouter"); _offering = _serviceOfferingDao.persistSystemServiceOffering(_offering); _template = _templateDao.findRoutingTemplate(); if (_template == null) { - s_logger.error("Unable to find system vm template."); + s_logger.error("Unable to find system vm template."); } else { - _routerTemplateId = _template.getId(); + _routerTemplateId = _template.getId(); } - + _useNewNetworking = Boolean.parseBoolean(configs.get("use.new.networking")); - + _systemAcct = _accountService.getSystemAccount(); - + s_logger.info("DomainRouterManager is configured."); return true; } - + @Override public String getName() { return _name; @@ -1029,14 +1069,14 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute @Override public void completeStartCommand(final DomainRouterVO router) { - _itMgr.stateTransitTo(router, VirtualMachine.Event.AgentReportRunning, router.getHostId()); + _itMgr.stateTransitTo(router, VirtualMachine.Event.AgentReportRunning, router.getHostId()); } @Override public void completeStopCommand(final DomainRouterVO router) { - completeStopCommand(router, VirtualMachine.Event.AgentReportStopped); + completeStopCommand(router, VirtualMachine.Event.AgentReportStopped); } - + @DB public void completeStopCommand(final DomainRouterVO router, final VirtualMachine.Event ev) { final long routerId = router.getId(); @@ -1049,11 +1089,11 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute } router.setVnet(null); - + String privateIpAddress = router.getPrivateIpAddress(); - + if (privateIpAddress != null) { - if(_defaultHypervisorType == null || !_defaultHypervisorType.equalsIgnoreCase(Hypervisor.HypervisorType.VmWare.toString())) { + if (_defaultHypervisorType == null || !_defaultHypervisorType.equalsIgnoreCase(Hypervisor.HypervisorType.VmWare.toString())) { _dcDao.releaseLinkLocalIpAddress(privateIpAddress, router.getDataCenterId(), router.getId()); } else { _dcDao.releasePrivateIpAddress(privateIpAddress, router.getDataCenterId(), router.getId()); @@ -1061,9 +1101,9 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute } router.setPrivateIpAddress(null); - if (! _itMgr.stateTransitTo(router, ev, null)) { - s_logger.debug("Router is not updated"); - return; + if (!_itMgr.stateTransitTo(router, ev, null)) { + s_logger.debug("Router is not updated"); + return; } txn.commit(); } catch (final Exception e) { @@ -1088,10 +1128,10 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute 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 { @@ -1099,7 +1139,7 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute if (!answer.getResult()) { s_logger.error("Unable to stop router"); } else { - stopped = true; + stopped = true; } } catch (AgentUnavailableException e) { s_logger.warn("Unable to reach agent to stop vm: " + router.getId()); @@ -1107,69 +1147,69 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute 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 eventId) { - long routerId = router.getId(); - + long routerId = router.getId(); + router = _routerDao.acquireInLockTable(routerId); if (router == null) { s_logger.debug("Unable to acquire lock on router " + routerId); return false; } - + EventVO event = new EventVO(); event.setUserId(1L); event.setAccountId(router.getAccountId()); event.setType(EventTypes.EVENT_ROUTER_STOP); event.setState(Event.State.Started); - event.setDescription("Stopping Router with Id: "+routerId); + event.setDescription("Stopping Router with Id: " + routerId); event.setStartId(eventId); event = _eventDao.persist(event); - if(eventId == 0){ + if (eventId == 0) { eventId = event.getId(); } - + try { - - if(s_logger.isDebugEnabled()) { + + 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; } - + event = new EventVO(); event.setUserId(1L); event.setAccountId(router.getAccountId()); event.setType(EventTypes.EVENT_ROUTER_STOP); event.setStartId(eventId); - - if (! _itMgr.stateTransitTo(router, VirtualMachine.Event.StopRequested, hostId)) { + + 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 { @@ -1188,7 +1228,7 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute 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); @@ -1196,17 +1236,17 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute _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()) { + if (s_logger.isDebugEnabled()) { s_logger.debug("Release lock on router " + routerId + " for stop"); } _routerDao.releaseFromLockTable(routerId); @@ -1225,14 +1265,15 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute final List vols = _volsDao.findCreatedByInstance(routerId); - final String [] storageIps = new String[2]; + final String[] storageIps = new String[2]; final VolumeVO vol = vols.get(0); storageIps[0] = vol.getHostIp(); if (mirroredVols && (vols.size() == 2)) { storageIps[1] = vols.get(1).getHostIp(); } - final PrepareForMigrationCommand cmd = new PrepareForMigrationCommand(router.getInstanceName(), router.getVnet(), storageIps, vols, mirroredVols); + final PrepareForMigrationCommand cmd = new PrepareForMigrationCommand(router.getInstanceName(), router.getVnet(), storageIps, vols, + mirroredVols); HostVO routingHost = null; final HashSet avoid = new HashSet(); @@ -1244,14 +1285,14 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute } avoid.add(fromHost); - while ((routingHost = (HostVO)_agentMgr.findHost(Host.Type.Routing, dc, pod, sp, offering, _template, router, fromHost, avoid)) != null) { + while ((routingHost = (HostVO) _agentMgr.findHost(Host.Type.Routing, dc, pod, sp, offering, _template, router, fromHost, avoid)) != null) { avoid.add(routingHost); if (s_logger.isDebugEnabled()) { s_logger.debug("Trying to migrate router to host " + routingHost.getName()); } - if( ! _storageMgr.share(router, vols, routingHost, false) ) { - s_logger.warn("Can not share " + vol.getPath() + " to " + router.getName() ); + if (!_storageMgr.share(router, vols, routingHost, false)) { + s_logger.warn("Can not share " + vol.getPath() + " to " + router.getName()); throw new StorageUnavailableException("Can not share " + vol.getPath() + " to " + router.getName(), sp.getId()); } @@ -1270,11 +1311,11 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute public boolean migrate(final DomainRouterVO router, final HostVO host) { final HostVO fromHost = _hostDao.findById(router.getHostId()); - if (! _itMgr.stateTransitTo(router, VirtualMachine.Event.MigrationRequested, router.getHostId())) { - s_logger.debug("State for " + router.toString() + " has changed so migration can not take place."); - return false; - } - + if (!_itMgr.stateTransitTo(router, VirtualMachine.Event.MigrationRequested, router.getHostId())) { + s_logger.debug("State for " + router.toString() + " has changed so migration can not take place."); + return false; + } + final MigrateCommand cmd = new MigrateCommand(router.getInstanceName(), host.getPrivateIpAddress(), false); final Answer answer = _agentMgr.easySend(fromHost.getId(), cmd); if (answer == null) { @@ -1294,7 +1335,7 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute @Override public boolean completeMigration(final DomainRouterVO router, final HostVO host) throws OperationTimedoutException, AgentUnavailableException { final CheckVirtualMachineCommand cvm = new CheckVirtualMachineCommand(router.getInstanceName()); - final CheckVirtualMachineAnswer answer = (CheckVirtualMachineAnswer)_agentMgr.send(host.getId(), cvm); + final CheckVirtualMachineAnswer answer = (CheckVirtualMachineAnswer) _agentMgr.send(host.getId(), cvm); if (answer == null || !answer.getResult()) { s_logger.debug("Unable to complete migration for " + router.getId()); _itMgr.stateTransitTo(router, VirtualMachine.Event.AgentReportStopped, null); @@ -1323,7 +1364,7 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute try { final List ids = _routerDao.findLonelyRouters(); s_logger.info("Found " + ids.size() + " routers to stop. "); - + for (final Long id : ids) { stopRouter(id, 0); } @@ -1334,24 +1375,23 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute } } - private VmDataCommand generateVmDataCommand(String routerPrivateIpAddress, String routerPublicIpAddress, - String vmPrivateIpAddress, String userData, String serviceOffering, String zoneName, - String guestIpAddress, String vmName, String vmInstanceName, long vmId) { - VmDataCommand cmd = new VmDataCommand(routerPrivateIpAddress, vmPrivateIpAddress); - - 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", "instance-id", vmInstanceName); - cmd.addVmData("metadata", "vm-id", String.valueOf(vmId)); - - return cmd; - } - + private VmDataCommand generateVmDataCommand(String routerPrivateIpAddress, String routerPublicIpAddress, String vmPrivateIpAddress, + String userData, String serviceOffering, String zoneName, String guestIpAddress, String vmName, String vmInstanceName, long vmId) { + VmDataCommand cmd = new VmDataCommand(routerPrivateIpAddress, vmPrivateIpAddress); + + 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", "instance-id", vmInstanceName); + cmd.addVmData("metadata", "vm-id", String.valueOf(vmId)); + + return cmd; + } + protected class NetworkUsageTask implements Runnable { public NetworkUsageTask() { @@ -1364,10 +1404,10 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute for (DomainRouterVO router : routers) { String privateIP = router.getPrivateIpAddress(); - if(privateIP != null){ + if (privateIP != null) { final NetworkUsageCommand usageCmd = new NetworkUsageCommand(privateIP, router.getName()); - final NetworkUsageAnswer answer = (NetworkUsageAnswer)_agentMgr.easySend(router.getHostId(), usageCmd); - if(answer != null){ + final NetworkUsageAnswer answer = (NetworkUsageAnswer) _agentMgr.easySend(router.getHostId(), usageCmd); + if (answer != null) { Transaction txn = Transaction.open(Transaction.CLOUD_DB); try { if ((answer.getBytesReceived() == 0) && (answer.getBytesSent() == 0)) { @@ -1382,23 +1422,26 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute } if (stats.getCurrentBytesReceived() > answer.getBytesReceived()) { if (s_logger.isDebugEnabled()) { - s_logger.debug("Received # of bytes that's less than the last one. Assuming something went wrong and persisting it. Reported: " + answer.getBytesReceived() + " Stored: " + stats.getCurrentBytesReceived()); + s_logger.debug("Received # of bytes that's less than the last one. Assuming something went wrong and persisting it. Reported: " + + answer.getBytesReceived() + " Stored: " + stats.getCurrentBytesReceived()); } stats.setNetBytesReceived(stats.getNetBytesReceived() + stats.getCurrentBytesReceived()); } stats.setCurrentBytesReceived(answer.getBytesReceived()); if (stats.getCurrentBytesSent() > answer.getBytesSent()) { if (s_logger.isDebugEnabled()) { - s_logger.debug("Received # of bytes that's less than the last one. Assuming something went wrong and persisting it. Reported: " + answer.getBytesSent() + " Stored: " + stats.getCurrentBytesSent()); + s_logger.debug("Received # of bytes that's less than the last one. Assuming something went wrong and persisting it. Reported: " + + answer.getBytesSent() + " Stored: " + stats.getCurrentBytesSent()); } stats.setNetBytesSent(stats.getNetBytesSent() + stats.getCurrentBytesSent()); } stats.setCurrentBytesSent(answer.getBytesSent()); _statsDao.update(stats.getId(), stats); txn.commit(); - } catch(Exception e) { + } catch (Exception e) { txn.rollback(); - s_logger.warn("Unable to update user statistics for account: " + router.getAccountId() + " Rx: " + answer.getBytesReceived() + "; Tx: " + answer.getBytesSent()); + s_logger.warn("Unable to update user statistics for account: " + router.getAccountId() + " Rx: " + + answer.getBytesReceived() + "; Tx: " + answer.getBytesSent()); } finally { txn.close(); } @@ -1408,43 +1451,37 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute } } - - public static boolean isAdmin(short accountType) { - return ((accountType == Account.ACCOUNT_TYPE_ADMIN) || - (accountType == Account.ACCOUNT_TYPE_DOMAIN_ADMIN) || - (accountType == Account.ACCOUNT_TYPE_READ_ONLY_ADMIN)); - } - - @Override - public DomainRouterVO deployVirtualRouter(Network guestConfig, DeployDestination dest, Account owner) throws InsufficientCapacityException, StorageUnavailableException, ConcurrentOperationException, ResourceUnavailableException { - long dcId = dest.getDataCenter().getId(); - + public static boolean isAdmin(short accountType) { + return ((accountType == Account.ACCOUNT_TYPE_ADMIN) || (accountType == Account.ACCOUNT_TYPE_DOMAIN_ADMIN) || (accountType == Account.ACCOUNT_TYPE_READ_ONLY_ADMIN)); + } + + @Override + public VirtualRouter deployVirtualRouter(Network guestConfig, DeployDestination dest, Account owner) throws InsufficientCapacityException, + ConcurrentOperationException, ResourceUnavailableException { + long dcId = dest.getDataCenter().getId(); + if (s_logger.isDebugEnabled()) { - s_logger.debug("Starting a router for network configurations: virtual=" + guestConfig + " in " + dest); + s_logger.debug("Starting a router for network configurations: virtual=" + guestConfig + " in " + dest); } - assert guestConfig.getState() == Network.State.Implemented || guestConfig.getState() == Network.State.Setup : "Network is not yet fully implemented: " + guestConfig; - assert guestConfig.getTrafficType() == TrafficType.Guest; - + assert guestConfig.getState() == Network.State.Implemented || guestConfig.getState() == Network.State.Setup : "Network is not yet fully implemented: " + + guestConfig; + assert guestConfig.getTrafficType() == TrafficType.Guest; + DataCenterDeployment plan = new DataCenterDeployment(dcId); - - guestConfig = _networkConfigurationDao.lockRow(guestConfig.getId(), true); - if (guestConfig == null) { - throw new ConcurrentOperationException("Unable to get the lock on " + guestConfig); - } - + DomainRouterVO router = _routerDao.findByNetworkConfiguration(guestConfig.getId()); if (router == null) { long id = _routerDao.getNextInSequence(Long.class, "id"); if (s_logger.isDebugEnabled()) { s_logger.debug("Creating the router " + id); } - + PublicIp sourceNatIp = _networkMgr.assignSourceNatIpAddress(owner, guestConfig, _accountService.getSystemUser().getId()); - + List offerings = _networkMgr.getSystemAccountNetworkOfferings(NetworkOfferingVO.SystemVmControlNetwork); NetworkOfferingVO controlOffering = offerings.get(0); NetworkVO controlConfig = _networkMgr.setupNetwork(_systemAcct, controlOffering, plan, null, null, false).get(0); - + List> networks = new ArrayList>(3); NetworkOfferingVO publicOffering = _networkMgr.getSystemAccountNetworkOfferings(NetworkOfferingVO.SystemVmPublicNetwork).get(0); List publicConfigs = _networkMgr.setupNetwork(_systemAcct, publicOffering, plan, null, null, false); @@ -1471,87 +1508,84 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute gatewayNic.setIsolationUri(guestConfig.getBroadcastUri()); gatewayNic.setMode(guestConfig.getMode()); gatewayNic.setNetmask(NetUtils.getCidrSubNet(guestConfig.getCidr())); - networks.add(new Pair((NetworkVO)guestConfig, gatewayNic)); + networks.add(new Pair((NetworkVO) guestConfig, gatewayNic)); networks.add(new Pair(controlConfig, null)); - - router = new DomainRouterVO(id, _offering.getId(), VirtualMachineName.getRouterName(id, _instance), _template.getId(), _template.getGuestOSId(), owner.getDomainId(), owner.getId(), guestConfig.getId(), _offering.getOfferHA()); - router = _itMgr.allocate(router, _template, _offering, networks, plan, null, owner); - } - - return _itMgr.start(router, null, _accountService.getSystemUser(), _accountService.getSystemAccount(), null); - } - - - @Override - public DomainRouterVO deployDhcp(Network guestConfig, DeployDestination dest, Account owner) throws InsufficientCapacityException, StorageUnavailableException, ConcurrentOperationException, ResourceUnavailableException { - long dcId = dest.getDataCenter().getId(); - - if (s_logger.isDebugEnabled()) { - s_logger.debug("Starting a dhcp for network configurations: dhcp=" + guestConfig + " in " + dest); - } - assert guestConfig.getState() == Network.State.Implemented || guestConfig.getState() == Network.State.Setup : "Network is not yet fully implemented: " + guestConfig; - - DataCenterDeployment plan = new DataCenterDeployment(dcId); - - guestConfig = _networkConfigurationDao.lockRow(guestConfig.getId(), true); - if (guestConfig == null) { - throw new ConcurrentOperationException("Unable to get the lock on " + guestConfig); - } - - DomainRouterVO router = _routerDao.findByNetworkConfiguration(guestConfig.getId()); - if (router == null) { - long id = _routerDao.getNextInSequence(Long.class, "id"); - if (s_logger.isDebugEnabled()) { - s_logger.debug("Creating the router " + id); - } - - List offerings = _networkMgr.getSystemAccountNetworkOfferings(NetworkOfferingVO.SystemVmControlNetwork); - NetworkOfferingVO controlOffering = offerings.get(0); - NetworkVO controlConfig = _networkMgr.setupNetwork(_systemAcct, controlOffering, plan, null, null, false).get(0); - - List> networks = new ArrayList>(3); - NicProfile gatewayNic = new NicProfile(); - gatewayNic.setDefaultNic(true); - networks.add(new Pair((NetworkVO)guestConfig, gatewayNic)); - networks.add(new Pair(controlConfig, null)); - - router = new DomainRouterVO(id, _offering.getId(), VirtualMachineName.getRouterName(id, _instance), _template.getId(), _template.getGuestOSId(), owner.getDomainId(), owner.getId(), guestConfig.getId(), _offering.getOfferHA()); - router.setRole(Role.DHCP_USERDATA); - router = _itMgr.allocate(router, _template, _offering, networks, plan, null, owner); - } - - return _itMgr.start(router, null, _accountService.getSystemUser(), _accountService.getSystemAccount(), null); - } - - @Override - public boolean finalizeVirtualMachineProfile(VirtualMachineProfile profile, DeployDestination dest, ReservationContext context) { - - DomainRouterVO router = profile.getVirtualMachine(); - NetworkVO network = _networkDao.findById(router.getNetworkId()); - - String type = null; - String dhcpRange = null; - //get first ip address from network cidr + router = new DomainRouterVO(id, _offering.getId(), VirtualMachineName.getRouterName(id, _instance), _template.getId(), + _template.getGuestOSId(), owner.getDomainId(), owner.getId(), guestConfig.getId(), _offering.getOfferHA()); + router = _itMgr.allocate(router, _template, _offering, networks, plan, null, owner); + } + + return _itMgr.start(router, null, _accountService.getSystemUser(), _accountService.getSystemAccount(), null); + } + + @Override + public VirtualRouter deployDhcp(Network guestConfig, DeployDestination dest, Account owner) throws InsufficientCapacityException, + StorageUnavailableException, ConcurrentOperationException, ResourceUnavailableException { + long dcId = dest.getDataCenter().getId(); + + if (s_logger.isDebugEnabled()) { + s_logger.debug("Starting a dhcp for network configurations: dhcp=" + guestConfig + " in " + dest); + } + assert guestConfig.getState() == Network.State.Implemented || guestConfig.getState() == Network.State.Setup : "Network is not yet fully implemented: " + + guestConfig; + + DataCenterDeployment plan = new DataCenterDeployment(dcId); + + DomainRouterVO router = _routerDao.findByNetworkConfiguration(guestConfig.getId()); + if (router == null) { + long id = _routerDao.getNextInSequence(Long.class, "id"); + if (s_logger.isDebugEnabled()) { + s_logger.debug("Creating the router " + id); + } + + List offerings = _networkMgr.getSystemAccountNetworkOfferings(NetworkOfferingVO.SystemVmControlNetwork); + NetworkOfferingVO controlOffering = offerings.get(0); + NetworkVO controlConfig = _networkMgr.setupNetwork(_systemAcct, controlOffering, plan, null, null, false).get(0); + + List> networks = new ArrayList>(3); + NicProfile gatewayNic = new NicProfile(); + gatewayNic.setDefaultNic(true); + networks.add(new Pair((NetworkVO) guestConfig, gatewayNic)); + networks.add(new Pair(controlConfig, null)); + + router = new DomainRouterVO(id, _offering.getId(), VirtualMachineName.getRouterName(id, _instance), _template.getId(), + _template.getGuestOSId(), owner.getDomainId(), owner.getId(), guestConfig.getId(), _offering.getOfferHA()); + router.setRole(Role.DHCP_USERDATA); + router = _itMgr.allocate(router, _template, _offering, networks, plan, null, owner); + } + + return _itMgr.start(router, null, _accountService.getSystemUser(), _accountService.getSystemAccount(), null); + } + + @Override + public boolean finalizeVirtualMachineProfile(VirtualMachineProfile profile, DeployDestination dest, ReservationContext context) { + + DomainRouterVO router = profile.getVirtualMachine(); + NetworkVO network = _networkDao.findById(router.getNetworkId()); + + String type = null; + String dhcpRange = null; + + // get first ip address from network cidr String cidr = network.getCidr(); String[] splitResult = cidr.split("\\/"); long size = Long.valueOf(splitResult[1]); dhcpRange = NetUtils.getIpRangeStartIpFromCidr(splitResult[0], size); - - String domain = network.getNetworkDomain(); - if (router.getRole() == Role.DHCP_USERDATA) { - type="dhcpsrvr"; - } else { - type = "router"; - } - - StringBuilder buf = profile.getBootArgsBuilder(); + String domain = network.getNetworkDomain(); + if (router.getRole() == Role.DHCP_USERDATA) { + type = "dhcpsrvr"; + } else { + type = "router"; + } + + StringBuilder buf = profile.getBootArgsBuilder(); buf.append(" template=domP type=" + type); buf.append(" name=").append(profile.getHostName()); NicProfile controlNic = null; NicProfile managementNic = null; - + for (NicProfile nic : profile.getNics()) { int deviceId = nic.getDeviceId(); buf.append(" eth").append(deviceId).append("ip=").append(nic.getIp4Address()); @@ -1567,43 +1601,43 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute buf.append(" localgw=").append(dest.getPod().getGateway()); managementNic = nic; } else if (nic.getTrafficType() == TrafficType.Control) { - // DOMR control command is sent over management server in VMware - if(dest.getHost().getHypervisorType() == HypervisorType.VmWare) { - buf.append(" mgmtcidr=").append(_mgmt_host); - buf.append(" localgw=").append(dest.getPod().getGateway()); - } - + // DOMR control command is sent over management server in VMware + if (dest.getHost().getHypervisorType() == HypervisorType.VmWare) { + buf.append(" mgmtcidr=").append(_mgmt_host); + buf.append(" localgw=").append(dest.getPod().getGateway()); + } + controlNic = nic; } } - + if (dhcpRange != null) { buf.append(" dhcprange=" + dhcpRange); - } - if (domain != null) { - buf.append(" domain="+router.getDomain()); - } - + } + if (domain != null) { + buf.append(" domain=" + router.getDomain()); + } + if (s_logger.isDebugEnabled()) { s_logger.debug("Boot Args for " + profile + ": " + buf.toString()); } - + if (controlNic == null) { throw new CloudRuntimeException("Didn't start a control port"); } - + profile.setParameter("control.nic", controlNic); - + return true; - } + } @Override public boolean finalizeDeployment(Commands cmds, VirtualMachineProfile profile, DeployDestination dest, ReservationContext context) { - NicProfile controlNic = (NicProfile)profile.getParameter("control.nic"); + NicProfile controlNic = (NicProfile) profile.getParameter("control.nic"); cmds.addCommand("checkSsh", new CheckSshCommand(profile.getInstanceName(), controlNic.getIp4Address(), 3922, 5, 20)); - + DomainRouterVO router = profile.getVirtualMachine(); - + List nics = _nicDao.listBy(router.getId()); for (NicVO nic : nics) { NetworkVO network = _networkDao.findById(nic.getNetworkId()); @@ -1629,7 +1663,7 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute if (userIps != null && !userIps.isEmpty()) { for (IPAddressVO userIp : userIps) { PublicIp publicIp = new PublicIp(userIp, _vlanDao.findById(userIp.getVlanId()), userIp.getMacAddress()); - publicIps.add((PublicIpAddress)publicIp); + publicIps.add(publicIp); } } @@ -1642,7 +1676,7 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute @Override public boolean finalizeStart(Commands cmds, VirtualMachineProfile profile, DeployDestination dest, ReservationContext context) { - CheckSshAnswer answer = (CheckSshAnswer)cmds.getAnswer("checkSsh"); + CheckSshAnswer answer = (CheckSshAnswer) cmds.getAnswer("checkSsh"); if (!answer.getResult()) { s_logger.warn("Unable to ssh to the VM: " + answer.getDetails()); return false; @@ -1650,108 +1684,103 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute return true; } - + @Override public void finalizeStop(VirtualMachineProfile profile, long hostId, String reservationId) { } - @Override - public RemoteAccessVpnVO startRemoteAccessVpn(RemoteAccessVpnVO vpnVO) throws ResourceUnavailableException { - DomainRouterVO router = getRouter(vpnVO.getAccountId(), vpnVO.getZoneId()); - if (router == null) { - s_logger.warn("Failed to start remote access VPN: no router found for account and zone"); - return null; - } - if (router.getState() != State.Running && router.getState() != State.Starting) { - s_logger.warn("Failed to start remote access VPN: router not in running state"); - return null; - } - List vpnUsers = _vpnUsersDao.listByAccount(vpnVO.getAccountId()); - VpnUsersCfgCommand addUsersCmd = new VpnUsersCfgCommand(router.getPrivateIpAddress(), vpnUsers, new ArrayList()); - RemoteAccessVpnCfgCommand startVpnCmd = new RemoteAccessVpnCfgCommand(true, router.getPrivateIpAddress(), vpnVO.getVpnServerAddress(), vpnVO.getLocalIp(), vpnVO.getIpRange(), vpnVO.getIpsecPresharedKey()); - Commands cmds = new Commands(OnError.Stop); - cmds.addCommand("users", addUsersCmd); - cmds.addCommand("startVpn", startVpnCmd); - try { - _agentMgr.send(router.getHostId(), cmds); - } catch (AgentUnavailableException e) { - s_logger.debug("Failed to start remote access VPN: ", e); - return null; - } catch (OperationTimedoutException e) { - s_logger.debug("Failed to start remote access VPN: ", e); - return null; - } - Answer answer = cmds.getAnswer("users"); - if (!answer.getResult()) { - s_logger.error("Unable to start vpn: unable add users to vpn in zone " + vpnVO.getZoneId() + " for account "+ vpnVO.getAccountId() +" on domR: " + router.getInstanceName() + " due to " + answer.getDetails()); - throw new ResourceUnavailableException("Unable to start vpn: Unable to add users to vpn in zone " + vpnVO.getZoneId() + " for account "+ vpnVO.getAccountId() +" on domR: " + router.getInstanceName() + " due to " + answer.getDetails()); + @Override + public RemoteAccessVpnVO startRemoteAccessVpn(RemoteAccessVpnVO vpnVO) throws ResourceUnavailableException { + DomainRouterVO router = getRouter(vpnVO.getAccountId(), vpnVO.getZoneId()); + if (router == null) { + s_logger.warn("Failed to start remote access VPN: no router found for account and zone"); + return null; } - answer = cmds.getAnswer("startVpn"); - if (!answer.getResult()) { - s_logger.error("Unable to start vpn in zone " + vpnVO.getZoneId() + " for account "+ vpnVO.getAccountId() +" on domR: " + router.getInstanceName() + " due to " + answer.getDetails()); - throw new ResourceUnavailableException("Unable to start vpn in zone " + vpnVO.getZoneId() + " for account "+ vpnVO.getAccountId() +" on domR: " + router.getInstanceName() + " due to " + answer.getDetails()); + if (router.getState() != State.Running && router.getState() != State.Starting) { + s_logger.warn("Failed to start remote access VPN: router not in running state"); + return null; } - return vpnVO; - } - - @Override - public boolean deleteRemoteAccessVpn(RemoteAccessVpnVO vpnVO) { - DomainRouterVO router = getRouter(vpnVO.getAccountId(), vpnVO.getZoneId()); - if (router == null) { - s_logger.warn("Failed to delete remote access VPN: no router found for account and zone"); - return false; - } - if (router.getState() != State.Running) { - s_logger.warn("Failed to delete remote access VPN: router not in running state"); - return false; - } - try { - Answer answer = _agentMgr.send(router.getHostId(), new RemoteAccessVpnCfgCommand(false, router.getPrivateIpAddress(), vpnVO.getVpnServerAddress(), vpnVO.getLocalIp(), vpnVO.getIpRange(), vpnVO.getIpsecPresharedKey())); - if (answer != null && answer.getResult()) { - return true; - } else { - s_logger.debug("Failed to delete remote access VPN: " + answer.getDetails()); - return false; - } - } catch (AgentUnavailableException e) { - s_logger.debug("Failed to delete remote access VPN: ", e); - return false; - } catch (OperationTimedoutException e) { - s_logger.debug("Failed to delete remote access VPN: ", e); - return false; - } - } - - public DomainRouterVO start(long routerId, User user, Account caller) throws StorageUnavailableException, InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException { - return start(_routerDao.findById(routerId), user, caller); - } - - public DomainRouterVO start(DomainRouterVO router, User user, Account caller) throws StorageUnavailableException, InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException { - return _itMgr.start(router, null, user, caller, null); - } + List vpnUsers = _vpnUsersDao.listByAccount(vpnVO.getAccountId()); + VpnUsersCfgCommand addUsersCmd = new VpnUsersCfgCommand(router.getPrivateIpAddress(), vpnUsers, new ArrayList()); + RemoteAccessVpnCfgCommand startVpnCmd = new RemoteAccessVpnCfgCommand(true, router.getPrivateIpAddress(), vpnVO.getVpnServerAddress(), + vpnVO.getLocalIp(), vpnVO.getIpRange(), vpnVO.getIpsecPresharedKey()); + Commands cmds = new Commands(OnError.Stop); + cmds.addCommand("users", addUsersCmd); + cmds.addCommand("startVpn", startVpnCmd); + try { + _agentMgr.send(router.getHostId(), cmds); + } catch (AgentUnavailableException e) { + s_logger.debug("Failed to start remote access VPN: ", e); + return null; + } catch (OperationTimedoutException e) { + s_logger.debug("Failed to start remote access VPN: ", e); + return null; + } + Answer answer = cmds.getAnswer("users"); + if (!answer.getResult()) { + s_logger.error("Unable to start vpn: unable add users to vpn in zone " + vpnVO.getZoneId() + " for account " + vpnVO.getAccountId() + + " on domR: " + router.getInstanceName() + " due to " + answer.getDetails()); + throw new ResourceUnavailableException("Unable to start vpn: Unable to add users to vpn in zone " + vpnVO.getZoneId() + " for account " + + vpnVO.getAccountId() + " on domR: " + router.getInstanceName() + " due to " + answer.getDetails(), DataCenter.class, + vpnVO.getZoneId()); + } + answer = cmds.getAnswer("startVpn"); + if (!answer.getResult()) { + s_logger.error("Unable to start vpn in zone " + vpnVO.getZoneId() + " for account " + vpnVO.getAccountId() + " on domR: " + + router.getInstanceName() + " due to " + answer.getDetails()); + throw new ResourceUnavailableException("Unable to start vpn in zone " + vpnVO.getZoneId() + " for account " + vpnVO.getAccountId() + + " on domR: " + router.getInstanceName() + " due to " + answer.getDetails(), DataCenter.class, vpnVO.getZoneId()); + } + return vpnVO; + } @Override - public DomainRouterVO addVirtualMachineIntoNetwork(Network config, NicProfile nic, VirtualMachineProfile profile, DeployDestination dest, ReservationContext context, Boolean startDhcp) throws ConcurrentOperationException, InsufficientNetworkCapacityException, ResourceUnavailableException { - DomainRouterVO router = _routerDao.findByNetworkConfiguration(config.getId()); - try { - if (startDhcp) { - router = this.deployDhcp(config, dest, profile.getOwner()); - } else { - router = this.deployVirtualRouter(config, dest, profile.getOwner()); - } - - } catch (InsufficientNetworkCapacityException e) { - throw e; - } catch (InsufficientCapacityException e) { - throw new ResourceUnavailableException("Unable to start router for " + config, e); - } - + public boolean deleteRemoteAccessVpn(RemoteAccessVpnVO vpnVO) { + DomainRouterVO router = getRouter(vpnVO.getAccountId(), vpnVO.getZoneId()); if (router == null) { - s_logger.error("Can't find a domain router to start VM: " + profile); - throw new ResourceUnavailableException("Can't find a domain router to start " + profile + " in " + config); + s_logger.warn("Failed to delete remote access VPN: no router found for account and zone"); + return false; } + if (router.getState() != State.Running) { + s_logger.warn("Failed to delete remote access VPN: router not in running state"); + return false; + } + try { + Answer answer = _agentMgr.send( + router.getHostId(), + new RemoteAccessVpnCfgCommand(false, router.getPrivateIpAddress(), vpnVO.getVpnServerAddress(), vpnVO.getLocalIp(), vpnVO + .getIpRange(), vpnVO.getIpsecPresharedKey())); + if (answer != null && answer.getResult()) { + return true; + } else { + s_logger.debug("Failed to delete remote access VPN: " + answer.getDetails()); + return false; + } + } catch (AgentUnavailableException e) { + s_logger.debug("Failed to delete remote access VPN: ", e); + return false; + } catch (OperationTimedoutException e) { + s_logger.debug("Failed to delete remote access VPN: ", e); + return false; + } + } + public DomainRouterVO start(long routerId, User user, Account caller) throws StorageUnavailableException, InsufficientCapacityException, + ConcurrentOperationException, ResourceUnavailableException { + return start(_routerDao.findById(routerId), user, caller); + } + + public DomainRouterVO start(DomainRouterVO router, User user, Account caller) throws StorageUnavailableException, InsufficientCapacityException, + ConcurrentOperationException, ResourceUnavailableException { + return _itMgr.start(router, null, user, caller, null); + } + + @Override + public VirtualRouter addVirtualMachineIntoNetwork(Network network, NicProfile nic, VirtualMachineProfile profile, DeployDestination dest, + ReservationContext context, Boolean startDhcp) throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException { + VirtualRouter router = startDhcp ? deployDhcp(network, dest, profile.getOwner()) : deployVirtualRouter(network, dest, profile.getOwner()); + String password = profile.getVirtualMachine().getPassword(); String userData = profile.getVirtualMachine().getUserData(); Commands cmds = new Commands(OnError.Stop); @@ -1759,125 +1788,132 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute String routerControlIpAddress = null; List nics = _nicDao.listBy(router.getId()); for (NicVO n : nics) { - NetworkVO nc = _networkConfigurationDao.findById(n.getNetworkId()); + NetworkVO nc = _networksDao.findById(n.getNetworkId()); if (n.getIp4Address() != null && nc.getTrafficType() == TrafficType.Public) { routerPublicIpAddress = nic.getIp4Address(); } else if (nc.getTrafficType() == TrafficType.Control) { routerControlIpAddress = n.getIp4Address(); } } - - cmds.addCommand("dhcp", new DhcpEntryCommand(nic.getMacAddress(), nic.getIp4Address(), routerControlIpAddress, profile.getVirtualMachine().getName())); + + cmds.addCommand("dhcp", new DhcpEntryCommand(nic.getMacAddress(), nic.getIp4Address(), routerControlIpAddress, profile.getVirtualMachine() + .getName())); if (password != null) { final String encodedPassword = rot13(password); - cmds.addCommand("password", new SavePasswordCommand(encodedPassword, nic.getIp4Address(), routerControlIpAddress, profile.getVirtualMachine().getName())); + cmds.addCommand("password", new SavePasswordCommand(encodedPassword, nic.getIp4Address(), routerControlIpAddress, profile + .getVirtualMachine().getName())); } - + String serviceOffering = _serviceOfferingDao.findById(profile.getServiceOfferingId()).getDisplayText(); - String zoneName = _dcDao.findById(config.getDataCenterId()).getName(); - - - cmds.addCommand("vmdata", generateVmDataCommand(routerControlIpAddress, routerPublicIpAddress, nic.getIp4Address(), userData, serviceOffering, zoneName, nic.getIp4Address(), profile.getVirtualMachine().getName(), profile.getVirtualMachine().getInstanceName(), profile.getId())); - + String zoneName = _dcDao.findById(network.getDataCenterId()).getName(); + + cmds.addCommand( + "vmdata", + generateVmDataCommand(routerControlIpAddress, routerPublicIpAddress, nic.getIp4Address(), userData, serviceOffering, zoneName, + nic.getIp4Address(), profile.getVirtualMachine().getName(), profile.getVirtualMachine().getInstanceName(), profile.getId())); + try { _agentMgr.send(router.getHostId(), cmds); - } catch (AgentUnavailableException e) { - throw new ResourceUnavailableException("Unable to reach the agent ", e); } catch (OperationTimedoutException e) { - throw new ResourceUnavailableException("Unable to reach the agent ", e); + throw new AgentUnavailableException("Unable to reach the agent ", router.getHostId(), e); } - + Answer answer = cmds.getAnswer("dhcp"); if (!answer.getResult()) { - s_logger.error("Unable to set dhcp entry for " + profile +" on domR: " + router.getName() + " due to " + answer.getDetails()); - throw new ResourceUnavailableException("Unable to set dhcp entry for " + profile + " due to " + answer.getDetails()); + s_logger.error("Unable to set dhcp entry for " + profile + " on domR: " + router.getName() + " due to " + answer.getDetails()); + throw new ResourceUnavailableException("Unable to set dhcp entry for " + profile + " due to " + answer.getDetails(), DataCenter.class, + router.getDataCenterId()); } - + answer = cmds.getAnswer("password"); if (answer != null && !answer.getResult()) { s_logger.error("Unable to set password for " + profile + " due to " + answer.getDetails()); - throw new ResourceUnavailableException("Unable to set password due to " + answer.getDetails()); + throw new ResourceUnavailableException("Unable to set password due to " + answer.getDetails(), DataCenter.class, router.getDataCenterId()); } - + answer = cmds.getAnswer("vmdata"); if (answer != null && !answer.getResult()) { s_logger.error("Unable to set VM data for " + profile + " due to " + answer.getDetails()); - throw new ResourceUnavailableException("Unable to set VM data due to " + answer.getDetails()); + throw new ResourceUnavailableException("Unable to set VM data due to " + answer.getDetails(), DataCenter.class, router.getDataCenterId()); } return router; } - + @Override public DomainRouterVO persist(DomainRouterVO router) { return _routerDao.persist(router); } - @Override - public boolean addRemoveVpnUsers(RemoteAccessVpnVO vpnVO, List addUsers, List removeUsers) { - 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 boolean addRemoveVpnUsers(RemoteAccessVpnVO vpnVO, List addUsers, List removeUsers) { + 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 DomainRouterVO findById(long id) { return _routerDao.findById(id); } - + @Override public DomainRouterVO findByName(String name) { if (!VirtualMachineName.isValidRouterName(name)) { return null; } - + return _routerDao.findById(VirtualMachineName.getRouterId(name)); } - + @Override public VirtualRouter startRouter(long routerId) throws ResourceUnavailableException, InsufficientCapacityException, ConcurrentOperationException { Account account = UserContext.current().getAccount(); - - //verify parameters + + // verify parameters DomainRouterVO router = _routerDao.findById(routerId); if (router == null) { - throw new PermissionDeniedException ("Unable to start router with id " + routerId + ". Permisssion denied"); + throw new PermissionDeniedException("Unable to start router with id " + routerId + ". Permisssion denied"); } _accountMgr.checkAccess(account, router); - - long eventId = EventUtils.saveScheduledEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_ROUTER_START, "starting Router with Id: "+routerId); + + long eventId = EventUtils.saveScheduledEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_ROUTER_START, + "starting Router with Id: " + routerId); UserVO user = _userDao.findById(UserContext.current().getUserId()); return this.start(router, user, account); } - + /** * Stops domain router - * @param cmd the command specifying router's id + * + * @param cmd + * the command specifying router's id * @return router if successful, null otherwise - * @throws OperationTimedoutException - * @throws ConcurrentOperationException - * @throws ResourceUnavailableException - * @throws InvalidParameterValueException, PermissionDeniedException + * @throws OperationTimedoutException + * @throws ConcurrentOperationException + * @throws ResourceUnavailableException + * @throws InvalidParameterValueException + * , PermissionDeniedException */ @Override public VirtualRouter stopRouter(long routerId) throws ResourceUnavailableException, ConcurrentOperationException { @@ -1885,116 +1921,25 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute Account account = context.getAccount(); long accountId = account.getId(); long userId = context.getUserId(); - // verify parameters DomainRouterVO router = _routerDao.findById(routerId); if (router == null) { - throw new PermissionDeniedException ("Unable to stop router with id " + routerId + ". Permission denied."); + throw new PermissionDeniedException("Unable to stop router with id " + routerId + ". Permission denied."); } _accountMgr.checkAccess(account, router); - - long eventId = EventUtils.saveScheduledEvent(userId, accountId, EventTypes.EVENT_ROUTER_STOP, "stopping Router with Id: "+routerId); - + + long eventId = EventUtils.saveScheduledEvent(userId, accountId, EventTypes.EVENT_ROUTER_STOP, "stopping Router with Id: " + routerId); + UserVO user = _userDao.findById(context.getUserId()); if (!_itMgr.stop(router, user, account)) { return null; } - + return router; } - -// private void reconstructRouterPortForwardingRules(Commands cmds, List ipAddrs) { -// List rules = _rulesMgr.gatherPortForwardingRulesForApplication(ipAddrs); -// if (rules.size() == 0) { -// s_logger.debug("There are not port forwarding rules to send. "); -// return; -// } -// SetPortForwardingRulesCommand pfrCmd = new SetPortForwardingRulesCommand(rules); -// cmds.addCommand(pfrCmd); -// } - /* - private List reconstructRouterIpAssocations(Commands cmds, VirtualRouter router) { - List ipAddrs = _networkMgr.listPublicIpAddressesInVirtualNetwork(router.getAccountId(), router.getDataCenterId(), null); - - } - */ - - /* - - private boolean reconstructRouterState(Network config, DomainRouterVO router, Commands cmds) { - if (router.getRole() == Role.DHCP_FIREWALL_LB_PASSWD_USERDATA) { - List ipAddrs = reconstructRouterIpAssocations(cmds, router); - reconstructRouterPortForwardingRules(cmds, ipAddrs); - } - - reconstructDhcpEntries(router); - reconstructVpnServerData(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 - List ipAddrs = _networkMgr.listPublicIpAddressesInVirtualNetwork(router.getAccountId(), router.getDataCenterId(), null); - 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; - } - } - - - return resendDhcpEntries(router) && resendVpnServerData(router); - - } - */ - -// private boolean resendDhcpEntries(Network config, DomainRouterVO router, Commands cmd){ -// 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 (UserVmVO 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 Commands getAssociateIPCommands(final DomainRouterVO router, final List ips, Commands cmds, long vmId) { @@ -2050,13 +1995,13 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute } - private boolean sendCommandsToRouter(final DomainRouterVO router, Commands cmds) { + private boolean sendCommandsToRouter(final DomainRouterVO router, Commands cmds) throws AgentUnavailableException { Answer[] answers = null; try { answers = _agentMgr.send(router.getHostId(), cmds); - } catch (final OperationTimedoutException e) { + } catch (OperationTimedoutException e) { s_logger.warn("Timed Out", e); - throw new ResourceUnavailableException("Unable to send commands to virtual router ", e); + throw new AgentUnavailableException("Unable to send commands to virtual router ", router.getHostId(), e); } if (answers == null) { @@ -2067,16 +2012,16 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute return false; } - // FIXME: Have to return state for individual command in the future + // FIXME: Have to return state for individual command in the future if (answers.length > 0) { Answer ans = answers[0]; return ans.getResult(); } return true; } - + @Override - public boolean associateIP (Network network, List ipAddress) { + public boolean associateIP(Network network, List ipAddress) throws ResourceUnavailableException { DomainRouterVO router = _routerDao.findByNetworkConfiguration(network.getId()); if (router == null) { //Return true only when domR entry exists, has Destroyed state and not null Removed field @@ -2087,29 +2032,29 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute return true; } s_logger.warn("Unable to associate ip addresses, virtual router doesn't exist in the network " + network.getId()); - throw new ResourceUnavailableException("Unable to assign ip addresses"); + throw new ResourceUnavailableException("Unable to assign ip addresses", DataCenter.class, network.getDataCenterId()); } - + if (router.getState() == State.Running || router.getState() == State.Starting) { Commands cmds = new Commands(OnError.Continue); //Have to resend all already associated ip addresses cmds = getAssociateIPCommands(router, ipAddress, cmds, 0); return sendCommandsToRouter(router, cmds); - } else if (router.getState() == State.Stopped || router.getState() == State.Stopping){ + } else if (router.getState() == State.Stopped || router.getState() == State.Stopping) { return true; } else { s_logger.warn("Unable to associate ip addresses, virtual router is not in the right state " + router.getState()); - throw new ResourceUnavailableException("Unable to assign ip addresses, domR is not in right state " + router.getState()); + throw new ResourceUnavailableException("Unable to assign ip addresses, domR is not in right state " + router.getState(), DataCenter.class, network.getDataCenterId()); } } - + @Override - public boolean applyLBRules(Network network, List rules) { + 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"); + throw new ResourceUnavailableException("Unable to apply lb rules", DataCenter.class, network.getDataCenterId()); } String routerControlIpAddress = router.getPrivateIpAddress(); @@ -2125,12 +2070,12 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute String protocol = rule.getProtocol(); String algorithm = rule.getAlgorithm(); String srcIp = rule.getSourceIpAddress().addr(); - int srcPort = rule.getSourcePortStart(); - List destinations = rule.getDestinations(); + 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(RoutingCommand.ROUTER_IP, router.getPrivateIpAddress()); cmd.setAccessDetail(RoutingCommand.ROUTER_NAME, router.getInstanceName()); @@ -2144,13 +2089,13 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute 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()); + throw new ResourceUnavailableException("Unable to apply load balancer rules, domR is not in right state " + router.getState(), DataCenter.class, network.getDataCenterId()); } } - + @Override - public boolean applyPortForwardingRules(Network network, List rules) { + 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(); @@ -2169,7 +2114,7 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute @Override public DomainRouterVO start(long vmId, long startEventId) throws InsufficientCapacityException, StorageUnavailableException, - ConcurrentOperationException, ExecutionException { + ConcurrentOperationException { // TODO Auto-generated method stub return null; } diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index 397213988de..fde69992f3c 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -168,11 +168,11 @@ import com.cloud.event.EventVO; import com.cloud.event.dao.EventDao; import com.cloud.exception.AgentUnavailableException; import com.cloud.exception.CloudAuthenticationException; +import com.cloud.exception.ConcurrentOperationException; 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; @@ -255,6 +255,7 @@ import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.Transaction; import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.utils.exception.ExecutionException; import com.cloud.utils.net.MacAddress; import com.cloud.utils.net.NetUtils; import com.cloud.vm.ConsoleProxyVO; @@ -607,8 +608,9 @@ public class ManagementServerImpl implements ManagementServer { DomainVO domain = _domainDao.findById(domainId); String domainName = null; - if(domain != null) - domainName = domain.getName(); + if(domain != null) { + domainName = domain.getName(); + } if (!userAccount.getState().equals("enabled") || !userAccount.getAccountState().equals("enabled")) { if (s_logger.isInfoEnabled()) { @@ -4829,7 +4831,7 @@ public class ManagementServerImpl implements ManagementServer { if(cert == null){ String msg = "Unable to obtain lock on the cert from uploadCertificate()"; s_logger.error(msg); - throw new ResourceUnavailableException(msg); + throw new ConcurrentOperationException(msg); }else{ if(cert.getUpdated().equalsIgnoreCase("Y")){ if(s_logger.isDebugEnabled()) { @@ -4866,14 +4868,14 @@ public class ManagementServerImpl implements ManagementServer { if(cpList.size() == 0){ String msg = "Unable to find any console proxies in the system for certificate update"; s_logger.warn(msg); - throw new ResourceUnavailableException(msg); + throw new ExecutionException(msg); } //get a list of all hosts in host table for type cp List cpHosts = _hostDao.listByType(com.cloud.host.Host.Type.ConsoleProxy); if(cpHosts.size() == 0){ String msg = "Unable to find any console proxy hosts in the system for certificate update"; s_logger.warn(msg); - throw new ResourceUnavailableException(msg); + throw new ExecutionException(msg); } //create a hashmap for fast lookup Map hostNameToHostIdMap = new HashMap(); @@ -4921,7 +4923,7 @@ public class ManagementServerImpl implements ManagementServer { } }catch (Exception e) { s_logger.warn("Failed to successfully update the cert across console proxies on management server:"+this.getId()); - if(e instanceof ResourceUnavailableException) { + if(e instanceof ExecutionException) { throw new ServerApiException(BaseCmd.RESOURCE_UNAVAILABLE_ERROR, e.getMessage()); } else if(e instanceof ManagementServerException) { throw new ServerApiException(BaseCmd.INTERNAL_ERROR, e.getMessage()); diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java index d009491b53c..32ff640ff70 100755 --- a/server/src/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/com/cloud/storage/StorageManagerImpl.java @@ -103,7 +103,6 @@ import com.cloud.exception.OperationTimedoutException; import com.cloud.exception.PermissionDeniedException; import com.cloud.exception.ResourceAllocationException; import com.cloud.exception.ResourceInUseException; -import com.cloud.exception.ResourceUnavailableException; import com.cloud.exception.StorageUnavailableException; import com.cloud.host.Host; import com.cloud.host.HostVO; @@ -236,14 +235,14 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag private final boolean _shouldBeSnapshotCapable = true; @Override - public boolean share(VMInstanceVO vm, List vols, HostVO host, boolean cancelPreviousShare) { + public boolean share(VMInstanceVO vm, List vols, HostVO host, boolean cancelPreviousShare) throws StorageUnavailableException { //if pool is in maintenance and it is the ONLY pool available; reject List rootVolForGivenVm = _volsDao.findByInstanceAndType(vm.getId(), VolumeType.ROOT); if(rootVolForGivenVm != null && rootVolForGivenVm.size() > 0){ boolean isPoolAvailable = isPoolAvailable(rootVolForGivenVm.get(0).getPoolId()); if(!isPoolAvailable){ - return false; + throw new StorageUnavailableException("Can not share " + vm, rootVolForGivenVm.get(0).getPoolId()); } } @@ -2241,7 +2240,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag if(primaryStorage == null){ String msg = "Unable to obtain lock on the storage pool in preparePrimaryStorageForMaintenance()"; s_logger.error(msg); - throw new ResourceUnavailableException(msg); + throw new ExecutionException(msg); } if (!primaryStorage.getStatus().equals(Status.Up) && !primaryStorage.getStatus().equals(Status.ErrorInMaintenance)) { @@ -2395,7 +2394,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag return _storagePoolDao.findById(primaryStorageId); } catch (Exception e) { - if(e instanceof ResourceUnavailableException){ + if(e instanceof ExecutionException){ s_logger.error("Exception in enabling primary storage maintenance:",e); throw new ServerApiException(BaseCmd.RESOURCE_UNAVAILABLE_ERROR, e.getMessage()); } @@ -2438,7 +2437,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag if(primaryStorage == null){ String msg = "Unable to obtain lock on the storage pool in cancelPrimaryStorageForMaintenance()"; s_logger.error(msg); - throw new ResourceUnavailableException(msg); + throw new ExecutionException(msg); } if (primaryStorage.getStatus().equals(Status.Up)) { @@ -2472,7 +2471,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag { String msg = "There was an error starting the console proxy id: "+vmInstance.getId()+" on storage pool, cannot complete primary storage maintenance"; s_logger.warn(msg); - throw new ResourceUnavailableException(msg); + throw new ExecutionException(msg); } } @@ -2487,7 +2486,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag { String msg = "There was an error starting the ssvm id: "+vmInstance.getId()+" on storage pool, cannot complete primary storage maintenance"; s_logger.warn(msg); - throw new ResourceUnavailableException(msg); + throw new ExecutionException(msg); } } @@ -2503,26 +2502,26 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag { String msg = "There was an error starting the user vm id: "+vmInstance.getId()+" on storage pool, cannot complete primary storage maintenance"; s_logger.warn(msg); - throw new ResourceUnavailableException(msg); + throw new ExecutionException(msg); } } catch (StorageUnavailableException e) { String msg = "There was an error starting the user vm id: "+vmInstance.getId()+" on storage pool, cannot complete primary storage maintenance"; s_logger.warn(msg,e); - throw new ResourceUnavailableException(msg); + throw new ExecutionException(msg); } catch (InsufficientCapacityException e) { String msg = "There was an error starting the user vm id: "+vmInstance.getId()+" on storage pool, cannot complete primary storage maintenance"; s_logger.warn(msg,e); - throw new ResourceUnavailableException(msg); + throw new ExecutionException(msg); } catch (ConcurrentOperationException e) { String msg = "There was an error starting the user vm id: "+vmInstance.getId()+" on storage pool, cannot complete primary storage maintenance"; s_logger.warn(msg,e); primaryStorage.setStatus(Status.ErrorInMaintenance); _storagePoolDao.persist(primaryStorage); - throw new ResourceUnavailableException(msg); + throw new ExecutionException(msg); } catch (ExecutionException e) { String msg = "There was an error starting the user vm id: "+vmInstance.getId()+" on storage pool, cannot complete primary storage maintenance"; s_logger.warn(msg,e); - throw new ResourceUnavailableException(msg); + throw new ExecutionException(msg); } } } @@ -2535,11 +2534,11 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag } catch (InvalidParameterValueException e) { String msg = "Error changing consoleproxy.restart back to false at end of cancel maintenance:"; s_logger.warn(msg,e); - throw new ResourceUnavailableException(msg); + throw new ExecutionException(msg); } catch (CloudRuntimeException e) { String msg = "Error changing consoleproxy.restart back to false at end of cancel maintenance:"; s_logger.warn(msg,e); - throw new ResourceUnavailableException(msg); + throw new ExecutionException(msg); } //Change the storage state back to up @@ -2548,19 +2547,15 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag return primaryStorage; } catch (Exception e) { - if(e instanceof ResourceUnavailableException){ - primaryStorage.setStatus(Status.ErrorInMaintenance); - _storagePoolDao.persist(primaryStorage); + primaryStorage.setStatus(Status.ErrorInMaintenance); + _storagePoolDao.persist(primaryStorage); + if(e instanceof ExecutionException){ throw new ServerApiException(BaseCmd.RESOURCE_UNAVAILABLE_ERROR, e.getMessage()); } else if(e instanceof InvalidParameterValueException){ - primaryStorage.setStatus(Status.ErrorInMaintenance); - _storagePoolDao.persist(primaryStorage); throw new ServerApiException(BaseCmd.PARAM_ERROR, e.getMessage()); } else{//all other exceptions - primaryStorage.setStatus(Status.ErrorInMaintenance); - _storagePoolDao.persist(primaryStorage); throw new ServerApiException(BaseCmd.INTERNAL_ERROR, e.getMessage()); } }finally{ diff --git a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java index 0bc1a41b9d3..29b1a921e58 100644 --- a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java +++ b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java @@ -451,9 +451,6 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V } catch (InsufficientCapacityException e) { s_logger.warn("InsufficientCapacity", e); throw new CloudRuntimeException("Insufficient capacity exception", e); - } catch (ResourceUnavailableException e) { - s_logger.warn("Unable to contact resource", e); - throw new CloudRuntimeException("Unable to contact resource", e); } Map context = new HashMap(); diff --git a/server/src/com/cloud/template/TemplateManagerImpl.java b/server/src/com/cloud/template/TemplateManagerImpl.java index 07b787c58b0..70aa180e279 100755 --- a/server/src/com/cloud/template/TemplateManagerImpl.java +++ b/server/src/com/cloud/template/TemplateManagerImpl.java @@ -34,7 +34,6 @@ import org.apache.log4j.Logger; import com.cloud.agent.AgentManager; import com.cloud.agent.api.Answer; import com.cloud.agent.api.storage.DestroyCommand; -import com.cloud.agent.api.storage.DownloadAnswer; import com.cloud.agent.api.storage.PrimaryStorageDownloadAnswer; import com.cloud.agent.api.storage.PrimaryStorageDownloadCommand; import com.cloud.api.ApiDBUtils; @@ -51,11 +50,10 @@ import com.cloud.api.commands.ExtractTemplateCmd; import com.cloud.api.commands.RegisterIsoCmd; import com.cloud.api.commands.RegisterTemplateCmd; import com.cloud.async.AsyncJobManager; -import com.cloud.async.AsyncJobResult; import com.cloud.async.AsyncJobVO; -import com.cloud.async.executor.ExtractJobResultObject; import com.cloud.configuration.ResourceCount.ResourceType; import com.cloud.configuration.dao.ConfigurationDao; +import com.cloud.dc.DataCenter; import com.cloud.dc.DataCenterVO; import com.cloud.dc.dao.DataCenterDao; import com.cloud.domain.dao.DomainDao; @@ -735,10 +733,10 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe } if (srcSecHost == null) { - throw new StorageUnavailableException("Source zone is not ready"); + throw new StorageUnavailableException("Source zone is not ready", DataCenter.class, sourceZoneId); } if (dstSecHost == null) { - throw new StorageUnavailableException("Destination zone is not ready"); + throw new StorageUnavailableException("Destination zone is not ready", DataCenter.class, destZoneId); } VMTemplateVO vmTemplate = _tmpltDao.findById(templateId); @@ -847,8 +845,9 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe boolean success = copy(userId, isoId, sourceZoneId, destZoneId, eventId); VMTemplateVO copiedIso = null; - if (success) - copiedIso = _tmpltDao.findById(isoId); + if (success) { + copiedIso = _tmpltDao.findById(isoId); + } return copiedIso; } @@ -881,8 +880,9 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe boolean success = copy(userId, templateId, sourceZoneId, destZoneId, eventId); VMTemplateVO copiedTemplate = null; - if (success) - copiedTemplate = _tmpltDao.findById(templateId); + if (success) { + copiedTemplate = _tmpltDao.findById(templateId); + } return copiedTemplate; } @@ -1309,8 +1309,9 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe } } // If command is executed via 8096 port, set userId to the id of System account (1) - if (userId == null) + if (userId == null) { userId = new Long(1); + } return userId; } diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 4140828f4dd..64830e7adda 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -814,25 +814,6 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager } - private void checkIfPoolAvailable(long vmId) throws StorageUnavailableException { - //check if the sp is up before starting - List rootVolList = _volsDao.findByInstanceAndType(vmId, VolumeType.ROOT); - if(rootVolList == null || rootVolList.size() == 0){ - throw new StorageUnavailableException("Could not find the root disk for this vm to verify if the pool on which it exists is Up or not"); - }else{ - Long poolId = rootVolList.get(0).getPoolId();//each vm has 1 root vol - StoragePoolVO sp = _storagePoolDao.findById(poolId); - if(sp == null){ - throw new StorageUnavailableException("Could not find the pool for the root disk of vm"+vmId+", to confirm if it is Up or not"); - }else{ - //found pool - if(!sp.getStatus().equals(com.cloud.host.Status.Up) && !sp.getStatus().equals(com.cloud.host.Status.CancelMaintenance)){ - throw new StorageUnavailableException("Could not start the vm; the associated storage pool is in:"+sp.getStatus().toString()+" state"); - } - } - } - } - private boolean rebootVirtualMachine(long userId, long vmId) { UserVmVO vm = _vmDao.findById(vmId); @@ -1426,7 +1407,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager } @Override - public UserVmVO start(long vmId, long startEventId) throws StorageUnavailableException, ConcurrentOperationException, ExecutionException { + public UserVmVO start(long vmId, long startEventId) throws StorageUnavailableException, ConcurrentOperationException { return null; // FIXME start(1L, vmId, null, null, startEventId); } @@ -1556,10 +1537,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager s_logger.debug("Trying to migrate router to host " + vmHost.getName()); } - if( !_storageMgr.share(vm, vols, vmHost, false) ) { - s_logger.warn("Can not share " + vm.toString() + " on host " + vmHost.getId()); - throw new StorageUnavailableException("Can not share " + vm.toString() + " on host " + vmHost.getId()); - } + _storageMgr.share(vm, vols, vmHost, false); Answer answer = _agentMgr.easySend(vmHost.getId(), cmd); if (answer != null && answer.getResult()) { diff --git a/server/src/com/cloud/vm/VirtualMachineGuru.java b/server/src/com/cloud/vm/VirtualMachineGuru.java index 9ae75df5fe3..31a49beda1b 100644 --- a/server/src/com/cloud/vm/VirtualMachineGuru.java +++ b/server/src/com/cloud/vm/VirtualMachineGuru.java @@ -111,7 +111,7 @@ public interface VirtualMachineGuru { * @throws ExecutionException * @throws ResourceUnavailableException */ - T start(long vmId, long startEventId) throws InsufficientCapacityException, StorageUnavailableException, ConcurrentOperationException, ExecutionException; + T start(long vmId, long startEventId) throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException; /** * stop the vm diff --git a/server/src/com/cloud/vm/VirtualMachineManager.java b/server/src/com/cloud/vm/VirtualMachineManager.java index 925d58fa843..056b2358c99 100644 --- a/server/src/com/cloud/vm/VirtualMachineManager.java +++ b/server/src/com/cloud/vm/VirtualMachineManager.java @@ -50,7 +50,7 @@ public interface VirtualMachineManager extends Manager { Map params, DeploymentPlan plan, HypervisorType hyperType, - Account owner) throws InsufficientCapacityException, ResourceUnavailableException; + Account owner) throws InsufficientCapacityException; T allocate(T vm, VMTemplateVO template, @@ -60,7 +60,7 @@ public interface VirtualMachineManager extends Manager { List> networks, DeploymentPlan plan, HypervisorType hyperType, - Account owner) throws InsufficientCapacityException, ResourceUnavailableException; + Account owner) throws InsufficientCapacityException; T allocate(T vm, VMTemplateVO template, @@ -68,7 +68,7 @@ public interface VirtualMachineManager extends Manager { List> networkProfiles, DeploymentPlan plan, HypervisorType hyperType, - Account owner) throws InsufficientCapacityException, ResourceUnavailableException; + Account owner) throws InsufficientCapacityException; T start(T vm, Map params, User caller, Account account, HypervisorType hyperType) throws InsufficientCapacityException, ResourceUnavailableException; @@ -79,7 +79,6 @@ public interface VirtualMachineManager extends Manager { void registerGuru(VirtualMachine.Type type, VirtualMachineGuru guru); boolean stateTransitTo(VMInstanceVO vm, Event e, Long id); - T advanceStart(T vm, Map params, User caller, Account account, HypervisorType hyperType) throws InsufficientCapacityException, ResourceUnavailableException, ConcurrentOperationException, OperationTimedoutException; diff --git a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java index ca437f638a9..532d17afe75 100644 --- a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java @@ -54,7 +54,6 @@ import com.cloud.event.EventVO; import com.cloud.exception.AgentUnavailableException; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientCapacityException; -import com.cloud.exception.InsufficientNetworkCapacityException; import com.cloud.exception.InsufficientServerCapacityException; import com.cloud.exception.OperationTimedoutException; import com.cloud.exception.ResourceUnavailableException; @@ -62,7 +61,6 @@ import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.hypervisor.HypervisorGuru; import com.cloud.network.NetworkManager; import com.cloud.network.NetworkVO; -import com.cloud.network.dao.NetworkDao; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.DiskOfferingVO; @@ -89,7 +87,6 @@ import com.cloud.vm.ItWorkVO.Type; import com.cloud.vm.VirtualMachine.Event; import com.cloud.vm.dao.ConsoleProxyDao; import com.cloud.vm.dao.DomainRouterDao; -import com.cloud.vm.dao.NicDao; import com.cloud.vm.dao.SecondaryStorageVmDao; import com.cloud.vm.dao.UserVmDao; import com.cloud.vm.dao.VMInstanceDao; @@ -458,7 +455,7 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, Cluster try { return advanceStop(vm, user, account); } catch (OperationTimedoutException e) { - throw new ResourceUnavailableException("Unable to stop vm because the operation to stop timed out", e); + throw new AgentUnavailableException("Unable to stop vm because the operation to stop timed out", vm.getHostId(), e); } catch (ConcurrentOperationException e) { throw new CloudRuntimeException("Unable to stop vm because of a concurrent operation", e); } diff --git a/utils/src/com/cloud/utils/SerialVersionUID.java b/utils/src/com/cloud/utils/SerialVersionUID.java index 7aa4c294417..0a7038569c2 100755 --- a/utils/src/com/cloud/utils/SerialVersionUID.java +++ b/utils/src/com/cloud/utils/SerialVersionUID.java @@ -33,8 +33,8 @@ public interface SerialVersionUID { public static final long CloudStartupServlet = Base | 0x3; public static final long CloudServiceImpl = Base | 0x4; public static final long AccountLimitException = Base | 0x5; - public static final long InsufficientNetworkCapacity = Base | 0x6; public static final long InsufficientVirtualNetworkCapacityException = Base | 0x7; + public static final long NetworkUnavailableException = Base | 0x8; public static final long UnsupportedVersionException = Base | 0xb; public static final long DataCenterIpAddressPK = Base | 0xc; public static final long UnableToExecuteException = Base | 0xd; diff --git a/utils/src/com/cloud/utils/exception/ExecutionException.java b/utils/src/com/cloud/utils/exception/ExecutionException.java index 7b49d215bb3..5526b73bfb2 100755 --- a/utils/src/com/cloud/utils/exception/ExecutionException.java +++ b/utils/src/com/cloud/utils/exception/ExecutionException.java @@ -19,6 +19,13 @@ package com.cloud.utils.exception; import com.cloud.utils.SerialVersionUID; +/** + * ExecutionException is a generic exception to indicate that execution has + * a problem so that the method can catch it and handle it properly. This + * exception should never be declared to be thrown out of + * a public method. + * + */ public class ExecutionException extends Exception { private static final long serialVersionUID = SerialVersionUID.ExecutionException;