From f147bf5f946ac4251a2d5c0e5e2361e1c95933ab Mon Sep 17 00:00:00 2001 From: Alex Huang Date: Mon, 6 Dec 2010 11:07:22 -0800 Subject: [PATCH] start vm not working again --- .../{configuration => guru}/NetworkGuru.java | 8 +- client/tomcatconf/components.xml.in | 10 +-- .../consoleproxy/ConsoleProxyManagerImpl.java | 15 ++-- .../src/com/cloud/network/NetworkManager.java | 2 +- .../com/cloud/network/NetworkManagerImpl.java | 6 +- .../ControlNetworkGuru.java | 3 +- .../GuestNetworkGuru.java | 3 +- .../{configuration => guru}/GuruUtils.java | 2 +- .../PodBasedNetworkGuru.java | 3 +- .../PublicNetworkGuru.java | 79 ++++++++++--------- .../router/DomainRouterManagerImpl.java | 10 +-- .../SecondaryStorageManagerImpl.java | 39 +++++---- server/src/com/cloud/vm/MauriceMoss.java | 53 ++++++++++--- .../src/com/cloud/vm/UserVmManagerImpl.java | 10 +-- server/src/com/cloud/vm/VmManager.java | 21 ++--- setup/db/create-schema.sql | 1 + 16 files changed, 140 insertions(+), 125 deletions(-) rename api/src/com/cloud/network/{configuration => guru}/NetworkGuru.java (92%) rename server/src/com/cloud/network/{configuration => guru}/ControlNetworkGuru.java (98%) rename server/src/com/cloud/network/{configuration => guru}/GuestNetworkGuru.java (99%) rename server/src/com/cloud/network/{configuration => guru}/GuruUtils.java (55%) rename server/src/com/cloud/network/{configuration => guru}/PodBasedNetworkGuru.java (98%) rename server/src/com/cloud/network/{configuration => guru}/PublicNetworkGuru.java (50%) diff --git a/api/src/com/cloud/network/configuration/NetworkGuru.java b/api/src/com/cloud/network/guru/NetworkGuru.java similarity index 92% rename from api/src/com/cloud/network/configuration/NetworkGuru.java rename to api/src/com/cloud/network/guru/NetworkGuru.java index 4af532e152e..0688a9e0440 100644 --- a/api/src/com/cloud/network/configuration/NetworkGuru.java +++ b/api/src/com/cloud/network/guru/NetworkGuru.java @@ -1,10 +1,11 @@ /** * */ -package com.cloud.network.configuration; +package com.cloud.network.guru; import com.cloud.deploy.DeployDestination; import com.cloud.deploy.DeploymentPlan; +import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientAddressCapacityException; import com.cloud.exception.InsufficientVirtualNetworkCapcityException; import com.cloud.network.Network; @@ -43,7 +44,7 @@ public interface NetworkGuru extends Adapter { * @throws InsufficientVirtualNetworkCapcityException * @throws InsufficientAddressCapacityException */ - NicProfile allocate(Network network, NicProfile nic, VirtualMachineProfile vm) throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException; + NicProfile allocate(Network network, NicProfile nic, VirtualMachineProfile vm) throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException, ConcurrentOperationException; /** * Fully implement the network configuration as specified. @@ -63,8 +64,9 @@ public interface NetworkGuru extends Adapter { * @return * @throws InsufficientVirtualNetworkCapcityException * @throws InsufficientAddressCapacityException + * @throws ConcurrentOperationException */ - void reserve(NicProfile nic, Network network, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException; + void reserve(NicProfile nic, Network network, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException, ConcurrentOperationException; boolean release(NicProfile nic, VirtualMachineProfile vm, String reservationId); diff --git a/client/tomcatconf/components.xml.in b/client/tomcatconf/components.xml.in index b539293635f..7036dc4ebde 100755 --- a/client/tomcatconf/components.xml.in +++ b/client/tomcatconf/components.xml.in @@ -39,11 +39,11 @@ - - - - - + + + + + diff --git a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java index 4bccc3194de..28eff0d6390 100644 --- a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java +++ b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java @@ -88,7 +88,6 @@ import com.cloud.event.EventUtils; import com.cloud.event.EventVO; 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.OperationTimedoutException; import com.cloud.exception.ResourceUnavailableException; @@ -552,16 +551,13 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx } catch (InsufficientCapacityException e) { s_logger.warn("Exception while trying to start console proxy", e); return null; - } catch (ConcurrentOperationException e) { - s_logger.warn("Exception while trying to start console proxy", e); - return null; } catch (ResourceUnavailableException e) { s_logger.warn("Exception while trying to start console proxy", e); return null; } } - public ConsoleProxyVO start2(long proxyVmId, long startEventId) throws ResourceUnavailableException, InsufficientCapacityException, ConcurrentOperationException { + public ConsoleProxyVO start2(long proxyVmId, long startEventId) throws ResourceUnavailableException, InsufficientCapacityException { if (!_useNewNetworking) { return start(proxyVmId, startEventId); } @@ -574,7 +570,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx @Override @DB public ConsoleProxyVO start(long proxyId, long startEventId) throws InsufficientCapacityException, - ConcurrentOperationException, StorageUnavailableException { + StorageUnavailableException { AsyncJobExecutor asyncExecutor = BaseAsyncJobExecutor.getCurrentExecutor(); if (asyncExecutor != null) { @@ -843,8 +839,6 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx if (thr instanceof StorageUnavailableException) { throw (StorageUnavailableException) thr; - } else if (thr instanceof ConcurrentOperationException) { - throw (ConcurrentOperationException) thr; } else if (thr instanceof ExecutionException) { s_logger.error("Error while starting console proxy due to " + thr.getMessage()); } else { @@ -1114,6 +1108,9 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx } 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(); @@ -1539,8 +1536,6 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx s_logger.warn("Storage unavailable", e); } catch (InsufficientCapacityException e) { s_logger.warn("insuffiient capacity", e); - } catch (ConcurrentOperationException e) { - s_logger.debug("Concurrent operation: " + e.getMessage()); } catch (ResourceUnavailableException e) { s_logger.debug("Concurrent operation: " + e.getMessage()); } diff --git a/server/src/com/cloud/network/NetworkManager.java b/server/src/com/cloud/network/NetworkManager.java index 6dd205afcc4..b1b0c3ee36d 100644 --- a/server/src/com/cloud/network/NetworkManager.java +++ b/server/src/com/cloud/network/NetworkManager.java @@ -116,7 +116,7 @@ public interface NetworkManager extends NetworkService { List getSystemAccountNetworkOfferings(String... offeringNames); - void allocate(VirtualMachineProfile vm, List> networks) throws InsufficientCapacityException; + void allocate(VirtualMachineProfile vm, List> networks) throws InsufficientCapacityException, ConcurrentOperationException; void prepare(VirtualMachineProfile profile, DeployDestination dest, ReservationContext context) throws InsufficientNetworkCapacityException, ConcurrentOperationException, ResourceUnavailableException; void release(VirtualMachineProfile vmProfile); diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index a5539e7098f..0aa53b4e89d 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -92,7 +92,6 @@ import com.cloud.network.Networks.AddressFormat; import com.cloud.network.Networks.BroadcastDomainType; import com.cloud.network.Networks.TrafficType; import com.cloud.network.addr.PublicIp; -import com.cloud.network.configuration.NetworkGuru; import com.cloud.network.dao.FirewallRulesDao; import com.cloud.network.dao.IPAddressDao; import com.cloud.network.dao.LoadBalancerDao; @@ -102,6 +101,7 @@ import com.cloud.network.dao.NetworkRuleConfigDao; import com.cloud.network.dao.RemoteAccessVpnDao; import com.cloud.network.dao.VpnUserDao; import com.cloud.network.element.NetworkElement; +import com.cloud.network.guru.NetworkGuru; import com.cloud.network.lb.LoadBalancingRulesManager; import com.cloud.network.router.DomainRouterManager; import com.cloud.network.rules.FirewallRule; @@ -228,7 +228,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag txn.start(); SearchCriteria sc = AssignIpAddressSearch.create(); sc.setParameters("dc", dcId); - sc.setJoinParameters("vlan", "vlanType", vlanUse); + sc.setJoinParameters("vlan", "type", vlanUse); Filter filter = new Filter(IPAddressVO.class, "vlanId", true, 0l, 1l); @@ -891,7 +891,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } @Override @DB - public void allocate(VirtualMachineProfile vm, List> networks) throws InsufficientCapacityException { + public void allocate(VirtualMachineProfile vm, List> networks) throws InsufficientCapacityException, ConcurrentOperationException { Transaction txn = Transaction.currentTxn(); txn.start(); diff --git a/server/src/com/cloud/network/configuration/ControlNetworkGuru.java b/server/src/com/cloud/network/guru/ControlNetworkGuru.java similarity index 98% rename from server/src/com/cloud/network/configuration/ControlNetworkGuru.java rename to server/src/com/cloud/network/guru/ControlNetworkGuru.java index 9e526c0b73c..5b8fb99cffb 100644 --- a/server/src/com/cloud/network/configuration/ControlNetworkGuru.java +++ b/server/src/com/cloud/network/guru/ControlNetworkGuru.java @@ -1,7 +1,7 @@ /** * */ -package com.cloud.network.configuration; +package com.cloud.network.guru; import java.util.Map; @@ -21,6 +21,7 @@ import com.cloud.network.Networks.AddressFormat; import com.cloud.network.Networks.BroadcastDomainType; import com.cloud.network.Networks.Mode; import com.cloud.network.Networks.TrafficType; +import com.cloud.network.guru.NetworkGuru; import com.cloud.network.Network; import com.cloud.network.NetworkVO; import com.cloud.offering.NetworkOffering; diff --git a/server/src/com/cloud/network/configuration/GuestNetworkGuru.java b/server/src/com/cloud/network/guru/GuestNetworkGuru.java similarity index 99% rename from server/src/com/cloud/network/configuration/GuestNetworkGuru.java rename to server/src/com/cloud/network/guru/GuestNetworkGuru.java index 972a0825ef3..f604b40bc01 100644 --- a/server/src/com/cloud/network/configuration/GuestNetworkGuru.java +++ b/server/src/com/cloud/network/guru/GuestNetworkGuru.java @@ -15,7 +15,7 @@ * along with this program. If not, see . * */ -package com.cloud.network.configuration; +package com.cloud.network.guru; import java.util.List; import java.util.Random; @@ -39,6 +39,7 @@ import com.cloud.network.NetworkVO; import com.cloud.network.Networks.BroadcastDomainType; import com.cloud.network.Networks.Mode; import com.cloud.network.Networks.TrafficType; +import com.cloud.network.guru.NetworkGuru; import com.cloud.offering.NetworkOffering; import com.cloud.offering.NetworkOffering.GuestIpType; import com.cloud.resource.Resource.ReservationStrategy; diff --git a/server/src/com/cloud/network/configuration/GuruUtils.java b/server/src/com/cloud/network/guru/GuruUtils.java similarity index 55% rename from server/src/com/cloud/network/configuration/GuruUtils.java rename to server/src/com/cloud/network/guru/GuruUtils.java index 1b6c9c04bff..92de57fce92 100644 --- a/server/src/com/cloud/network/configuration/GuruUtils.java +++ b/server/src/com/cloud/network/guru/GuruUtils.java @@ -1,7 +1,7 @@ /** * */ -package com.cloud.network.configuration; +package com.cloud.network.guru; public final class GuruUtils { diff --git a/server/src/com/cloud/network/configuration/PodBasedNetworkGuru.java b/server/src/com/cloud/network/guru/PodBasedNetworkGuru.java similarity index 98% rename from server/src/com/cloud/network/configuration/PodBasedNetworkGuru.java rename to server/src/com/cloud/network/guru/PodBasedNetworkGuru.java index ef77d4f3103..6a58852005e 100644 --- a/server/src/com/cloud/network/configuration/PodBasedNetworkGuru.java +++ b/server/src/com/cloud/network/guru/PodBasedNetworkGuru.java @@ -1,7 +1,7 @@ /** * */ -package com.cloud.network.configuration; +package com.cloud.network.guru; import javax.ejb.Local; @@ -18,6 +18,7 @@ import com.cloud.network.Networks.AddressFormat; import com.cloud.network.Networks.BroadcastDomainType; import com.cloud.network.Networks.Mode; import com.cloud.network.Networks.TrafficType; +import com.cloud.network.guru.NetworkGuru; import com.cloud.network.Network; import com.cloud.network.NetworkVO; import com.cloud.network.NetworkManager; diff --git a/server/src/com/cloud/network/configuration/PublicNetworkGuru.java b/server/src/com/cloud/network/guru/PublicNetworkGuru.java similarity index 50% rename from server/src/com/cloud/network/configuration/PublicNetworkGuru.java rename to server/src/com/cloud/network/guru/PublicNetworkGuru.java index 1d1b432e599..e97e896b822 100644 --- a/server/src/com/cloud/network/configuration/PublicNetworkGuru.java +++ b/server/src/com/cloud/network/guru/PublicNetworkGuru.java @@ -1,7 +1,9 @@ /** * */ -package com.cloud.network.configuration; +package com.cloud.network.guru; + +import java.util.Random; import javax.ejb.Local; @@ -9,12 +11,11 @@ import org.apache.log4j.Logger; import com.cloud.dc.DataCenter; import com.cloud.dc.DataCenterVO; -import com.cloud.dc.Vlan.VlanType; -import com.cloud.dc.VlanVO; import com.cloud.dc.dao.DataCenterDao; import com.cloud.dc.dao.VlanDao; import com.cloud.deploy.DeployDestination; import com.cloud.deploy.DeploymentPlan; +import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientAddressCapacityException; import com.cloud.exception.InsufficientVirtualNetworkCapcityException; import com.cloud.network.Network; @@ -28,12 +29,13 @@ import com.cloud.network.Networks.TrafficType; import com.cloud.network.addr.PublicIp; import com.cloud.network.dao.IPAddressDao; import com.cloud.offering.NetworkOffering; +import com.cloud.offering.NetworkOffering.GuestIpType; import com.cloud.resource.Resource.ReservationStrategy; import com.cloud.user.Account; import com.cloud.user.UserContext; -import com.cloud.utils.Pair; import com.cloud.utils.component.AdapterBase; import com.cloud.utils.component.Inject; +import com.cloud.utils.net.NetUtils; import com.cloud.vm.NicProfile; import com.cloud.vm.ReservationContext; import com.cloud.vm.VirtualMachine; @@ -47,49 +49,51 @@ public class PublicNetworkGuru extends AdapterBase implements NetworkGuru { @Inject VlanDao _vlanDao; @Inject NetworkManager _networkMgr; @Inject IPAddressDao _ipAddressDao; + Random _rand = new Random(System.currentTimeMillis()); @Override - public Network design(NetworkOffering offering, DeploymentPlan plan, Network config, Account owner) { - if (offering.getTrafficType() != TrafficType.Public) { + public Network design(NetworkOffering offering, DeploymentPlan plan, Network network, Account owner) { + if (offering.getTrafficType() != TrafficType.Public || (offering.getTrafficType() == TrafficType.Guest && offering.getGuestIpType() != GuestIpType.Direct)) { + s_logger.trace("We only take care of two types of networks. Public or Guest direct so this is no ours"); return null; } - NetworkVO network = new NetworkVO(offering.getTrafficType(), offering.getGuestIpType(), Mode.Static, BroadcastDomainType.Vlan, offering.getId(), plan.getDataCenterId()); - DataCenterVO dc = _dcDao.findById(plan.getDataCenterId()); - network.setDns1(dc.getDns1()); - network.setDns2(dc.getDns2()); - return network; + if (offering.getTrafficType() == TrafficType.Public) { + NetworkVO network = new NetworkVO(offering.getTrafficType(), offering.getGuestIpType(), Mode.Static, BroadcastDomainType.Vlan, offering.getId(), plan.getDataCenterId()); + DataCenterVO dc = _dcDao.findById(plan.getDataCenterId()); + network.setDns1(dc.getDns1()); + network.setDns2(dc.getDns2()); + return network; + } else { + return null; + } } protected PublicNetworkGuru() { super(); } - protected void getIp(NicProfile nic, DataCenter dc, VirtualMachineProfile vm, Network network) throws InsufficientVirtualNetworkCapcityException { + protected void getIp(NicProfile nic, DataCenter dc, VirtualMachineProfile vm, Network network) throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException, ConcurrentOperationException { if (nic.getIp4Address() == null) { - PublicIp ip = _networkMgr.assignSourceNatIpAddress(dc, vm.getOwner(), network, UserContext.current().getUserId()); - Pair ipAndVlan = __vlanDao.assignIpAddress(dc.getId(), vm.getVirtualMachine().getAccountId(), vm.getVirtualMachine().getDomainId(), VlanType.VirtualNetwork, true); - if (ipAndVlan == null) { - throw new InsufficientVirtualNetworkCapcityException("Unable to get public ip address in " + dc.getId(), DataCenter.class, dc.getId()); - } - VlanVO vlan = ipAndVlan.second(); - nic.setIp4Address(ipAndVlan.first()); - nic.setGateway(vlan.getVlanGateway()); - nic.setNetmask(vlan.getVlanNetmask()); - nic.setIsolationUri(IsolationType.Vlan.toUri(vlan.getVlanId())); + PublicIp ip = _networkMgr.assignSourceNatIpAddress(vm.getOwner(), network, UserContext.current().getUserId()); + nic.setIp4Address(ip.getAddress()); + nic.setGateway(ip.getGateway()); + nic.setNetmask(ip.getNetmask()); + nic.setIsolationUri(IsolationType.Vlan.toUri(ip.getVlanTag())); nic.setBroadcastType(BroadcastDomainType.Vlan); - nic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(vlan.getVlanId())); + nic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(ip.getVlanTag())); nic.setFormat(AddressFormat.Ip4); - nic.setReservationId(Long.toString(vlan.getId())); + nic.setReservationId(ip.getVlanTag()); + nic.setMacAddress(NetUtils.long2Mac(ip.getMacAddress() | 0x060000000000l | (((long)_rand.nextInt(32768) << 25) & 0x00fffe000000l))); } nic.setDns1(dc.getDns1()); nic.setDns2(dc.getDns2()); } @Override - public NicProfile allocate(Network config, NicProfile nic, VirtualMachineProfile vm) throws InsufficientVirtualNetworkCapcityException, - InsufficientAddressCapacityException { - if (config.getTrafficType() != TrafficType.Public) { + public NicProfile allocate(Network network, NicProfile nic, VirtualMachineProfile vm) throws InsufficientVirtualNetworkCapcityException, + InsufficientAddressCapacityException, ConcurrentOperationException { + if (network.getTrafficType() != TrafficType.Public) { return null; } @@ -97,11 +101,8 @@ public class PublicNetworkGuru extends AdapterBase implements NetworkGuru { nic = new NicProfile(ReservationStrategy.Create, null, null, null, null); } - String mac = _networkMgr.getNextAvailableMacAddressInNetwork(config.getId()); - nic.setMacAddress(mac); - - DataCenter dc = _dcDao.findById(config.getDataCenterId()); - getIp(nic, dc, vm); + DataCenter dc = _dcDao.findById(network.getDataCenterId()); + getIp(nic, dc, vm, network); if (nic.getIp4Address() == null) { nic.setStrategy(ReservationStrategy.Start); @@ -113,9 +114,9 @@ public class PublicNetworkGuru extends AdapterBase implements NetworkGuru { } @Override - public void reserve(NicProfile nic, Network configuration, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException { + public void reserve(NicProfile nic, Network network, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException, ConcurrentOperationException { if (nic.getIp4Address() == null) { - getIp(nic, dest.getDataCenter(), vm); + getIp(nic, dest.getDataCenter(), vm, network); } } @@ -126,20 +127,20 @@ public class PublicNetworkGuru extends AdapterBase implements NetworkGuru { } @Override - public Network implement(Network config, NetworkOffering offering, DeployDestination destination, ReservationContext context) { - return config; + public Network implement(Network network, NetworkOffering offering, DeployDestination destination, ReservationContext context) { + return network; } @Override - public void deallocate(Network config, NicProfile nic, VirtualMachineProfile vm) { + public void deallocate(Network network, NicProfile nic, VirtualMachineProfile vm) { } @Override - public void destroy(Network config, NetworkOffering offering) { + public void destroy(Network network, NetworkOffering offering) { } @Override - public boolean trash(Network config, NetworkOffering offering, Account owner) { + public boolean trash(Network network, NetworkOffering offering, Account owner) { return true; } } diff --git a/server/src/com/cloud/network/router/DomainRouterManagerImpl.java b/server/src/com/cloud/network/router/DomainRouterManagerImpl.java index 2a8e502999f..b1fac76e703 100644 --- a/server/src/com/cloud/network/router/DomainRouterManagerImpl.java +++ b/server/src/com/cloud/network/router/DomainRouterManagerImpl.java @@ -2421,14 +2421,8 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute UserVO user = _userDao.findById(context.getUserId()); - try { - if (!_itMgr.stop(router, user, account)) { - return null; - } - } catch (AgentUnavailableException e) { - throw new ResourceUnavailableException("Unable to reach the server to stop the vm", e); - } catch (OperationTimedoutException e) { - throw new ResourceUnavailableException("Stop operation timed out", e); + if (!_itMgr.stop(router, user, account)) { + return null; } return router; diff --git a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java index 1bed3dc0c6d..fe6eda97514 100644 --- a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java +++ b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java @@ -62,14 +62,11 @@ import com.cloud.configuration.Config; import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.dc.DataCenterVO; import com.cloud.dc.HostPodVO; -import com.cloud.dc.Vlan.VlanType; -import com.cloud.dc.VlanVO; import com.cloud.dc.dao.DataCenterDao; import com.cloud.dc.dao.HostPodDao; import com.cloud.dc.dao.VlanDao; import com.cloud.deploy.DataCenterDeployment; import com.cloud.deploy.DeployDestination; -import com.cloud.domain.DomainVO; import com.cloud.event.Event; import com.cloud.event.EventTypes; import com.cloud.event.EventVO; @@ -772,9 +769,9 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V } 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(); @@ -923,21 +920,21 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V return net; } - Pair ipAndVlan = _vlanDao.assignIpAddress(dcId, Account.ACCOUNT_ID_SYSTEM, DomainVO.ROOT_DOMAIN, VlanType.VirtualNetwork, true); - - if (ipAndVlan == null) { - s_logger.debug("Unable to get public ip address (type=Virtual) for secondary storage vm for data center : " + dcId); - ipAndVlan = _vlanDao.assignPodDirectAttachIpAddress(dcId, podId, Account.ACCOUNT_ID_SYSTEM, DomainVO.ROOT_DOMAIN); - if (ipAndVlan == null) { - s_logger.debug("Unable to get public ip address (type=DirectAttach) for secondary storage vm for data center : " + dcId); - } - - } - if (ipAndVlan != null) { - VlanVO vlan = ipAndVlan.second(); - networkInfo net = new networkInfo(ipAndVlan.first(), vlan.getVlanNetmask(), vlan.getVlanGateway(), vlan.getId(), vlan.getVlanId()); - return net; - } +//FIXME am I even needed any more? Pair ipAndVlan = _vlanDao.assignIpAddress(dcId, Account.ACCOUNT_ID_SYSTEM, DomainVO.ROOT_DOMAIN, VlanType.VirtualNetwork, true); +// +// if (ipAndVlan == null) { +// s_logger.debug("Unable to get public ip address (type=Virtual) for secondary storage vm for data center : " + dcId); +// ipAndVlan = _vlanDao.assignPodDirectAttachIpAddress(dcId, podId, Account.ACCOUNT_ID_SYSTEM, DomainVO.ROOT_DOMAIN); +// if (ipAndVlan == null) { +// s_logger.debug("Unable to get public ip address (type=DirectAttach) for secondary storage vm for data center : " + dcId); +// } +// +// } +// if (ipAndVlan != null) { +// VlanVO vlan = ipAndVlan.second(); +// networkInfo net = new networkInfo(ipAndVlan.first(), vlan.getVlanNetmask(), vlan.getVlanGateway(), vlan.getId(), vlan.getVlanId()); +// return net; +// } return null; } diff --git a/server/src/com/cloud/vm/MauriceMoss.java b/server/src/com/cloud/vm/MauriceMoss.java index 503a97cdfad..9902cf6b274 100644 --- a/server/src/com/cloud/vm/MauriceMoss.java +++ b/server/src/com/cloud/vm/MauriceMoss.java @@ -19,7 +19,6 @@ package com.cloud.vm; import java.util.ArrayList; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.UUID; @@ -32,7 +31,6 @@ import org.apache.log4j.Logger; import com.cloud.agent.AgentManager; import com.cloud.agent.AgentManager.OnError; import com.cloud.agent.api.Answer; -import com.cloud.agent.api.PrepareForMigrationCommand; import com.cloud.agent.api.Start2Command; import com.cloud.agent.api.StopAnswer; import com.cloud.agent.api.StopCommand; @@ -45,8 +43,6 @@ import com.cloud.cluster.ManagementServerHostVO; import com.cloud.configuration.Config; import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.dc.DataCenter; -import com.cloud.dc.DataCenterVO; -import com.cloud.dc.HostPodVO; import com.cloud.deploy.DataCenterDeployment; import com.cloud.deploy.DeployDestination; import com.cloud.deploy.DeploymentPlan; @@ -62,20 +58,16 @@ import com.cloud.exception.InsufficientServerCapacityException; import com.cloud.exception.OperationTimedoutException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.exception.StorageUnavailableException; -import com.cloud.host.Host; -import com.cloud.host.HostVO; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.hypervisor.HypervisorGuru; -import com.cloud.network.NetworkVO; import com.cloud.network.NetworkManager; +import com.cloud.network.NetworkVO; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.DiskOfferingVO; import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.StorageManager; -import com.cloud.storage.StoragePoolVO; import com.cloud.storage.VMTemplateVO; -import com.cloud.storage.VolumeVO; import com.cloud.storage.Volume.VolumeType; import com.cloud.storage.dao.VMTemplateDao; import com.cloud.user.Account; @@ -172,7 +164,11 @@ public class MauriceMoss implements VmManager, ClusterManagerListener { if (s_logger.isDebugEnabled()) { s_logger.debug("Allocating nics for " + vm); } - _networkMgr.allocate(vmProfile, networks); + try { + _networkMgr.allocate(vmProfile, networks); + } catch (ConcurrentOperationException e) { + throw new CloudRuntimeException("Concurrent operation while trying to allocate resources for the VM", e); + } if (dataDiskOfferings == null) { dataDiskOfferings = new ArrayList>(0); @@ -232,7 +228,18 @@ public class MauriceMoss implements VmManager, ClusterManagerListener { } @Override - public boolean destroy(T vm, User caller, Account account) throws ResourceUnavailableException, OperationTimedoutException, ConcurrentOperationException { + public boolean destroy(T vm, User caller, Account account) throws ResourceUnavailableException { + try { + return advanceDestroy(vm, caller, account); + } catch (OperationTimedoutException e) { + throw new CloudRuntimeException("Operation timed out", e); + } catch (ConcurrentOperationException e) { + throw new CloudRuntimeException("Concurrent operation ", e); + } + } + + @Override + public boolean advanceDestroy(T vm, User caller, Account account) throws ResourceUnavailableException, OperationTimedoutException, ConcurrentOperationException { if (vm == null || vm.getState() == State.Destroyed || vm.getState() == State.Expunging || vm.getRemoved() != null) { if (s_logger.isDebugEnabled()) { s_logger.debug("Unable to find vm or vm is destroyed: " + vm); @@ -307,9 +314,18 @@ public class MauriceMoss implements VmManager, ClusterManagerListener { protected MauriceMoss() { } + + @Override + public T start(T vm, Map params, User caller, Account account) throws InsufficientCapacityException, ResourceUnavailableException { + try { + return advanceStart(vm, params, caller, account); + } catch (ConcurrentOperationException e) { + throw new CloudRuntimeException("Unable to start a VM due to concurrent operation", e); + } + } @Override - public T start(T vm, Map params, User caller, Account account) throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException { + public T advanceStart(T vm, Map params, User caller, Account account) throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException { State state = vm.getState(); if (state == State.Starting || state == State.Running) { s_logger.debug("VM is already started: " + vm); @@ -422,9 +438,20 @@ public class MauriceMoss implements VmManager, ClusterManagerListener { return null; } + + @Override + public boolean stop(T vm, User user, Account account) throws ResourceUnavailableException { + try { + return advanceStop(vm, user, account); + } catch (OperationTimedoutException e) { + throw new ResourceUnavailableException("Unable to stop vm because the operation to stop timed out", e); + } catch (ConcurrentOperationException e) { + throw new CloudRuntimeException("Unable to stop vm because of a concurrent operation", e); + } + } @Override - public boolean stop(T vm, User user, Account account) throws AgentUnavailableException, OperationTimedoutException, ConcurrentOperationException { + public boolean advanceStop(T vm, User user, Account account) throws AgentUnavailableException, OperationTimedoutException, ConcurrentOperationException { State state = vm.getState(); if (state == State.Stopped) { if (s_logger.isDebugEnabled()) { diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 3f9d835d60c..7bd11fde087 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -3856,10 +3856,8 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM try { _itMgr.stop(vm, user, caller); - } catch (AgentUnavailableException e) { + } catch (ResourceUnavailableException e) { throw new CloudRuntimeException("Unable to contact the agent to stop the virtual machine " + vm, e); - } catch (OperationTimedoutException e) { - throw new CloudRuntimeException("Waiting too long for agent to stop the virtual machine " + vm, e); } return _vmDao.findById(vmId); @@ -3915,11 +3913,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM EventUtils.saveScheduledEvent(userId, vm.getAccountId(), EventTypes.EVENT_VM_DESTROY, "Destroying Vm with Id: "+vmId); boolean status; - try { - status = _itMgr.destroy(vm, caller, account); - } catch (OperationTimedoutException e) { - throw new ResourceUnavailableException("Resource not available to complete the command", e); - } + status = _itMgr.destroy(vm, caller, account); if (status) { EventUtils.saveEvent(userId, vm.getAccountId(), EventTypes.EVENT_VM_DESTROY, "Successfully destroyed vm with id:"+vmId); diff --git a/server/src/com/cloud/vm/VmManager.java b/server/src/com/cloud/vm/VmManager.java index 8d3581bfb7e..28e92b92e22 100644 --- a/server/src/com/cloud/vm/VmManager.java +++ b/server/src/com/cloud/vm/VmManager.java @@ -21,13 +21,10 @@ import java.util.List; import java.util.Map; import com.cloud.deploy.DeploymentPlan; -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.host.HostVO; import com.cloud.network.NetworkVO; import com.cloud.service.ServiceOfferingVO; import com.cloud.storage.DiskOfferingVO; @@ -51,7 +48,7 @@ public interface VmManager extends Manager { List> networks, Map params, DeploymentPlan plan, - Account owner) throws InsufficientCapacityException, StorageUnavailableException; + Account owner) throws InsufficientCapacityException, ResourceUnavailableException; T allocate(T vm, VMTemplateVO template, @@ -60,25 +57,29 @@ public interface VmManager extends Manager { Pair dataDiskOffering, List> networks, DeploymentPlan plan, - Account owner) throws InsufficientCapacityException, StorageUnavailableException; + Account owner) throws InsufficientCapacityException, ResourceUnavailableException; T allocate(T vm, VMTemplateVO template, ServiceOfferingVO serviceOffering, List> networkProfiles, DeploymentPlan plan, - Account owner) throws InsufficientCapacityException, StorageUnavailableException; + Account owner) throws InsufficientCapacityException, ResourceUnavailableException; - T start(T vm, Map params, User caller, Account account) throws InsufficientCapacityException, StorageUnavailableException, ConcurrentOperationException, ResourceUnavailableException; + T start(T vm, Map params, User caller, Account account) throws InsufficientCapacityException, ResourceUnavailableException; - boolean stop(T vm, User caller, Account account) throws AgentUnavailableException, ConcurrentOperationException, OperationTimedoutException; + boolean stop(T vm, User caller, Account account) throws ResourceUnavailableException; - boolean destroy(T vm, User caller, Account account) throws ResourceUnavailableException, ConcurrentOperationException, OperationTimedoutException; -; + boolean destroy(T vm, User caller, Account account) throws ResourceUnavailableException; 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) throws InsufficientCapacityException, ResourceUnavailableException, ConcurrentOperationException, OperationTimedoutException; + boolean advanceStop(T vm, User caller, Account account) throws ResourceUnavailableException, OperationTimedoutException, ConcurrentOperationException; + + boolean advanceDestroy(T vm, User caller, Account account) throws ResourceUnavailableException, OperationTimedoutException, ConcurrentOperationException; } diff --git a/setup/db/create-schema.sql b/setup/db/create-schema.sql index ccca9f43564..1cf70197ab1 100755 --- a/setup/db/create-schema.sql +++ b/setup/db/create-schema.sql @@ -140,6 +140,7 @@ CREATE TABLE `cloud`.`networks` ( `set_fields` bigint unsigned NOT NULL DEFAULT 0 COMMENT 'which fields are set already', `guest_type` char(32) COMMENT 'type of guest network', `shared` int(1) unsigned NOT NULL DEFAULT 0 COMMENT '0 if network is shared, 1 if network dedicated', + `network_domain` varchar(255) COMMENT 'domain', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;