diff --git a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java index d40297942a9..1d8a0cb1013 100644 --- a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java +++ b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java @@ -112,14 +112,12 @@ import com.cloud.storage.StorageManager; import com.cloud.storage.VMTemplateHostVO; import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; import com.cloud.storage.VMTemplateVO; -import com.cloud.storage.VolumeVO; import com.cloud.storage.dao.GuestOSDao; import com.cloud.storage.dao.VMTemplateDao; import com.cloud.storage.dao.VMTemplateHostDao; import com.cloud.storage.dao.VolumeDao; import com.cloud.user.Account; import com.cloud.user.AccountManager; -import com.cloud.user.AccountVO; import com.cloud.user.User; import com.cloud.user.dao.AccountDao; import com.cloud.utils.DateUtil; @@ -130,12 +128,10 @@ import com.cloud.utils.component.ComponentLocator; import com.cloud.utils.component.Inject; import com.cloud.utils.component.Manager; import com.cloud.utils.concurrency.NamedThreadFactory; -import com.cloud.utils.db.DB; import com.cloud.utils.db.GlobalLock; import com.cloud.utils.db.Transaction; import com.cloud.utils.events.SubscriptionMgr; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.exception.ExecutionException; import com.cloud.vm.ConsoleProxyVO; import com.cloud.vm.NicProfile; import com.cloud.vm.NicVO; @@ -624,7 +620,6 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx } ConsoleProxyVO proxy = _consoleProxyDao.findById(proxyVmId); - allocProxyStorage(dataCenterId, proxyVmId); if (proxy != null) { SubscriptionMgr.getInstance().notifySubscribers(ConsoleProxyManager.ALERT_SUBJECT, this, new ConsoleProxyAlertEventArgs(ConsoleProxyAlertEventArgs.PROXY_CREATED, dataCenterId, proxy.getId(), proxy, null)); @@ -639,8 +634,6 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx this, new ConsoleProxyAlertEventArgs(ConsoleProxyAlertEventArgs.PROXY_CREATE_FAILURE, dataCenterId, proxyVmId, null, "Unable to allocate storage")); - - destroyProxyDBOnly(proxyVmId); } return null; } @@ -681,7 +674,6 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx new ConsoleProxyAlertEventArgs(ConsoleProxyAlertEventArgs.PROXY_CREATE_FAILURE, dataCenterId, proxyVmId, null, "Unable to allocate storage")); EventUtils.saveEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventVO.LEVEL_ERROR, EventTypes.EVENT_PROXY_CREATE, "console proxy creation failed", startEventId); - destroyProxyDBOnly(proxyVmId); } return null; } @@ -727,43 +719,6 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx return context; } - @DB - protected ConsoleProxyVO allocProxyStorage(long dataCenterId, long proxyVmId) { - ConsoleProxyVO proxy = _consoleProxyDao.findById(proxyVmId); - assert (proxy != null); - - DataCenterVO dc = _dcDao.findById(dataCenterId); - HostPodVO pod = _podDao.findById(proxy.getPodId()); - final AccountVO account = _accountDao.findById(Account.ACCOUNT_ID_SYSTEM); - - try { - List vols = _storageMgr.create(account, proxy, _template, dc, pod, _serviceOffering, null, 0); - if (vols == null) { - s_logger.error("Unable to alloc storage for console proxy"); - return null; - } - - Transaction txn = Transaction.currentTxn(); - txn.start(); - - // update pool id - ConsoleProxyVO vo = _consoleProxyDao.findById(proxy.getId()); - _consoleProxyDao.update(proxy.getId(), vo); - - // kick the state machine - _itMgr.stateTransitTo(proxy, VirtualMachine.Event.OperationSucceeded, null); - - txn.commit(); - return proxy; - } catch (StorageUnavailableException e) { - s_logger.error("Unable to alloc storage for console proxy: ", e); - return null; - } catch (ExecutionException e) { - s_logger.error("Unable to alloc storage for console proxy: ", e); - return null; - } - } - private ConsoleProxyAllocator getCurrentAllocator() { // for now, only one adapter is supported Enumeration it = _consoleProxyAllocators.enumeration(); @@ -1047,57 +1002,6 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx } } -// private void checkPendingProxyVMs() { -// // drive state to change away from transient states -// List l = _consoleProxyDao.getProxyListInStates(State.Creating); -// if (l != null && l.size() > 0) { -// for (ConsoleProxyVO proxy : l) { -// if (proxy.getLastUpdateTime() == null -// || (proxy.getLastUpdateTime() != null && System.currentTimeMillis() - proxy.getLastUpdateTime().getTime() > 60000)) { -// try { -// ConsoleProxyVO readyProxy = null; -// if (_allocProxyLock.lock(ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_SYNC)) { -// try { -// readyProxy = allocProxyStorage(proxy.getDataCenterId(), proxy.getId()); -// } finally { -// _allocProxyLock.unlock(); -// } -// -// if (readyProxy != null) { -// GlobalLock proxyLock = GlobalLock.getInternLock(getProxyLockName(readyProxy.getId())); -// try { -// if (proxyLock.lock(ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_SYNC)) { -// try { -// readyProxy = start(readyProxy.getId()); -// } finally { -// proxyLock.unlock(); -// } -// } else { -// if (s_logger.isInfoEnabled()) { -// s_logger.info("Unable to acquire synchronization lock to start console proxy : " + readyProxy.getName()); -// } -// } -// } finally { -// proxyLock.releaseRef(); -// } -// } -// } else { -// if (s_logger.isInfoEnabled()) { -// s_logger.info("Unable to acquire synchronization lock to allocate proxy storage, wait for next turn"); -// } -// } -// } catch (StorageUnavailableException e) { -// s_logger.warn("Storage unavailable", e); -// } catch (InsufficientCapacityException e) { -// s_logger.warn("insuffiient capacity", e); -// } catch (ResourceUnavailableException e) { -// s_logger.debug("Concurrent operation: " + e.getMessage()); -// } -// } -// } -// } -// } - private Runnable getCapacityScanTask() { return new Runnable() { @@ -1417,58 +1321,6 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx } } - @DB - protected void completeStopCommand(ConsoleProxyVO proxy, VirtualMachine.Event ev) { - - Transaction txn = Transaction.currentTxn(); - try { - txn.start(); - SubscriptionMgr.getInstance().notifySubscribers( - ConsoleProxyManager.ALERT_SUBJECT, - this, - new ConsoleProxyAlertEventArgs(ConsoleProxyAlertEventArgs.PROXY_DOWN, proxy.getDataCenterId(), proxy.getId(), proxy, - null)); - - if (!_itMgr.stateTransitTo(proxy, ev, null)) { - s_logger.debug("Unable to update the console proxy"); - return; - } - txn.commit(); - } catch (Exception e) { - s_logger.error("Unable to complete stop command due to ", e); - } - - if (_storageMgr.unshare(proxy, null) == null) { - s_logger.warn("Unable to set share to false for " + proxy.getId()); - } -// Transaction txn = Transaction.currentTxn(); -// try { -// txn.start(); -// String privateIpAddress = proxy.getPrivateIpAddress(); -// if (privateIpAddress != null) { -// proxy.setPrivateIpAddress(null); -//// freePrivateIpAddress(privateIpAddress, proxy.getDataCenterId(), proxy.getId()); -// } -// String guestIpAddress = proxy.getGuestIpAddress(); -// if (guestIpAddress != null) { -// proxy.setGuestIpAddress(null); -// _dcDao.releaseLinkLocalIpAddress(guestIpAddress, proxy.getDataCenterId(), proxy.getId()); -// } -// -// if (!_itMgr.stateTransitTo(proxy, ev, null)) { -// s_logger.debug("Unable to update the console proxy"); -// return; -// } -// txn.commit(); -// } catch (Exception e) { -// s_logger.error("Unable to complete stop command due to ", e); -// } -// -// if (_storageMgr.unshare(proxy, null) == null) { -// s_logger.warn("Unable to set share to false for " + proxy.getId()); -// } - } - @Override public Long convertToId(String vmName) { if (!VirtualMachineName.isValidConsoleProxyName(vmName, _instance)) { @@ -1568,34 +1420,6 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx } } - @DB - public boolean destroyProxyDBOnly(long vmId) { - Transaction txn = Transaction.currentTxn(); - try { - txn.start(); - _volsDao.deleteVolumesByInstance(vmId); - - ConsoleProxyVO proxy = _consoleProxyDao.findById(vmId); - if (proxy != null) { - if (proxy.getPublicIpAddress() != null) { -// freePublicIpAddress(proxy.getPublicIpAddress(), proxy.getDataCenterId(), proxy.getPodId()); - } - - _consoleProxyDao.remove(vmId); - - } - - txn.commit(); - return true; - } catch (Exception e) { - s_logger.error("Caught this error: ", e); - txn.rollback(); - return false; - } finally { - s_logger.debug("console proxy vm is destroyed from DB : " + vmId); - } - } - @Override public boolean stop(ConsoleProxyVO proxy) throws ResourceUnavailableException { GlobalLock proxyLock = GlobalLock.getInternLock(getProxyLockName(proxy.getId())); @@ -1603,9 +1427,6 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx if (proxyLock.lock(ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_SYNC)) { try { boolean result = _itMgr.stop(proxy, _accountMgr.getSystemUser(), _accountMgr.getSystemAccount()); - if (result) { - completeStopCommand(proxy, VirtualMachine.Event.OperationSucceeded); - } return result; } finally { proxyLock.unlock(); diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 86e57042d07..bb0f989fdd4 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -241,7 +241,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag if (!_ipAddressDao.update(addr.getAddress(), addr)) { throw new CloudRuntimeException("Found address to allocate but unable to update: " + addr); } - if(!sourceNat && (owner.getAccountId() != Account.ACCOUNT_ID_SYSTEM)){ + if(!sourceNat){ UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_NET_IP_ASSIGN, owner.getAccountId(), dcId, 0, addr.getAddress().toString()); _usageEventDao.persist(usageEvent); } @@ -657,7 +657,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag if (success) { _ipAddressDao.unassignIpAddress(addr); s_logger.debug("released a public ip: " + addr); - if(!ip.isSourceNat() && (ownerId != Account.ACCOUNT_ID_SYSTEM)){ + if(!ip.isSourceNat()){ UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_NET_IP_RELEASE, ownerId, ip.getDataCenterId(), 0, addr.toString()); _usageEventDao.persist(usageEvent); } @@ -941,7 +941,8 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag if (profile.getIp4Address() != null) { vo.setIp4Address(profile.getIp4Address()); - vo.setState(NicVO.State.Reserved); + vo.setReservationStrategy(ReservationStrategy.Create); + vo.setState(Nic.State.Allocated); vo.setAddressFormat(AddressFormat.Ip4); } @@ -1050,6 +1051,15 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag _networksDao.releaseFromLockTable(networkId); } } + + @DB + protected void updateNic(NicVO nic, long networkId, int count) { + Transaction txn = Transaction.currentTxn(); + txn.start(); + _nicDao.update(nic.getId(), nic); + _networksDao.changeActiveNicsBy(networkId, count); + txn.commit(); + } @Override public void prepare(VirtualMachineProfile vmProfile, DeployDestination dest, ReservationContext context) throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException { @@ -1082,9 +1092,11 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag nic.setNetmask(profile.getNetmask()); nic.setGateway(profile.getGateway()); nic.setAddressFormat(profile.getFormat()); - _nicDao.update(nic.getId(), nic); + updateNic(nic, network.getId(), 1); } else { profile = new NicProfile(nic, network, nic.getBroadcastUri(), nic.getIsolationUri()); + nic.setState(Nic.State.Reserved); + updateNic(nic, network.getId(), 1); } for (NetworkElement element : _networkElements) { @@ -1095,7 +1107,6 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } vmProfile.addNic(profile); - _networksDao.changeActiveNicsBy(network.getId(), 1); } } @@ -1117,17 +1128,25 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag List nics = _nicDao.listBy(vmProfile.getId()); for (NicVO nic : nics) { NetworkVO network = _networksDao.findById(nic.getNetworkId()); - if (nic.getReservationStrategy() == ReservationStrategy.Start) { - NetworkGuru concierge = _networkGurus.get(network.getGuruName()); - nic.setState(Resource.State.Releasing); - _nicDao.update(nic.getId(), nic); - NicProfile profile = new NicProfile(nic, network, null, null); - if (concierge.release(profile, vmProfile, nic.getReservationId())) { - nic.setState(Resource.State.Allocated); + if (nic.getState() == Nic.State.Reserved || nic.getState() == Nic.State.Reserving) { + if (nic.getReservationStrategy() == ReservationStrategy.Start) { + NetworkGuru concierge = _networkGurus.get(network.getGuruName()); + nic.setState(Resource.State.Releasing); _nicDao.update(nic.getId(), nic); + NicProfile profile = new NicProfile(nic, network, null, null); + if (concierge.release(profile, vmProfile, nic.getReservationId())) { + nic.setState(Resource.State.Allocated); + if (nic.getState() == Nic.State.Reserved) { + updateNic(nic, network.getId(), -1); + } else { + _nicDao.update(nic.getId(), nic); + } + } + } else { + nic.setState(Nic.State.Allocated); + updateNic(nic, network.getId(), -1); } - } - _networksDao.changeActiveNicsBy(network.getId(), -1); + } } } diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java index b62f83b48bf..99435a29f2d 100644 --- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java +++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java @@ -298,8 +298,6 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian int _routerCleanupInterval = 3600; int _routerStatsInterval = 300; private ServiceOfferingVO _offering; - private int _networkRate; - private int _multicastRate; String _networkDomain; private VMTemplateVO _template; @@ -632,10 +630,6 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian _itMgr.registerGuru(VirtualMachine.Type.DomainRouter, this); boolean useLocalStorage = Boolean.parseBoolean(configs.get(Config.SystemVMUseLocalStorage.key())); - String networkRateStr = _configDao.getValue("network.throttling.rate"); - 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, true, null, Network.GuestIpType.Virtual, useLocalStorage, true, null, true); _offering.setUniqueName("Cloud.Com-SoftwareRouter"); @@ -1107,19 +1101,22 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian // DOMR control command is sent over management server in VMware if (dest.getHost().getHypervisorType() == HypervisorType.VmWare) { - if(s_logger.isInfoEnabled()) - s_logger.info("Check if we need to add management server explicit route to DomR. pod cidr: " + dest.getPod().getCidrAddress() + "/" + dest.getPod().getCidrSize() + if(s_logger.isInfoEnabled()) { + s_logger.info("Check if we need to add management server explicit route to DomR. pod cidr: " + dest.getPod().getCidrAddress() + "/" + dest.getPod().getCidrSize() + ", pod gateway: " + dest.getPod().getGateway() + ", management host: " + _mgmt_host); + } if(!NetUtils.sameSubnetCIDR(_mgmt_host, dest.getPod().getGateway(), dest.getPod().getCidrSize())) { - if(s_logger.isInfoEnabled()) - s_logger.info("Add management server explicit route to DomR."); + if(s_logger.isInfoEnabled()) { + s_logger.info("Add management server explicit route to DomR."); + } buf.append(" mgmtcidr=").append(_mgmt_host); buf.append(" localgw=").append(dest.getPod().getGateway()); } else { - if(s_logger.isInfoEnabled()) - s_logger.info("Management server host is at same subnet at pod private network, don't add explict route to DomR"); + if(s_logger.isInfoEnabled()) { + s_logger.info("Management server host is at same subnet at pod private network, don't add explict route to DomR"); + } } } diff --git a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java index 606a7fbf85c..9d0965d591a 100644 --- a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java +++ b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java @@ -54,15 +54,12 @@ import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.dc.DataCenter; import com.cloud.dc.DataCenter.NetworkType; import com.cloud.dc.DataCenterVO; -import com.cloud.dc.HostPodVO; import com.cloud.dc.dao.DataCenterDao; -import com.cloud.dc.dao.HostPodDao; import com.cloud.deploy.DataCenterDeployment; import com.cloud.deploy.DeployDestination; import com.cloud.event.EventTypes; import com.cloud.event.EventUtils; import com.cloud.event.EventVO; -import com.cloud.event.dao.EventDao; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.ResourceUnavailableException; @@ -79,26 +76,20 @@ import com.cloud.network.Network; import com.cloud.network.NetworkManager; import com.cloud.network.NetworkVO; import com.cloud.network.Networks.TrafficType; -import com.cloud.network.dao.IPAddressDao; import com.cloud.network.dao.NetworkDao; import com.cloud.offerings.NetworkOfferingVO; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; -import com.cloud.storage.StorageManager; import com.cloud.storage.VMTemplateHostVO; import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; import com.cloud.storage.VMTemplateVO; -import com.cloud.storage.VolumeVO; import com.cloud.storage.dao.StoragePoolHostDao; import com.cloud.storage.dao.VMTemplateDao; import com.cloud.storage.dao.VMTemplateHostDao; -import com.cloud.storage.dao.VolumeDao; import com.cloud.storage.template.TemplateConstants; import com.cloud.user.Account; import com.cloud.user.AccountService; -import com.cloud.user.AccountVO; import com.cloud.user.User; -import com.cloud.user.dao.AccountDao; import com.cloud.utils.DateUtil; import com.cloud.utils.NumbersUtil; import com.cloud.utils.Pair; @@ -106,13 +97,10 @@ import com.cloud.utils.component.Adapters; import com.cloud.utils.component.ComponentLocator; import com.cloud.utils.component.Inject; import com.cloud.utils.concurrency.NamedThreadFactory; -import com.cloud.utils.db.DB; import com.cloud.utils.db.GlobalLock; import com.cloud.utils.db.Transaction; import com.cloud.utils.events.SubscriptionMgr; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.exception.ExecutionException; -import com.cloud.utils.net.Ip; import com.cloud.utils.net.NetUtils; import com.cloud.utils.net.NfsUtils; import com.cloud.vm.NicProfile; @@ -146,868 +134,744 @@ import com.cloud.vm.dao.SecondaryStorageVmDao; // Starting, HA, Migrating, Creating and Running state are all counted as "Open" for available capacity calculation // because sooner or later, it will be driven into Running state // -@Local(value={SecondaryStorageVmManager.class}) +@Local(value = { SecondaryStorageVmManager.class }) public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, VirtualMachineGuru { - private static final Logger s_logger = Logger.getLogger(SecondaryStorageManagerImpl.class); + private static final Logger s_logger = Logger.getLogger(SecondaryStorageManagerImpl.class); - private static final int DEFAULT_CAPACITY_SCAN_INTERVAL = 30000; // 30 seconds - private static final int EXECUTOR_SHUTDOWN_TIMEOUT = 1000; // 1 second + private static final int DEFAULT_CAPACITY_SCAN_INTERVAL = 30000; // 30 + // seconds + private static final int EXECUTOR_SHUTDOWN_TIMEOUT = 1000; // 1 second - private static final int ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_COOPERATION = 3; // 3 seconds - private static final int ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_SYNC = 180; // 3 minutes - - private static final int STARTUP_DELAY = 60000; // 60 seconds - - private String _mgmt_host; - private int _mgmt_port = 8250; - private int _secStorageVmCmdPort = 3; + private static final int ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_COOPERATION = 3; // 3 + // seconds + private static final int ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_SYNC = 180; // 3 + // minutes - private String _name; - @Inject(adapter=SecondaryStorageVmAllocator.class) - private Adapters _ssVmAllocators; + private static final int STARTUP_DELAY = 60000; // 60 seconds - @Inject private SecondaryStorageVmDao _secStorageVmDao; - @Inject private DataCenterDao _dcDao; - @Inject private VMTemplateDao _templateDao; - @Inject private IPAddressDao _ipAddressDao; - @Inject private VolumeDao _volsDao; - @Inject private HostPodDao _podDao; - @Inject private HostDao _hostDao; - @Inject private StoragePoolHostDao _storagePoolHostDao; - @Inject private AccountDao _accountDao; + private String _mgmt_host; + private int _mgmt_port = 8250; - @Inject private VMTemplateHostDao _vmTemplateHostDao; + private String _name; + @Inject(adapter = SecondaryStorageVmAllocator.class) + private Adapters _ssVmAllocators; - @Inject private AgentManager _agentMgr; - @Inject private NetworkManager _networkMgr; - @Inject private StorageManager _storageMgr; - - @Inject private ClusterManager _clusterMgr; + @Inject + private SecondaryStorageVmDao _secStorageVmDao; + @Inject + private DataCenterDao _dcDao; + @Inject + private VMTemplateDao _templateDao; + @Inject + private HostDao _hostDao; + @Inject + private StoragePoolHostDao _storagePoolHostDao; + + @Inject + private VMTemplateHostDao _vmTemplateHostDao; + + @Inject + private AgentManager _agentMgr; + @Inject + private NetworkManager _networkMgr; + + @Inject + private ClusterManager _clusterMgr; + + private SecondaryStorageListener _listener; - private SecondaryStorageListener _listener; - private ServiceOfferingVO _serviceOffering; private VMTemplateVO _template; - @Inject private ConfigurationDao _configDao; - @Inject private EventDao _eventDao; - @Inject private ServiceOfferingDao _offeringDao; - @Inject private AccountService _accountMgr; - @Inject private VirtualMachineManager _itMgr; - @Inject private NicDao _nicDao; - @Inject private NetworkDao _networkDao; - + @Inject + private ConfigurationDao _configDao; + @Inject + private ServiceOfferingDao _offeringDao; + @Inject + private AccountService _accountMgr; + @Inject + private VirtualMachineManager _itMgr; + @Inject + private NicDao _nicDao; + @Inject + private NetworkDao _networkDao; + private IpAddrAllocator _IpAllocator; - + private AsyncJobManager _asyncMgr; - private final ScheduledExecutorService _capacityScanScheduler = Executors - .newScheduledThreadPool(1, new NamedThreadFactory("SS-Scan")); + private final ScheduledExecutorService _capacityScanScheduler = Executors.newScheduledThreadPool(1, new NamedThreadFactory("SS-Scan")); - - private long _capacityScanInterval = DEFAULT_CAPACITY_SCAN_INTERVAL; + private long _capacityScanInterval = DEFAULT_CAPACITY_SCAN_INTERVAL; + private int _secStorageVmRamSize; - private int _secStorageVmRamSize; + private String _domain; + private String _instance; + private boolean _useLocalStorage; + private boolean _useSSlCopy; + private String _allowedInternalSites; - private String _domain; - private String _instance; - private boolean _useLocalStorage; - private boolean _useSSlCopy; - private String _secHostUuid; - private String _nfsShare; - private String _allowedInternalSites; + private final GlobalLock _capacityScanLock = GlobalLock.getInternLock(getCapacityScanLockName()); + private final GlobalLock _allocLock = GlobalLock.getInternLock(getAllocLockName()); - private final GlobalLock _capacityScanLock = GlobalLock.getInternLock(getCapacityScanLockName()); - private final GlobalLock _allocLock = GlobalLock.getInternLock(getAllocLockName()); - - @Override - public SecondaryStorageVmVO startSecStorageVm(long secStorageVmId) { - boolean started = false; - long startEventId = EventUtils.saveStartedEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_SSVM_START, "Starting secondary storage Vm with Id: "+secStorageVmId); - try { - SecondaryStorageVmVO ssvm = start(secStorageVmId); - started = true; - return ssvm; - } catch (StorageUnavailableException e) { - s_logger.warn("Exception while trying to start secondary storage vm", e); - return null; - } catch (InsufficientCapacityException e) { - s_logger.warn("Exception while trying to start secondary storage vm", e); - return null; - } catch (ConcurrentOperationException e) { - s_logger.warn("Exception while trying to start secondary storage vm", e); - return null; - } catch (ResourceUnavailableException e) { - return null; - } finally { - if(started){ - EventUtils.saveEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventVO.LEVEL_INFO, EventTypes.EVENT_SSVM_START, "Started secondary storage Vm with Id: "+secStorageVmId, startEventId); - } else { - EventUtils.saveEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventVO.LEVEL_ERROR, EventTypes.EVENT_SSVM_START, "Failed to start secondary storage Vm with Id: "+secStorageVmId, startEventId); - } - } - } - - @Override - public SecondaryStorageVmVO start(long secStorageVmId) throws ResourceUnavailableException, InsufficientCapacityException, ConcurrentOperationException { - SecondaryStorageVmVO secStorageVm = _secStorageVmDao.findById(secStorageVmId); - Account systemAcct = _accountMgr.getSystemAccount(); - User systemUser = _accountMgr.getSystemUser(); - return _itMgr.start(secStorageVm, null, systemUser, systemAcct); - } + @Override + public SecondaryStorageVmVO startSecStorageVm(long secStorageVmId) { + boolean started = false; + long startEventId = EventUtils.saveStartedEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_SSVM_START, + "Starting secondary storage Vm with Id: " + secStorageVmId); + try { + SecondaryStorageVmVO ssvm = start(secStorageVmId); + started = true; + return ssvm; + } catch (StorageUnavailableException e) { + s_logger.warn("Exception while trying to start secondary storage vm", e); + return null; + } catch (InsufficientCapacityException e) { + s_logger.warn("Exception while trying to start secondary storage vm", e); + return null; + } catch (ConcurrentOperationException e) { + s_logger.warn("Exception while trying to start secondary storage vm", e); + return null; + } catch (ResourceUnavailableException e) { + return null; + } finally { + if (started) { + EventUtils.saveEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventVO.LEVEL_INFO, EventTypes.EVENT_SSVM_START, + "Started secondary storage Vm with Id: " + secStorageVmId, startEventId); + } else { + EventUtils.saveEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventVO.LEVEL_ERROR, EventTypes.EVENT_SSVM_START, + "Failed to start secondary storage Vm with Id: " + secStorageVmId, startEventId); + } + } + } - - @Override - public boolean generateFirewallConfiguration(Long hostId){ - if (hostId == null) { - return true; - } - boolean success = true; - List allZones = _dcDao.listAll(); - for (DataCenterVO zone: allZones){ - success = success && generateFirewallConfigurationForZone( zone.getId()); - } + @Override + public SecondaryStorageVmVO start(long secStorageVmId) throws ResourceUnavailableException, InsufficientCapacityException, + ConcurrentOperationException { + SecondaryStorageVmVO secStorageVm = _secStorageVmDao.findById(secStorageVmId); + Account systemAcct = _accountMgr.getSystemAccount(); + User systemUser = _accountMgr.getSystemUser(); + return _itMgr.start(secStorageVm, null, systemUser, systemAcct); + } + + @Override + public boolean generateFirewallConfiguration(Long hostId) { + if (hostId == null) { + return true; + } + boolean success = true; + List allZones = _dcDao.listAll(); + for (DataCenterVO zone : allZones) { + success = success && generateFirewallConfigurationForZone(zone.getId()); + } return true; - } - - @Override - public boolean generateSetupCommand(Long zoneId) { + } - List zoneSsvms = _secStorageVmDao.listByZoneId(zoneId); - if (zoneSsvms.size() == 0) { - return true; - } - SecondaryStorageVmVO secStorageVm = zoneSsvms.get(0);//FIXME: assumes one vm per zone. - if (secStorageVm.getState() != State.Running && secStorageVm.getState() != State.Starting){ - s_logger.warn("No running secondary storage vms found in zone " + zoneId + " , skip programming http auth"); - return true; - } - Host storageHost = _hostDao.findSecondaryStorageHost(zoneId); - if (storageHost == null) { - s_logger.warn("No storage hosts found in zone " + zoneId + " , skip programming http auth"); - return true; - } - SecStorageSetupCommand setupCmd = new SecStorageSetupCommand(zoneId); - if (_allowedInternalSites != null) { - List allowedCidrs = new ArrayList(); - String [] cidrs = _allowedInternalSites.split(","); - for (String cidr: cidrs) { - if (NetUtils.isValidCIDR(cidr) || NetUtils.isValidIp(cidr)) { - allowedCidrs.add(cidr); - } - } - String privateCidr = NetUtils.ipAndNetMaskToCidr(secStorageVm.getPrivateIpAddress(), secStorageVm.getPrivateNetmask()); - String publicCidr = NetUtils.ipAndNetMaskToCidr(secStorageVm.getPublicIpAddress(), secStorageVm.getPublicNetmask()); - if (NetUtils.isNetworkAWithinNetworkB(privateCidr, publicCidr) || NetUtils.isNetworkAWithinNetworkB(publicCidr, privateCidr)){ - allowedCidrs.add("0.0.0.0/0"); - } - setupCmd.setAllowedInternalSites(allowedCidrs.toArray(new String[allowedCidrs.size()])); - } - String copyPasswd = _configDao.getValue("secstorage.copy.password"); - setupCmd.setCopyPassword(copyPasswd); - setupCmd.setCopyUserName(TemplateConstants.DEFAULT_HTTP_AUTH_USER); - Answer answer = _agentMgr.easySend(storageHost.getId(), setupCmd); - if (answer != null && answer.getResult()) { - if (s_logger.isDebugEnabled()) { + @Override + public boolean generateSetupCommand(Long zoneId) { + + List zoneSsvms = _secStorageVmDao.listByZoneId(zoneId); + if (zoneSsvms.size() == 0) { + return true; + } + SecondaryStorageVmVO secStorageVm = zoneSsvms.get(0);// FIXME: assumes + // one vm per zone. + if (secStorageVm.getState() != State.Running && secStorageVm.getState() != State.Starting) { + s_logger.warn("No running secondary storage vms found in zone " + zoneId + " , skip programming http auth"); + return true; + } + Host storageHost = _hostDao.findSecondaryStorageHost(zoneId); + if (storageHost == null) { + s_logger.warn("No storage hosts found in zone " + zoneId + " , skip programming http auth"); + return true; + } + SecStorageSetupCommand setupCmd = new SecStorageSetupCommand(zoneId); + if (_allowedInternalSites != null) { + List allowedCidrs = new ArrayList(); + String[] cidrs = _allowedInternalSites.split(","); + for (String cidr : cidrs) { + if (NetUtils.isValidCIDR(cidr) || NetUtils.isValidIp(cidr)) { + allowedCidrs.add(cidr); + } + } + String privateCidr = NetUtils.ipAndNetMaskToCidr(secStorageVm.getPrivateIpAddress(), secStorageVm.getPrivateNetmask()); + String publicCidr = NetUtils.ipAndNetMaskToCidr(secStorageVm.getPublicIpAddress(), secStorageVm.getPublicNetmask()); + if (NetUtils.isNetworkAWithinNetworkB(privateCidr, publicCidr) || NetUtils.isNetworkAWithinNetworkB(publicCidr, privateCidr)) { + allowedCidrs.add("0.0.0.0/0"); + } + setupCmd.setAllowedInternalSites(allowedCidrs.toArray(new String[allowedCidrs.size()])); + } + String copyPasswd = _configDao.getValue("secstorage.copy.password"); + setupCmd.setCopyPassword(copyPasswd); + setupCmd.setCopyUserName(TemplateConstants.DEFAULT_HTTP_AUTH_USER); + Answer answer = _agentMgr.easySend(storageHost.getId(), setupCmd); + if (answer != null && answer.getResult()) { + if (s_logger.isDebugEnabled()) { s_logger.debug("Successfully programmed http auth into " + secStorageVm.getName()); } - return true; - } else { - if (s_logger.isDebugEnabled()) { + return true; + } else { + if (s_logger.isDebugEnabled()) { s_logger.debug("failed to program http auth into secondary storage vm : " + secStorageVm.getName()); } - return false; - } - } + return false; + } + } - private boolean generateFirewallConfigurationForZone( Long zoneId) { - List zoneSsvms = _secStorageVmDao.listByZoneId(zoneId); - if (zoneSsvms.size() == 0) { - return true; - } - SecondaryStorageVmVO secStorageVm = zoneSsvms.get(0);//FIXME: assumes one vm per zone. - if (secStorageVm.getState() != State.Running && secStorageVm.getState() != State.Starting){ - s_logger.warn("No running secondary storage vms found in zone " + zoneId + " , skip programming firewall rules"); - return true; - } - Host storageHost = _hostDao.findSecondaryStorageHost(zoneId); - if (storageHost == null) { - s_logger.warn("No storage hosts found in zone " + zoneId + " , skip programming firewall rules"); - return true; - } - List alreadyRunning = _secStorageVmDao.getSecStorageVmListInStates( State.Running, State.Migrating, State.Starting); + private boolean generateFirewallConfigurationForZone(Long zoneId) { + List zoneSsvms = _secStorageVmDao.listByZoneId(zoneId); + if (zoneSsvms.size() == 0) { + return true; + } + SecondaryStorageVmVO secStorageVm = zoneSsvms.get(0);// FIXME: assumes + // one vm per zone. + if (secStorageVm.getState() != State.Running && secStorageVm.getState() != State.Starting) { + s_logger.warn("No running secondary storage vms found in zone " + zoneId + " , skip programming firewall rules"); + return true; + } + Host storageHost = _hostDao.findSecondaryStorageHost(zoneId); + if (storageHost == null) { + s_logger.warn("No storage hosts found in zone " + zoneId + " , skip programming firewall rules"); + return true; + } + List alreadyRunning = _secStorageVmDao.getSecStorageVmListInStates(State.Running, State.Migrating, State.Starting); - String copyPort = Integer.toString(TemplateConstants.DEFAULT_TMPLT_COPY_PORT); - SecStorageFirewallCfgCommand cpc = new SecStorageFirewallCfgCommand(); - for (SecondaryStorageVmVO ssVm: alreadyRunning) { - if (ssVm.getPublicIpAddress() != null) { - if (ssVm.getId() == secStorageVm.getId()) { + String copyPort = Integer.toString(TemplateConstants.DEFAULT_TMPLT_COPY_PORT); + SecStorageFirewallCfgCommand cpc = new SecStorageFirewallCfgCommand(); + for (SecondaryStorageVmVO ssVm : alreadyRunning) { + if (ssVm.getPublicIpAddress() != null) { + if (ssVm.getId() == secStorageVm.getId()) { continue; } - cpc.addPortConfig(ssVm.getPublicIpAddress(), copyPort , true, TemplateConstants.DEFAULT_TMPLT_COPY_INTF); - if (_useSSlCopy){ - cpc.addPortConfig(ssVm.getPublicIpAddress(), "443" , true, TemplateConstants.DEFAULT_TMPLT_COPY_INTF); - } - } - } - Answer answer = _agentMgr.easySend(storageHost.getId(), cpc); - if (answer != null && answer.getResult()) { - if (s_logger.isDebugEnabled()) { + cpc.addPortConfig(ssVm.getPublicIpAddress(), copyPort, true, TemplateConstants.DEFAULT_TMPLT_COPY_INTF); + if (_useSSlCopy) { + cpc.addPortConfig(ssVm.getPublicIpAddress(), "443", true, TemplateConstants.DEFAULT_TMPLT_COPY_INTF); + } + } + } + Answer answer = _agentMgr.easySend(storageHost.getId(), cpc); + if (answer != null && answer.getResult()) { + if (s_logger.isDebugEnabled()) { s_logger.debug("Successfully programmed firewall rules into " + secStorageVm.getName()); } - return true; - } else { - if (s_logger.isDebugEnabled()) { + return true; + } else { + if (s_logger.isDebugEnabled()) { s_logger.debug("failed to program firewall rules into secondary storage vm : " + secStorageVm.getName()); } - return false; - } - - } - + return false; + } + } + public SecondaryStorageVmVO startNew(long dataCenterId) { - public SecondaryStorageVmVO startNew(long dataCenterId) { - - if (s_logger.isDebugEnabled()) { + if (s_logger.isDebugEnabled()) { s_logger.debug("Assign secondary storage vm from a newly started instance for request from data center : " + dataCenterId); } - long startEventId = EventUtils.saveStartedEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_SSVM_CREATE, "Creating secondary storage Vm in zone : "+dataCenterId); - Map context = createSecStorageVmInstance(dataCenterId); + long startEventId = EventUtils.saveStartedEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_SSVM_CREATE, + "Creating secondary storage Vm in zone : " + dataCenterId); + Map context = createSecStorageVmInstance(dataCenterId); - long secStorageVmId = (Long) context.get("secStorageVmId"); - if (secStorageVmId == 0) { - if (s_logger.isTraceEnabled()) { + long secStorageVmId = (Long) context.get("secStorageVmId"); + if (secStorageVmId == 0) { + if (s_logger.isTraceEnabled()) { s_logger.trace("Creating secondary storage vm instance failed, data center id : " + dataCenterId); } - // release critical system resource on failure - if (context.get("publicIpAddress") != null) { - freePublicIpAddress((String) context.get("publicIpAddress"), dataCenterId, 0); - } - EventUtils.saveEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventVO.LEVEL_ERROR, EventTypes.EVENT_SSVM_CREATE, "Failed to create secondary storage Vm in zone : "+dataCenterId, startEventId); - return null; - } + EventUtils.saveEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventVO.LEVEL_ERROR, EventTypes.EVENT_SSVM_CREATE, + "Failed to create secondary storage Vm in zone : " + dataCenterId, startEventId); + return null; + } - SecondaryStorageVmVO secStorageVm = _secStorageVmDao.findById(secStorageVmId); - //SecondaryStorageVmVO secStorageVm = allocSecStorageVmStorage(dataCenterId, secStorageVmId); - if (secStorageVm != null) { - SubscriptionMgr.getInstance().notifySubscribers(ALERT_SUBJECT, this, - new SecStorageVmAlertEventArgs( - SecStorageVmAlertEventArgs.SSVM_CREATED, - dataCenterId, secStorageVmId, secStorageVm, null) - ); - EventUtils.saveEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventVO.LEVEL_INFO, EventTypes.EVENT_SSVM_CREATE, "Successfully created secondary storage Vm "+ secStorageVm.getName() +" in zone : "+dataCenterId, startEventId); - return secStorageVm; - } else { - if (s_logger.isDebugEnabled()) { + SecondaryStorageVmVO secStorageVm = _secStorageVmDao.findById(secStorageVmId); + // SecondaryStorageVmVO secStorageVm = + // allocSecStorageVmStorage(dataCenterId, secStorageVmId); + if (secStorageVm != null) { + SubscriptionMgr.getInstance().notifySubscribers(ALERT_SUBJECT, this, + new SecStorageVmAlertEventArgs(SecStorageVmAlertEventArgs.SSVM_CREATED, dataCenterId, secStorageVmId, secStorageVm, null)); + EventUtils.saveEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventVO.LEVEL_INFO, EventTypes.EVENT_SSVM_CREATE, + "Successfully created secondary storage Vm " + secStorageVm.getName() + " in zone : " + dataCenterId, startEventId); + return secStorageVm; + } else { + if (s_logger.isDebugEnabled()) { s_logger.debug("Unable to allocate secondary storage vm storage, remove the secondary storage vm record from DB, secondary storage vm id: " - + secStorageVmId); + + secStorageVmId); } - - SubscriptionMgr.getInstance().notifySubscribers(ALERT_SUBJECT, this, - new SecStorageVmAlertEventArgs( - SecStorageVmAlertEventArgs.SSVM_CREATE_FAILURE, - dataCenterId, secStorageVmId, null, "Unable to allocate storage") - ); - destroySecStorageVmDBOnly(secStorageVmId); - EventUtils.saveEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventVO.LEVEL_ERROR, EventTypes.EVENT_SSVM_CREATE, "Failed to create secondary storage Vm in zone : "+dataCenterId, startEventId); - } - return null; - } - - protected Map createSecStorageVmInstance(long dataCenterId) { - HostVO secHost = _hostDao.findSecondaryStorageHost(dataCenterId); - if (secHost == null) { - String msg = "No secondary storage available in zone " + dataCenterId + ", cannot create secondary storage vm"; - s_logger.warn(msg); - throw new CloudRuntimeException(msg); - } - - _secHostUuid = secHost.getGuid(); - _nfsShare = secHost.getStorageUrl(); - - long id = _secStorageVmDao.getNextInSequence(Long.class, "id"); - String name = VirtualMachineName.getSystemVmName(id, _instance, "s").intern(); - Account systemAcct = _accountMgr.getSystemAccount(); - - DataCenterDeployment plan = new DataCenterDeployment(dataCenterId); - DataCenter dc = _dcDao.findById(plan.getDataCenterId()); - List defaultOffering = _networkMgr.getSystemAccountNetworkOfferings(NetworkOfferingVO.SystemPublicNetwork); - if (dc.getNetworkType() == NetworkType.Basic) { - defaultOffering = _networkMgr.getSystemAccountNetworkOfferings(NetworkOfferingVO.SysteGuestNetwork); - } - - List offerings = _networkMgr.getSystemAccountNetworkOfferings(NetworkOfferingVO.SystemControlNetwork, NetworkOfferingVO.SystemManagementNetwork); - List> networks = new ArrayList>(offerings.size() + 1); - NicProfile defaultNic = new NicProfile(); - defaultNic.setDefaultNic(true); - defaultNic.setDeviceId(2); - try { - networks.add(new Pair(_networkMgr.setupNetwork(systemAcct, defaultOffering.get(0), plan, null, null, false, false).get(0), defaultNic)); - for (NetworkOfferingVO offering : offerings) { - networks.add(new Pair(_networkMgr.setupNetwork(systemAcct, offering, plan, null, null, false, false).get(0), null)); - } - } catch (ConcurrentOperationException e) { - s_logger.info("Unable to setup due to concurrent operation. " + e); - return new HashMap(); - } - SecondaryStorageVmVO secStorageVm = new SecondaryStorageVmVO(id, _serviceOffering.getId(), name, _template.getId(), _template.getHypervisorType(), - _template.getGuestOSId(), dataCenterId, systemAcct.getDomainId(), systemAcct.getId()); - try { - secStorageVm = _itMgr.allocate(secStorageVm, _template, _serviceOffering, networks, plan, null, systemAcct); - } catch (InsufficientCapacityException e) { - s_logger.warn("InsufficientCapacity", e); - throw new CloudRuntimeException("Insufficient capacity exception", e); - } - - Map context = new HashMap(); - context.put("secStorageVmId", secStorageVm.getId()); - return context; - } + SubscriptionMgr.getInstance().notifySubscribers( + ALERT_SUBJECT, + this, + new SecStorageVmAlertEventArgs(SecStorageVmAlertEventArgs.SSVM_CREATE_FAILURE, dataCenterId, secStorageVmId, null, + "Unable to allocate storage")); + EventUtils.saveEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventVO.LEVEL_ERROR, EventTypes.EVENT_SSVM_CREATE, + "Failed to create secondary storage Vm in zone : " + dataCenterId, startEventId); + } + return null; + } - protected SecondaryStorageVmVO allocSecStorageVmStorage(long dataCenterId, long secStorageVmId) { - SecondaryStorageVmVO secStorageVm = _secStorageVmDao.findById(secStorageVmId); - assert (secStorageVm != null); + protected Map createSecStorageVmInstance(long dataCenterId) { + HostVO secHost = _hostDao.findSecondaryStorageHost(dataCenterId); + if (secHost == null) { + String msg = "No secondary storage available in zone " + dataCenterId + ", cannot create secondary storage vm"; + s_logger.warn(msg); + throw new CloudRuntimeException(msg); + } - DataCenterVO dc = _dcDao.findById(dataCenterId); - HostPodVO pod = _podDao.findById(secStorageVm.getPodId()); - - final AccountVO account = _accountDao.findById(Account.ACCOUNT_ID_SYSTEM); - + long id = _secStorageVmDao.getNextInSequence(Long.class, "id"); + String name = VirtualMachineName.getSystemVmName(id, _instance, "s").intern(); + Account systemAcct = _accountMgr.getSystemAccount(); + + DataCenterDeployment plan = new DataCenterDeployment(dataCenterId); + DataCenter dc = _dcDao.findById(plan.getDataCenterId()); + + List defaultOffering = _networkMgr.getSystemAccountNetworkOfferings(NetworkOfferingVO.SystemPublicNetwork); + if (dc.getNetworkType() == NetworkType.Basic) { + defaultOffering = _networkMgr.getSystemAccountNetworkOfferings(NetworkOfferingVO.SysteGuestNetwork); + } + + List offerings = _networkMgr.getSystemAccountNetworkOfferings(NetworkOfferingVO.SystemControlNetwork, + NetworkOfferingVO.SystemManagementNetwork); + List> networks = new ArrayList>(offerings.size() + 1); + NicProfile defaultNic = new NicProfile(); + defaultNic.setDefaultNic(true); + defaultNic.setDeviceId(2); try { - List vols = _storageMgr.create(account, secStorageVm, _template, dc, pod, _serviceOffering, null,0); - if( vols == null ){ - s_logger.error("Unable to alloc storage for secondary storage vm"); - return null; - } - - // kick the state machine - _itMgr.stateTransitTo(secStorageVm, VirtualMachine.Event.OperationSucceeded, null); - return secStorageVm; - } catch (StorageUnavailableException e) { - s_logger.error("Unable to alloc storage for secondary storage vm: ", e); - return null; - } catch (ExecutionException e) { - s_logger.error("Unable to alloc storage for secondary storage vm: ", e); - return null; - } - } + networks.add(new Pair(_networkMgr.setupNetwork(systemAcct, defaultOffering.get(0), plan, null, null, false, false) + .get(0), defaultNic)); + for (NetworkOfferingVO offering : offerings) { + networks.add(new Pair(_networkMgr.setupNetwork(systemAcct, offering, plan, null, null, false, false).get(0), + null)); + } + } catch (ConcurrentOperationException e) { + s_logger.info("Unable to setup due to concurrent operation. " + e); + return new HashMap(); + } + SecondaryStorageVmVO secStorageVm = new SecondaryStorageVmVO(id, _serviceOffering.getId(), name, _template.getId(), + _template.getHypervisorType(), _template.getGuestOSId(), dataCenterId, systemAcct.getDomainId(), systemAcct.getId()); + try { + secStorageVm = _itMgr.allocate(secStorageVm, _template, _serviceOffering, networks, plan, null, systemAcct); + } catch (InsufficientCapacityException e) { + s_logger.warn("InsufficientCapacity", e); + throw new CloudRuntimeException("Insufficient capacity exception", e); + } - private void freePublicIpAddress(String ipAddress, long dcId, long podId) { - if (_IpAllocator != null && _IpAllocator.exteralIpAddressAllocatorEnabled()) { - _IpAllocator.releasePublicIpAddress(ipAddress, dcId, podId); - } else { - _ipAddressDao.unassignIpAddress(new Ip(ipAddress)); - } - } + Map context = new HashMap(); + context.put("secStorageVmId", secStorageVm.getId()); + return context; + } - private SecondaryStorageVmAllocator getCurrentAllocator() { + private SecondaryStorageVmAllocator getCurrentAllocator() { - // for now, only one adapter is supported - Enumeration it = _ssVmAllocators.enumeration(); - if (it.hasMoreElements()) { + // for now, only one adapter is supported + Enumeration it = _ssVmAllocators.enumeration(); + if (it.hasMoreElements()) { return it.nextElement(); } - return null; - } + return null; + } - protected String connect(String ipAddress, int port) { - return null; - } + protected String connect(String ipAddress, int port) { + return null; + } - - + private Runnable getCapacityScanTask() { + return new Runnable() { -// private void checkPendingSecStorageVMs() { -// // drive state to change away from transient states -// List l = _secStorageVmDao.getSecStorageVmListInStates(State.Creating); -// if (l != null && l.size() > 0) { -// for (SecondaryStorageVmVO secStorageVm : l) { -// if (secStorageVm.getLastUpdateTime() == null || -// (secStorageVm.getLastUpdateTime() != null && System.currentTimeMillis() - secStorageVm.getLastUpdateTime().getTime() > 60000)) { -// try { -// SecondaryStorageVmVO readysecStorageVm = null; -// if (_allocLock.lock(ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_SYNC)) { -// try { -// readysecStorageVm = allocSecStorageVmStorage(secStorageVm.getDataCenterId(), secStorageVm.getId()); -// } finally { -// _allocLock.unlock(); -// } -// -// if (readysecStorageVm != null) { -// GlobalLock secStorageVmLock = GlobalLock.getInternLock(getSecStorageVmLockName(readysecStorageVm.getId())); -// try { -// if (secStorageVmLock.lock(ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_SYNC)) { -// try { -// readysecStorageVm = start(readysecStorageVm.getId()); -// } finally { -// secStorageVmLock.unlock(); -// } -// } else { -// if (s_logger.isInfoEnabled()) { -// s_logger.info("Unable to acquire synchronization lock to start secondary storage vm : " + readysecStorageVm.getName()); -// } -// } -// } finally { -// secStorageVmLock.releaseRef(); -// } -// } -// } else { -// if (s_logger.isInfoEnabled()) { -// s_logger.info("Unable to acquire synchronization lock to allocate secondary storage vm storage, wait for next turn"); -// } -// } -// } catch (StorageUnavailableException e) { -// 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()); -// } -// } -// } -// } -// } + @Override + public void run() { + Transaction txn = Transaction.open(Transaction.CLOUD_DB); + try { + reallyRun(); + } catch (Throwable e) { + s_logger.warn("Unexpected exception " + e.getMessage(), e); + } finally { + txn.close(); + } + } - private Runnable getCapacityScanTask() { - return new Runnable() { - - @Override - public void run() { - Transaction txn = Transaction.open(Transaction.CLOUD_DB); - try { - reallyRun(); - } catch(Throwable e) { - s_logger.warn("Unexpected exception " + e.getMessage(), e); - } finally { - txn.close(); - } - } - - private void reallyRun() { - if (s_logger.isTraceEnabled()) { + private void reallyRun() { + if (s_logger.isTraceEnabled()) { s_logger.trace("Begin secondary storage vm capacity scan"); } - - Map zoneHostInfoMap = getZoneHostInfo(); - if (isServiceReady(zoneHostInfoMap)) { - if (s_logger.isTraceEnabled()) { + + Map zoneHostInfoMap = getZoneHostInfo(); + if (isServiceReady(zoneHostInfoMap)) { + if (s_logger.isTraceEnabled()) { s_logger.trace("Sec Storage VM Service is ready, check to see if we need to allocate standby capacity"); } - if (!_capacityScanLock.lock(ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_COOPERATION)) { - if (s_logger.isTraceEnabled()) { + if (!_capacityScanLock.lock(ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_COOPERATION)) { + if (s_logger.isTraceEnabled()) { s_logger.trace("Sec Storage VM Capacity scan lock is used by others, skip and wait for my turn"); } - return; - } + return; + } - if (s_logger.isTraceEnabled()) { + if (s_logger.isTraceEnabled()) { s_logger.trace("*** Begining secondary storage vm capacity scan... ***"); } - try { - //checkPendingSecStorageVMs(); - - List datacenters = _dcDao.listAllIncludingRemoved(); + try { + // checkPendingSecStorageVMs(); + List datacenters = _dcDao.listAllIncludingRemoved(); - for (DataCenterVO dc: datacenters){ - if(isZoneReady(zoneHostInfoMap, dc.getId())) { - List alreadyRunning = _secStorageVmDao.getSecStorageVmListInStates(dc.getId(), State.Running, State.Migrating, State.Starting); - List stopped = _secStorageVmDao.getSecStorageVmListInStates(dc.getId(), State.Stopped, State.Stopping); - if (alreadyRunning.size() == 0) { - if (stopped.size() == 0) { - s_logger.info("No secondary storage vms found in datacenter id=" + dc.getId() + ", starting a new one" ); - allocCapacity(dc.getId()); - } else { - s_logger.warn("Stopped secondary storage vms found in datacenter id=" + dc.getId() + ", not restarting them automatically" ); - } + for (DataCenterVO dc : datacenters) { + if (isZoneReady(zoneHostInfoMap, dc.getId())) { + List alreadyRunning = _secStorageVmDao.getSecStorageVmListInStates(dc.getId(), State.Running, + State.Migrating, State.Starting); + List stopped = _secStorageVmDao.getSecStorageVmListInStates(dc.getId(), State.Stopped, + State.Stopping); + if (alreadyRunning.size() == 0) { + if (stopped.size() == 0) { + s_logger.info("No secondary storage vms found in datacenter id=" + dc.getId() + ", starting a new one"); + allocCapacity(dc.getId()); + } else { + s_logger.warn("Stopped secondary storage vms found in datacenter id=" + dc.getId() + + ", not restarting them automatically"); + } - } - } else { - if(s_logger.isDebugEnabled()) { + } + } else { + if (s_logger.isDebugEnabled()) { s_logger.debug("Zone " + dc.getId() + " is not ready to alloc secondary storage vm"); } - } - } + } + } - if (s_logger.isTraceEnabled()) { + if (s_logger.isTraceEnabled()) { s_logger.trace("*** Stop secondary storage vm capacity scan ***"); } - } finally { - _capacityScanLock.unlock(); - } + } finally { + _capacityScanLock.unlock(); + } - } else { - if (s_logger.isTraceEnabled()) { + } else { + if (s_logger.isTraceEnabled()) { s_logger.trace("Secondary storage vm service is not ready for capacity preallocation, wait for next time"); } - } + } - if (s_logger.isTraceEnabled()) { + if (s_logger.isTraceEnabled()) { s_logger.trace("End of secondary storage vm capacity scan"); } - } - }; - } + } + }; + } + public SecondaryStorageVmVO assignSecStorageVmFromRunningPool(long dataCenterId) { - - public SecondaryStorageVmVO assignSecStorageVmFromRunningPool(long dataCenterId) { - - if (s_logger.isTraceEnabled()) { + if (s_logger.isTraceEnabled()) { s_logger.trace("Assign secondary storage vm from running pool for request from data center : " + dataCenterId); } - SecondaryStorageVmAllocator allocator = getCurrentAllocator(); - assert (allocator != null); - List runningList = _secStorageVmDao.getSecStorageVmListInStates(dataCenterId, State.Running); - if (runningList != null && runningList.size() > 0) { - if (s_logger.isTraceEnabled()) { - s_logger.trace("Running secondary storage vm pool size : " + runningList.size()); - for (SecondaryStorageVmVO secStorageVm : runningList) { + SecondaryStorageVmAllocator allocator = getCurrentAllocator(); + assert (allocator != null); + List runningList = _secStorageVmDao.getSecStorageVmListInStates(dataCenterId, State.Running); + if (runningList != null && runningList.size() > 0) { + if (s_logger.isTraceEnabled()) { + s_logger.trace("Running secondary storage vm pool size : " + runningList.size()); + for (SecondaryStorageVmVO secStorageVm : runningList) { s_logger.trace("Running secStorageVm instance : " + secStorageVm.getName()); } - } + } - Map loadInfo = new HashMap(); - - return allocator.allocSecondaryStorageVm(runningList, loadInfo, dataCenterId); - } else { - if (s_logger.isTraceEnabled()) { + Map loadInfo = new HashMap(); + + return allocator.allocSecondaryStorageVm(runningList, loadInfo, dataCenterId); + } else { + if (s_logger.isTraceEnabled()) { s_logger.trace("Empty running secStorageVm pool for now in data center : " + dataCenterId); } - } - return null; - } + } + return null; + } - public SecondaryStorageVmVO assignSecStorageVmFromStoppedPool(long dataCenterId) { - List l = _secStorageVmDao.getSecStorageVmListInStates( - dataCenterId, State.Starting, State.Stopped, - State.Migrating); - if (l != null && l.size() > 0) { + public SecondaryStorageVmVO assignSecStorageVmFromStoppedPool(long dataCenterId) { + List l = _secStorageVmDao.getSecStorageVmListInStates(dataCenterId, State.Starting, State.Stopped, State.Migrating); + if (l != null && l.size() > 0) { return l.get(0); } - return null; - } + return null; + } - private void allocCapacity(long dataCenterId) { - if (s_logger.isTraceEnabled()) { + private void allocCapacity(long dataCenterId) { + if (s_logger.isTraceEnabled()) { s_logger.trace("Allocate secondary storage vm standby capacity for data center : " + dataCenterId); } - boolean secStorageVmFromStoppedPool = false; - SecondaryStorageVmVO secStorageVm = assignSecStorageVmFromStoppedPool(dataCenterId); - if (secStorageVm == null) { - if (s_logger.isInfoEnabled()) { + boolean secStorageVmFromStoppedPool = false; + SecondaryStorageVmVO secStorageVm = assignSecStorageVmFromStoppedPool(dataCenterId); + if (secStorageVm == null) { + if (s_logger.isInfoEnabled()) { s_logger.info("No stopped secondary storage vm is available, need to allocate a new secondary storage vm"); } - if (_allocLock.lock(ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_SYNC)) { - try { - secStorageVm = startNew(dataCenterId); - } finally { - _allocLock.unlock(); - } - } else { - if (s_logger.isInfoEnabled()) { + if (_allocLock.lock(ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_SYNC)) { + try { + secStorageVm = startNew(dataCenterId); + } finally { + _allocLock.unlock(); + } + } else { + if (s_logger.isInfoEnabled()) { s_logger.info("Unable to acquire synchronization lock to allocate secStorageVm resource for standby capacity, wait for next scan"); } - return; - } - } else { - if (s_logger.isInfoEnabled()) { + return; + } + } else { + if (s_logger.isInfoEnabled()) { s_logger.info("Found a stopped secondary storage vm, bring it up to running pool. secStorageVm vm id : " + secStorageVm.getId()); } - secStorageVmFromStoppedPool = true; - } + secStorageVmFromStoppedPool = true; + } - if (secStorageVm != null) { - long secStorageVmId = secStorageVm.getId(); - GlobalLock secStorageVmLock = GlobalLock.getInternLock(getSecStorageVmLockName(secStorageVmId)); - try { - if (secStorageVmLock.lock(ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_SYNC)) { - try { - secStorageVm = startSecStorageVm(secStorageVmId); - } finally { - secStorageVmLock.unlock(); - } - } else { - if (s_logger.isInfoEnabled()) { - s_logger.info("Unable to acquire synchronization lock to start secStorageVm for standby capacity, secStorageVm vm id : " - + secStorageVm.getId()); + if (secStorageVm != null) { + long secStorageVmId = secStorageVm.getId(); + GlobalLock secStorageVmLock = GlobalLock.getInternLock(getSecStorageVmLockName(secStorageVmId)); + try { + if (secStorageVmLock.lock(ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_SYNC)) { + try { + secStorageVm = startSecStorageVm(secStorageVmId); + } finally { + secStorageVmLock.unlock(); } - return; - } - } finally { - secStorageVmLock.releaseRef(); - } + } else { + if (s_logger.isInfoEnabled()) { + s_logger.info("Unable to acquire synchronization lock to start secStorageVm for standby capacity, secStorageVm vm id : " + + secStorageVm.getId()); + } + return; + } + } finally { + secStorageVmLock.releaseRef(); + } - if (secStorageVm == null) { - if (s_logger.isInfoEnabled()) { - s_logger.info("Unable to start secondary storage vm for standby capacity, secStorageVm vm Id : " - + secStorageVmId + ", will recycle it and start a new one"); + if (secStorageVm == null) { + if (s_logger.isInfoEnabled()) { + s_logger.info("Unable to start secondary storage vm for standby capacity, secStorageVm vm Id : " + secStorageVmId + + ", will recycle it and start a new one"); } - if (secStorageVmFromStoppedPool) { + if (secStorageVmFromStoppedPool) { destroySecStorageVm(secStorageVmId); } - } else { - if (s_logger.isInfoEnabled()) { + } else { + if (s_logger.isInfoEnabled()) { s_logger.info("Secondary storage vm " + secStorageVm.getName() + " is started"); } - } - } - } + } + } + } - public boolean isServiceReady(Map zoneHostInfoMap) { - for (ZoneHostInfo zoneHostInfo : zoneHostInfoMap.values()) { - if ((zoneHostInfo.getFlags() & RunningHostInfoAgregator.ZoneHostInfo.ALL_HOST_MASK) != 0){ - if (s_logger.isInfoEnabled()) { + public boolean isServiceReady(Map zoneHostInfoMap) { + for (ZoneHostInfo zoneHostInfo : zoneHostInfoMap.values()) { + if ((zoneHostInfo.getFlags() & RunningHostInfoAgregator.ZoneHostInfo.ALL_HOST_MASK) != 0) { + if (s_logger.isInfoEnabled()) { s_logger.info("Zone " + zoneHostInfo.getDcId() + " is ready to launch"); } - return true; - } - } + return true; + } + } - return false; - } - - public boolean isZoneReady(Map zoneHostInfoMap, long dataCenterId) { - ZoneHostInfo zoneHostInfo = zoneHostInfoMap.get(dataCenterId); - if(zoneHostInfo != null && (zoneHostInfo.getFlags() & RunningHostInfoAgregator.ZoneHostInfo.ROUTING_HOST_MASK) != 0) { - VMTemplateVO template = _templateDao.findConsoleProxyTemplate(); - HostVO secHost = _hostDao.findSecondaryStorageHost(dataCenterId); - if (secHost == null) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("No secondary storage available in zone " + dataCenterId + ", wait until it is ready to launch secondary storage vm"); + return false; + } + + public boolean isZoneReady(Map zoneHostInfoMap, long dataCenterId) { + ZoneHostInfo zoneHostInfo = zoneHostInfoMap.get(dataCenterId); + if (zoneHostInfo != null && (zoneHostInfo.getFlags() & RunningHostInfoAgregator.ZoneHostInfo.ROUTING_HOST_MASK) != 0) { + VMTemplateVO template = _templateDao.findConsoleProxyTemplate(); + HostVO secHost = _hostDao.findSecondaryStorageHost(dataCenterId); + if (secHost == null) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("No secondary storage available in zone " + dataCenterId + + ", wait until it is ready to launch secondary storage vm"); } - return false; - } - - boolean templateReady = false; - if (template != null) { - VMTemplateHostVO templateHostRef = _vmTemplateHostDao.findByHostTemplate(secHost.getId(), template.getId()); - templateReady = (templateHostRef != null) && (templateHostRef.getDownloadState() == Status.DOWNLOADED); - } - - if(templateReady) { - - List> l = _storagePoolHostDao.getDatacenterStoragePoolHostInfo(dataCenterId, !_useLocalStorage); - if(l != null && l.size() > 0 && l.get(0).second().intValue() > 0) { - - return true; - } else { - if (s_logger.isDebugEnabled()) { + return false; + } + + boolean templateReady = false; + if (template != null) { + VMTemplateHostVO templateHostRef = _vmTemplateHostDao.findByHostTemplate(secHost.getId(), template.getId()); + templateReady = (templateHostRef != null) && (templateHostRef.getDownloadState() == Status.DOWNLOADED); + } + + if (templateReady) { + + List> l = _storagePoolHostDao.getDatacenterStoragePoolHostInfo(dataCenterId, !_useLocalStorage); + if (l != null && l.size() > 0 && l.get(0).second().intValue() > 0) { + + return true; + } else { + if (s_logger.isDebugEnabled()) { s_logger.debug("Primary storage is not ready, wait until it is ready to launch secondary storage vm"); } - } - } else { - if (s_logger.isTraceEnabled()) { + } + } else { + if (s_logger.isTraceEnabled()) { s_logger.trace("Zone host is ready, but secondary storage vm template is not ready"); } - } - } - return false; - } - - private synchronized Map getZoneHostInfo() { - Date cutTime = DateUtil.currentGMTTime(); - List l = _hostDao.getRunningHostCounts(new Date(cutTime.getTime() - _clusterMgr.getHeartbeatThreshold())); + } + } + return false; + } - RunningHostInfoAgregator aggregator = new RunningHostInfoAgregator(); - if (l.size() > 0) { + private synchronized Map getZoneHostInfo() { + Date cutTime = DateUtil.currentGMTTime(); + List l = _hostDao.getRunningHostCounts(new Date(cutTime.getTime() - _clusterMgr.getHeartbeatThreshold())); + + RunningHostInfoAgregator aggregator = new RunningHostInfoAgregator(); + if (l.size() > 0) { for (RunningHostCountInfo countInfo : l) { aggregator.aggregate(countInfo); } } - return aggregator.getZoneHostInfoMap(); - } + return aggregator.getZoneHostInfoMap(); + } - @Override - public String getName() { - return _name; - } + @Override + public String getName() { + return _name; + } - @Override - public boolean start() { - if (s_logger.isInfoEnabled()) { + @Override + public boolean start() { + if (s_logger.isInfoEnabled()) { s_logger.info("Start secondary storage vm manager"); } - return true; - } + return true; + } - @Override - public boolean stop() { - if (s_logger.isInfoEnabled()) { + @Override + public boolean stop() { + if (s_logger.isInfoEnabled()) { s_logger.info("Stop secondary storage vm manager"); } - _capacityScanScheduler.shutdownNow(); + _capacityScanScheduler.shutdownNow(); - try { - _capacityScanScheduler.awaitTermination(EXECUTOR_SHUTDOWN_TIMEOUT, TimeUnit.MILLISECONDS); - } catch (InterruptedException e) { - } + try { + _capacityScanScheduler.awaitTermination(EXECUTOR_SHUTDOWN_TIMEOUT, TimeUnit.MILLISECONDS); + } catch (InterruptedException e) { + } - _capacityScanLock.releaseRef(); - _allocLock.releaseRef(); - return true; - } + _capacityScanLock.releaseRef(); + _allocLock.releaseRef(); + return true; + } - @Override - public boolean configure(String name, Map params) - throws ConfigurationException { - if (s_logger.isInfoEnabled()) { + @Override + public boolean configure(String name, Map params) throws ConfigurationException { + if (s_logger.isInfoEnabled()) { s_logger.info("Start configuring secondary storage vm manager : " + name); } - _name = name; + _name = name; - ComponentLocator locator = ComponentLocator.getCurrentLocator(); - ConfigurationDao configDao = locator.getDao(ConfigurationDao.class); - if (configDao == null) { - throw new ConfigurationException("Unable to get the configuration dao."); - } - - Map configs = configDao.getConfiguration("management-server", params); - - _secStorageVmRamSize = NumbersUtil.parseInt(configs.get("secstorage.vm.ram.size"), DEFAULT_SS_VM_RAMSIZE); - String useServiceVM = configDao.getValue("secondary.storage.vm"); - boolean _useServiceVM = false; - if ("true".equalsIgnoreCase(useServiceVM)){ - _useServiceVM = true; + ComponentLocator locator = ComponentLocator.getCurrentLocator(); + ConfigurationDao configDao = locator.getDao(ConfigurationDao.class); + if (configDao == null) { + throw new ConfigurationException("Unable to get the configuration dao."); } - + + Map configs = configDao.getConfiguration("management-server", params); + + _secStorageVmRamSize = NumbersUtil.parseInt(configs.get("secstorage.vm.ram.size"), DEFAULT_SS_VM_RAMSIZE); + String useServiceVM = configDao.getValue("secondary.storage.vm"); + boolean _useServiceVM = false; + if ("true".equalsIgnoreCase(useServiceVM)) { + _useServiceVM = true; + } + String sslcopy = configDao.getValue("secstorage.encrypt.copy"); if ("true".equalsIgnoreCase(sslcopy)) { - _useSSlCopy = true; + _useSSlCopy = true; } - + _allowedInternalSites = configDao.getValue("secstorage.allowed.internal.sites"); - - String value = configs.get("secstorage.vm.cmd.port"); - _secStorageVmCmdPort = NumbersUtil.parseInt(value, 3922); - - - value = configs.get("secstorage.capacityscan.interval"); - _capacityScanInterval = NumbersUtil.parseLong(value, DEFAULT_CAPACITY_SCAN_INTERVAL); + String value = configs.get("secstorage.capacityscan.interval"); + _capacityScanInterval = NumbersUtil.parseLong(value, DEFAULT_CAPACITY_SCAN_INTERVAL); - _domain = configs.get("domain"); - if (_domain == null) { - _domain = "foo.com"; - } + _domain = configs.get("domain"); + if (_domain == null) { + _domain = "foo.com"; + } - _instance = configs.get("instance.name"); - if (_instance == null) { - _instance = "DEFAULT"; - } - - Map agentMgrConfigs = configDao.getConfiguration("AgentManager", params); - _mgmt_host = agentMgrConfigs.get("host"); - if(_mgmt_host == null) { - s_logger.warn("Critical warning! Please configure your management server host address right after you have started your management server and then restart it, otherwise you won't have access to secondary storage"); - } - - value = agentMgrConfigs.get("port"); - _mgmt_port = NumbersUtil.parseInt(value, 8250); + _instance = configs.get("instance.name"); + if (_instance == null) { + _instance = "DEFAULT"; + } - _listener = new SecondaryStorageListener(this); - _agentMgr.registerForHostEvents(_listener, true, true, false); + Map agentMgrConfigs = configDao.getConfiguration("AgentManager", params); + _mgmt_host = agentMgrConfigs.get("host"); + if (_mgmt_host == null) { + s_logger.warn("Critical warning! Please configure your management server host address right after you have started your management server and then restart it, otherwise you won't have access to secondary storage"); + } - HighAvailabilityManager haMgr = locator.getManager(HighAvailabilityManager.class); - if (haMgr != null) { - haMgr.registerHandler(VirtualMachine.Type.SecondaryStorageVm, this); - } + value = agentMgrConfigs.get("port"); + _mgmt_port = NumbersUtil.parseInt(value, 8250); - _itMgr.registerGuru(VirtualMachine.Type.SecondaryStorageVm, this); - - - boolean useLocalStorage = Boolean.parseBoolean(configs.get(Config.SystemVMUseLocalStorage.key())); - _serviceOffering = new ServiceOfferingVO("System Offering For Secondary Storage VM", 1, _secStorageVmRamSize, 0, 0, 0, true, null, Network.GuestIpType.Virtual, useLocalStorage, true, null, true); - _serviceOffering.setUniqueName("Cloud.com-SecondaryStorage"); - _serviceOffering = _offeringDao.persistSystemServiceOffering(_serviceOffering); + _listener = new SecondaryStorageListener(this); + _agentMgr.registerForHostEvents(_listener, true, true, false); + + HighAvailabilityManager haMgr = locator.getManager(HighAvailabilityManager.class); + if (haMgr != null) { + haMgr.registerHandler(VirtualMachine.Type.SecondaryStorageVm, this); + } + + _itMgr.registerGuru(VirtualMachine.Type.SecondaryStorageVm, this); + + _useLocalStorage = Boolean.parseBoolean(configs.get(Config.SystemVMUseLocalStorage.key())); + _serviceOffering = new ServiceOfferingVO("System Offering For Secondary Storage VM", 1, _secStorageVmRamSize, 0, 0, 0, true, null, + Network.GuestIpType.Virtual, _useLocalStorage, true, null, true); + _serviceOffering.setUniqueName("Cloud.com-SecondaryStorage"); + _serviceOffering = _offeringDao.persistSystemServiceOffering(_serviceOffering); _template = _templateDao.findConsoleProxyTemplate(); if (_template == null && _useServiceVM) { throw new ConfigurationException("Unable to find the template for secondary storage vm VMs"); } - + if (_useServiceVM) { - _capacityScanScheduler.scheduleAtFixedRate(getCapacityScanTask(), STARTUP_DELAY, - _capacityScanInterval, TimeUnit.MILLISECONDS); + _capacityScanScheduler.scheduleAtFixedRate(getCapacityScanTask(), STARTUP_DELAY, _capacityScanInterval, TimeUnit.MILLISECONDS); } - String configValue = _configDao.getValue("system.vm.use.local.storage"); - _useLocalStorage = Boolean.parseBoolean(configValue); - if (s_logger.isInfoEnabled()) { + if (s_logger.isInfoEnabled()) { s_logger.info("Secondary storage vm Manager is configured."); } - return true; - } + return true; + } - protected SecondaryStorageManagerImpl() { - } + protected SecondaryStorageManagerImpl() { + } - @Override - public Command cleanup(SecondaryStorageVmVO vm, String vmName) { - if (vmName != null) { - return new StopCommand(vm, vmName, VirtualMachineName.getVnet(vmName)); - } else if (vm != null) { - SecondaryStorageVmVO vo = vm; - return new StopCommand(vo, null); - } else { - throw new CloudRuntimeException("Shouldn't even be here!"); - } - } + @Override + public Command cleanup(SecondaryStorageVmVO vm, String vmName) { + if (vmName != null) { + return new StopCommand(vm, vmName, VirtualMachineName.getVnet(vmName)); + } else if (vm != null) { + SecondaryStorageVmVO vo = vm; + return new StopCommand(vo, null); + } else { + throw new CloudRuntimeException("Shouldn't even be here!"); + } + } - @DB - protected void completeStopCommand(SecondaryStorageVmVO secStorageVm, VirtualMachine.Event ev) { - Transaction txn = Transaction.currentTxn(); - try { - txn.start(); - - SubscriptionMgr.getInstance().notifySubscribers( - SecStorageVmAlertEventArgs.ALERT_SUBJECT, this, - new SecStorageVmAlertEventArgs( - SecStorageVmAlertEventArgs.SSVM_DOWN, - secStorageVm.getDataCenterId(), secStorageVm.getId(), secStorageVm, null) - ); - - if (! _itMgr.stateTransitTo(secStorageVm, ev, null)) { - s_logger.debug("Unable to update the secondary storage vm"); - return; - } - txn.commit(); - } catch (Exception e) { - s_logger.error("Unable to complete stop command due to ", e); - } + @Override + public Long convertToId(String vmName) { + if (!VirtualMachineName.isValidSystemVmName(vmName, _instance, "s")) { + return null; + } + return VirtualMachineName.getSystemVmId(vmName); + } - if (_storageMgr.unshare(secStorageVm, null) == null) { - s_logger.warn("Unable to set share to false for " + secStorageVm.getId()); - } - } + @Override + public boolean stopSecStorageVm(long secStorageVmId) { - @Override - public Long convertToId(String vmName) { - if (!VirtualMachineName.isValidSystemVmName(vmName, _instance, "s")) { - return null; - } - return VirtualMachineName.getSystemVmId(vmName); - } - - @Override - public boolean stopSecStorageVm(long secStorageVmId) { - AsyncJobExecutor asyncExecutor = BaseAsyncJobExecutor.getCurrentExecutor(); if (asyncExecutor != null) { AsyncJobVO job = asyncExecutor.getJob(); @@ -1019,25 +883,25 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V } SecondaryStorageVmVO secStorageVm = _secStorageVmDao.findById(secStorageVmId); - if (secStorageVm == null) { - String msg = "Stopping secondary storage vm failed: secondary storage vm " + secStorageVmId + " no longer exists"; - if (s_logger.isDebugEnabled()) { + if (secStorageVm == null) { + String msg = "Stopping secondary storage vm failed: secondary storage vm " + secStorageVmId + " no longer exists"; + if (s_logger.isDebugEnabled()) { s_logger.debug(msg); } - return false; - } - try { - return stop(secStorageVm); - } catch (ResourceUnavailableException e) { - if (s_logger.isDebugEnabled()) { + return false; + } + try { + return stop(secStorageVm); + } catch (ResourceUnavailableException e) { + if (s_logger.isDebugEnabled()) { s_logger.debug("Stopping secondary storage vm " + secStorageVm.getName() + " faled : exception " + e.toString()); } - return false; - } - } + return false; + } + } - @Override - public boolean rebootSecStorageVm(long secStorageVmId) { + @Override + public boolean rebootSecStorageVm(long secStorageVmId) { AsyncJobExecutor asyncExecutor = BaseAsyncJobExecutor.getCurrentExecutor(); if (asyncExecutor != null) { AsyncJobVO job = asyncExecutor.getJob(); @@ -1047,100 +911,65 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V } _asyncMgr.updateAsyncJobAttachment(job.getId(), "secstorage_vm", secStorageVmId); } - - final SecondaryStorageVmVO secStorageVm = _secStorageVmDao.findById(secStorageVmId); - - if (secStorageVm == null || secStorageVm.getState() == State.Destroyed) { - return false; - } - if (secStorageVm.getState() == State.Running && secStorageVm.getHostId() != null) { - final RebootCommand cmd = new RebootCommand(secStorageVm.getInstanceName()); - final Answer answer = _agentMgr.easySend(secStorageVm.getHostId(), cmd); + final SecondaryStorageVmVO secStorageVm = _secStorageVmDao.findById(secStorageVmId); - if (answer != null && answer.getResult()) { - if (s_logger.isDebugEnabled()) { + if (secStorageVm == null || secStorageVm.getState() == State.Destroyed) { + return false; + } + + if (secStorageVm.getState() == State.Running && secStorageVm.getHostId() != null) { + final RebootCommand cmd = new RebootCommand(secStorageVm.getInstanceName()); + final Answer answer = _agentMgr.easySend(secStorageVm.getHostId(), cmd); + + if (answer != null && answer.getResult()) { + if (s_logger.isDebugEnabled()) { s_logger.debug("Successfully reboot secondary storage vm " + secStorageVm.getName()); } - - SubscriptionMgr.getInstance().notifySubscribers( - ALERT_SUBJECT, this, - new SecStorageVmAlertEventArgs( - SecStorageVmAlertEventArgs.SSVM_REBOOTED, - secStorageVm.getDataCenterId(), secStorageVm.getId(), secStorageVm, null) - ); - - return true; - } else { - String msg = "Rebooting Secondary Storage VM failed - " + secStorageVm.getName(); - if (s_logger.isDebugEnabled()) { + + SubscriptionMgr.getInstance().notifySubscribers( + ALERT_SUBJECT, + this, + new SecStorageVmAlertEventArgs(SecStorageVmAlertEventArgs.SSVM_REBOOTED, secStorageVm.getDataCenterId(), + secStorageVm.getId(), secStorageVm, null)); + + return true; + } else { + String msg = "Rebooting Secondary Storage VM failed - " + secStorageVm.getName(); + if (s_logger.isDebugEnabled()) { s_logger.debug(msg); } - return false; - } - } else { - return startSecStorageVm(secStorageVmId) != null; - } - } + return false; + } + } else { + return startSecStorageVm(secStorageVmId) != null; + } + } - @Override - public boolean destroySecStorageVm(long vmId) { - SecondaryStorageVmVO ssvm = _secStorageVmDao.findById(vmId); - - try { + @Override + public boolean destroySecStorageVm(long vmId) { + SecondaryStorageVmVO ssvm = _secStorageVmDao.findById(vmId); + + try { return _itMgr.expunge(ssvm, _accountMgr.getSystemUser(), _accountMgr.getSystemAccount()); } catch (ResourceUnavailableException e) { s_logger.warn("Unable to expunge " + ssvm, e); return false; } - } - - @DB - public boolean destroySecStorageVmDBOnly(long vmId) { - Transaction txn = Transaction.currentTxn(); - try { - txn.start(); - _volsDao.deleteVolumesByInstance(vmId); - - SecondaryStorageVmVO secStorageVm = _secStorageVmDao.findById(vmId); - if (secStorageVm != null) { - if (secStorageVm.getPublicIpAddress() != null) { - freePublicIpAddress(secStorageVm.getPublicIpAddress(), secStorageVm.getDataCenterId(), secStorageVm.getPodId()); - } - - _secStorageVmDao.remove(vmId); - EventUtils.saveEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_SSVM_DESTROY, "Secondary Storage Vm destroyed - " + secStorageVm.getName()); - } - txn.commit(); - return true; - } catch (Exception e) { - s_logger.error("Caught this error: ", e); - txn.rollback(); - return false; - } finally { - s_logger.debug("secondary storage vm vm is destroyed from DB : " + vmId); - } - } - - @Override - public boolean stop(SecondaryStorageVmVO secStorageVm) throws ResourceUnavailableException { - if (! _itMgr.stateTransitTo(secStorageVm, VirtualMachine.Event.StopRequested, secStorageVm.getHostId())) { - String msg = "Unable to stop secondary storage vm: " + secStorageVm.toString(); - s_logger.debug(msg); - return false; - } + } + @Override + public boolean stop(SecondaryStorageVmVO secStorageVm) throws ResourceUnavailableException { if (secStorageVm.getHostId() != null) { GlobalLock secStorageVmLock = GlobalLock.getInternLock(getSecStorageVmLockName(secStorageVm.getId())); try { if (secStorageVmLock.lock(ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_SYNC)) { try { - boolean result = _itMgr.stop(secStorageVm, _accountMgr.getSystemUser(), _accountMgr.getSystemAccount()); + boolean result = _itMgr.stop(secStorageVm, _accountMgr.getSystemUser(), _accountMgr.getSystemAccount()); if (result) { - completeStopCommand(secStorageVm, VirtualMachine.Event.OperationSucceeded); } - - return result; + + return result; } finally { secStorageVmLock.unlock(); } @@ -1156,291 +985,202 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V // vm was already stopped, return true return true; - } + } -// @Override -// public boolean migrate(SecondaryStorageVmVO secStorageVm, HostVO host) { -// HostVO fromHost = _hostDao.findById(secStorageVm.getId()); -// -// if (! _itMgr.stateTransitTo(secStorageVm, VirtualMachine.Event.MigrationRequested, secStorageVm.getHostId())) { -// s_logger.debug("State for " + secStorageVm.toString() + " has changed so migration can not take place."); -// return false; -// } -// -// MigrateCommand cmd = new MigrateCommand(secStorageVm.getInstanceName(), host.getPrivateIpAddress(), false); -// Answer answer = _agentMgr.easySend(fromHost.getId(), cmd); -// if (answer == null || !answer.getResult()) { -// return false; -// } -// -// _storageMgr.unshare(secStorageVm, fromHost); -// -// return true; -// } -// -// @Override -// public boolean completeMigration(SecondaryStorageVmVO secStorageVm, HostVO host) -// throws AgentUnavailableException, OperationTimedoutException { -// CheckVirtualMachineCommand cvm = new CheckVirtualMachineCommand(secStorageVm.getInstanceName()); -// CheckVirtualMachineAnswer answer = (CheckVirtualMachineAnswer) _agentMgr.send(host.getId(), cvm); -// if (!answer.getResult()) { -// s_logger.debug("Unable to complete migration for " + secStorageVm.getId()); -// _itMgr.stateTransitTo(secStorageVm, VirtualMachine.Event.AgentReportStopped, null); -// return false; -// } -// -// State state = answer.getState(); -// if (state == State.Stopped) { -// s_logger.warn("Unable to complete migration as we can not detect it on " + host.getId()); -// _itMgr.stateTransitTo(secStorageVm, VirtualMachine.Event.AgentReportStopped, null); -// return false; -// } -// -// _itMgr.stateTransitTo(secStorageVm, VirtualMachine.Event.OperationSucceeded, host.getId()); -// return true; -// } -// -// @Override -// public HostVO prepareForMigration(SecondaryStorageVmVO secStorageVm) throws StorageUnavailableException { -// -// VMTemplateVO template = _templateDao.findById(secStorageVm.getTemplateId()); -// long routerId = secStorageVm.getId(); -// boolean mirroredVols = secStorageVm.isMirroredVols(); -// DataCenterVO dc = _dcDao.findById(secStorageVm.getDataCenterId()); -// HostPodVO pod = _podDao.findById(secStorageVm.getPodId()); -// StoragePoolVO sp = _storageMgr.getStoragePoolForVm(secStorageVm.getId()); -// -// List vols = _volsDao.findCreatedByInstance(routerId); -// -// String[] storageIps = new String[2]; -// VolumeVO vol = vols.get(0); -// storageIps[0] = vol.getHostIp(); -// if (mirroredVols && (vols.size() == 2)) { -// storageIps[1] = vols.get(1).getHostIp(); -// } -// -// PrepareForMigrationCommand cmd = new PrepareForMigrationCommand(secStorageVm.getName(), null, storageIps, vols, mirroredVols); -// -// HostVO routingHost = null; -// HashSet avoid = new HashSet(); -// -// HostVO fromHost = _hostDao.findById(secStorageVm.getHostId()); -// if (fromHost.getClusterId() == null) { -// s_logger.debug("The host is not in a cluster"); -// return null; -// } -// avoid.add(fromHost); -// -// while ((routingHost = (HostVO) _agentMgr.findHost(Host.Type.Routing, -// dc, pod, sp, _serviceOffering, template, secStorageVm, fromHost, avoid)) != null) { -// avoid.add(routingHost); -// if (s_logger.isDebugEnabled()) { -// s_logger.debug("Trying to migrate router to host " + routingHost.getName()); -// } -// -// if( !_storageMgr.share(secStorageVm, vols, routingHost, false) ) { -// s_logger.warn("Can not share " + vol.getPath() + " to " + secStorageVm.getName()); -// throw new StorageUnavailableException("Can not share " + vol.getPath() + " to " + secStorageVm.getName(), vol.getPoolId()); -// } -// -// Answer answer = _agentMgr.easySend(routingHost.getId(), cmd); -// if (answer != null && answer.getResult()) { -// return routingHost; -// } -// _storageMgr.unshare(secStorageVm, vols, routingHost); -// } -// -// return null; -// } + @Override + public void onAgentConnect(Long dcId, StartupCommand cmd) { + if (_IpAllocator != null && _IpAllocator.exteralIpAddressAllocatorEnabled()) { + List zoneSsvms = _secStorageVmDao.listByZoneId(dcId); + if (zoneSsvms.size() == 0) { + return; + } + SecondaryStorageVmVO secStorageVm = zoneSsvms.get(0);// FIXME: + // assumes one + // vm per zone. + secStorageVm.setPrivateIpAddress(cmd.getStorageIpAddress()); /* + * FIXME: + * privateipaddress + * is + * overwrited + * with + * address + * of + * secondary + * storage + */ + secStorageVm.setPrivateNetmask(cmd.getStorageNetmask()); + secStorageVm.setPublicIpAddress(cmd.getPublicIpAddress()); + secStorageVm.setPublicNetmask(cmd.getPublicNetmask()); + _secStorageVmDao.persist(secStorageVm); + } + } - @Override - public void onAgentConnect(Long dcId, StartupCommand cmd){ - if (_IpAllocator != null && _IpAllocator.exteralIpAddressAllocatorEnabled()) { - List zoneSsvms = _secStorageVmDao.listByZoneId(dcId); - if (zoneSsvms.size() == 0) { - return ; - } - SecondaryStorageVmVO secStorageVm = zoneSsvms.get(0);//FIXME: assumes one vm per zone. - secStorageVm.setPrivateIpAddress(cmd.getStorageIpAddress()); /*FIXME: privateipaddress is overwrited with address of secondary storage*/ - secStorageVm.setPrivateNetmask(cmd.getStorageNetmask()); - secStorageVm.setPublicIpAddress(cmd.getPublicIpAddress()); - secStorageVm.setPublicNetmask(cmd.getPublicNetmask()); - _secStorageVmDao.persist(secStorageVm); - } - } - - private String getCapacityScanLockName() { - // to improve security, it may be better to return a unique mashed - // name(for example MD5 hashed) - return "secStorageVm.capacity.scan"; - } + private String getCapacityScanLockName() { + // to improve security, it may be better to return a unique mashed + // name(for example MD5 hashed) + return "secStorageVm.capacity.scan"; + } - private String getAllocLockName() { - // to improve security, it may be better to return a unique mashed - // name(for example MD5 hashed) - return "secStorageVm.alloc"; - } + private String getAllocLockName() { + // to improve security, it may be better to return a unique mashed + // name(for example MD5 hashed) + return "secStorageVm.alloc"; + } - private String getSecStorageVmLockName(long id) { - return "secStorageVm." + id; - } - - @Override - public SecondaryStorageVmVO findByName(String name) { - if (!VirtualMachineName.isValidSecStorageVmName(name, null)) { - return null; - } - return findById(VirtualMachineName.getSystemVmId(name)); - } + private String getSecStorageVmLockName(long id) { + return "secStorageVm." + id; + } - @Override - public SecondaryStorageVmVO findById(long id) { - return _secStorageVmDao.findById(id); - } + @Override + public SecondaryStorageVmVO findByName(String name) { + if (!VirtualMachineName.isValidSecStorageVmName(name, null)) { + return null; + } + return findById(VirtualMachineName.getSystemVmId(name)); + } - @Override - public SecondaryStorageVmVO persist(SecondaryStorageVmVO vm) { - return _secStorageVmDao.persist(vm); - } + @Override + public SecondaryStorageVmVO findById(long id) { + return _secStorageVmDao.findById(id); + } - @Override - public boolean finalizeVirtualMachineProfile( - VirtualMachineProfile profile, - DeployDestination dest, ReservationContext context) { + @Override + public SecondaryStorageVmVO persist(SecondaryStorageVmVO vm) { + return _secStorageVmDao.persist(vm); + } - HostVO secHost = _hostDao.findSecondaryStorageHost(dest.getDataCenter().getId()); - assert(secHost != null); - - StringBuilder buf = profile.getBootArgsBuilder(); - buf.append(" template=domP type=secstorage"); - buf.append(" host=").append(_mgmt_host); - buf.append(" port=").append(_mgmt_port); - buf.append(" name=").append(profile.getVirtualMachine().getName()); + @Override + public boolean finalizeVirtualMachineProfile(VirtualMachineProfile profile, DeployDestination dest, + ReservationContext context) { - buf.append(" zone=").append(dest.getDataCenter().getId()); - buf.append(" pod=").append(dest.getPod().getId()); - buf.append(" guid=").append(secHost.getGuid()); - String nfsMountPoint = null; - try { - nfsMountPoint = NfsUtils.url2Mount(secHost.getStorageUrl()); - } catch (Exception e) { - } - - buf.append(" mount.path=").append(nfsMountPoint); - buf.append(" resource=com.cloud.storage.resource.NfsSecondaryStorageResource"); - buf.append(" instance=SecStorage"); - buf.append(" sslcopy=").append(Boolean.toString(_useSSlCopy)); + HostVO secHost = _hostDao.findSecondaryStorageHost(dest.getDataCenter().getId()); + assert (secHost != null); - NicProfile controlNic = null; + StringBuilder buf = profile.getBootArgsBuilder(); + buf.append(" template=domP type=secstorage"); + buf.append(" host=").append(_mgmt_host); + buf.append(" port=").append(_mgmt_port); + buf.append(" name=").append(profile.getVirtualMachine().getName()); + + buf.append(" zone=").append(dest.getDataCenter().getId()); + buf.append(" pod=").append(dest.getPod().getId()); + buf.append(" guid=").append(secHost.getGuid()); + String nfsMountPoint = null; + try { + nfsMountPoint = NfsUtils.url2Mount(secHost.getStorageUrl()); + } catch (Exception e) { + } + + buf.append(" mount.path=").append(nfsMountPoint); + buf.append(" resource=com.cloud.storage.resource.NfsSecondaryStorageResource"); + buf.append(" instance=SecStorage"); + buf.append(" sslcopy=").append(Boolean.toString(_useSSlCopy)); + + NicProfile controlNic = null; NicProfile managementNic = null; - + boolean externalDhcp = false; String externalDhcpStr = _configDao.getValue("direct.attach.network.externalIpAllocator.enabled"); - if(externalDhcpStr != null && externalDhcpStr.equalsIgnoreCase("true")) { + if (externalDhcpStr != null && externalDhcpStr.equalsIgnoreCase("true")) { externalDhcp = true; } - - for (NicProfile nic : profile.getNics()) { - int deviceId = nic.getDeviceId(); - if (nic.getIp4Address() == null) { - buf.append(" eth").append(deviceId).append("mask=").append("0.0.0.0"); - buf.append(" eth").append(deviceId).append("ip=").append("0.0.0.0"); - } else { - buf.append(" eth").append(deviceId).append("ip=").append(nic.getIp4Address()); - buf.append(" eth").append(deviceId).append("mask=").append(nic.getNetmask()); - } - - buf.append(" eth").append(deviceId).append("mask=").append(nic.getNetmask()); - if (nic.isDefaultNic()) { - buf.append(" gateway=").append(nic.getGateway()); - } - if (nic.getTrafficType() == TrafficType.Management) { - buf.append(" localgw=").append(dest.getPod().getGateway()); - managementNic = nic; - buf.append(" private.network.device=").append("eth").append(deviceId); - } else if (nic.getTrafficType() == TrafficType.Control) { - if(nic.getIp4Address() != null) { + + for (NicProfile nic : profile.getNics()) { + int deviceId = nic.getDeviceId(); + if (nic.getIp4Address() == null) { + buf.append(" eth").append(deviceId).append("mask=").append("0.0.0.0"); + buf.append(" eth").append(deviceId).append("ip=").append("0.0.0.0"); + } else { + buf.append(" eth").append(deviceId).append("ip=").append(nic.getIp4Address()); + buf.append(" eth").append(deviceId).append("mask=").append(nic.getNetmask()); + } + + buf.append(" eth").append(deviceId).append("mask=").append(nic.getNetmask()); + if (nic.isDefaultNic()) { + buf.append(" gateway=").append(nic.getGateway()); + } + if (nic.getTrafficType() == TrafficType.Management) { + buf.append(" localgw=").append(dest.getPod().getGateway()); + managementNic = nic; + buf.append(" private.network.device=").append("eth").append(deviceId); + } else if (nic.getTrafficType() == TrafficType.Control) { + if (nic.getIp4Address() != null) { controlNic = nic; } - } else if(nic.getTrafficType() == TrafficType.Public) { - buf.append(" public.network.device=").append("eth").append(deviceId); - } - } - - /*External DHCP mode*/ - if(externalDhcp) { + } else if (nic.getTrafficType() == TrafficType.Public) { + buf.append(" public.network.device=").append("eth").append(deviceId); + } + } + + /* External DHCP mode */ + if (externalDhcp) { buf.append(" bootproto=dhcp"); } - - if(controlNic == null) { - assert(managementNic != null); - controlNic = managementNic; + + if (controlNic == null) { + assert (managementNic != null); + controlNic = managementNic; } - - DataCenterVO dc = _dcDao.findById(profile.getVirtualMachine().getDataCenterId()); - buf.append(" dns1=").append(dc.getInternalDns1()); - if (dc.getInternalDns2() != null) { - buf.append(" dns2=").append(dc.getInternalDns2()); - } - - String bootArgs = buf.toString(); - if (s_logger.isDebugEnabled()) { - s_logger.debug("Boot Args for " + profile + ": " + bootArgs); - } - if (controlNic == null) { - throw new CloudRuntimeException("Didn't start a control port"); - } + DataCenterVO dc = _dcDao.findById(profile.getVirtualMachine().getDataCenterId()); + buf.append(" dns1=").append(dc.getInternalDns1()); + if (dc.getInternalDns2() != null) { + buf.append(" dns2=").append(dc.getInternalDns2()); + } - profile.setParameter("control.nic", controlNic); - - return true; - } + String bootArgs = buf.toString(); + if (s_logger.isDebugEnabled()) { + s_logger.debug("Boot Args for " + profile + ": " + bootArgs); + } - @Override - public boolean finalizeDeployment(Commands cmds, - VirtualMachineProfile profile, - DeployDestination dest, ReservationContext context) { - NicProfile controlNic = (NicProfile)profile.getParameter("control.nic"); + 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"); CheckSshCommand check = new CheckSshCommand(profile.getInstanceName(), controlNic.getIp4Address(), 3922, 5, 20); cmds.addCommand("checkSsh", check); - + SecondaryStorageVmVO secVm = profile.getVirtualMachine(); DataCenter dc = dest.getDataCenter(); - List nics = _nicDao.listBy(secVm.getId()); + List nics = _nicDao.listBy(secVm.getId()); for (NicVO nic : nics) { - NetworkVO network = _networkDao.findById(nic.getNetworkId()); - if ((network.getTrafficType() == TrafficType.Public && dc.getNetworkType() == NetworkType.Advanced) || (network.getTrafficType() == TrafficType.Guest && dc.getNetworkType() == NetworkType.Basic)) { - secVm.setPublicIpAddress(nic.getIp4Address()); - secVm.setPublicNetmask(nic.getNetmask()); - secVm.setPublicMacAddress(nic.getMacAddress()); - } else if (network.getTrafficType() == TrafficType.Control) { - secVm.setGuestIpAddress(nic.getIp4Address()); - secVm.setGuestNetmask(nic.getNetmask()); - secVm.setGuestMacAddress(nic.getMacAddress()); - } else if (network.getTrafficType() == TrafficType.Management) { - secVm.setPrivateIpAddress(nic.getIp4Address()); - secVm.setPrivateNetmask(nic.getNetmask()); - secVm.setPrivateMacAddress(nic.getMacAddress()); - } + NetworkVO network = _networkDao.findById(nic.getNetworkId()); + if ((network.getTrafficType() == TrafficType.Public && dc.getNetworkType() == NetworkType.Advanced) + || (network.getTrafficType() == TrafficType.Guest && dc.getNetworkType() == NetworkType.Basic)) { + secVm.setPublicIpAddress(nic.getIp4Address()); + secVm.setPublicNetmask(nic.getNetmask()); + secVm.setPublicMacAddress(nic.getMacAddress()); + } else if (network.getTrafficType() == TrafficType.Control) { + secVm.setGuestIpAddress(nic.getIp4Address()); + secVm.setGuestNetmask(nic.getNetmask()); + secVm.setGuestMacAddress(nic.getMacAddress()); + } else if (network.getTrafficType() == TrafficType.Management) { + secVm.setPrivateIpAddress(nic.getIp4Address()); + secVm.setPrivateNetmask(nic.getNetmask()); + secVm.setPrivateMacAddress(nic.getMacAddress()); + } } _secStorageVmDao.update(secVm.getId(), secVm); return true; - } + } - @Override - public boolean finalizeStart(VirtualMachineProfile profile, - long hostId, Commands cmds,ReservationContext context) { - CheckSshAnswer answer = (CheckSshAnswer)cmds.getAnswer("checkSsh"); - if (!answer.getResult()) { - s_logger.warn("Unable to ssh to the VM: " + answer.getDetails()); - return false; - } - - return true; - } + @Override + public boolean finalizeStart(VirtualMachineProfile profile, long hostId, Commands cmds, ReservationContext context) { + CheckSshAnswer answer = (CheckSshAnswer) cmds.getAnswer("checkSsh"); + if (!answer.getResult()) { + s_logger.warn("Unable to ssh to the VM: " + answer.getDetails()); + return false; + } - @Override - public void finalizeStop(VirtualMachineProfile profile, StopAnswer answer) { - } + return true; + } + + @Override + public void finalizeStop(VirtualMachineProfile profile, StopAnswer answer) { + } }